微信公众号:霍米兹
关注可了解更多的后续内容。问题或建议,请在公众号留言。
数据系列
1 字符串系列1)数据结构之sds
2) 通过set看string
3) 字符串优化
字符串优化总结
字符串是redis最常用的数据类型,所有的键都是字符串类型,值对象除了整数外都是使用字符串存储,所以字符串内存优化至关重要。这篇文章主要是把前面两节字符串系列sds和set命令操作字符串进行总结,并指出优化点。1.sds预分配机制
redis为了减少内存再分配次数,提高性能响应采用的预分配机制,在进行字符串append时,如果拼接后的字符串小于1M,则分配两倍的字符串内存,防止下次操作添加,如果拼接后的字符串小于1M,则除字符串空间外多分配1M。假设一个值对象本身大小是20k,执行字符串追加再加20k,总的大小是40k,则redis会申请80k的空间,这样虽然减少了内存分配,但是也造成了空间浪费。 解决方案:尽量减少字符串频繁修改操作,例如append,setrange等,改为直接set字符串去处理,这样能降低预分配带来的内存浪费和内存碎片化。2.控制键的数量
有的业务场景的对象可用redis提供的数据结构替代string结构,没必要把所有的数据都搞成对象,例如hash,list,set,zset等,使用这些结构也可以节省空间,并且有的数据结构获取数据的时候只需要获取对应想要的数据,而不需要全量获取。当然也会带来一定问题就是不能使用过期时间、淘汰策略等问题,只能开发者自己记录一个时间,然后定时scan去清理,不同的结构虽然能减少内存,但是不同的数据结构也会对读写效率不同,所以如何选用合适的数据模型需要开发者平衡时间、空间、开发成本等各种因素。3.缩减键值对象
key的长度,也能占用一定的空间,key比较多、高并发场景就会比较明显,既影响空间占用也影响出流量和响应速度,所以高并发、数据量的场景尽量用业务场景的简单拼写组成key,尽量表明语义又简短。value的长度,在业务上精简业务对象,去掉不必要的属性,避免存储无效的数据。也可以采用更高效的序列化方式。4.共享对象池
共享对象池是指前文说的整数对象池0~9999,redis启动时加载证书对象池,为了节约内存。但是使用时需注意, 开启maxmemory和LRU淘汰策略后,整数对象池失效,具体原因可参考本公众号之前的文章有说明。数据优先使用整数,比字符串类型更节省空间。5.长度控制
长度允许的情况下,长度小于44个字符,44字符以下会将 raw转为embst r。embstr的内存分配、内存释放是一次而raw内存分配、释放是两次。embstr编码的数据都存放在一块连续的内存里。这种方式可以减少内存分配次数,提高内存效率,降低内存碎片。微信公众号:霍米兹
如果觉得文章对你有点帮助,欢迎转发和关注本公众号以及文章,你的点赞是小编坚持下去的唯一动力,更多好文-->欢迎光临霍米兹