首页 > 技术文章 > Set,Sorted Set相关命令操作,批量插入及管道,事务

yhq1314 2018-11-22 14:52 原文

Set

SADD key member [member ...]

向key指定的set集合添加成员,次集合是排重的,从2.4版本后才支持添加多个
如果key不存在则创建key以及set集合
返回当前操作成功添加的成员数量,不是所有的成员数量
SMOVE source destination member
把key为source的set中值为member的成员移动到key为destination的set集合中
该操作是原子操作
如果source不存在或者member不存在source中,则返回0ͺ否则返回1
SPOP key
从key指定的set集合中移除一个值
如果有值可以移除就返回被移除的值,没有或者key不存在则返回nil
SREM key member [member ...]
从key指定的set中移除member的成员,如果某个member不存在,则会被忽略,成功后返回被移除的数量
SCARD key
返回key对应的集合成员数量
SMEMBERS key
返回key对应的set的所有成员
SDIFF key [key ...]
返回第一个key与后面其它可以对应的set中不存在的值
127.0.0.1:6379> smembers settest
(empty list or set)
127.0.0.1:6379> sadd settest 11 22 33
(integer) 3
127.0.0.1:6379> smembers settest
1) "11"
2) "22"
3) "33"
127.0.0.1:6379> srem settest 11
(integer) 1
127.0.0.1:6379> smembers settest
1) "22"
2) "33"
127.0.0.1:6379> scard settest
(integer) 2
127.0.0.1:6379> sadd set2 88 99 10
(integer) 3
127.0.0.1:6379> sadd set2 33
(integer) 1
127.0.0.1:6379> sdiff settest set2
1) "22
SDIFFSTORE destination key [key ...]
与SDIFF一样,但是会把差异存在的值放在destination的set中
如果destination已经存在,将会覆盖,即原来的set中的值都没有了
返回destination中值的个数
SINTER key [key ...]
返回key对应的set中值的交集,如果key不存在,就被当作是空集合,返回值交集的元素
127.0.0.1:6379> sinter settest set2
1) "33"
SINTERSTORE destination key [key ...]
与SINTER一样,但是把交集的数据存储在desttination中
SISMEMBER key member
判断member是不是key对应set的成员,如果是返回1,如果key不存在或者不是返回0

SRANDMEMBER key [count]
不带参数count,则从key指定的set中随机返回一个成员
从2.6版本后,增加count,如果count>0,则随机返回count个不同的值ͺ如果count<0,返回多个值,但可能会有相同的值,数量就是count的绝对值
SUNION key [key ...]
返回所有key中的所有值,如果值有相同的,则会去重
127.0.0.1:6379> srandmember settest
"22"
127.0.0.1:6379> smembers settest
1) "22"
2) "33"
127.0.0.1:6379> srandmember settest
"33"
127.0.0.1:6379> srandmember settest 3
1) "22"
2) "33"
127.0.0.1:6379> srandmember settest -3
1) "22"
2) "22"
3) "33"
127.0.0.1:6379> sadd set1 100
(integer) 1
127.0.0.1:6379> sunion set1 settest
1) "22"
2) "33"
3) "100"
127.0.0.1:6379> sadd set1 33
(integer) 1
127.0.0.1:6379> sunion set1 settest
1) "22"
2) "33"
3) "100"
SUNIONSTORE destination key [key ...]
与sunion功能一致,不过把合并后的数据放在destination这个set集合,返回集合的长度
SSCAN key cursor [MATCH pattern] [COUNT count]

Sorted Set

