redis 基于简单动态字符串、双端链表、字典、压缩列表、整数集合、跳跃表等数据结构
提供了多种数据类型(string、list、hash、set、zset),不同的数据类型都有不同的适用
命令。例LPUSH 和 LLEN只能用于列表类型的键,DEL、 TTL 和 TYPE, 可以用于任何类型的键,
要正确执行这些命令就需要根据当前类型执行不同的处理方式,删除String 类型 跟删除 list
过程就不同。另外当列表类型元素的大小及个数的变更,redis对其进行优化也会使得对象的类型及编码格式
发生变化。redis 键值使用的都是redisObject 对象
redisObject 源码
typedef struct redisObject {
unsigned type:4;
unsigned encoding:4;
unsigned lru:REDIS_LRU_BITS;
int refcount;
void *ptr;
} robj;
属性 | 描述 |
---|
type | 记录当前对象的类型 string,list,hash,set,zset |
encoding | 对象使用的编码 int,embstr,raw,hashtable, ziplist,intset,linkedlist,skiplist |
lru | 对象最后一次被程序访问时间 缓存淘汰时可用上 |
refcount | 引用计数 初始值为1 作用于垃圾回收 |
ptr | 对象实际值指针 |
不同类型编码对象
数据类型 | 内部编码方式 | OBJECT ENCODING | 备注 |
---|
sting | REDIS_ENCODING_INT | “int” | 字符串对象保存的是整数,且这个整数值可以用long类型表示 |
sting | REDIS_ENCODING_EMBSTR | “embstr” | 不符合 int编码标准,同时最大的字符长度<= 44字节 |
sting | REDIS_ENCODING_RAW | “raw” | 大于44字节同时字符长度小于 512M |
list | REDIS_ENCODING_ZIPLIST | “ziplist” | redis 3.2之前 list-max-ziplist-size -2list-compress-depth 0 |
list | REDIS_ENCODING_LINKEDLIST | “linkedlist” | redis 3.2之前 |
list | REDIS_ENCODING_QUICKEDLIST | “quickedlist” | redis 3.2之后 由压缩列表组成的双向列表–>快速列表 |
hash | REDIS_ENCODING_HT | “hashtable” | |
hash | REDIS_ENCODING_ZIPLIST | “ziplist” | hash-max-ziplist-entries 512 hash-max-ziplist-value 64 |
set | REDIS_ENCODING_HT | “hashtable” | |
set | REDIS_ENCODING_INTSET | “intset” | |
zset | REDIS_ENCODING_SKIPLIST | “skiplist” | |
zset | REDIS_ENCODING_ZIPLIST | “ziplist” | |
参考
https://blog.csdn.net/weixin_39765325/article/details/111296512
https://blog.csdn.net/java_lifeng/article/details/105529667