zoukankan      html  css  js  c++  java
  • 第三课补充01——set类型 sorted类型命令操作详解,redis管道及事务

    1、 set类型的命令操作:

    1)sadd命令:向key指定的set集合添加成员

     

     

    ##sadd命令:是设置set集合类型的数据,sadd  <key> <mumber> [<mumber>]

    ##<key>不存在的时候,sadd命令创建key并向集合添加成员;

    ##注意,成员之间空格分隔,如果用逗号,则表示是同一个成员

    ##set集合里,member是不重复的

     

    2)smove命令:是原子操作,将指定的member从source移动到desitination

    ##其中,source destination均是指set类型的key,member是source里的某个成员

    ##smove命令:用于两个集合之间成员的移出、移入;

     

     

    3)spop命令:从key指定的set集合里移除一个值,返回值是被移除的member,没有或key不存在则返回nil

     

    ##spop命令,是从集合里移除一个member,是随机移除的,因为set是无序的,sorted set才是有

     

     

    ##set里的member是非重复的,且存入和pop是无序的,set集合本身就是无序的

     

    4)srem命令:从指定key的set集合里移除指定的member,返回值是移除的member的数量

     

     

     

    5)scard命令:返回key对应的set集合里member数量

     

     

     

    6)smembers命令:返回key对应的集合的所有成员

     

     

     

    7)sdiff命令:返回第一个集合存在,而后面集合里不存在的成员

     

     

     

    settest1={s1 s2 s3 s4}

    settest2={s1 s2 s3}

    settest3={s1 s2 s3 s4}

    sdiff settest1 settset2命令后,返回settest1里存在,而settest2里不存在的成员值,因此返回值为s4

    sdiff settest1 settset2 settest3命令,则是以settest1为比较基准,返回settest1里存在而其他集合不存在的成员,因此上面第二个例子返回值为empty set

     

    8)sdiffstore命令:与sdiff一样,但是会把存在差异的值放在destination的set中

     

     

     

    9sinter命令:返回两个集合的交集

     

     

    settest1={s1 s2 s3 s4}

    settest2={s1 s2 s3}

    sinter settest1 settest2命令后,返回settest1和settest2集合的交集member

     

    10)sinterstore命令:将交集存储到一个集合里

     

     

     

    11)sismember 命令:判断该成员是否在该集合里

     

     

     

    12)srandmember命令:随机返回集合里指定个数个成员,不指定个数则随机返回一个成员

     

     

     

    13)sunion命令:返回所有集合的成员

     

     

     

    14)sunionstore命令:求集合的并集,并把结果存在在新集合上

     

    15)sscan命令:对集合里的成员遍历,用法和scan类似,scan是对string类型的key做遍历;sscan命令是对指定集合里的成员做遍历,可以模式匹配

     

     

     

    2、 sorted set(排序后的set集合)类型的命令操作:

    ##set集合里,数据的排序和插入的次序是不相关的,sorted set集合里的数据排序是有序的;

    1)zadd命令:将后面的成员按照一定的排序分数放入key指定的sorted set里

     

    (1) xx选项是只有成员存在才能操作,也就是对成员的update操作;

    (2) nx选项是针对不存在的成员才能操作,也就是对成员的insert操作;

    (3) ch选项表示返回的值不是新增元素的数量,而是发生变化的元素的数量,不加ch,返回值是新增原因的数量;

    (4) incr选项,指定后后面只能有一对score-member,表示给成员的score增加对应的值,不同的成员有相同的score时,按照成员的字典序进行排序;

     

     

     

    ##按照1 2 3的顺序,向有序集合sset1里添加3个成员:11 22 33

     

     

     

     

    2)zrange命令:返回key指定的set集合里指定区间的member

     

     

    3)zscore命令:获取key对应的set集合中指定member的score值

     

     

    4)zscan命令:与scan类似

     

     

    5)zcard命令:返回key指定的set集合里的所有成员数量

     

     

    6)zcount命令:返回key指定的set集合里,满足min<=score<=max条件的元素的数量

     

     

    7)zincreby命令:把key指定的set集合里,指定的member的score增加increment

     

     

    8)zinterstore命令:求指定key对应的集合的交集,并存入新集合key

     

    9)zunionstore命令:求指定key对应的集合的并集,并存入新集合key

     

    10)zrangebylex命令:当集合里所有元素的score都一样时,用此命令可以去除key的集合中符合字典序min max之间的值

     

     

     

    3、 管道

     

    (1) redis的客户端和服务器端通信,有网络传输,假设网络传输可以承受100字节,但是由于redis命令输送量比较少,如果发送一个命令就封装一个包,传输数据包没有把网络占全,而在同样的网络时延下,一个命令一个传输包,带的信息量很少,导致网络的吞吐率不高。如果传输包里有多个redis命令,占满网络传输承载,这样可以提高客户端的吞吐率。

    (2) 在这个背景下,提供管道——以批量形式将命令从客户端传输到服务器上,提高客户端吞吐率,注意的是,管理传输的命令,必须同时执行完,缓存到服务器端,再一起返回给客户端。

    (3) 由于中间执行结果会缓存到内存,命令执行结果数据较多的时候,会导致服务器端内存暴增;当已经把网络填充满后,再增加多的命令,不会提升性能,主要涉及到最大报文段长度的值;

    (4) 不用管道,和用管道,性能相差6倍多

     

     

    4、 事务

     

    ##redis的事务,不像关系型数据库那样严谨,没有事务回滚机制,一旦某个命令执行失败,剩余命令依旧执行,会导致整个事务数据不完整。

    ##一般的语句执行错误都是由于命令错误等bug导致,某些情况了执行总会成功,例如mset命令。因此为了获取较高的性能,在不是很严格的业务场景下,可以大胆使用redis事务;如果是在非常严格的场景使用,建议增加类似对账机制进行数据的校验和纠正处理。

     

    1)事务的成功提交

     

    2)事务的丢弃(失败)

     

    3)事务里的乐观锁(乐观锁只针对一次事务有效)

     

    在窗口1里执行:

    (1)string1原值为是s1,string2原值为s2

    (2)先用乐观锁监控string1

    (3)以事务方式,对string1和stirng2做修改

    (3)事务尚未提交

     

     

    在窗口2里执行:

    (4)修改string1的值

     

     

     在窗口1里执行:

    (5)提交(3)里未提交的事务,exec提交事务,发现返回nil,说明事务失败

    (6)查看string1值为s11111,说明窗口2里对string1的修改生效了;string2值为s2,是最初的值没有修改。

    总结:在使用乐观锁监控下,一旦事务内的被乐观锁监控的key发生变化(被乐观锁监控的key被修改了),就会导致事务失败。





  • 相关阅读:
    jhat:虚拟机堆转储快照分析工具
    jmap:java内存影像工具
    jinfo:Java配置信息工具
    jstat:虚拟机统计信息监视工具
    jps:虚拟机进程状况工具
    jdk工具总领
    到底是"/"还是"/*"
    jdk_keytool
    html地图定位
    java 手机号码归属地查询
  • 原文地址:https://www.cnblogs.com/cjing2011/p/b08a8e9913bcc936105762c020b46dcc.html
Copyright © 2011-2022 走看看