Redis: Posibilidad de caducidad de los campos Hash / Set / List

Creado en 9 dic. 2011  ·  3Comentarios  ·  Fuente: redis/redis

Ahora es posible establecer la caducidad solo para las claves de los objetos principales, no para los elementos de colección.
Tengo un problema de diseño con eso.

Imaginemos que almacenamos propiedades de sesión en el hash.
La sesión caduca después de un tiempo, pero tenemos que saber cuántas sesiones siguen activas.
Entonces ... | creó otra colección para almacenar la lista de sesiones activas, donde:
token (clave) y clave para el hash de sesión (valor).

Ahora, cuando mi sesión expira, su token en la colección activa todavía está presente,
y no tengo la posibilidad de eliminarlos.

Soluciones:
1) Posibilidad de caducidad de los campos Hash / Set / List. Simplemente estableceré la expiración del token de sesión, lo mismo que el hash de la sesión principal

2) Desencadenadores de vencimiento: cuando la clave expira, se ejecutará algún grupo de comando (tal vez el script Lua)

3) Publicar el mensaje de caducidad en el canal definido anteriormente, que contiene la clave caducada. Usando controladores, podría implementar mis propios desencadenantes

Comentario más útil

Hola, esto no se implementará por diseño original:

  • No hay tipos anidados en claves.
  • Sin características complejas en campos únicos de tipos de datos agregados.

El razonamiento es mucho más complejo y está muy sesgado por los sentimientos personales, las preferencias y la sensibilidad, por lo que no hay una forma objetiva en la que pueda mostrarte que esto es mejor;)

Clausura. Gracias por informarnos.

Todos 3 comentarios

Hola, esto no se implementará por diseño original:

  • No hay tipos anidados en claves.
  • Sin características complejas en campos únicos de tipos de datos agregados.

El razonamiento es mucho más complejo y está muy sesgado por los sentimientos personales, las preferencias y la sensibilidad, por lo que no hay una forma objetiva en la que pueda mostrarte que esto es mejor;)

Clausura. Gracias por informarnos.

¿Existe una buena práctica para abordar esto?

Se me ocurrió una solución bastante buena para este problema de "expirar los valores hash de redis por clave".

Básicamente, solo almacena las entradas con las marcas de tiempo como claves, o incrustadas en las claves. Tenga en cuenta que redis quiere cadenas como claves, por lo que tendrá que .toString () / parseInt () las claves para comparar. Usando este esquema, simplemente crea un montón de tablas hash con sus variables relevantes en los nombres de las tablas hash, y cada una tiene pares de marca de tiempo / valor.

Por ejemplo, en 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)));
            })
        }
    })
})

Tenga en cuenta que simplemente eliminar las entradas antiguas antes de realizar un análisis crítico de los valores, a medida que avanza, es mucho más eficiente, computacionalmente, que hacer que redis realmente verifique los valores de tiempo de espera en cada clave en cada hash de redis en cada base de datos cada segundo. Entonces, no es una mala solución.

¿Fue útil esta página
0 / 5 - 0 calificaciones