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

10 篇文章 0 订阅

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: 1

99.13% <= 1 milliseconds
99.51% <= 30 milliseconds
99.55% <= 31 milliseconds
99.83% <= 32 milliseconds
100.00% <= 32 milliseconds
70422.53 requests per second

====== PING_BULK ======
  10000 requests completed in 0.13 seconds
  50 parallel clients
  3 bytes payload
  keep alive: 1

98.80% <= 1 milliseconds
100.00% <= 1 milliseconds
77519.38 requests per second

====== SET ======
  10000 requests completed in 0.17 seconds
  50 parallel clients
  3 bytes payload
  keep alive: 1

95.13% <= 1 milliseconds
96.80% <= 2 milliseconds
97.01% <= 3 milliseconds
98.97% <= 4 milliseconds
99.20% <= 19 milliseconds
99.51% <= 25 milliseconds
99.91% <= 26 milliseconds
100.00% <= 27 milliseconds
59523.81 requests per second

====== GET ======
  10000 requests completed in 0.11 seconds
  50 parallel clients
  3 bytes payload
  keep alive: 1

99.47% <= 1 milliseconds
100.00% <= 1 milliseconds
92592.59 requests per second

====== INCR ======
  10000 requests completed in 0.10 seconds
  50 parallel clients
  3 bytes payload
  keep alive: 1

99.62% <= 1 milliseconds
100.00% <= 1 milliseconds
97087.38 requests per second

====== LPUSH ======
  10000 requests completed in 0.10 seconds
  50 parallel clients
  3 bytes payload
  keep alive: 1

99.76% <= 1 milliseconds
100.00% <= 1 milliseconds
99009.90 requests per second

====== RPUSH ======
  10000 requests completed in 0.11 seconds
  50 parallel clients
  3 bytes payload
  keep alive: 1

99.66% <= 1 milliseconds
100.00% <= 1 milliseconds
94339.62 requests per second

====== LPOP ======
  10000 requests completed in 0.10 seconds
  50 parallel clients
  3 bytes payload
  keep alive: 1

99.72% <= 1 milliseconds
100.00% <= 1 milliseconds
100000.00 requests per second

====== RPOP ======
  10000 requests completed in 0.10 seconds
  50 parallel clients
  3 bytes payload
  keep alive: 1

99.80% <= 1 milliseconds
100.00% <= 1 milliseconds
95238.10 requests per second

====== SADD ======
  10000 requests completed in 0.11 seconds
  50 parallel clients
  3 bytes payload
  keep alive: 1

99.43% <= 1 milliseconds
100.00% <= 1 milliseconds
90909.09 requests per second

====== HSET ======
  10000 requests completed in 0.11 seconds
  50 parallel clients
  3 bytes payload
  keep alive: 1

99.43% <= 1 milliseconds
100.00% <= 1 milliseconds
94339.62 requests per second

====== SPOP ======
  10000 requests completed in 0.11 seconds
  50 parallel clients
  3 bytes payload
  keep alive: 1

99.56% <= 1 milliseconds
100.00% <= 1 milliseconds
94339.62 requests per second

====== LPUSH (needed to benchmark LRANGE) ======
  10000 requests completed in 0.10 seconds
  50 parallel clients
  3 bytes payload
  keep alive: 1

99.19% <= 1 milliseconds
100.00% <= 2 milliseconds
96153.84 requests per second

====== LRANGE_100 (first 100 elements) ======
  10000 requests completed in 0.26 seconds
  50 parallel clients
  3 bytes payload
  keep alive: 1

80.14% <= 1 milliseconds
99.93% <= 2 milliseconds
100.00% <= 2 milliseconds
38314.18 requests per second

====== LRANGE_300 (first 300 elements) ======
  10000 requests completed in 0.64 seconds
  50 parallel clients
  3 bytes payload
  keep alive: 1

0.01% <= 1 milliseconds
95.22% <= 2 milliseconds
99.85% <= 3 milliseconds
99.86% <= 4 milliseconds
100.00% <= 4 milliseconds
15625.00 requests per second

