redis对象

redis中的每个对象都由redisObject结构表示:

typedef struct redisObject {
// 类型
unsigned type:4;
// 编码
unsigned encoding:4;
// 指向底层实现数据结构的指针
void *ptr;
// ...
} robj;
类型常量 对象名称
REDIS_STRING 字符串对象
REDIS_LIST 列表对象
REDIS_HASH 哈希对象
REDIS_SET 集合对象
REDIS_ZSET 有序集合对象

redis对象可能使用的底层实现。

类型 编码 对象
REDIS_STRING REDIS_ENCODING_INT 使用整数值实现的字符串对象
REDIS_STRING REDIS_ENCODING_EMBSTR 使用embstr编码的简单动态字符串实现的字符串对象
REDIS_STRING REDIS_ENCODING_RAW 使用简单动态字符串实现的字符串对象
REDIS_LIST REDIS_ENCODING_ZIPLIST 使用压缩列表实现的列表对象
REDIS_LIST REDIS_ENCODING_LINKEDLIST 使用双端链表实现的列表对象
REDIS_HASH REDIS_ENCODING_ZIPLIST 使用压缩列表实现的哈希对象
REDIS_HASH REDIS_ENCODING_HT 使用字典实现的哈希对象
REDIS_SET REDIS_ENCODING_INTSET 使用整数集合实现的集合对象
REDIS_SET REDIS_ENCODING_HT 使用字典实现的集合对象
REDIS_ZSET REDIS_ENCODING_ZIPLIST 使用压缩列表实现的有序集合对象
REDIS_ZSET REDIS_ENCODING_SKIPLIST 使用跳表实现的有序集合对象

查看数据库键的值对象:

type

查看数据库键的值对象的编码:

OBJECT ENCODING

字符串对象

字符串对象的编码可以是intembstrraw
如果字符串对象保存的是一个字符串值,且长度小于等于32字节,那么则使用embstr编码。embstr编码是专门用于保存短字符串的一种优化编码方式,这种编码和raw编码一样,都使用redisObject结构和sdshdr结构来表示字符串对象,但raw编码会调用两次内存分配函数来分别创建redisObject结构和sdshdr结构,而embstr编码则通过调用一次内存分配函数来分配一块连续的空间,空间依次包含redisObjectsdshdr两个结构。

简单命令

创建一个字符串对象:

set name test

查看字符串对象:

get name

列表对象

列表对象的编码可以是ziplistlinkedlist
创建一个列表对象:

RPUSH numbers 1 “three” 5

高版本redis(5.0)中的ziplist编码被listpack编码取代。listpack的优势:

  • 简化设计:去掉prevlenzltail,提高了操作的稳定性
  • 性能优化:避免频繁的内存调整,插入、删除和遍历的性能更加平稳
  • 更强的扩展性:支持更大数据范围和更高效的内存使用

简单操作命令

将元素推入列表表头:

LPUSH list 1 “zhang” 2

将元素推入列表表尾:

RPUSH list 3

查看列表对象:

LRANGE list 0 -1

1) "1"
2) "jiang"
3) "2"
4) "3"

删除列表表头节点:

LPOP list

删除列表表尾节点:

RPOP list

查看列表节点保存的值:

LINDEX list 0

"jiang"

查看列表长度:

LLEN list

修改列表节点中的值:

LSET list 0 “zhang”

哈希对象

哈希对象的编码可以是ziplist或字典。存储键值对,键是字符串,值也是字符串。

简单操作命令

添加数据到哈希对象中:

HSET ht name jiang

获取哈希对象中的数据:

HGET ht name

"jiang"

判断哈希对象中的某个键是否存在:

HEXISTS ht name

1

删除哈希对象中的指定键:

HDEL ht name

获取哈希对象中键值对数量:

HLEN ht

获取哈希对象的所有数据:

HGETALL ht

1) "name"
2) "jiang"
3) "age"
4) "25"

集合对象

集合对象的编码可以是inset或字典。存储键值对,值是null

简单操作命令

往集合中添加新元素:

SADD set name

获取集合中元素数量:

SCARD set

查找元素是否在集合中:

SISMEMBER set name

获取集合中所有元素:

SMEMBERS set

删除集合中指定元素:

SREM set name

有序集合对象

有序集合的编码可以是ziplistskiplist
跳表编码的有序集合对象使用zset结构作为底层实现,一个zset结构同时包含一个字典和一个跳跃表。跳表按照分值从小到大保存所有集合元素,除此之外,zset结构中的字典为有序集合创建一个从成员到分数的映射。

简单操作指令

添加新元素到有序集合对象:

ZADD zset 2 apple 3 banana

获取元素个数:

ZCARD zset

统计分值在给定范围内节点数目:

ZCOUNT zset 1 5

返回给定索引范围内的所有元素:

ZRANGE zset 0 1

1) "apple"
2) "banana"

删除给定成员节点:

ZREM zset apple

查看给定成员分数:

ZSCORE zset banana