假如我们想使用redis存储许多小对象,这些对象可以使用json字符串表示,也可能是html片段和简单的key->boolean键值对 。概况的说,一切皆字符串,都可以使用string:string的形式表示.
我们假设要缓存的对象使用数字后缀进行编码,如:
- object:102393
- object:1234
- object:5
- a Key named object:12
- a Field named 34
【redis内存优化】HSET object:12 34 somevalue如你所见,每个散列表将(理论上)包含100个字段,这是CPU资源和内存资源之间的一个折中.
另一个需要你关注的是在这种模式下,无论缓存多少对象,每个散列表都会分配100个字段 。因为我们的对象总是以数字结尾,而不是一个随机的字符串 。从某些方面来说,这是一种隐性的预分片 。
对于小数字怎么处理?比如object:2,我们采用object:作为key,所有剩下的数字作为一个字段 。所以object:2和object:10都会被存储到key为object:的散列表中,但是一个使用2作为字段,一个使用10作为字段 。
这种方式将节省多少内存?
我使用了下面的Ruby程序进行了测试:
require 'rubygems'require 'redis'Useoptimization = truedef hash_get_key_field(key) s = key.split(":") if s[1].length > 2 {:key => s[0]+":"+s[1][0..-3], :field => s[1][-2..-1]} else {:key => s[0]+":", :field => s[1]} endenddef hash_set(r,key,value) kf = hash_get_key_field(key) r.hset(kf[:key],kf[:field],value)enddef hash_get(r,key,value) kf = hash_get_key_field(key) r.hget(kf[:key],kf[:field],value)endr = Redis.new(0..100000).each{|id| key = "object:#{id}" if UseOptimization hash_set(r,key,"val") else r.set(key,"val") end}在redis2.2的64位版本上测试结果:
- 当开启优化时使用内存1.7M
- 当未开启优化时使用内存11M
推荐阅读
- redis sds 介绍
- Redis两种持久化机制RDB和AOF详解
- 网站结构从哪方面优化?
- 网站优化的robots.txt使用
- 阿里架构师教你处理高并发:2种方法,解决Redis和Mysql一致性
- 你真的了解SEO优化吗?浅谈用户体验优化
- 免费的WordPress图片优化压缩插件reSmush 支持后台自动批处理
- 内存|独特气泡RGB柔光!阿斯加特洛基DDR4 3600内存图赏
- 直通车点击转化率的优化思路 直通车点击转化率是什么意思
- 教你一招:orderBy排序优化
