redis总结2-Redis六种数据类型命令总结(附命令实例)

来源:互联网 发布:ssH访问境外服务器端口 编辑:程序博客网 时间:2024/06/05 14:32

redis总结1-Redis简介、安装、集群

redis总结2-Redis六种数据类型命令总结(附命令实例)

redis总结3-持久化rdb,aof,运维命令,Sentinel监控

redis总结4-KEY设计技巧,常见问题

一.简介

1.1 NoSQL简介

1.1.2 NoSQL特点

1.1.3 NoSQL适用场景

1.2 Redis简介

1.2.1 简介

1.2.2 Redis具体适用场合

1.2.3 redis和memcached相比

1.2.4 redis,mysql,mongodb对比

二.安装

2.1 单机安装

2.2 设值环境变量及服务

2.3 安装后的目录结构

2.4 配置详解

2.5 集群

三 Redis命令

3.1 连接命令

/usr/local/redis/bin/redis-server ../conf/6379.conf 指定配置文件启动服务
/usr/local/redis/bin/redis-cli 本地连接
/usr/local/redis/bin/redis-cli -h 192.168.2.210 -p 7000 远程连接
/usr/local/redis/bin/redis-cli -h 192.168.2.210 -p 7000 -a password 远程连接有密码
config get requirepass 获取配置密码
config set requirepass newPassword配置授权密码
/usr/local/redis/bin/redis-server –version 查看redis版本,返回:Redis server v=3.0.7 sha=00000000:0 malloc=jemalloc-3.6.0 bits=64 build=7f1378f0349abebd
./redis-benchmark -n 10000 测试压力

