2011-02-25 20 views
9

Estoy usando redis como mi caché web, y quiero almacenar esos objetos activerecord en redis directamente, pero usando redis-rb me sale un error.cómo guardar activerecord object of rails to redis

Parece que no puedo serializarlo o algo así. ¿Hay alguna posibilidad de hacer esto por mí? ¿Tengo que serializarlo en formato json?

¿Qué formato de serialización sería el más eficiente?

Respuesta

14

Redis almacena cadenas (y algunas otras estructuras de datos de cadenas); para que puedas serializar los valores de Redis como quieras siempre que termines con una cadena.

JSON es probablemente el mejor lugar para comenzar, ya que es delgado, no demasiado frágil, funciona bien con los patrones de actualización en vivo, y es legible in situ. Más tarde, puede agregar más complejidad para cumplir sus objetivos según sea necesario, por ejemplo, compresión. #to_json y #from_json ya están en ActiveRecord si quieres usar JSON (con YAJL o su tipo que no debería ser excesivamente lento, hablando en términos relativos.) #to_xml también está ahí, si te interesa S & M.

cálculo de referencias crudo también puede funcionar, pero de vez en cuando va terriblemente mal (he tenido calculan las referencias objetos superan 2MB después lzo compresión que eran sólo unos pocos K en JSON.)

Si es realmente un cuello de botella para usted, usted Desea ejecutar sus propias pruebas de eficiencia para su (s) objetivo (s), por ejemplo, velocidad de escritura, velocidad de lectura o tamaño de almacenamiento, con sus propios objetos y patrones de datos.

+0

gracias Yuri, realmente me dijiste lo que quiero saber. Parece que json es mi mejor opción aquí ... ¡Gracias de nuevo! –

+0

Al intentar esto ahora, parece que Marshal es la elección correcta si incluye asociaciones. Restaurará las cosas en el tipo correcto. Con JSON, las asociaciones simplemente se almacenan como hashes, por lo que se obtiene un error al intentar restaurar con from_json. – mahemoff

+0

http://msgpack.org/ es una gran opción también. Más pequeño y más eficiente que JSON. –

1
def self.set(friend_list, player_id) 
redis.set("friend_list_#{player_id}", Marshal.dump(friend_list)) == 'OK' ? friend_list : nil 
end 

def self.get(player_id) 
    friend_list = redis.get("friend_list_#{player_id}") 
    Marshal.load(friend_list) if friend_list 
end 
+0

parece JSON es más conveniente para mí, pero voy a hacer una prueba de rendimiento con respecto al método Mariscal. gracias de cualquier manera. –

0

Puede convertir su modelo a un hash utilizando el método de atributos y luego guardarlo con mapped_hmset

def redis_set() 
    redis.mapped_hmset("namespace:modelName:#{self.id}", self.attributes) 
end 

def redis_get(id) 
    redis.hgetall("namespace:modelName:#{id}") 
end