====== LRANGE_500 (first 450 elements) ======
  10000 requests completed in 0.95 seconds
  50 parallel clients
  3 bytes payload
  keep alive: 1

0.04% <= 1 milliseconds
1.02% <= 2 milliseconds
92.41% <= 3 milliseconds
98.50% <= 4 milliseconds
99.56% <= 5 milliseconds
99.85% <= 6 milliseconds
99.87% <= 7 milliseconds
100.00% <= 8 milliseconds
10570.83 requests per second

====== LRANGE_600 (first 600 elements) ======
  10000 requests completed in 1.15 seconds
  50 parallel clients
  3 bytes payload
  keep alive: 1

0.01% <= 1 milliseconds
0.28% <= 2 milliseconds
84.16% <= 3 milliseconds
98.90% <= 4 milliseconds
99.77% <= 5 milliseconds
100.00% <= 5 milliseconds
8726.00 requests per second

====== MSET (10 keys) ======
  10000 requests completed in 0.17 seconds
  50 parallel clients
  3 bytes payload
  keep alive: 1

94.71% <= 1 milliseconds
99.85% <= 2 milliseconds
100.00% <= 2 milliseconds
58479.53 requests per second

3.1 Redis通用命令

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

3.2 Redis字符串操作

命令举例说明
setset key value [ex 秒数] / [px 毫秒数] [nx] /[xx]nx: 表示key不存在时,执行操作;xx: 表示key存在时,执行操作
msetmset key1 v1 key2 v2multi set , 一次性设置多个键值
getget key获取key的值
mgetmget key1 key2 ..keyn获取多个key的值
setrangesetrange key offset value把字符串的offset偏移字节,(覆盖式)改成value,如果偏移量>字符长度, 该字符自动补0x00
appendappend key value把value追加到key的原值上
getrangegetrange key start stop是获取字符串中 [start, stop]范围的值,对于字符串的下标,左数从0开始,右数从-1开始,,最右边-1,倒数第二是-2,倒数第三是-3
getsetgetset key newvalue获取并返回旧值,设置新值
incrincr key指定的key的值加1,并返回加1后的值(不存在的key当成0,再incr操作,范围为64有符号)
incrbyincrby key number指定key加指定数值number
incrbyfloatincrbyfloat key floatnumber指定key加指定浮点数目
decrdecr key指定key减1
decrbydecrby key number指定key减指定数目number
getbitgetbit key offset获取值的二进制表示,对应位上的值(从左,从0编号),set字符串之后,根据ASCII码,对应的2进制的位上对应的值.多个字符串,就是合并在一起的. 如:字符串ABCDEF转换后为:01000001 01000010 01000011 01000100 01000101 01000110
setbitsetbit key offset value设置指定位上(从0开始)对应二进制位上的值,返回: 该位上的旧值
bitopbitop 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 hello
OK
redis 127.0.0.1:6379> setrange greet 2 x
(integer) 5
redis 127.0.0.1:6379> get greet
"hexlo"

redis 127.0.0.1:6379> setrange greet 6 !
(integer) 7
redis 127.0.0.1:6379> get greet
"heyyo\x00!"


//getrange,字符串的下标,左数从0开始,右数从-1开始,最右边-1,倒数第二是-2,倒数第三是-3
redis 127.0.0.1:6379> set title 'chinese'
OK
redis 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 0
OK
redis 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 A
OK
127.0.0.1:6379> setbit char 7 1
(integer) 1
127.0.0.1:6379> set char A
OK
127.0.0.1:6379> setbit char 6 1
(integer) 0
127.0.0.1:6379> setbit char 7 0
(integer) 1
127.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) 1
127.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) 0
127.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) 0
redis 127.0.0.1:6379> setbit lower 2 1
(integer) 0
redis 127.0.0.1:6379> get lower
" "
redis 127.0.0.1:6379> set char Q
OK
redis 127.0.0.1:6379> get char
"Q"
redis 127.0.0.1:6379> bitop or char char lower
(integer) 1
redis 127.0.0.1:6379> get char
"q"
  • setbit使用场景.通过0/1来标识登录情况.一个用户一个bit位实现.
    ## 3.3 list链表操作