//测试redis服务压力,该测试结果为centos7的虚拟机,redis版本为4.0.1[root@bogon bin]# ./redis-benchmark -n 10000====== PING_INLINE ======  10000 requests completed in 0.14 seconds  50 parallel clients  3 bytes payload  keep alive: 199.13% <= 1 milliseconds99.51% <= 30 milliseconds99.55% <= 31 milliseconds99.83% <= 32 milliseconds100.00% <= 32 milliseconds70422.53 requests per second====== PING_BULK ======  10000 requests completed in 0.13 seconds  50 parallel clients  3 bytes payload  keep alive: 198.80% <= 1 milliseconds100.00% <= 1 milliseconds77519.38 requests per second====== SET ======  10000 requests completed in 0.17 seconds  50 parallel clients  3 bytes payload  keep alive: 195.13% <= 1 milliseconds96.80% <= 2 milliseconds97.01% <= 3 milliseconds98.97% <= 4 milliseconds99.20% <= 19 milliseconds99.51% <= 25 milliseconds99.91% <= 26 milliseconds100.00% <= 27 milliseconds59523.81 requests per second====== GET ======  10000 requests completed in 0.11 seconds  50 parallel clients  3 bytes payload  keep alive: 199.47% <= 1 milliseconds100.00% <= 1 milliseconds92592.59 requests per second====== INCR ======  10000 requests completed in 0.10 seconds  50 parallel clients  3 bytes payload  keep alive: 199.62% <= 1 milliseconds100.00% <= 1 milliseconds97087.38 requests per second====== LPUSH ======  10000 requests completed in 0.10 seconds  50 parallel clients  3 bytes payload  keep alive: 199.76% <= 1 milliseconds100.00% <= 1 milliseconds99009.90 requests per second====== RPUSH ======  10000 requests completed in 0.11 seconds  50 parallel clients  3 bytes payload  keep alive: 199.66% <= 1 milliseconds100.00% <= 1 milliseconds94339.62 requests per second====== LPOP ======  10000 requests completed in 0.10 seconds  50 parallel clients  3 bytes payload  keep alive: 199.72% <= 1 milliseconds100.00% <= 1 milliseconds100000.00 requests per second====== RPOP ======  10000 requests completed in 0.10 seconds  50 parallel clients  3 bytes payload  keep alive: 199.80% <= 1 milliseconds100.00% <= 1 milliseconds95238.10 requests per second====== SADD ======  10000 requests completed in 0.11 seconds  50 parallel clients  3 bytes payload  keep alive: 199.43% <= 1 milliseconds100.00% <= 1 milliseconds90909.09 requests per second====== HSET ======  10000 requests completed in 0.11 seconds  50 parallel clients  3 bytes payload  keep alive: 199.43% <= 1 milliseconds100.00% <= 1 milliseconds94339.62 requests per second====== SPOP ======  10000 requests completed in 0.11 seconds  50 parallel clients  3 bytes payload  keep alive: 199.56% <= 1 milliseconds100.00% <= 1 milliseconds94339.62 requests per second====== LPUSH (needed to benchmark LRANGE) ======  10000 requests completed in 0.10 seconds  50 parallel clients  3 bytes payload  keep alive: 199.19% <= 1 milliseconds100.00% <= 2 milliseconds96153.84 requests per second====== LRANGE_100 (first 100 elements) ======  10000 requests completed in 0.26 seconds  50 parallel clients  3 bytes payload  keep alive: 180.14% <= 1 milliseconds99.93% <= 2 milliseconds100.00% <= 2 milliseconds38314.18 requests per second====== LRANGE_300 (first 300 elements) ======  10000 requests completed in 0.64 seconds  50 parallel clients  3 bytes payload  keep alive: 10.01% <= 1 milliseconds95.22% <= 2 milliseconds99.85% <= 3 milliseconds99.86% <= 4 milliseconds100.00% <= 4 milliseconds15625.00 requests per second====== LRANGE_500 (first 450 elements) ======  10000 requests completed in 0.95 seconds  50 parallel clients  3 bytes payload  keep alive: 10.04% <= 1 milliseconds1.02% <= 2 milliseconds92.41% <= 3 milliseconds98.50% <= 4 milliseconds99.56% <= 5 milliseconds99.85% <= 6 milliseconds99.87% <= 7 milliseconds100.00% <= 8 milliseconds10570.83 requests per second====== LRANGE_600 (first 600 elements) ======  10000 requests completed in 1.15 seconds  50 parallel clients  3 bytes payload  keep alive: 10.01% <= 1 milliseconds0.28% <= 2 milliseconds84.16% <= 3 milliseconds98.90% <= 4 milliseconds99.77% <= 5 milliseconds100.00% <= 5 milliseconds8726.00 requests per second====== MSET (10 keys) ======  10000 requests completed in 0.17 seconds  50 parallel clients  3 bytes payload  keep alive: 194.71% <= 1 milliseconds99.85% <= 2 milliseconds100.00% <= 2 milliseconds58479.53 requests per second

3.1 Redis通用命令

命令 举例 说明 select select 0 选择数据库,默认为0数据库,配置默认16个数据库(0~15) move move key db 将key移动到db中 flushdb flushdb 清空redis数据库 keys keys pattern 查询相应的key,模糊匹配,* 通配多个,?通配一个,[]通配括号中的某一个 randomkey randomkey 返回随机key exists exists key 是否存在某key del del key1 key2 … Keyn 删除1个或多个键,不存在的忽略,返回实际删除的个数 rename rename key newkey 给key赋一个新的key名,如果newkey已存在,则newkey的原值被覆盖 renamenx renamenx key newkey(nx–> not exists) 把key改名为newkey,发生修改返回1,未发生修改返回0 type type key 返回key存储的类型,string,link,set,order set, hash ttl ttl key 查询key的生命周期,返回秒,不存在的key,返回-2,已过期/不过期返回-1 pttl pttl key 查询key的生命周期,返回毫秒,不存在的key,返回-2,已过期/不过期返回-1 expire expire key 过期时间,返回秒 pexpire pexpire key 过期时间,返回毫秒 persist persist key key置为永久有效

3.2 Redis字符串操作

