redis(三)-----redis基本数据类型 (3)

"b"
修改
修改指定索引下标的元素:
lset key index newValue
实例
127.0.0.1:6379> lset listdel 0 a
OK
127.0.0.1:6379> lrange listdel 0 -1

"a"

"b"

"b"

阻塞操作
blpop key [key ...] timeout
brpop key [key ...] timeout

blpop和brpop是lpop和rpop的阻塞版本,它们除了弹出方向不同,使用方法基本相同,所以下面以brpop命令进行说明,brpop命令包含两个参数: ·key[key...]:多个列表的键。 ·timeout:阻塞时间(单位:秒)。

1)列表为空:如果timeout=3,那么客户端要等到3秒后返回,如果 timeout=0,那么客户端一直阻塞等下去:

实例
127.0.0.1:6379> lrange empty 0 -1
(empty array)
127.0.0.1:6379> brpop empty 3
(nil)
(3.08s)

2)列表不为空:客户端会立即返回
实例
127.0.0.1:6379> brpop listdel 0

"listdel"

"b"

使用brpop时,有两点需要注意。 第一点,如果是多个键,那么brpop会从左至右遍历键,一旦有一个键能弹出元素,客户端立即返回
如果多个客户端对同一个键执行brpop,那么最先执行brpop命令的客户端可以获取到弹出的值

内部编码

列表类型的内部编码有两种。

ziplist(压缩列表):当列表的元素个数小于list-max-ziplist-entries配置 (默认512个),同时列表中每个元素的值都小于list-max-ziplist-value配置时 (默认64字节),Redis会选用ziplist来作为列表的内部实现来减少内存的使 用。

linkedlist(链表):当列表类型无法满足ziplist的条件时,Redis会使用 linkedlist作为列表的内部实现。

quicklist内部编码,简单地说它是以一个ziplist为节 点的linkedlist,它结合了ziplist和linkedlist两者的优势,为列表类型提供了一 种更为优秀的内部编码实现

实例
127.0.0.1:6379> object encoding code
"quicklist"

使用场景

1.消息队列
Redis的lpush+brpop命令组合即可实现阻塞队列,生产 者客户端使用lrpush从列表左侧插入元素,多个消费者客户端使用brpop命令 阻塞式的“抢”列表尾部的元素,多个客户端保证了消费的负载均衡和高可用性
2.文章列表

实际上列表的使用场景很多,在选择时可以参考以下:

lpush+lpop=Stack(栈)

lpush+rpop=Queue(队列)

lpsh+ltrim=Capped Collection(有限集合)

lpush+brpop=Message Queue(消息队列)

集合

集合(set)类型也是用来保存多个的字符串元素,但和列表类型不一 样的是,集合中不允许有重复元素,并且集合中的元素是无序的,不能通过 索引下标获取元素。一个集合最多可以存储2^32-1个元 素。Redis除了支持集合内的增删改查,同时还支持多个集合取交集、并 集、差集

命令

集合内操作
(1)添加元素
sadd key element [element ...]

127.0.0.1:6379> sadd myset a b c
(integer) 3
127.0.0.1:6379> sadd myset a b c
(integer) 3
127.0.0.1:6379> smembers myset

"c"

"a"

"b"

(2)删除元素
srem key element [element ...]

127.0.0.1:6379> srem myset a b
(integer) 2
127.0.0.1:6379> smembers myset

"c"

(3)计算元素个数
scard key
scard的时间复杂度为O(1),它不会遍历集合所有元素,而是直接用 Redis内部的变量
127.0.0.1:6379> scard myset
(integer) 1

(4)判断元素是否在集合中
sismember key element

127.0.0.1:6379> sismember myset c
(integer) 1

(5)随机从集合返回指定个数元素
srandmember key [count]
[count]是可选参数,如果不写默认为1
实例
127.0.0.1:6379> sismember myset c
(integer) 1
127.0.0.1:6379> srandmember set 2

"a"

"b"
127.0.0.1:6379> srandmember set 2

"c"

"a"

(6)从集合随机弹出元素
spop key
实例
127.0.0.1:6379> spop set
"b"
127.0.0.1:6379> spop set
"a"

(7)获取所有元素
smembers key

集合间操作

先add两个集合
127.0.0.1:6379> sadd user:a it is a man
(integer) 4
127.0.0.1:6379> sadd user:b this is a girl
(integer) 4

(1)求多个集合的交集
sinter key [key ...]

实例
127.0.0.1:6379> sinter user:a user:b

"a"

"is"

(2)求多个集合的并集
sunion key [key ...]

实例
127.0.0.1:6379> sunion user:a user:b

"this"

"girl"

"is"

"a"

(3)求多个集合的差集
sdiff key [key ...]

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://www.heiqu.com/zzfszg.html