一、一次string转化为hash的优化
1. 场景:
用户id: userId,
用户微博数量:weiboCount
2. 实现方法:
(1) 使用Redis字符串数据结构, userId为key, weiboCount作为Value
(2) 使用Redis哈希结构,hashkey只有一个, key="allUserWeiboCount",field=userId,fieldValue= weiboCount
(3) 使用Redis哈希结构, hashkey为多个, key=userId/100, field=userId%100, fieldValue= weiboCount
3. 获取方法:
#获取userId=5003用户的微博数
(1) get 5003
(2) hget allUser 5003
(3) hget 50 3
4. 内存占用量对比(100万用户 userId u:1~u:1000000)
#方法一 Memory
used_memory:118002640
used_memory_human:112.54M
used_memory_rss:127504384
used_memory_peak:118002640
used_memory_peak_human:112.54M
used_memory_lua:36864
mem_fragmentation_ratio:1.08
mem_allocator:jemalloc-3.6.0
---------------------------------------------------
#方法二 Memory
used_memory:134002968
used_memory_human:127.80M
used_memory_rss:144261120
used_memory_peak:134002968
used_memory_peak_human:127.80M
used_memory_lua:36864
mem_fragmentation_ratio:1.08
mem_allocator:jemalloc-3.6.0
--------------------------------------------------------
#方法三 Memory
used_memory:19249088
used_memory_human:18.36M
used_memory_rss:26558464
used_memory_peak:134002968
used_memory_peak_human:127.80M
used_memory_lua:36864
mem_fragmentation_ratio:1.38
mem_allocator:jemalloc-3.6.0
三、结果对比
redis核心对象 数据类型 + 编码方式 + ptr 分段hash也不会造成drift
方案 优点 缺点
string 直观、容易理解 内存占用较大 key值分散、 不便于计算整体
hash 直观、容易理解 内存占用大、 一 个key占用过大内 存,如果是redis- cluster会出现data drift
segment-hash 内存占用量小 理解不够直观
网友评论