命令 举例 说明 set set key value [ex 秒数] / [px 毫秒数] [nx] /[xx] nx: 表示key不存在时,执行操作;xx: 表示key存在时,执行操作 mset mset key1 v1 key2 v2 multi set , 一次性设置多个键值 get get key 获取key的值 mget mget key1 key2 ..keyn 获取多个key的值 setrange setrange key offset value 把字符串的offset偏移字节,(覆盖式)改成value,如果偏移量>字符长度, 该字符自动补0x00 append append key value 把value追加到key的原值上 getrange getrange key start stop 是获取字符串中 [start, stop]范围的值,对于字符串的下标,左数从0开始,右数从-1开始,,最右边-1,倒数第二是-2,倒数第三是-3 getset getset key newvalue 获取并返回旧值,设置新值 incr incr key 指定的key的值加1,并返回加1后的值(不存在的key当成0,再incr操作,范围为64有符号) incrby incrby key number 指定key加指定数值number incrbyfloat incrbyfloat key floatnumber 指定key加指定浮点数目 decr decr key 指定key减1 decrby decrby key number 指定key减指定数目number getbit getbit key offset 获取值的二进制表示,对应位上的值(从左,从0编号),set字符串之后,根据ASCII码,对应的2进制的位上对应的值.多个字符串,就是合并在一起的. 如:字符串ABCDEF转换后为:01000001 01000010 01000011 01000100 01000101 01000110 setbit setbit key offset value 设置指定位上(从0开始)对应二进制位上的值,返回: 该位上的旧值 bitop bitop operation destkey key1 [key2 …] 对key1,key2..keyN作operation,并将结果保存到 destkey 上,operation 可以是 AND(都为1才1) 、 OR(有一个1则1) 、 NOT 、 XOR(两位不同时结果为1,否则为0 )
//setrange,坐标从0开始redis 127.0.0.1:6379> set greet helloOKredis 127.0.0.1:6379> setrange greet 2 x(integer) 5redis 127.0.0.1:6379> get greet"hexlo"redis 127.0.0.1:6379> setrange greet 6 !(integer) 7redis 127.0.0.1:6379> get greet"heyyo\x00!"//getrange,字符串的下标,左数从0开始,右数从-1开始,最右边-1,倒数第二是-2,倒数第三是-3redis 127.0.0.1:6379> set title 'chinese'OKredis 127.0.0.1:6379> getrange title 0 3"chin"redis 127.0.0.1:6379> getrange title 1 -2"hines"注意: 1: start>=length, 则返回空字符串2: stop>=length,则截取至字符结尾3: 如果start 所处位置在stop右边, 返回空字符串//getset key newvalue,获取并返回旧值,设置新值redis 127.0.0.1:6379> set cnt 0OKredis 127.0.0.1:6379> getset cnt 1"0"redis 127.0.0.1:6379> getset cnt 2"1"//根据ASCII//01000001  A//01000010  B//测试setbit 127.0.0.1:6379> set char AOK127.0.0.1:6379> setbit char 7 1(integer) 1127.0.0.1:6379> set char AOK127.0.0.1:6379> setbit char 6 1(integer) 0127.0.0.1:6379> setbit char 7 0(integer) 1127.0.0.1:6379> get char"B"//以上就是由A的01000001,将第6(从左到右,从0开始)位改成1,第七位改为0,变成01000010,则为B  //然后可以继续往后追加,8位(第二字节[8个bit]的第1位)0,9位1,15位1,然后就是01000001(A),然后加在一起就是BA了127.0.0.1:6379> setbit char 8 0(integer) 1127.0.0.1:6379> get char"B\x00"127.0.0.1:6379> setbit char 9 1(integer) 0 127.0.0.1:6379> setbit char 15 1(integer) 0127.0.0.1:6379> get char"BA"127.0.0.1:6379> //01110001 q(113),01010001 Q(81).(相差32,则只需修改加上100000即可.)//bitop;bitop operation destkey key1 [key2 ...]//char为Q,二进制为01010001,lower的7位0,2位1,则为:00100000,//char or lower->01010001 or 00100000 =>01110001(q)redis 127.0.0.1:6379> setbit lower 7 0(integer) 0redis 127.0.0.1:6379> setbit lower 2 1(integer) 0redis 127.0.0.1:6379> get lower" "redis 127.0.0.1:6379> set char QOKredis 127.0.0.1:6379> get char"Q"redis 127.0.0.1:6379> bitop or char char lower(integer) 1redis 127.0.0.1:6379> get char"q"
  • setbit使用场景.通过0/1来标识登录情况.一个用户一个bit位实现.
    ## 3.3 list链表操作
