Redis hash结构以下两种存储方式哪种比较高效?

数据量:20万用户信息
1、微信图片_20200611114157.png
如图,20万用户放在一个hash里面,hashkey是用户的id,value是用户的信息
2、微信图片_20200611114207.png
如图,20万用户有20万个hash,每个hash的hashkey是用户信息的字段名

以上两种方式哪种更好?最好能告知下原由。

感谢各位大佬。

阅读 3.5k
3 个回答

我个人觉得,都使用到Redis了, Redis操作都是在内存中完成的, 内存效率问题大不可担心, 数据量的大小,影响了Redis序列化进行存储效率! (还有这么大的数据量存储Redis好像并不合理, 内存占用过多) (不认同莫介意!) 可以看看这个

20W 级别的数据量,二者的性能差别可忽略不计。

千万甚至亿级别以后的数据量再考虑这个事儿吧。

首先你要知道 Hash 结构随着元素的增加、性能会随之下降,主要是两个原因:内存膨胀和哈希冲突。

所以数据量特大时,一般会拆分 Hash 结构,由一次哈希变为两次哈希(即所谓的哈希桶策略)。

拿你这个场景举例子,可以把 ID 是 1 到 1W 的放在一个 Key 下,里面再用 HashKey 存每个 ID;再把 ID 是 1W 到 2W 的放另一个 Key 下,里面还是 HashKey……依此类推。客户端在存取之前,先要判断一下要取的 ID 是哪个桶下的。

大概的结构就是:

Key: user:10000
HashKey Value
1 { id: 1 }
2 { id: 2 }
Key: user:20000
HashKey Value
10001 { id: 10001 }
10002 { id: 10002 }

(这么做也不是没有缺点,不是说存取的时候多了判断的一步,是别的,你可以自己思考一下)。


P.S. 前者还有个 JSON 反序列化的性能开销,但与 Redis 无关,这里不做讨论。

新手上路,请多包涵

从设计角度看,用户量会持续增加,而userinfo的结构不怎么变化。在使用过程中,一般使用userinfo某一个字段。所以使用第二种比较合适

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题