命令举例说明
lpush/rpushlpush/rpush key value把值插入到链接头部/尾部
rpop/lpoprpop/lpop key返回并删除链表尾/表头元素
lrangegetlrange key start stop返回链表中[start ,stop]中的元素,左数从0开始然后是1,2,3…,右数从-1开始,然后是-2,-3…
lremlrem key count value从key链表中删除;value值删除count的绝对值个value后结束;Count>0 从表头删除;Count< 0 从表尾删除.
ltrimltrim key start stopltrim剪切key对应的链接,切[start,stop(截止的坐标,不是长度)]一段,并把该段重新赋给key
lindexlindex key index返回index索引上的值,从0开始
llenllen key计算链接表的元素个数
linsertlinsert key after/before search value作用: 在key链表中寻找’search’,并在search值之前/之后,插入value。 注: 一旦找到一个search后,命令就结束了,因此不会插入多个value
rpoplpushrpoplpush source destrpoplpush把source的尾部拿出,放在dest的头部,并返回该单元值(pop出来的值)
brpop ,blpopbrpop ,blpop key timeoutbrpop/blpop(block z阻塞式等待)等待弹出key的尾/头元素,Timeout为等待超时时间,单位秒,如果timeout为0,则一直等待
//lrem 删除key中的value,删除的个数为count个
127.0.0.1:6379> lrange set1 0 -1
1) "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) 1
127.0.0.1:6379> lrange set1 0 -1
1) "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 index
127.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 
OK
127.0.0.1:6379> lrange set1 0 -1
1) "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) 11
127.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) 5
127.0.0.1:6379> lrange lnum 0 -1
1) "5"
2) "4"
3) "3"
4) "2"
5) "1"
127.0.0.1:6379> lpush lstr a b c d e f
(integer) 6
127.0.0.1:6379> lrange lstr 0 -1
1) "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 -1
1) "5"
2) "4"
3) "3"
4) "2"
127.0.0.1:6379> lrange lstr 0 -1
1) "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 30
1) "lstr2"
2) "aa"
(19.38s)

3.4 set集合相关命令

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

命令举例说明
saddsadd key value1 value2往集合key中增加元素
sremsrem value1 value2value1 value2的元素,返回值:忽略不存在的元素后,真正删除掉的元素的个数
spopspop key返回并删除集合中key中1个随机元素,无序,所以随机返回
randmemberrandmember key返回集合key中,随机的1个元素.
sismembersismember key value判断value是否在key集合中,是返回1,否返回0
smemberssismembersmembers key返回集中中所有的元素
scardscard key返回集合中元素的个数
smovesmove source dest value把source中的value删除,并添加到dest集合中
sintersinter key1 key2 key3求出key1 key2 key3 三个集合中的交集,并返回结果集
sinterstoresinterstore dest key1 key2 key3求出key1 key2 key3 三个集合中的交集,并赋给dest并返回个数
sunionsuion key1 key2.. Keyn求出key1 key2 keyn的并集,并返回结果
sunionstoresunionstore dest key1 key2 key3求出key1,key2,key3的并集并赋给dest,并返回个数
sdiffsdiff key1 key2 key3求出key1与key2 key3的差集,key1-key2-key3,并返回值
sdiffstoresdiff dest key1 key2 key3将key1-key2-key3的结果保存到dest中,并返回个数
//smembers,sinter,sinterstore,sunion,sunionstore
//smember,sinter,sinterstore
127.0.0.1:6379> smembers setstr1
1) "a"
2) "b"
3) "f"
4) "c"
5) "e"
127.0.0.1:6379> smembers setstr2
1) "o"
2) "a"
3) "f"
4) "p"
5) "q"
127.0.0.1:6379> sinter setstr1 setstr2
1) "a"
2) "f"

127.0.0.1:6379> sinterstore setstrinter setstr1 setstr2
(integer) 2
127.0.0.1:6379> smembers setstrinter
1) "a"
2) "f"
127.0.0.1:6379> 