命令 举例 说明 lpush/rpush lpush/rpush key value 把值插入到链接头部/尾部 rpop/lpop rpop/lpop key 返回并删除链表尾/表头元素 lrange getlrange key start stop 返回链表中[start ,stop]中的元素,左数从0开始然后是1,2,3…,右数从-1开始,然后是-2,-3… lrem lrem key count value 从key链表中删除;value值删除count的绝对值个value后结束;Count>0 从表头删除;Count< 0 从表尾删除. ltrim ltrim key start stop ltrim剪切key对应的链接,切[start,stop(截止的坐标,不是长度)]一段,并把该段重新赋给key lindex lindex key index 返回index索引上的值,从0开始 llen llen key 计算链接表的元素个数 linsert linsert key after/before search value 作用: 在key链表中寻找’search’,并在search值之前/之后,插入value。 注: 一旦找到一个search后,命令就结束了,因此不会插入多个value rpoplpush rpoplpush source dest rpoplpush把source的尾部拿出,放在dest的头部,并返回该单元值(pop出来的值) brpop ,blpop brpop ,blpop key timeout brpop/blpop(block z阻塞式等待)等待弹出key的尾/头元素,Timeout为等待超时时间,单位秒,如果timeout为0,则一直等待
//lrem 删除key中的value,删除的个数为count个127.0.0.1:6379> lrange set1 0 -11) "a"2) "c"3) "d"4) "a"5) "b"6) "c"7) "e"8) "b"9) "d"127.0.0.1:6379> lrem set1 1 a(integer) 1127.0.0.1:6379> lrange set1 0 -11) "c"2) "d"3) "a"4) "b"5) "c"6) "e"7) "b"8) "d"127.0.0.1:6379> //ltrim key start stop|ltrim剪切key对应的链接,切[start,stop]一段,并把该段重新赋给key//lindex key index127.0.0.1:6379> lrange set1 0 -1 1) "w" 2) "v" 3) "u" 4) "z" 5) "y" 6) "x" 7) "d" 8) "a" 9) "b"10) "c"11) "e"127.0.0.1:6379>  127.0.0.1:6379> ltrim set1 2 9 OK127.0.0.1:6379> lrange set1 0 -11) "u"2) "z"3) "y"4) "x"5) "d"6) "a"7) "b"8) "c"127.0.0.1:6379> lindex set1 0"u"127.0.0.1:6379> lindex set1 1"z"//linsert在集合set1中查找到的第一个d前面插入n后的结果.127.0.0.1:6379> lrange set1 0 -1 1) "d" 2) "u" 3) "m" 4) "z" 5) "y" 6) "x" 7) "d" 8) "a" 9) "b"10) "c"127.0.0.1:6379> linsert set1 before d n(integer) 11127.0.0.1:6379> lrange set1 0 -1 1) "n" 2) "d" 3) "u" 4) "m" 5) "z" 6) "y" 7) "x" 8) "d" 9) "a"10) "b"11) "c"127.0.0.1:6379> //rpoplpush source dest|rpoplpush把source的尾部拿出,放在dest的头部,并返回该单//元值(pop出来的值).例子中将lnum的头部的1取出来放到了str的尾部.127.0.0.1:6379> lpush lnum 1 2 3 4 5 (integer) 5127.0.0.1:6379> lrange lnum 0 -11) "5"2) "4"3) "3"4) "2"5) "1"127.0.0.1:6379> lpush lstr a b c d e f(integer) 6127.0.0.1:6379> lrange lstr 0 -11) "f"2) "e"3) "d"4) "c"5) "b"6) "a"127.0.0.1:6379> rpoplpush lnum lstr"1"127.0.0.1:6379> lrange lnum 0 -11) "5"2) "4"3) "3"4) "2"127.0.0.1:6379> lrange lstr 0 -11) "1"2) "f"3) "e"4) "d"5) "c"6) "b"7) "a"//brpop, blpop (block阻塞式等待)//客户端1执行取值(当前没有lstr2这个list),执行语句,等待30秒127.0.0.1:6379> brpop lstr2 30//客户端2,执行push数据127.0.0.1:6379> lpush lstr2 aa bb cc dd(integer) 4//客户端1,收到数据,brpop取到最右(底部)的值127.0.0.1:6379> brpop lstr2 301) "lstr2"2) "aa"(19.38s)

