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