redis-对象robj
对象的类型与编码
版本是2.6
版本3.2及以上5.06中:
- OBJ_ENCODING_RAW: string类型内部结构,最原生的表示方式。其实只有string类型才会用这个encoding值(表示成sds)。
- OBJ_ENCODING_INT: string类型内部结构,表示成数字。实际用long表示。
- OBJ_ENCODING_HT: hash&set内部类型,表示成dict。
- OBJ_ENCODING_ZIPMAP: 是个旧的表示方式,已不再用。在小于Redis 2.6的版本中才有。
- OBJ_ENCODING_LINKEDLIST: list类型内部结构,也是个旧的表示方式,已不再用。
- OBJ_ENCODING_ZIPLIST: list&hash&zset类型内部结构,表示成ziplist。
- OBJ_ENCODING_INTSET: 整数set内部类型,表示成intset。用于set数据结构。
- OBJ_ENCODING_SKIPLIST: zset内部类型,表示成skiplist。用于sorted set数据结构。
- OBJ_ENCODING_EMBSTR: string类型内部结构,表示成一种特殊的嵌入式的sds。
- OBJ_ENCODING_QUICKLIST: list类型内部结构,表示成quicklist。用于list数据结构。
- OBJ_ENCODING_STREAM: list类型内部结构,编码为列表包的基数树
更多string多余空间回收等查看详解版:http://zhangtielei.com/posts/blog-redis-robj.html
内存回收
redis采用引用计数技术和LRU算法实现内存回收,详情https://www.cnblogs.com/WJ5888/p/4371647.html;
对象共享不单单字符串建使用,那些在数据结构潜逃了字符串对象的对象(linkedlist、hashtable、zset、)都可以使用这些共享对象。
对象空转时长
最大内存淘汰策略:
线上最大内存淘汰策略(maxmemory_policy)默认为volatile-lru。
Redis共提供8种数据淘汰策略:
- volatile-lru: 从设置过期时间的key中挑选最近最少使用的key淘汰;
- volatile-ttl: 从设置过期时间的key中挑选即将过期的key淘汰;
- volatile-random: 从设置过期时间的key中任意挑选key淘汰;
- volatile-lfu: 从设置过期时间的key中挑选使用频率最低的key淘汰;
- allkeys-lru: 从所有key中挑选最近最少使用的数据淘汰;
- allkeys-lfu: 从所有key中挑选使用频率最低的键淘汰;
- allkeys-random: 从所有key中任意挑选key淘汰;
- no-enviction: 禁止驱逐数据,当redis内存使用打到maxmemory,在该策略下,直接返回错误;
更多源码注释说明见server.h
https://github.com/dalaizhao/redis/tree/feature_code_comment