3.4 set集合相关命令

集合的性质: 唯一性,无序性,确定性

命令 举例 说明 sadd sadd key value1 value2 往集合key中增加元素 srem srem value1 value2 value1 value2的元素,返回值:忽略不存在的元素后,真正删除掉的元素的个数 spop spop key 返回并删除集合中key中1个随机元素,无序,所以随机返回 randmember randmember key 返回集合key中,随机的1个元素. sismember sismember key value 判断value是否在key集合中,是返回1,否返回0 smembers sismembersmembers key 返回集中中所有的元素 scard scard key 返回集合中元素的个数 smove smove source dest value 把source中的value删除,并添加到dest集合中 sinter sinter key1 key2 key3 求出key1 key2 key3 三个集合中的交集,并返回结果集 sinterstore sinterstore dest key1 key2 key3 求出key1 key2 key3 三个集合中的交集,并赋给dest并返回个数 sunion suion key1 key2.. Keyn 求出key1 key2 keyn的并集,并返回结果 sunionstore sunionstore dest key1 key2 key3 求出key1,key2,key3的并集并赋给dest,并返回个数 sdiff sdiff key1 key2 key3 求出key1与key2 key3的差集,key1-key2-key3,并返回值 sdiffstore sdiff dest key1 key2 key3 将key1-key2-key3的结果保存到dest中,并返回个数
//smembers,sinter,sinterstore,sunion,sunionstore//smember,sinter,sinterstore127.0.0.1:6379> smembers setstr11) "a"2) "b"3) "f"4) "c"5) "e"127.0.0.1:6379> smembers setstr21) "o"2) "a"3) "f"4) "p"5) "q"127.0.0.1:6379> sinter setstr1 setstr21) "a"2) "f"127.0.0.1:6379> sinterstore setstrinter setstr1 setstr2(integer) 2127.0.0.1:6379> smembers setstrinter1) "a"2) "f"127.0.0.1:6379> //sunion和sunionstore127.0.0.1:6379> sunion setstr1 setstr21) "o"2) "a"3) "b"4) "p"5) "f"6) "c"7) "q"8) "e"127.0.0.1:6379> 127.0.0.1:6379> sunionstore setstrunion setstr1 setstr2(integer) 8127.0.0.1:6379> smembers setstrunion1) "o"2) "a"3) "b"4) "p"5) "f"6) "c"7) "q"8) "e"//smember,sdiff,sdiffstore  127.0.0.1:6379> smembers setstr11) "b"2) "a"3) "c"4) "f"5) "e"127.0.0.1:6379> smembers setstr21) "o"2) "a"3) "p"4) "f"5) "q"127.0.0.1:6379> sdiff setstr1 setstr21) "b"2) "e"3) "c"127.0.0.1:6379> sdiffstore setstrdiff setstr1 setstr2(integer) 3 127.0.0.1:6379> smembers setstrdiff1) "b"2) "e"3) "c"127.0.0.1:6379>

3.5 order set 有序集合