ZADD key [NX|XX] [CH] [INCR] score member [score member ...]
把后面的成员,按照一定的排序分数放入key指定的sorted set
如果member已经存在,则会更新score,同时把该元素插入新的顺序位置
XX表示只有member存在才能操作,也就是只能更新score
NX,表示不更新,只做插入,即如果有成员存在,该操作会失败,不存在就插入
Ch表示返回的值不是新增元素的数量而是发生变化的元素的数量,包括:新增元素和已经存在的但是score被修改的元素
Incr,当指定该属性时,后面只能有一对score-member,表示给member成员的score增加对应的值
当不同的成员具有相同的score时,redis会按照成员的字典序进行排序
如果不加ch选项,则返回被添加的新成员的数量ͺ如果采用incr选项则返回的是增加后的元素的score
127.0.0.1:6379> zadd sett1 1 11 2 22 3 33
(integer) 3
127.0.0.1:6379> zrange sett1 0 10
1) "11"
2) "22"
3) "33"
127.0.0.1:6379> zadd sett1 xx 20 22
(integer) 0
127.0.0.1:6379> zrange sett1 0 10
1) "11"
2) "33"
3) "22"
127.0.0.1:6379> zadd sett1 xx ch 21 22
(integer) 1
127.0.0.1:6379> zrange sett1 0 10
1) "11"
2) "33"
3) "22"
127.0.0.1:6379> zadd sett1 incr 100 11
"101"
127.0.0.1:6379> zrange sett1 0 10
1) "33"
2) "22"
3) "11"
ZRANGE key start stop [WITHSCORES]
返回key指定的set的某个区间值
Set的第一个值下标是0,如果start或者stop为负数,则表示倒数第几个
当带上属性withscores时,返回的值会带上score
ZSCORE key member
获取key对应的set集合中member成员的score值
ZSCAN key cursor [MATCH pattern] [COUNT count]
与scan类似,以游标的方式遍历key对应的set集合的值
127.0.0.1:6379> zrange sett1 0 10 withscores
1) "33"
2) "3"
3) "22"
4) "21"
5) "11"
6) "101"
127.0.0.1:6379> zscore sett1 33
"3"
127.0.0.1:6379> zscan sett1 0
1) "0"
2) 1) "33"
2) "3"
3) "22"
4) "21"
5) "11"
6) "101"
ZCARD key
返回key指定的set的所有成员数量
ZCOUNT key min max
返回key指定的set集合中,min<=score<=max的元素的数量
ZINCRBY key increment member
把key中的member元素的score增加increment数
ZINTERSTORE destination numkeys key [key ...] [WEIGHTS weight [weight ...]] [AGGREGATE
SUM|MIN|MAX]
求指定的key对应的集合中的交集,numkeys表示被求交集的key的数量,必须完全一致
默认交集元素的score是所有集合中score的和,可以通过AGGREGATE的参数SUM MIN MAX来指定其它算法
还可以通过WEIGHTS指定不同key的权重,参与score计算的权重
127.0.0.1:6379> zcard sett1
(integer) 3
127.0.0.1:6379> type sett1
zset
127.0.0.1:6379> zrange sett1 0 10
1) "33"
2) "22"
3) "11"
127.0.0.1:6379> zrange sett1 0 10 withscores
1) "33"
2) "3"
3) "22"
4) "21"
5) "11"
6) "101"
ZUNIONSTORE destination numkeys key [key ...] [WEIGHTS weight [weight ...]] [AGGREGATE
SUM|MIN|MAX]

