zoukankan      html  css  js  c++  java
  • Set,Sorted Set相关命令操作,批量插入及管道,事务

    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命令ͺ因此为了获取比较高的性能,
    在不是很严格的业务场景还是可以大胆使用的,如果在非常严谨的场景使用,建议增加类似对账机制进行数据的验证和纠错处理

  • 相关阅读:
    33. 搜索旋转排序数组
    54. 螺旋矩阵
    46. 全排列
    120. 三角形最小路径和
    338. 比特位计数
    746. 使用最小花费爬楼梯
    spring boot的一些常用注解
    SSM整合Dubbo案例
    一些面试题
    Spring Aop和Spring Ioc(二)
  • 原文地址:https://www.cnblogs.com/yhq1314/p/10001025.html
Copyright © 2011-2022 走看看