Redis: Π’ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡ‚ΡŒ истСчСния срока дСйствия ΠΏΠΎΠ»Π΅ΠΉ Hash / Set / List

Π‘ΠΎΠ·Π΄Π°Π½Π½Ρ‹ΠΉ Π½Π° 9 Π΄Π΅ΠΊ. 2011  Β·  3ΠšΠΎΠΌΠΌΠ΅Π½Ρ‚Π°Ρ€ΠΈΠΈ  Β·  Π˜ΡΡ‚ΠΎΡ‡Π½ΠΈΠΊ: redis/redis

Π’Π΅ΠΏΠ΅Ρ€ΡŒ ΠΌΠΎΠΆΠ½ΠΎ ΡƒΡΡ‚Π°Π½ΠΎΠ²ΠΈΡ‚ΡŒ срок дСйствия Ρ‚ΠΎΠ»ΡŒΠΊΠΎ для ΠΊΠ»ΡŽΡ‡Π΅ΠΉ ΠΊ основным ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π°ΠΌ, Π½ΠΎ Π½Π΅ для элСмСнтов ΠΊΠΎΠ»Π»Π΅ΠΊΡ†ΠΈΠΉ.
Π£ мСня ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌΡ‹ с Π΄ΠΈΠ·Π°ΠΉΠ½ΠΎΠΌ.

ΠŸΡ€Π΅Π΄ΡΡ‚Π°Π²ΠΈΠΌ, Ρ‡Ρ‚ΠΎ ΠΌΡ‹ Ρ…Ρ€Π°Π½ΠΈΠΌ свойства сСанса Π² Ρ…Π΅ΡˆΠ΅.
Π‘Ρ€ΠΎΠΊ дСйствия сСанса истСкаСт Ρ‡Π΅Ρ€Π΅Π· Π½Π΅ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠ΅ врСмя, Π½ΠΎ ΠΌΡ‹ Π΄ΠΎΠ»ΠΆΠ½Ρ‹ Π·Π½Π°Ρ‚ΡŒ, сколько сСансов Π΅Ρ‰Π΅ ΠΆΠΈΠ²Ρ‹.
Π˜Ρ‚Π°ΠΊ ... | создал Π΅Ρ‰Π΅ ΠΎΠ΄Π½Ρƒ ΠΊΠΎΠ»Π»Π΅ΠΊΡ†ΠΈΡŽ для хранСния списка Π°ΠΊΡ‚ΠΈΠ²Π½Ρ‹Ρ… сСансов, Π³Π΄Π΅:
Ρ‚ΠΎΠΊΠ΅Π½ (ΠΊΠ»ΡŽΡ‡) ΠΈ ΠΊΠ»ΡŽΡ‡ ΠΊ Ρ…Π΅ΡˆΡƒ сСанса (Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅).

Π’Π΅ΠΏΠ΅Ρ€ΡŒ, ΠΊΠΎΠ³Π΄Π° ΠΌΠΎΠΉ сСанс истСкаСт, Ρ‚ΠΎΠΊΠ΅Π½ Π² Π°ΠΊΡ‚ΠΈΠ²Π½ΠΎΠΉ ΠΊΠΎΠ»Π»Π΅ΠΊΡ†ΠΈΠΈ всС Π΅Ρ‰Π΅ присутствуСт,
ΠΈ Ρƒ мСня Π½Π΅Ρ‚ возмоТности ΡƒΠ΄Π°Π»ΠΈΡ‚ΡŒ ΠΈΡ….

РСшСния:
1) Π’ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡ‚ΡŒ истСчСния срока дСйствия ΠΏΠΎΠ»Π΅ΠΉ Hash / Set / List. Π― просто ΡƒΡΡ‚Π°Π½ΠΎΠ²Π»ΡŽ истСчСниС срока дСйствия Ρ‚ΠΎΠΊΠ΅Π½Π° сСанса, ΠΊΠ°ΠΊ ΠΈ основной Ρ…Π΅Ρˆ сСанса

2) Π’Ρ€ΠΈΠ³Π³Π΅Ρ€Ρ‹ истСчСния срока дСйствия - ΠΏΠΎ истСчСнии срока дСйствия ΠΊΠ»ΡŽΡ‡Π° Π±ΡƒΠ΄Π΅Ρ‚ Π²Ρ‹ΠΏΠΎΠ»Π½Π΅Π½Π° нСкоторая Π³Ρ€ΡƒΠΏΠΏΠ° ΠΊΠΎΠΌΠ°Π½Π΄ (Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎ, сцСнарий Lua)