//sunion和sunionstore
127.0.0.1:6379> sunion setstr1 setstr2
1) "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) 8

127.0.0.1:6379> smembers setstrunion
1) "o"
2) "a"
3) "b"
4) "p"
5) "f"
6) "c"
7) "q"
8) "e"


//smember,sdiff,sdiffstore  
127.0.0.1:6379> smembers setstr1
1) "b"
2) "a"
3) "c"
4) "f"
5) "e"
127.0.0.1:6379> smembers setstr2
1) "o"
2) "a"
3) "p"
4) "f"
5) "q"
127.0.0.1:6379> sdiff setstr1 setstr2
1) "b"
2) "e"
3) "c"
127.0.0.1:6379> sdiffstore setstrdiff setstr1 setstr2
(integer) 3 
127.0.0.1:6379> smembers setstrdiff
1) "b"
2) "e"
3) "c"
127.0.0.1:6379>

3.5 order set 有序集合

命令举例说明
zaddzadd key score1 value1 score2 value2添加元素
zremzzrem key value1 value2删除集合中的元素
zremrangebyscorezremrangebyscore key min max按照socre来删除元素,删除score在[min,max]之间的
zremrangebyrankzremrangebyrank key start end按排名删除元素,删除名次在[start,end]之间的
zrankzrank key member查询member的排名(升续 0名开始)
zrevrankzrevrank key memeber查询 member的排名(降续 0名开始)
zrangezrange key start stop [withscores]把集合排序后,返回名次[start,stop]的元素,默认是升续排列,Withscores 是把score也打印出来
zrevrangezrevrange key start stop [withscores]把集合降序排列,取名字[start,stop]之间的元素
zrangebyscorezrangebyscore key min max [withscores] limit offset N集合(升续)排序后,取score在[min,max]内的元素,并跳过 offset个, 取出N个
zcardzcard key返回元素个数
zcountzcount 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,zrem
127.0.0.1:6379> zadd zsetstr1  1 a 2 b 3 c 4 d  5 x 6 y 7 z
(integer) 7
127.0.0.1:6379> zrange zsetstr1 0 -1
1) "a"
2) "b"
3) "c"
4) "d"
5) "x"
6) "y"
7) "z"
127.0.0.1:6379> zrem zsetstr1 d
(integer) 1
127.0.0.1:6379> zrange zsetstr1 0 -1
1) "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) 7
127.0.0.1:6379> zrange zsetnum1 0 -1
1) "11"
2) "22"
3) "33"
4) "44"
5) "55"
6) "66"
7) "77"
127.0.0.1:6379> zremrangebyscore zsetnum1 11 13
(integer) 2
127.0.0.1:6379> zrange zsetnum1 0 -1
1) "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) 2
127.0.0.1:6379> zrange zsetnum1 0 -1
1) "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) 2
127.0.0.1:6379> 

//zrange,返回排名1-2或者0-2或者0-5(超过最多,取到最后)
127.0.0.1:6379> zrange  zsetnum1 1 2
1) "66"
2) "77"
127.0.0.1:6379> zrange  zsetnum1 0 2
1) "11"
2) "66"
3) "77"
127.0.0.1:6379> zrange  zsetnum1 0 5
1) "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 2
1) "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哈希