命令 举例 说明 zadd zadd key score1 value1 score2 value2 添加元素 zrem zzrem key value1 value2 删除集合中的元素 zremrangebyscore zremrangebyscore key min max 按照socre来删除元素,删除score在[min,max]之间的 zremrangebyrank zremrangebyrank key start end 按排名删除元素,删除名次在[start,end]之间的 zrank zrank key member 查询member的排名(升续 0名开始) zrevrank zrevrank key memeber 查询 member的排名(降续 0名开始) zrange zrange key start stop [withscores] 把集合排序后,返回名次[start,stop]的元素,默认是升续排列,Withscores 是把score也打印出来 zrevrange zrevrange key start stop [withscores] 把集合降序排列,取名字[start,stop]之间的元素 zrangebyscore zrangebyscore key min max [withscores] limit offset N 集合(升续)排序后,取score在[min,max]内的元素,并跳过 offset个, 取出N个 zcard zcard key 返回元素个数 zcount zcount key min max 返回[min,max] 区间内元素的数量

一个复杂命令

zinterstore destination numkeys key1 [key2 ...] [WEIGHTS weight [weight ...]] [AGGREGATE SUM|MIN|MAX]求key1,key2的交集,key1,key2的权重分别是 weight1,weight2聚合方法用: sum |min|max聚合的结果,保存在dest集合内注意: weights ,aggregate如何理解?答: 如果有交集, 交集元素又有socre,score怎么处理? Aggregate sum->score相加   , min 求最小score, max 最大score另: 可以通过weigth设置不同key的权重, 交集时,socre * weights
//zadd,zrange,zrem127.0.0.1:6379> zadd zsetstr1  1 a 2 b 3 c 4 d  5 x 6 y 7 z(integer) 7127.0.0.1:6379> zrange zsetstr1 0 -11) "a"2) "b"3) "c"4) "d"5) "x"6) "y"7) "z"127.0.0.1:6379> zrem zsetstr1 d(integer) 1127.0.0.1:6379> zrange zsetstr1 0 -11) "a"2) "b"3) "c"4) "x"5) "y"6) "z"//zadd,zrange,zremrangebyscore,zremrangebyrank(从0开始计算)127.0.0.1:6379> zadd zsetnum1  10 11 11 22 13 33 14 44 15 55 16 66 17 77(integer) 7127.0.0.1:6379> zrange zsetnum1 0 -11) "11"2) "22"3) "33"4) "44"5) "55"6) "66"7) "77"127.0.0.1:6379> zremrangebyscore zsetnum1 11 13(integer) 2127.0.0.1:6379> zrange zsetnum1 0 -11) "11"2) "44"3) "55"4) "66"5) "77"127.0.0.1:6379> zremrangebyrank zsetnum1 11 13(integer) 0//排名也是从0开始算的.127.0.0.1:6379> zremrangebyrank zsetnum1 1 2(integer) 2127.0.0.1:6379> zrange zsetnum1 0 -11) "11"2) "66"3) "77"//查看66在zset中的排名,正序(从0开始)127.0.0.1:6379> zrank zsetnum1 66(integer) 1//查看11在zset中的排名,正序(从0开始)127.0.0.1:6379> zrank zsetnum1 11(integer) 0 //查看11在zset中的排名,倒序(从0开始)127.0.0.1:6379> zrevrank zsetnum1 11(integer) 2127.0.0.1:6379> //zrange,返回排名1-2或者0-2或者0-5(超过最多,取到最后)127.0.0.1:6379> zrange  zsetnum1 1 21) "66"2) "77"127.0.0.1:6379> zrange  zsetnum1 0 21) "11"2) "66"3) "77"127.0.0.1:6379> zrange  zsetnum1 0 51) "11"2) "66"3) "77"127.0.0.1:6379> //列出所有数据,带分值127.0.0.1:6379> arange zsetstr1 0 -1 withscores 1) "a" 2) "1" 3) "b" 4) "2" 5) "c" 6) "3" 7) "x" 8) "5" 9) "y"10) "6"11) "z"12) "7"//zrangebyscore普通使用和综合使用127.0.0.1:6379> zrangebyscore zsetstr1 0 10 withscores 1) "a" 2) "1" 3) "b" 4) "2" 5) "c" 6) "3" 7) "x" 8) "5" 9) "y"10) "6"11) "z"//按照score排序,取score在0-10之间的,跳过1个然后取2个127.0.0.1:6379> zrangebyscore zsetstr1 0 10 withscores limit 1 21) "b"2) "2"3) "c"4) "3"//zcard 元素个数127.0.0.1:6379> zcard zsetstr1(integer) 6//score在2~5之间(包括2和5)的个数127.0.0.1:6379> zcount zsetstr1 2 5(integer) 3