3) ΠžΠΏΡƒΠ±Π»ΠΈΠΊΠΎΠ²Π°Ρ‚ΡŒ сообщСниС ΠΎΠ± истСчСнии срока дСйствия Π² Ρ€Π°Π½Π΅Π΅ ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½Π½ΠΎΠΌ ΠΊΠ°Π½Π°Π»Π΅, содСрТащСС ΠΈΡΡ‚Π΅ΠΊΡˆΠΈΠΉ ΠΊΠ»ΡŽΡ‡. Π˜ΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡ Π΄Ρ€Π°ΠΉΠ²Π΅Ρ€Ρ‹, я ΠΌΠΎΠ³ Ρ€Π΅Π°Π»ΠΈΠ·ΠΎΠ²Π°Ρ‚ΡŒ свои собствСнныС Ρ‚Ρ€ΠΈΠ³Π³Π΅Ρ€Ρ‹

Π‘Π°ΠΌΡ‹ΠΉ ΠΏΠΎΠ»Π΅Π·Π½Ρ‹ΠΉ ΠΊΠΎΠΌΠΌΠ΅Π½Ρ‚Π°Ρ€ΠΈΠΉ

ΠŸΡ€ΠΈΠ²Π΅Ρ‚, это Π½Π΅ Π±ΡƒΠ΄Π΅Ρ‚ Ρ€Π΅Π°Π»ΠΈΠ·ΠΎΠ²Π°Π½ΠΎ ΠΎΡ€ΠΈΠ³ΠΈΠ½Π°Π»ΡŒΠ½Ρ‹ΠΌ Π΄ΠΈΠ·Π°ΠΉΠ½ΠΎΠΌ:

  • Π’ ΠΊΠ»ΡŽΡ‡Π°Ρ… Π½Π΅Ρ‚ Π²Π»ΠΎΠΆΠ΅Π½Π½Ρ‹Ρ… Ρ‚ΠΈΠΏΠΎΠ².
  • НСт слоТных Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΉ Π² ΠΎΡ‚Π΄Π΅Π»ΡŒΠ½Ρ‹Ρ… полях Π°Π³Ρ€Π΅Π³ΠΈΡ€ΠΎΠ²Π°Π½Π½Ρ‹Ρ… Ρ‚ΠΈΠΏΠΎΠ² Π΄Π°Π½Π½Ρ‹Ρ….

РассуТдСния Π½Π°ΠΌΠ½ΠΎΠ³ΠΎ слоТнСС ΠΈ Π²ΠΎ ΠΌΠ½ΠΎΠ³ΠΎΠΌ зависят ΠΎΡ‚ Π»ΠΈΡ‡Π½Ρ‹Ρ… чувств, ΠΏΡ€Π΅Π΄ΠΏΠΎΡ‡Ρ‚Π΅Π½ΠΈΠΉ ΠΈ Ρ‡ΡƒΠ²ΡΡ‚Π²ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎΡΡ‚ΠΈ, поэтому Π½Π΅Ρ‚ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ΠΈΠ²Π½ΠΎΠ³ΠΎ способа ΠΏΠΎΠΊΠ°Π·Π°Ρ‚ΡŒ Π²Π°ΠΌ, Ρ‡Ρ‚ΠΎ это Π»ΡƒΡ‡ΡˆΠ΅;)

Π—Π°ΠΊΡ€Ρ‹Ρ‚ΠΈΠ΅. Бпасибо Π·Π° сообщСниС.

ВсС 3 ΠšΠΎΠΌΠΌΠ΅Π½Ρ‚Π°Ρ€ΠΈΠΉ

ΠŸΡ€ΠΈΠ²Π΅Ρ‚, это Π½Π΅ Π±ΡƒΠ΄Π΅Ρ‚ Ρ€Π΅Π°Π»ΠΈΠ·ΠΎΠ²Π°Π½ΠΎ ΠΎΡ€ΠΈΠ³ΠΈΠ½Π°Π»ΡŒΠ½Ρ‹ΠΌ Π΄ΠΈΠ·Π°ΠΉΠ½ΠΎΠΌ:

  • Π’ ΠΊΠ»ΡŽΡ‡Π°Ρ… Π½Π΅Ρ‚ Π²Π»ΠΎΠΆΠ΅Π½Π½Ρ‹Ρ… Ρ‚ΠΈΠΏΠΎΠ².
  • НСт слоТных Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΉ Π² ΠΎΡ‚Π΄Π΅Π»ΡŒΠ½Ρ‹Ρ… полях Π°Π³Ρ€Π΅Π³ΠΈΡ€ΠΎΠ²Π°Π½Π½Ρ‹Ρ… Ρ‚ΠΈΠΏΠΎΠ² Π΄Π°Π½Π½Ρ‹Ρ….