命令举例说明
hsethset key field valuehset把key中 filed域的值设为value,如果没有field域,直接添加,如果有,则覆盖原field域的值
hmsethmset key field1 value1 [field2 value2 field3 value3 ……fieldn valuen]设置field1->N 个域, 对应的值是value1->N
hgethget key field返回key中field域的值
hmgethmget key field1 field2 fieldN返回key中field1 field2 fieldN域的值
hgetallhgetall key返回key中,所有域与其值
hdelhdel key field删除key中 field域
hlenhdelhlen key返回key中元素的数量
hexistshexists key field判断key中有没有field域
hinrbyhinrby key field value是把key中的field域的值增长整型值value
hinrby floathinrby float key field value是把key中的field域的值增长浮点值value
hkeyshkeys key返回key中所有的field
kvalskvals key返回key中所有的value
127.0.0.1:6379> hset hsetstr1 field1 a
(integer) 1
127.0.0.1:6379> hset hsetstr1 field2 b
(integer) 1
127.0.0.1:6379> hset hsetstr1 field3 c
(integer) 1
127.0.0.1:6379> hmset hsetstr1 field4 d field5 e field6 f
OK
127.0.0.1:6379> hget hsetstr1 field2
"b"
127.0.0.1:6379> hdel hsetstr1 field2
(integer) 1
127.0.0.1:6379> hget hsetstr1 field2
(nil)
127.0.0.1:6379> hlen hsetstr1
(integer) 5
127.0.0.1:6379> hkeys hsetstr1
1) "field1"
2) "field3"
3) "field4"
4) "field5"
5) "field6"
127.0.0.1:6379> hvals hsetstr1
1) "a"
2) "c"
3) "d"
4) "e"
5) "f"

3.7 redis事务及锁应用

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

类型Mysqlredis
开启start transactionmuitl
语句普通sql普通命令
失败rollback 回滚discard 取消
成功commitexec

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

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

//使用multi来批量执行exec-例1
127.0.0.1:6379> set str1 vlaue1
OK
127.0.0.1:6379> multi
OK
127.0.0.1:6379> set str2 value2
QUEUED
127.0.0.1:6379> set str3 value3
QUEUED
127.0.0.1:6379> set str4 value4
QUEUED
127.0.0.1:6379> exec
1) OK
2) OK
3) OK
127.0.0.1:6379> 

//使用multi来批量执行discard-例2
127.0.0.1:6379> multi
OK
127.0.0.1:6379> set str11 value11
QUEUED
127.0.0.1:6379> set str12 value12
QUEUED
127.0.0.1:6379> set str13 value13
QUEUED
127.0.0.1:6379> discard
OK
127.0.0.1:6379> 


//语法就有问题: 这种,exec时,报错, 所有语句得不到执行 -例3
//解释:由于set str22value22时语法有问题(没有value),则执行时所有的队列都没有执行
127.0.0.1:6379> multi
OK
127.0.0.1:6379> set str21 value21
QUEUED
127.0.0.1:6379> set str22value22
(error) ERR wrong number of arguments for 'set' command
127.0.0.1:6379> set str23 value23 abc
QUEUED
127.0.0.1:6379> set str24 value24
QUEUED
127.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> multi
OK
127.0.0.1:6379> set str31 value31
QUEUED
127.0.0.1:6379> set str33 value33 abc
QUEUED
127.0.0.1:6379> set str34 value34
QUEUED
127.0.0.1:6379> exec
1) OK
2) (error) ERR syntax error
3) OK
127.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 ticket
OK
127.0.0.1:6379> multi 
OK
127.0.0.1:6379> decr ticket 
QUEUED
127.0.0.1:6379> decr ticket 
QUEUED

//客户端2-默认
127.0.0.1:6379> get ticket
"10"
127.0.0.1:6379> set ticket 20
OK
127.0.0.1:6379> 

//客户端1-继续执行
// 返回nil,说明监视的ticket已经改变了,事务就取消了.
// 客户端2执行之后,执行exec
127.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_news
Reading messages... (press Ctrl-C to quit)
1) "subscribe"
2) "channel_news"
3) (integer) 1
1) "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' command
127.0.0.1:6379> publish channel_news 'news_1'
(integer) 1
127.0.0.1:6379> publish channel_news 'news_2'
(integer) 1
127.0.0.1:6379> 

//监听段发生变化-cli1,cli2端每发送一条信息,则监听端受到一条信息
[root@bogon bin]# ./redis-cli 
127.0.0.1:6379> subscribe channel_news
Reading messages... (press Ctrl-C to quit)
1) "subscribe"
2) "channel_news"
3) (integer) 1
1) "message"
2) "channel_news"
3) "news_1"
1) "message"
2) "channel_news"
3) "news_2"

  • 4
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值