3.6 Hash哈希

命令 举例 说明 hset hset key field value hset把key中 filed域的值设为value,如果没有field域,直接添加,如果有,则覆盖原field域的值 hmset hmset key field1 value1 [field2 value2 field3 value3 ……fieldn valuen] 设置field1->N 个域, 对应的值是value1->N hget hget key field 返回key中field域的值 hmget hmget key field1 field2 fieldN 返回key中field1 field2 fieldN域的值 hgetall hgetall key 返回key中,所有域与其值 hdel hdel key field 删除key中 field域 hlen hdelhlen key 返回key中元素的数量 hexists hexists key field 判断key中有没有field域 hinrby hinrby key field value 是把key中的field域的值增长整型值value hinrby float hinrby float key field value 是把key中的field域的值增长浮点值value hkeys hkeys key 返回key中所有的field kvals kvals key 返回key中所有的value
127.0.0.1:6379> hset hsetstr1 field1 a(integer) 1127.0.0.1:6379> hset hsetstr1 field2 b(integer) 1127.0.0.1:6379> hset hsetstr1 field3 c(integer) 1127.0.0.1:6379> hmset hsetstr1 field4 d field5 e field6 fOK127.0.0.1:6379> hget hsetstr1 field2"b"127.0.0.1:6379> hdel hsetstr1 field2(integer) 1127.0.0.1:6379> hget hsetstr1 field2(nil)127.0.0.1:6379> hlen hsetstr1(integer) 5127.0.0.1:6379> hkeys hsetstr11) "field1"2) "field3"3) "field4"4) "field5"5) "field6"127.0.0.1:6379> hvals hsetstr11) "a"2) "c"3) "d"4) "e"5) "f"

3.7 redis事务及锁应用

Redis支持简单的事务,Redis与 mysql事务的对比

类型 Mysql redis 开启 start transaction muitl 语句 普通sql 普通命令 失败 rollback 回滚 discard 取消 成功 commit exec

rollback与discard 的区别
如果已经成功执行了2条语句, 第3条语句出错.
Rollback后,前2条的语句影响消失.
Discard只是结束本次事务,前2条语句造成的影响仍然还在.

在mutil后面的语句中, 语句出错可能有2种情况
- 1: 语法就有问题:
这种,exec时,报错, 所有语句得不到执行 -见下文中例3
- 2: 语法本身没错,但适用对象有问题. 比如 zadd 操作list对象
Exec之后,会执行正确的语句,并跳过有不适当的语句. -见下文中例4