求指定的key对的集合中的并集,numkeys表示被求交集的key的数量,必须完全一致
如果有交集的元素,则几个元素的score是所有集合中score的和,可以通过AGGREGATE的参数SUM MIN MAX来指定其它算法
还可以通过WEIGHTS指定不同key的权重,参与score计算的权重
ZRANGEBYLEX key min max [LIMIT offset count]
当集合的所有元素的score都一样时,通过该命令取出key的集合中符合字典序min max区间的值
Min和max必须以[开头,代表不等于和等于,比如min为[5,则带表大于等于5
用-号代表无穷小,+号带表无穷大,如果min为-,max为+则代表返回所有的值
Limit用于分页返回,类似于mysql的limit,offset是第几条
ZLEXCOUNT key min max
当集合的所有元素的score都一样时,通过该命令取出key的集合中符合字典序min max区间的值的个数
Min和max必须以或者[开头,代表不等于和等于,比如min为[5,则代表大于等于5
用-号代表无穷小,+号代表无穷大,如果min为-,max为+则带表返回所有的值
ZREVRANGEBYLEX key max min [LIMIT offset count]
与zrangebylex功能类似,不过它是从大到小的返回值列表
ZRANGEBYSCORE key min max [WITHSCORES] [LIMIT offset count]
取出分数(score)位于min和max之间的元素,默认是包含最小和最大两个边界,也可以采用(或者[来明确表示边界
• Withscores可以把符合要求的元素的score值一起查询出来
• Limit类似mysql的limit,offset带表起始值,count带表查询数量
• 可以通过-inf和+infї表无穷小和无穷大
ZRANK key member
• 返回key集合中,元素member对应的排序ѹ置
• 如果key不存在或者member不存在,返回nil
ZREM key member [member ...]
• 删除key指定的set集合中对应的元素
• 返回被删除的元素的数量,不包括不存在的元素
ZREMRANGEBYLEX key min max
• 当集合所有元素的score相同时,删除该集合中字典序范围为min和max的元素
• Min和max的定义参考ZRANGEBYLEX命令
• 返回被删除的元素个数
ZREMRANGEBYRANK key start stop
• 删除key对应集合中排序顺序为start和stop中间的元素
• Start和stop可以为负数表示从最大排序的倒数,正序的下标从0开始
• 返回被删除的元素个数
ZREMRANGEBYSCORE key min max
• 删除key指定的set集合中对应的元素,score满足min和max大小
• 返回被删除的元素的数量,不包括不存在的元素
ZREVRANGE key start stop [WITHSCORES]
• 与zrange类似,但是љ倒序方式查询
• 返回符合条件的元素
ZREVRANGEBYSCORE key max min [WITHSCORES] [LIMIT offset count]
以倒序的方式返回key对ځ集合中,score在max和min中间的元素
• Withscores表示返回元素时显示元素的score值
• Limit类似mysql的limit,offset表示起始值,count表示数量
ZREMRANGEBYSCORE key min max
删除key指定的set集合中对ځ的元素,score满足min和max大小
• 返回被删除的元素的数量,不包括不存在的元素
ZREVRANK key member
返回key集合中member元素的排序ѹ置,key对ځ的集合倒排后member所处的位置
• 返回倒序序号,如果key不存在或者member不存在则返回nil

 

管道(pipelining)

为了提升客户端服务器器端的通信效率,从而可以提升客户端的吞吐率,redis提供了pipelining来一次
可以发起多个命令,并且要等多个命令执行完成才能返回最终结果
注意事项
由于中间执行结果会先缓冲到内存,所以如果命令执行结果数据比较多的话会导致服务器内存暴增
当已经把网络包填充满后,再增加多的命令,并不会提升性能,主要涉及到最大报文段长度的值

事务操作命令


- MULTI,开启一个事务
– EXEC,执行事务中所有的命令,即MULTI后所有的命令
– DISCARD,类似回滚,即不执行MULTI后的所有命令
– WATCH,类似于乐观锁的实,࣫当事务执行期间(实就是事务开始时,因为redis是单线程,一旦开
始执行,数据不会被其它线程的命令修改),被观察的key的值发生变化,则事务不会执行
– UNWATCH,取消观察,即取消乐观锁
事务的本质理解
类似于命令队列,保证命令的顺序性,并会检查入队列的每个命令的语法合法性
所有命令执行过程不会被打断,即使中间某个命令执行失败,也会把剩下的所有命令都执行完成
当事务通过exec或者discard后,watch乐观锁会失效

127.0.0.1:6379> multi
OK
127.0.0.1:6379> set tkey 111
QUEUED
127.0.0.1:6379> set t2 222
QUEUED
127.0.0.1:6379> set tkey 333
QUEUED
127.0.0.1:6379> exec
1) OK
2) OK
3) OK
127.0.0.1:6379> get tkey
"333"
127.0.0.1:6379> get t2
"222"
127.0.0.1:6379> multi
OK
127.0.0.1:6379> set tkey 555
QUEUED
127.0.0.1:6379> set t2 333
QUEUED
127.0.0.1:6379> discard
OK
127.0.0.1:6379> get tkey
"333"
127.0.0.1:6379> get t2
"222"
127.0.0.1:6379> exec
(error) ERR EXEC without MULTI

Redis原子性有一定的局限性,它只能检查语句的合法性(入队检查),如果进入队列的语句不合法,则整个事务不会提交ͺ
如果采用乐观锁(watch),则,当对应的key的值发生变化,则事务部会提交

因为redis是单线程执行,即同时刻只有一个命令在执行,因此不会出࣫在执行过程中数据被其他命令修改的情况
执行过程中宕机不会导致数据不一致,因为通过持久化机制可以按照执行成功的标准检测
有一定的局限性:没有事务回滚机制,一旦某个命令执行失败(剩下的命令依然会继续执行),会导致整个事务的数据不能完整

单线程执行,具备很好的隔离性

依赖redis的持久化机制,如果采用aof,则需要设置appendfsync为always时,每个命令的执行都会写入磁盘

关于事务
1.并不能像关系型数据库那样严谨
2.一般的语句执行错误都是由于命令错误等bug导致,某些命令执行总会成功,比如mset命令ͺ因此为了获取比较高的性能,
在不是很严格的业务场景还是可以大胆使用的,如果在非常严谨的场景使用,建议增加类似对账机制进行数据的验证和纠错处理

推荐阅读