Π’Π΅ΠΏΠ΅ΡΡ ΠΌΠΎΠΆΠ½ΠΎ ΡΡΡΠ°Π½ΠΎΠ²ΠΈΡΡ ΡΡΠΎΠΊ Π΄Π΅ΠΉΡΡΠ²ΠΈΡ ΡΠΎΠ»ΡΠΊΠΎ Π΄Π»Ρ ΠΊΠ»ΡΡΠ΅ΠΉ ΠΊ ΠΎΡΠ½ΠΎΠ²Π½ΡΠΌ ΠΎΠ±ΡΠ΅ΠΊΡΠ°ΠΌ, Π½ΠΎ Π½Π΅ Π΄Π»Ρ ΡΠ»Π΅ΠΌΠ΅Π½ΡΠΎΠ² ΠΊΠΎΠ»Π»Π΅ΠΊΡΠΈΠΉ.
Π£ ΠΌΠ΅Π½Ρ ΠΏΡΠΎΠ±Π»Π΅ΠΌΡ Ρ Π΄ΠΈΠ·Π°ΠΉΠ½ΠΎΠΌ.
ΠΡΠ΅Π΄ΡΡΠ°Π²ΠΈΠΌ, ΡΡΠΎ ΠΌΡ Ρ
ΡΠ°Π½ΠΈΠΌ ΡΠ²ΠΎΠΉΡΡΠ²Π° ΡΠ΅Π°Π½ΡΠ° Π² Ρ
Π΅ΡΠ΅.
Π‘ΡΠΎΠΊ Π΄Π΅ΠΉΡΡΠ²ΠΈΡ ΡΠ΅Π°Π½ΡΠ° ΠΈΡΡΠ΅ΠΊΠ°Π΅Ρ ΡΠ΅ΡΠ΅Π· Π½Π΅ΠΊΠΎΡΠΎΡΠΎΠ΅ Π²ΡΠ΅ΠΌΡ, Π½ΠΎ ΠΌΡ Π΄ΠΎΠ»ΠΆΠ½Ρ Π·Π½Π°ΡΡ, ΡΠΊΠΎΠ»ΡΠΊΠΎ ΡΠ΅Π°Π½ΡΠΎΠ² Π΅ΡΠ΅ ΠΆΠΈΠ²Ρ.
ΠΡΠ°ΠΊ ... | ΡΠΎΠ·Π΄Π°Π» Π΅ΡΠ΅ ΠΎΠ΄Π½Ρ ΠΊΠΎΠ»Π»Π΅ΠΊΡΠΈΡ Π΄Π»Ρ Ρ
ΡΠ°Π½Π΅Π½ΠΈΡ ΡΠΏΠΈΡΠΊΠ° Π°ΠΊΡΠΈΠ²Π½ΡΡ
ΡΠ΅Π°Π½ΡΠΎΠ², Π³Π΄Π΅:
ΡΠΎΠΊΠ΅Π½ (ΠΊΠ»ΡΡ) ΠΈ ΠΊΠ»ΡΡ ΠΊ Ρ
Π΅ΡΡ ΡΠ΅Π°Π½ΡΠ° (Π·Π½Π°ΡΠ΅Π½ΠΈΠ΅).
Π’Π΅ΠΏΠ΅ΡΡ, ΠΊΠΎΠ³Π΄Π° ΠΌΠΎΠΉ ΡΠ΅Π°Π½Ρ ΠΈΡΡΠ΅ΠΊΠ°Π΅Ρ, ΡΠΎΠΊΠ΅Π½ Π² Π°ΠΊΡΠΈΠ²Π½ΠΎΠΉ ΠΊΠΎΠ»Π»Π΅ΠΊΡΠΈΠΈ Π²ΡΠ΅ Π΅ΡΠ΅ ΠΏΡΠΈΡΡΡΡΡΠ²ΡΠ΅Ρ,
ΠΈ Ρ ΠΌΠ΅Π½Ρ Π½Π΅Ρ Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡΠΈ ΡΠ΄Π°Π»ΠΈΡΡ ΠΈΡ
.
Π Π΅ΡΠ΅Π½ΠΈΡ:
1) ΠΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡΡ ΠΈΡΡΠ΅ΡΠ΅Π½ΠΈΡ ΡΡΠΎΠΊΠ° Π΄Π΅ΠΉΡΡΠ²ΠΈΡ ΠΏΠΎΠ»Π΅ΠΉ Hash / Set / List. Π― ΠΏΡΠΎΡΡΠΎ ΡΡΡΠ°Π½ΠΎΠ²Π»Ρ ΠΈΡΡΠ΅ΡΠ΅Π½ΠΈΠ΅ ΡΡΠΎΠΊΠ° Π΄Π΅ΠΉΡΡΠ²ΠΈΡ ΡΠΎΠΊΠ΅Π½Π° ΡΠ΅Π°Π½ΡΠ°, ΠΊΠ°ΠΊ ΠΈ ΠΎΡΠ½ΠΎΠ²Π½ΠΎΠΉ Ρ
Π΅Ρ ΡΠ΅Π°Π½ΡΠ°
2) Π’ΡΠΈΠ³Π³Π΅ΡΡ ΠΈΡΡΠ΅ΡΠ΅Π½ΠΈΡ ΡΡΠΎΠΊΠ° Π΄Π΅ΠΉΡΡΠ²ΠΈΡ - ΠΏΠΎ ΠΈΡΡΠ΅ΡΠ΅Π½ΠΈΠΈ ΡΡΠΎΠΊΠ° Π΄Π΅ΠΉΡΡΠ²ΠΈΡ ΠΊΠ»ΡΡΠ° Π±ΡΠ΄Π΅Ρ Π²ΡΠΏΠΎΠ»Π½Π΅Π½Π° Π½Π΅ΠΊΠΎΡΠΎΡΠ°Ρ Π³ΡΡΠΏΠΏΠ° ΠΊΠΎΠΌΠ°Π½Π΄ (Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎ, ΡΡΠ΅Π½Π°ΡΠΈΠΉ Lua)
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 Π² ΠΊΠ°ΠΆΠ΄ΠΎΠΉ ΠΠ ΠΊΠ°ΠΆΠ΄ΡΡ ΡΠ΅ΠΊΡΠ½Π΄Ρ. Π’Π°ΠΊ ΡΡΠΎ ΡΡΠΎ Π½Π΅ΠΏΠ»ΠΎΡ ΠΎΠ΅ ΡΠ΅ΡΠ΅Π½ΠΈΠ΅.
Π‘Π°ΠΌΡΠΉ ΠΏΠΎΠ»Π΅Π·Π½ΡΠΉ ΠΊΠΎΠΌΠΌΠ΅Π½ΡΠ°ΡΠΈΠΉ
ΠΡΠΈΠ²Π΅Ρ, ΡΡΠΎ Π½Π΅ Π±ΡΠ΄Π΅Ρ ΡΠ΅Π°Π»ΠΈΠ·ΠΎΠ²Π°Π½ΠΎ ΠΎΡΠΈΠ³ΠΈΠ½Π°Π»ΡΠ½ΡΠΌ Π΄ΠΈΠ·Π°ΠΉΠ½ΠΎΠΌ:
Π Π°ΡΡΡΠΆΠ΄Π΅Π½ΠΈΡ Π½Π°ΠΌΠ½ΠΎΠ³ΠΎ ΡΠ»ΠΎΠΆΠ½Π΅Π΅ ΠΈ Π²ΠΎ ΠΌΠ½ΠΎΠ³ΠΎΠΌ Π·Π°Π²ΠΈΡΡΡ ΠΎΡ Π»ΠΈΡΠ½ΡΡ ΡΡΠ²ΡΡΠ², ΠΏΡΠ΅Π΄ΠΏΠΎΡΡΠ΅Π½ΠΈΠΉ ΠΈ ΡΡΠ²ΡΡΠ²ΠΈΡΠ΅Π»ΡΠ½ΠΎΡΡΠΈ, ΠΏΠΎΡΡΠΎΠΌΡ Π½Π΅Ρ ΠΎΠ±ΡΠ΅ΠΊΡΠΈΠ²Π½ΠΎΠ³ΠΎ ΡΠΏΠΎΡΠΎΠ±Π° ΠΏΠΎΠΊΠ°Π·Π°ΡΡ Π²Π°ΠΌ, ΡΡΠΎ ΡΡΠΎ Π»ΡΡΡΠ΅;)
ΠΠ°ΠΊΡΡΡΠΈΠ΅. Π‘ΠΏΠ°ΡΠΈΠ±ΠΎ Π·Π° ΡΠΎΠΎΠ±ΡΠ΅Π½ΠΈΠ΅.