惊了 redis 还能这样玩??

2018-05-07 18:39:19 +08:00
 johnsneakers
接手新项目,那个程序把 hash 当 MySQL 来用,给我说他们以前项目都这样搞。具体是:所有玩家的个人信息放在 user 这个 key 里面,hset user 10000 用户个人信息 json。 第一次见这样玩的 ,我太菜了,怎么给对方说都不听。
19340 次点击
所在节点    Redis
111 条回复
johnsneakers
2018-05-08 13:01:41 +08:00
@ety001
@enenaaa

这个帖子开的不亏....发现很多人都没搞明白我在说什么,或者误解了我说的了...吃了没文化的亏
jiangzhuo
2018-05-08 13:09:04 +08:00
100W 规模的级别这么用没啥问题吧
而且在实现某些需求的时候还更方便 比如说我要一次把这些用户数据全从 redis 里清掉
johnsneakers
2018-05-08 13:14:01 +08:00
@darklowly 谢谢你给我科普这些基础知识
nooper
2018-05-08 13:23:29 +08:00
@youxiachai 我感觉是同一时间发的,居然你比我的快。
jerryt
2018-05-08 13:41:49 +08:00
@Waterchestnut 同样遇到过, 真的肠子都悔青了
fenglangjuxu
2018-05-08 13:51:34 +08:00
这么做是有点奇怪,但是也没啥特别的.
虽然我是第二种做法.
perssy
2018-05-08 13:51:49 +08:00
@youxiachai 我想还是有点差别的,这贴里讨论的是两个问题:
1. 能否把用户信息保存在 redis 里
2. 能否把全部用户信息保存在一个 hash 中
从 append 来看,lz 纠结的是第二个问题,那么用这篇文章作为论据反驳就不适合了,因为就像文章中也提到的,一个 hash 中的 key 不建议超过 1000 个
watzds
2018-05-08 14:00:43 +08:00
我初学 redis 的时候就发现这个问题了,当时是分开了,似乎一般情况两种都行,没深究
luw2007
2018-05-08 14:06:04 +08:00
用户不到千万,单 key,或者单用户 key 都可以。
超过千万,单 key 是做不到的,单用户 key 要考虑 key 多问题。
luw2007
2018-05-08 14:19:23 +08:00
在讨论一下关于效率的问题, 两者操作都是 O(1)。所以查询速度相差无几。
底层结构上单个 key-> hashtable,单用户 key-> hashtable,两者数据结构并无区别。
单个用户 key 查找 db.hashtable 命中返回。
单个 key 查找 db.hashtable 命中 再次查询 key.hashtable 命中返回。
多出来的一次查询操作基本可以忽略掉。
shuax
2018-05-08 14:21:41 +08:00
基本操作,O(1)有什么问题?不然 hash 设计来干嘛的
youxiachai
2018-05-08 14:33:30 +08:00
@perssy 文章的例子是 3 亿信息规模....反过来说..1k 个 key 就能处理 3 亿信息...
你觉得..lz 提的几万的量..甚至百万....
无论是 cpu 还是别的...就几十万甚至几百万的量..
你想到这些是不是没考虑到实际?
sampeng
2018-05-08 15:23:16 +08:00
原则上可以,但现实中不推荐使用。
优点:
1.足够快。不会蛋疼 io 问题。
2.其实逻辑和管理会复杂,其实是被关系型数据库惯坏了。算法足够 ok。结构很好的话其实没什么问题。而且会简化很多问题。如果对数据可用性不那么高,只用 redis 反而是简单可依赖的。所以具体问题具体分析

有两点问题:
1,内存问题。100 万用户放得下,500 万用户呢?
2,单点问题。如果是云类的主机,都有一定概率的当机。自己服务器就不用说了,冷不丁挂了怎么搞。还有服务器迁移的时候得把数据 flush 到硬盘上。确保所有数据都 flush 好了才能做。另外就算全部有持久化,加载的时候如果数据足够多。真的不是一会半会。你们能忍几分钟服务不可用的状态?。做分布式很不好搞,自行做 hash 和分片不是不可以,但都用了这么大一坨了,为何不直接在 mysql 中弄呢?
Felldeadbird
2018-05-08 15:23:53 +08:00
你同事的设计没毛病啊,楼主你的方案也合理。 就看哪边业务在实际 存取中,更贴合业务。
有时候依据某个值,只取 1 点数据,和取 1 个数据,连带获取大量数据的区别。
tikiet
2018-05-08 17:25:30 +08:00
标题配合头像太有误导性了 ;)
daxiangxuezhang
2018-05-08 17:41:35 +08:00
看了标题以为是要分享什么 redis 新特性
daxiangxuezhang
2018-05-08 17:43:28 +08:00
存 hash 感觉也没什么太大的问题吧,一个 key 担心热点数据拖垮节点的话就多搞几个,keyName = user + mod(userId,n)就好了么~
Mirana
2018-05-08 18:19:19 +08:00
本身就是单线程的,hset 里所有的数据取出来用单独一个 key 并没有任何优化,反而污染了命名空间
RorschachZZZ
2018-05-08 18:23:34 +08:00
我也是 string 存用户信息。这个 key 感觉太大了
xiadada
2018-05-08 19:13:52 +08:00
@daxiangxuezhang mod 的做法并没有压榨干存储空间, 应该用 / 法, user:213 user:233 提取出来一个 user:2 然后 里面是 13 和 33

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

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

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

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

© 2021 V2EX