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通用命令
3.2 Redis字符串操作
//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链表操作
//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集合相关命令
集合的性质: 唯一性,无序性,确定性
//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 有序集合
一个复杂命令
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哈希
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事务的对比
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"
- redis总结2-Redis六种数据类型命令总结(附命令实例)
- Redis中五种数据类型总结
- [redis]redis五种数据类型命令汇总整理
- 服务篇六(2)---redis最新命令总结
- [Redis] redis-cli 命令总结
- [Redis] redis-cli 命令总结
- [Redis] redis-cli 命令总结
- [Redis] redis-cli 命令总结
- [Redis] redis-cli 命令总结
- [Redis] redis-cli 命令总结
- [Redis] redis-cli 命令总结
- [Redis] redis-cli 命令总结
- [Redis] redis-cli 命令总结
- [Redis] redis-cli 命令总结
- [Redis] redis-cli 命令总结
- [Redis] redis-cli 命令总结
- [Redis]redis-cli 命令总结
- [Redis] redis-cli 命令总结
- SQLServer数据迁移到Mysql工具
- react之flux小结
- 用LSTM自动生成古诗
- 结构体定义 typedef struct 用法详解和用法小结
- Failure to find org.codehaus.plexus:plexus-archiver:jar:1.2 in...错误
- redis总结2-Redis六种数据类型命令总结(附命令实例)
- python学习笔记 part1
- Java8 LinkedList的底层实现
- urllib
- C# 实例练习——字符串处理(第一天)
- Struts2的文件目录
- 游黄山、宏村记
- 16年湖南训练赛,全是语文题
- 八皇后问题(C++)