redis总结2-Redis六种数据类型命令总结(附命令实例)
redis总结3-持久化rdb,aof,运维命令,Sentinel监控
一.简介
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通用命令
命令 | 举例 | 说明 |
---|---|---|
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 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/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 -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集合相关命令
集合的性质: 唯一性,无序性,确定性
命令 | 举例 | 说明 |
---|---|---|
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,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 有序集合
命令 | 举例 | 说明 |
---|---|---|
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,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哈希
命令 | 举例 | 说明 |
---|---|---|
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) 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事务的对比
类型 | 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-例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"