//使用multi来批量执行exec-例1127.0.0.1:6379> set str1 vlaue1OK127.0.0.1:6379> multiOK127.0.0.1:6379> set str2 value2QUEUED127.0.0.1:6379> set str3 value3QUEUED127.0.0.1:6379> set str4 value4QUEUED127.0.0.1:6379> exec1) OK2) OK3) OK127.0.0.1:6379> //使用multi来批量执行discard-例2127.0.0.1:6379> multiOK127.0.0.1:6379> set str11 value11QUEUED127.0.0.1:6379> set str12 value12QUEUED127.0.0.1:6379> set str13 value13QUEUED127.0.0.1:6379> discardOK127.0.0.1:6379> //语法就有问题: 这种,exec时,报错, 所有语句得不到执行 -例3//解释:由于set str22value22时语法有问题(没有value),则执行时所有的队列都没有执行127.0.0.1:6379> multiOK127.0.0.1:6379> set str21 value21QUEUED127.0.0.1:6379> set str22value22(error) ERR wrong number of arguments for 'set' command127.0.0.1:6379> set str23 value23 abcQUEUED127.0.0.1:6379> set str24 value24QUEUED127.0.0.1:6379> exec(error) EXECABORT Transaction discarded because of previous errors.127.0.0.1:6379> get str21(nil)127.0.0.1:6379> get str23(nil)127.0.0.1:6379> get str24(nil)127.0.0.1:6379> //语法本身没错,但适用对象有问题. 比如 zadd 操作list对象  -例4//Exec之后,会执行正确的语句,并跳过有不适当的语句//解释:str33时语法没有问题,但是参数有问题失效时间只能是数字而不能是abc,执行时前后的31和34都正常执行,但是23跳过不执行,但不阻碍31.和34的执行127.0.0.1:6379> multiOK127.0.0.1:6379> set str31 value31QUEUED127.0.0.1:6379> set str33 value33 abcQUEUED127.0.0.1:6379> set str34 value34QUEUED127.0.0.1:6379> exec1) OK2) (error) ERR syntax error3) OK127.0.0.1:6379> get str31"value31"127.0.0.1:6379> get str33(nil)127.0.0.1:6379> get str34"value34"
思考: 我正在买票Ticket -1 , money -100而票只有1张, 如果在我multi之后,和exec之前, 票被别人买了---即ticket变成0了.我该如何观察这种情景,并不再提交悲观的想法: 世界充满危险,肯定有人和我抢,  ticket上锁, 只有我能操作. [悲观锁]乐观的想法:没有那么人和我抢,因此,我只需要注意,--有没有人更改ticket的值就可以了 [乐观锁]

watch Redis的事务中,启用的是乐观锁,只负责监测key没有被改动.

watch key1 key2 … keyN
作用:监听key1 key2..keyN有没有变化,如果有变, 则事务取消

unwatch
作用: 取消所有watch监听

具体的命令----  watch命令//客户端1-默认127.0.0.1:6379> get ticket"10"127.0.0.1:6379> watch ticketOK127.0.0.1:6379> multi OK127.0.0.1:6379> decr ticket QUEUED127.0.0.1:6379> decr ticket QUEUED//客户端2-默认127.0.0.1:6379> get ticket"10"127.0.0.1:6379> set ticket 20OK127.0.0.1:6379> //客户端1-继续执行// 返回nil,说明监视的ticket已经改变了,事务就取消了.// 客户端2执行之后,执行exec127.0.0.1:6379> exec(nil)127.0.0.1:6379> get ticket"20"127.0.0.1:6379> 

3.8 频道发布与消息订阅

使用办法:
订阅端: Subscribe 频道名称
发布端: publish 频道名称 发布内容

//开启监听段-cli1[root@bogon bin]# ./redis-cli 127.0.0.1:6379> subscribe channel_newsReading messages... (press Ctrl-C to quit)1) "subscribe"2) "channel_news"3) (integer) 11) "message"2) "channel_news"//开启发送端,并发送消息-cli2[root@bogon bin]# ./redis-cli 127.0.0.1:6379> publish channel_news(error) ERR wrong number of arguments for 'publish' command127.0.0.1:6379> publish channel_news 'news_1'(integer) 1127.0.0.1:6379> publish channel_news 'news_2'(integer) 1127.0.0.1:6379> //监听段发生变化-cli1,cli2端每发送一条信息,则监听端受到一条信息[root@bogon bin]# ./redis-cli 127.0.0.1:6379> subscribe channel_newsReading messages... (press Ctrl-C to quit)1) "subscribe"2) "channel_news"3) (integer) 11) "message"2) "channel_news"3) "news_1"1) "message"2) "channel_news"3) "news_2"
原创粉丝点击