1. 字符串
字符串类型是最基础的数据结构,其他的几种数据结构都是在字符串类型基础上构建的。
命令
- 设置值 set key value [ex seconds] [px milliseconds] [nx | xx]
- ex seconds 为键设置秒级别的超时时间
- px millseconds 为键设置毫秒级别的超时时间
- nx 键必须不存在才可以设置成功
- xx 键必须存在可以设置成功 (redis还提供了setex和setnx两个命令来区分)
- 批量设置值 mset key value [key value ...]
- 获取值 get key
- 批量获取值 mget key
- 计数 incr key
内部编码
- int 8个字节的长整型
- embstr 小于等于39个字节的字符串
- raw 大于39个字节的字符串
2. 哈希
哈希类型指的是键值本身又是一个键值对结构
命令
- 设置值 hset key field value (redis还提供了hsetnx,和setnx的作用一样)
- 获取值 hget key field
- 删除field hdel key field [field...]
- 计算field个数 hlen key
- 批量设置或获取 hmget key field[field...] hmset key filed vaule[field value...]
- 判断field 是否存在 hexists key field
- 获取所有的field hkeys key
- 获取所有的value hvals key
内部编码
哈希类型的内部编码有两种
- ziplist(压缩列表)当哈希类型元素个数小于hash-max-ziplist-entries配置(默认512个)同时所有的值都小于hash-max-ziplist-value配置(默认是64字节)时,会使用ziplist作为哈希的内部实现,ziplist使用更加紧凑的结构实现多个元素的连续存储,所以在节省内存方便比hashtable优秀
- hashtable(哈希表)当无法满足ziplist的条件时,会使用hashtable作为哈希的内部实现,因为此时ziplsit的读写效率会下降,而hashtable的读写时间复杂度是O(1)
3. 列表
列表类型用于存储多个有序的字符串,可以充当栈和队列的角色
命令
添加操作
- 从右边插入元素 rpush key value [value...]
- 从左边插入元素 lpush key value [value...]
- 向某个元素前或者后插入元素 linsert key before|after pivot value (linsert listkey b a)
查找
- 获取指定范围内的元素 lrange key start end
- 获取指定索引下标的元素 lindex key index
- 获取列表长度 llen listkey
删除
- 从列表左侧弹出元素 lpop key
- 从列表右侧弹出元素 rpop key
- 删除指定元素 lrem key count vaule
当count>0从左到右,删除最多count个元素
当count<0从右到左,删除最多count个绝对值个元素
当count=0,删除所有
修改
- 修改指定下标的元素 lset key index newValue
内部编码
列表类型的内部编码有两种
- ziplist:和哈希一样,当列表的元素个数小于list-max-ziplist-entries配置(默认512个),同时列表中每个元素的值都小于list-mac-ziplist-value配置(默认64字节),会选用ziplist来作为列表的内部实现来减少内存的使用
- linkedlist(链表):当ziplist的条件无法满足时,会使用linkedlist作为内部实现
4. 集合
集合和列表不一样的是,集合中不允许有重复的元素,并且是无序的,不能通过索引下标获取元素
命令
集合内操作
- 添加元素 sadd key element [element...]
- 删除元素 srem key element [element...]
- 计算元素个数 scard key 时间复杂度O(1)
- 判断元素是否在集合内 sismember key element
- 随机从集合中返回指定个数元素 srandmember key [count]
- 从集合中随机弹出元素 spop key
- 获取所有元素 smember key
集合间操作
- 求多个集合的交集 sinter key [key...]
- 求多个集合的并集 sunion key [key...]
- 求多个集合的差集 sdiff key [key...]
- 将交集、并集、差集结果保存 (sinterstore distin key [key...]) (sunionstore distin key [key...]) (sdiffstore distin key [key...])
内部编码
集合类型的内部编码有两种
- intset(集合)当集合中的元素都是整数且元素个数小于set-max-intset-entries配置(默认512个)时,会选用intset来作为集合的内部实现,从而减少内存的使用
- hashtable:当集合类型无法满足intset的条件时,会使用hashtable来实现
5. 有序集合
有序集合在集合的基础上添加了可以排序的特性,通过给每一个元素设置一个分数(score)作为排序的依据,
命令
- 添加成员 zadd key score member [score member ...]
zadd命令添加了nx,xx,ch, incr四个选项
nx: member必须不存在,才可以设置成功,用于添加
xx: member必须存在,才可以设置成功,用于更新
ch: 返回此次操作后,有序集合元素和分数发生变化的个数
incr: 对score做增加
- 计算成员个数 zcard key
- 计算某个成员的分组 zscore key member
- 计算成员的排名
- zrank key member(从低到高)
- zrevrank key member(从高到低)
- 删除成员 zrem key member[member...]
- 增加成员的分数 zincrby key increment member
- 返回指定排名范围的成员
- zrange key start end [withscore] (从低到高)
- zrevrange key start end [withsores] (从高到低)
- 返回指定分数范围的成员
- zrangebyscore key min max [withsores] [limit offset count]
- zrevrangebyscore key max min [withscore] [limit offset count] (limit offset count 选项可以限制输出的起止位置和个数)
- 删除指定排名内的升序元素 zremrangebyrank key start end
- 删除指定分数范围内的成员 zremrangebyscore key min max
内部编码
有序集合类型的内部编码有两种
- ziplist:当有序集合元素小于zset-max-ziplist-entries配置(默认128个),且每个元素的值都小于zset-max-ziplist-value配置(默认64字节)会使用ziplist,节省内存。
- skiplist(跳跃表)当ziplist条件不满足时,会使用skiplist作为内部实现。