redis 大 key 导致读取和删除性能降低的原因是什么呢?

2020-10-20 15:43:12 +08:00
 noble4cc

一个 key 大约 1M 的话,读取性能会退化成几十毫秒,如果 1k 的话只有几毫秒,按道理说读取内存性能很高的呀,为什么退化的这么严重

3643 次点击
所在节点    程序员
23 条回复
codehz
2020-10-20 15:59:46 +08:00
(你是不是没考虑到网络传输
BoarBoar
2020-10-20 16:40:15 +08:00
不负责任猜测,是因为 key 过大的话在内存中分配成不连续地址了,从数组变成了链表
Narcissu5
2020-10-20 17:04:28 +08:00
redis 要首先针对 key 计算 hash,如果 hash 冲突了还得比较,估计慢在这里了
caola
2020-10-20 17:09:22 +08:00
key 搞那长?还不如转为短的 key,再把完整的内容放到 hash 表里
zpfhbyx
2020-10-20 17:10:10 +08:00
我感觉也是网络因素..
noble4cc
2020-10-20 17:38:28 +08:00
@codehz 本机测试的,网络传输忽略,网络传输确实会,大了 tcp 要分好几个包,但是我觉得这不是根本原因,就算把测试 key 缩小为 1.5k ,一个包可以传输,1.5k 的 key 耗时涨的也挺过分的,好几毫秒的 get 请求不正常
noble4cc
2020-10-20 17:40:53 +08:00
@caola 不是 key 是,key 对应的 value
kerro1990
2020-10-20 18:56:16 +08:00
1M 内存质量不行的话,寻址都会废
4771314
2020-10-20 19:12:26 +08:00
寻址慢吧
zeroday
2020-10-20 19:15:20 +08:00
总要遍历一遍把 value 取出来吧...你 key 越大遍历的越久,能不慢吗...
Jooooooooo
2020-10-20 19:15:34 +08:00
卡在网卡上了
gitgabige
2020-10-20 19:16:45 +08:00
1M 大的 key ???
katsusan
2020-10-20 19:24:41 +08:00
用户态内存复制到内核缓冲区吧,另外 ram 的存取不命中 cache 的话本来也不快,大概要六七十纳秒起步。
scriptB0y
2020-10-20 19:30:23 +08:00
感觉是楼上说的内存寻址的问题…… 可以考虑使用 https://redis.io/commands/unlink 命令删除,这个是立即返回的。
la2la
2020-10-20 19:37:01 +08:00
@scriptB0y 抱歉,没有必要替极客时间推广,只是提供一种排查思路,因为可能造成这个问题的原因有很多,从服务器性能到网络 IO 都有可能,正好最近在看这个东西还不错就提了一下。已删除图片链接
noble4cc
2020-10-20 20:18:49 +08:00
@zeroday 字符串为什么要遍历
laminux29
2020-10-20 21:15:02 +08:00
这种有源码的东西,直接调试一下不就知道原因了,上面一堆人瞎猜我也是醉了,这种事情能猜准?
Mirana
2020-10-20 22:44:49 +08:00
1. redisdb 本身就是个大哈希表,读取和插入都要对 key 做一次哈希找到对应的 slot,对 1m 数据做哈希和 1k 数据做哈希有性能差别
2. 网络耗时增加
FutherAll
2020-10-20 23:19:49 +08:00
大 key 问题指的是 key 对应的 value 大,为什么这么多说 key 大的,key 如果到 kb 级别,感觉是 key 的设计有问题。

value 过大,比如 string 到 100KB 这种,其它容器类的比如 list zset 元素个数过多,读取和写入就会耗费大量内存和 CPU,阻塞其它操作;集群模式的话单个节点很容易压力多大。再叠加热 key 之类的,节点很容易就被打崩了。
Nillouise
2020-10-21 09:24:27 +08:00
@laminux29 具体怎么做?自己加 log 编译一个版本出来调试?还是直接编译+断点调试?

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

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

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

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

© 2021 V2EX