redis占用内存的疑问

分别往27个set结构里面添加10万个 df04e 类似这样的字符。每个字符串长度大概是5。
结果一看内存占用,8MB多。

# Memory
used_memory:8963776
used_memory_human:8.55M
used_memory_rss:21229568
used_memory_rss_human:20.25M
used_memory_peak:75501696
used_memory_peak_human:72.00M
total_system_memory:8589934592
total_system_memory_human:8.00G
used_memory_lua:37888
used_memory_lua_human:37.00K
maxmemory:0
maxmemory_human:0B
maxmemory_policy:noeviction
mem_fragmentation_ratio:2.37
mem_allocator:libc

我把那些长度5的字符串的,10万个,连起来,然后写入一个文本里面,大概500KB。为啥到了redis,占用了8MB,这是为什么呢?

我把10万个 5969b4ba18c9add4a9d5f5a1 这样的字符串,每个字符串长度24,插入到一个set结构里面,结果内存占用10MB。与上面相差无几。这到底怎么回事?


我后来改成list结构,占了大概0.5MB左右。符合了真实的空间占用。是否set在分配内存的时候跟list结构有差异???
但是实际情况,我却不可能使用list替代set结构。

阅读 5.9k
2 个回答

图片描述
图片描述

这个和redis的内部编码机制有关,你可以尝试将其拆分为多个key,每个key存放512条数据,这样应该会减少不少缓存

redis 使用了数据结构其中存储有其他一些内容,可以没法和直接存储在文本文件中的大小进行比较

感谢邀请,从你的问题来看,你需要做到分片存储,就像楼上说的,每个key最多可以存储512条数据,那就多设置几个key,根据某种算法,将值分配到某个key里面,保证每个key最多512条数据,当数据过多的存储在一个key里面时,redis底层实现数据对象的结构就会发生变化了,存储空间大小及查找的速度也会有影响,有本书叫做redis设计与实现,有机会可以了解一下

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