РассуТдСния Π½Π°ΠΌΠ½ΠΎΠ³ΠΎ слоТнСС ΠΈ Π²ΠΎ ΠΌΠ½ΠΎΠ³ΠΎΠΌ зависят ΠΎΡ‚ Π»ΠΈΡ‡Π½Ρ‹Ρ… чувств, ΠΏΡ€Π΅Π΄ΠΏΠΎΡ‡Ρ‚Π΅Π½ΠΈΠΉ ΠΈ Ρ‡ΡƒΠ²ΡΡ‚Π²ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎΡΡ‚ΠΈ, поэтому Π½Π΅Ρ‚ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ΠΈΠ²Π½ΠΎΠ³ΠΎ способа ΠΏΠΎΠΊΠ°Π·Π°Ρ‚ΡŒ Π²Π°ΠΌ, Ρ‡Ρ‚ΠΎ это Π»ΡƒΡ‡ΡˆΠ΅;)

Π—Π°ΠΊΡ€Ρ‹Ρ‚ΠΈΠ΅. Бпасибо Π·Π° сообщСниС.

Π•ΡΡ‚ΡŒ Π»ΠΈ Π»ΡƒΡ‡ΡˆΠΈΠΉ способ ΠΏΡ€ΠΈΠ±Π»ΠΈΠ·ΠΈΡ‚ΡŒΡΡ ΠΊ этому?

Π― ΠΏΡ€ΠΈΠ΄ΡƒΠΌΠ°Π» довольно Ρ…ΠΎΡ€ΠΎΡˆΠ΅Π΅ Ρ€Π΅ΡˆΠ΅Π½ΠΈΠ΅ для этой ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌΡ‹ «истСкаСт срок дСйствия Ρ…Π΅Ρˆ-Π·Π½Π°Ρ‡Π΅Π½ΠΈΠΉ redis ΠΏΠΎ ΠΊΠ»ΡŽΡ‡ΡƒΒ».

По сути, Π²Ρ‹ просто сохраняСтС записи с ΠΎΡ‚ΠΌΠ΅Ρ‚ΠΊΠ°ΠΌΠΈ Π²Ρ€Π΅ΠΌΠ΅Π½ΠΈ Π² качСствС ΠΊΠ»ΡŽΡ‡Π΅ΠΉ ΠΈΠ»ΠΈ встраиваСтС ΠΈΡ… Π² ΠΊΠ»ΡŽΡ‡ΠΈ. ΠžΠ±Ρ€Π°Ρ‚ΠΈΡ‚Π΅ Π²Π½ΠΈΠΌΠ°Π½ΠΈΠ΅, Ρ‡Ρ‚ΠΎ redis Ρ…ΠΎΡ‡Π΅Ρ‚, Ρ‡Ρ‚ΠΎΠ±Ρ‹ строки Π±Ρ‹Π»ΠΈ ΠΊΠ»ΡŽΡ‡Π°ΠΌΠΈ, поэтому Π²Π°ΠΌ придСтся .toString () / parseInt () ΡΡ€Π°Π²Π½ΠΈΠ²Π°Ρ‚ΡŒ ΠΊΠ»ΡŽΡ‡ΠΈ. Π˜ΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡ эту схСму, Π²Ρ‹ просто создаСтС ΠΊΡƒΡ‡Ρƒ Ρ…Π΅Ρˆ-Ρ‚Π°Π±Π»ΠΈΡ† с вашими ΡΠΎΠΎΡ‚Π²Π΅Ρ‚ΡΡ‚Π²ΡƒΡŽΡ‰ΠΈΠΌΠΈ ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹ΠΌΠΈ Π² ΠΈΠΌΠ΅Π½Π°Ρ… Ρ…Π΅Ρˆ-Ρ‚Π°Π±Π»ΠΈΡ†, ΠΈ каТдая ΠΈΠ· Π½ΠΈΡ… ΠΈΠΌΠ΅Π΅Ρ‚ ΠΏΠ°Ρ€Ρ‹ ΠΌΠ΅Ρ‚ΠΊΠ° Π²Ρ€Π΅ΠΌΠ΅Π½ΠΈ / значСния.

