关于 redis 的储存问题。

2018-04-08 16:42:55 +08:00
 mandy0119

有很大量用户信息,需要放进缓存中。

	方法 1:每个用户一个 key,单独存放。
	
	方法 2:所有用户存入一个 key,类型为 hash。使用时取出此 hash,再操作。

目前有点拿不准该用哪一种效率高一些,资源利用率高一些。

	讨论:数据量 N 大于何值时,方法效率最高。

	讨论:何种场景,使用方法 1/2 比较合适。

对 redis 理解不深,求大佬们解疑。

6176 次点击
所在节点    Redis
26 条回复
Immortal
2018-04-08 16:47:26 +08:00
具体没测试过,单纯从以前看过的 redis 的优化文章来看
方法 2 资源(内存)利用率高很多,方法 1 中虽然是 kv 结构,但是就算是最简单的 kv,对于 redis 的数据结构也有很多额外数据
undefinedMe
2018-04-08 16:52:20 +08:00
方法一
defunct9
2018-04-08 16:56:36 +08:00
方法二
rrfeng
2018-04-08 16:59:39 +08:00
任何情况下都应该用 1
单 key 太大是一个非常大的隐患
micean
2018-04-08 16:59:53 +08:00
lastpass
2018-04-08 17:02:38 +08:00
方法一吧。毕竟你这是不是大量用户,而是很大量用户。
用方法二,取所有用户这个数据,仅仅是数据传输都要一定的时间。
jelinet
2018-04-08 17:04:14 +08:00
方法 1 吧。
lastpass
2018-04-08 17:05:18 +08:00
而且,用方法二,你对用户信息的增删改等操作也很麻烦。容易出错。而且方法二将所有鸡蛋放在同一个篮子里。一旦这个数据发生点意外情况。你所有用户数据全部 gg。
xomix
2018-04-08 17:07:24 +08:00
数据量在千级以下的时候方法 2 都是比较优秀的,当数据量超过千的级别,你获取全部用户信息的 value 传输都是个大问题。

千级别以下我觉得基本上也用不上这些缓存了,你随便写个文本库都可以对应,所以你就不要想方法 2 了。
nowgoo
2018-04-08 17:13:22 +08:00
方案一。
1. 可制定细粒度的缓存过期策略,更灵活。
2. 用 mget/mset 读写。
3. 如果每个 value 的长度都差不多,内存利用率应该还可以的。实在不行启用压缩嘛。
myyou
2018-04-08 17:13:26 +08:00
方法二效率最高,可用在长期缓存用户信息(只在用户更新用户信息时更新 hash field 的 value )
方法一虽然内存使用率低,但是可以设置过期时间,对比不常登录用户可以避免占用内存

方法一和二除了能对每个用户设置过期时间,其实没什么区别
myyou
2018-04-08 17:14:52 +08:00
@myyou 说错了,方法一内存占用更高
Immortal
2018-04-08 17:15:03 +08:00
再多说一句 具体还得看你的 value 大小 这个也比较关键
yang2yang
2018-04-08 17:43:22 +08:00
用方法一吧,方法二导致 value 变大,会导致速度变慢的,内存利用率不是关键吧,一般都考虑时间吧?
tusj
2018-04-08 17:53:54 +08:00
方法 1 吧。
R18
2018-04-08 17:58:38 +08:00
自己做下测试?
tusj
2018-04-08 17:59:05 +08:00
方法一好。
因为如果以后要上 redis 集群的话,这些 key 可以分散到不同的主机以分摊压力。
如果用方法二,所有数据都在一个 key 下,出现单点性能问题的话,就算上 redis 集群也没用。
R18
2018-04-08 17:59:27 +08:00
如果使用方案一,如果用户真的很大,请设置 key 的自动过期或者回收机制
hustlibraco
2018-04-08 18:00:20 +08:00
方法 1 可用,方法 2 数据量上来了不可控。
在少量数据规模的时候方法二确实利用更高效,但是一般情况下不需要这么节省 redis 资源,方法一的扩展性更好,控制粒度也更细,一开始就用方法一没有后顾之忧
catinred
2018-04-08 18:01:17 +08:00
要单独对部分用户设置过期时间 那就方法 1
要是单个用户的数据量比较小 例如几 K,那就方法 2
主要还是看业务场景
无论哪种方法,都尽量避免取所有用户数据。

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/445125

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX