我想将用户的个人资料存储在redis中,因为我必须经常阅读多个用户的个人资料。。我目前看到两种选择:
选项1: - 为每个用户的个人资料存储单独的哈希密钥
选项2: - 使用单个哈希键存储所有用户个人资料
请告诉我哪个选项最好考虑以下内容:
答案 0 :(得分:2)
正如Sergio Tulentsev指出的那样,以任何方式将所有用户数据(特别是如果数据集很大的情况下)存储在单个哈希中都是不好的。
如果您按照本blog post的要求进行内存优化,则也不希望将用户数据存储为单独的密钥。
使用分页机制读取用户数据需要使用数据库而不是像redis这样的简单缓存系统。因此,建议为此使用NoSQL数据库,例如mongoDB。
但是每次从数据库中读取都是一项昂贵的操作,尤其是当您要读取大量记录时。
因此,最好的解决方案是在Redis中缓存最活跃的用户数据,以消除数据库获取开销。
我建议您调查walrus。
基本上遵循以下模式:
@cache.cached(timeout=expiry_in_secs)
def function_name(param1, param2, ...., param_n):
# perform database fetch
# return user data
这可确保经常访问或请求的用户数据位于redis中,并且该函数自动从redis返回值,而不是进行数据库调用。另外,如果长时间不访问,密钥也会过期。
您将其设置如下:
from walrus import *
db = Database(host='localhost', port=6379, db=0)
主机可以在其中获取远程运行的redis集群的域名。
希望这会有所帮助。
答案 1 :(得分:1)
选项1。
如果“没有更大的数据集”,则可以将Partitioning视为Redis FAQ suggests。在Redis常见问题上,您还可以检查其他指标,例如“单个Redis实例可以容纳的最大密钥数”或“ Redis内存占用量”
答案 2 :(得分:0)
(但不要使用哈希,请使用单键。例如SET profile:4d094f58c96767d7a0099d49 {...}
)
SET
而不是HSET
的原因)HMGET
在一次通话中吸引所有用户,但前提是您的用户群不是很大。否则,服务器很难为您提供结果。选项3是将您的用户数据分解为由用户ID的哈希决定的哈希桶。如果您有很多用户并且经常进行批处理,则效果很好。像这样:
HSET profiles:<bucket> <id> {json object}
HGET profiles:<bucket> <id>
HMGET profiles:<bucket>
最后一个获取完整配置文件的文件。建议不要将其总计超过1mb。与顺序ID搭配使用时效果很好,而对于散列ID则效果不佳,因为它们可能会增长太多。如果您将它与哈希一起使用,并且它增长得太多,这会减慢您的Redis速度,则您可以回退到HSCAN
(如option2中一样),或者使用新的哈希函数将对象重新分配给更多存储桶。
如果您的情况正确,我的建议是使用第三个选项,其序号范围为100。如果您要获取大量数据,请从第一天开始计划群集。< / p>