НапримСр, Π² nodejs:

var Redis = require('then-redis')
var _ = require("underscore");
var redClient = Redis.createClient('tcp://localhost:6379');
var now = new Date();
var nowSeconds = parseFloat( Math.round(now.getTime() / 1000)); 
var nowSecondString = nowSeconds.toString();
thisEntry[nowSecondString] = myReleventValueAtThisTime;
var myHashTableName = thisCategory + ":" + thisSubcategory + ":" + thisFrame;    
// add newest entry to hash
redClient.hmset(myHashTableName,thisEntry).then(function () {
    // get all entries from hash
    redClient.hgetall(myHashTableName).then(function (result) { 
        console.log("got existing entries from : " + myHashTableName + " hashTable.")
        var myCurrentValidValues = [];
        if (result) {
            for (var i in result) {
                // test entries for being too old in seconds
                if (parseFloat(i) < nowSeconds - 180) { 
                    // this entry is > 3 minutes old, mark for deletion
                    redClient.hdel(myHashTableName,i) // delete old entries here
                } else {
                    var thisValidKeyValPair = {}
                    // our values happen to be floats
                    thisValidKeyValPair[i] = parseFloat(result[i]);
                    myCurrentValidValues.push(thisValidKeyValPair) 
                }
            }
            // now do stuff with your value array, which doesn't including "stale" entries
            // example sort by value descending
            myCurrentValidValues.sort(function(a,b){ 
                return( _.values(a) - _.values(b));
            })
            // example sort by timestamp, oldest to newest, ascending
            myCurrentValidValues.sort(function(a,b){ 
                return( parseFloat(_.keys(a)) - parseFloat(_.keys(b)));
            })
        }
    })
})

ΠžΠ±Ρ€Π°Ρ‚ΠΈΡ‚Π΅ Π²Π½ΠΈΠΌΠ°Π½ΠΈΠ΅, Ρ‡Ρ‚ΠΎ простоС ΡƒΠ΄Π°Π»Π΅Π½ΠΈΠ΅ старых записСй Π΄ΠΎ Ρ‚ΠΎΠ³ΠΎ, ΠΊΠ°ΠΊ Π²Ρ‹ сдСлаСтС ΠΊΠ°ΠΊΠΎΠΉ-Π»ΠΈΠ±ΠΎ критичСский Π°Π½Π°Π»ΠΈΠ· Π·Π½Π°Ρ‡Π΅Π½ΠΈΠΉ ΠΏΠΎ Ρ…ΠΎΠ΄Ρƒ Π΄Π΅Π»Π°, Π³ΠΎΡ€Π°Π·Π΄ΠΎ эффСктивнСС с Π²Ρ‹Ρ‡ΠΈΡΠ»ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎΠΉ Ρ‚ΠΎΡ‡ΠΊΠΈ зрСния, Ρ‡Π΅ΠΌ Ссли Π±Ρ‹ redis фактичСски провСрял значСния Ρ‚Π°ΠΉΠΌ-Π°ΡƒΡ‚Π° для ΠΊΠ°ΠΆΠ΄ΠΎΠ³ΠΎ ΠΊΠ»ΡŽΡ‡Π° Π² ΠΊΠ°ΠΆΠ΄ΠΎΠΌ Ρ…ΡΡˆΠ΅ redis Π² ΠΊΠ°ΠΆΠ΄ΠΎΠΉ Π‘Π” ΠΊΠ°ΠΆΠ΄ΡƒΡŽ сСкунду. Π’Π°ΠΊ Ρ‡Ρ‚ΠΎ это Π½Π΅ΠΏΠ»ΠΎΡ…ΠΎΠ΅ Ρ€Π΅ΡˆΠ΅Π½ΠΈΠ΅.

Π‘Ρ‹Π»Π° Π»ΠΈ эта страница ΠΏΠΎΠ»Π΅Π·Π½ΠΎΠΉ?
0 / 5 - 0 Ρ€Π΅ΠΉΡ‚ΠΈΠ½Π³ΠΈ