Redis数据类型
查阅Redis官方文档可知,Redis提供给用户的核心数据类型有以下九个,从上到下依次是字符串,哈希,列表,集合,有序集合,流,位图,位域,地址空间。因为Redis本身就是通过键值对的方式存储数据,这些数据类型都存在于Redis的value中 ,不同的数据类型,所需要的插入命令也不相同。下面我将依据官方文档对这九种数据类型依次进行介绍,本篇文章将着重对List,Set两种数据类型进行介绍。
1.List类型
List类型是用来存储多个有序的字符串(需要注意此处的有序指的是插入先后顺序,并不是大小)。在 Redis 中,可以对列表两端插⼊(push)和弹出(pop),还可以获取指定范围的元素列表、 获取指定索引下标的元素等。
(1)常见命令
操作List类型的常用命令有:lpush,lpushx,rpush,rpushx,lrange,lpop,rpop,lindex,linsert,llen,blpop,brpop。下面将按顺序依次介绍用法。
操作类型 | 命令 | 时间复杂度 |
---|---|---|
添加 | rpush key value [value ...] | O(k),k 是元素个数 |
lpush key value [value ...] | O(k),k 是元素个数 | |
linsert key before | after pivot value | O(n),n 是 pivot 距离头尾的距离 | |
查找 | lrange key start end | O(s n),s 是 start 偏移量,n 是 start 到 end 的范围 |
lindex key index | O(n),n 是索引的偏移量 | |
llen key | O(1) | |
删除 | lpop key | O(1) |
rpop key | O(1) | |
lremkey count value | O(k),k 是元素个数 | |
ltrim key start end | O(k),k 是元素个数 | |
修改 | lset key index value | O(n),n 是索引的偏移量 |
阻塞操作 | blpop brpop | O(1) |
LPUSH key element [element ...]
lpush命令用于将一个或多个元素从左侧插入。
代码语言:javascript复制LPUSHX key element [element ...]
lpushx命令用于当key存在时,将元素从左侧插入,不存在则直接返回。
代码语言:javascript复制RPUSH key element [element ...]
rpush命令用于将一个或多个元素从右侧(尾部)插入。
代码语言:javascript复制RPUSHX key element [element ...]
rpushx命令用于当key存在时,讲一个或者多个元素从右侧插入。
代码语言:javascript复制LRANGE key start stop
lrange用于获取从start到end区间的所有元素,左闭右闭。
代码语言:javascript复制LPOP key
lpop用于从list左侧取出元素(头删)。
代码语言:javascript复制RPOP key
rpop用于从list右侧取出元素(尾删) 。
代码语言:javascript复制LINDEX key index
lindex用于获取从左数第indedx位置的元素。
代码语言:javascript复制LINSERT key <BEFORE | AFTER> pivot element
linsert用于在特定位置前或后插入元素。
代码语言:javascript复制LLEN key
llen用于获取list长度 。
代码语言:javascript复制BLPOP key [key ...] timeout
blpop是lpop的阻塞版本,当所有key对应的列表都为为空时执行该命令的客户端将会阻塞,直到某个列表被其他客户端插入元素,或者设置的timeout时间到。
代码语言:javascript复制 BRPOP key [key ...] timeout
brpop是rpop的阻塞版本,具体机制参考上面的blpop。
(2)内部编码
List类型在内存中存储时的内部编码有ziplist,linkedlist两种方式。Redis会根据当前值的类型和长度动态决定使用哪种内部编码实现,可以通过object encoding key 命令来查看编码方式。
- ziplist(压缩列表):当列表的元素个数⼩于 list-max-ziplist-entries 配置(默认 512 个),同时列表中每个元素的⻓度都⼩于 list-max-ziplist-value 配置(默认 64 字节)时,Redis 会选⽤ziplist 来作为列表的内部编码实现来减少内存消耗。
- linkedlist(链表):当列表类型⽆法满⾜ ziplist 的条件时,Redis 会使⽤ linkedlist 作为列表的内部实现。
2.Set类型
集合类型也是保存多个字符串类型的元素的,但和列表类型不同的是,集合中元素之间是⽆序的,元素不允许重复。Redis 除了⽀持集合内的增删查改操作,同时还⽀持多个集合取交集、并集、差集,合理地使⽤好集合类型,能在实际开发中解决很多问题。
(1)常见命令
操作Set类型的常用命令有:sadd,smembers,sismember,scard,spop,smove,srem,sinter,sinterstore,sunion,sunionstore,sdiff,sdiffstore。下面将按顺序依次介绍用法。
代码语言:javascript复制SADD key member [member ...]
时间复杂度O(1),sadd用于将一个或者多个元素添加到set中,重复的元素无法添加到set中。
代码语言:javascript复制SMEMBERS key
时间复杂度O(N),smembers用于获取一个set中的所有元素,元素间的顺序是无序的。
代码语言:javascript复制SISMEMBER key member
时间复杂度O(1), sismember用于判断一个元素在不在set中。
代码语言:javascript复制 SCARD key
时间复杂度O(1),scard用于获取set的元素个数。
代码语言:javascript复制SPOP key [count]
时间复杂度O(N),spop用于从set中删除并返回一个或多个元素。
代码语言:javascript复制SMOVE source destination member
时间复杂度O(1),smove用于将一个元素从源set取出并放入目标set中。
代码语言:javascript复制SREM key member [member ...]
时间复杂度O(N),srem用于将指定的元素从set中删除。
代码语言:javascript复制SINTER key [key ...]
时间复杂度O(N*M)N 是最⼩的集合元素个数. M 是最⼤的集合元素个数, sinter用于获取给定set的交集中的元素。
代码语言:javascript复制 SINTERSTORE destination key [key ...]
时间复杂度O(N*M)N 是最⼩的集合元素个数. M 是最⼤的集合元素个数, sinterstore用于获取给定set的交集中的元素并保存在目标set中。
代码语言:javascript复制SUNION key [key ...]
时间复杂度O(N)N 给定的所有集合的总的元素个数, sunion用于获取给定set的并集中的元素。
代码语言:javascript复制SUNIONSTORE destination key [key ...]
时间复杂度O(N), sunionstore用于获取给定set的并集中的元素并保存在目标set中。
代码语言:javascript复制SDIFF key [key ...]
时间复杂度O(N)N 给定的所有集合的总的元素个数,sdiff用于获取指定set的差集中的元素。
代码语言:javascript复制SDIFFSTORE destination key [key ...]
时间复杂度O(N),sdiffstore用于取给定set的并集中的元素并保存在目标set中。
(2)内部编码
集合类型在内存中存储时的内部编码方式有inset,hashtable两种方式。Redis会根据当前值的类型和长度动态决定使用哪种内部编码实现,可以通过object encoding key 命令来查看编码方式。
- intset(整数集合):当集合中的元素都是整数并且元素的个数⼩于 set-max-intset-entries 配置(默认 512 个)时,Redis 会选⽤ intset 来作为集合的内部实现,从⽽减少内存的使⽤。
- hashtable(哈希表):当集合类型⽆法满⾜ intset 的条件时,Redis 会使⽤ hashtable 作为集合的内部实现。