Redis 五大基础数据类型 String 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 127.0 .0 .1 :6379 > ping PONG 127.0 .0 .1 :6379 > set name wang OK 127.0 .0 .1 :6379 > get name "wang" 127.0 .0 .1 :6379 > select 3 OK 127.0 .0 .1 :6379 [3 ]> select 0 OK 127.0 .0 .1 :6379 > dbsize (integer) 2 127.0 .0 .1 :6379 > keys * 1 ) "name" 2 ) "\xac\xed\x00\x05t\x00\x05mykey" 127.0 .0 .1 :6379 > set key1 value1OK 127.0 .0 .1 :6379 > set key2 value2OK 127.0 .0 .1 :6379 > keys key* 1 ) "key1" 2 ) "key2" 127.0 .0 .1 :6379 > flushdb OK 127.0 .0 .1 :6379 > keys *(empty list or set) 127.0 .0 .1 :6379 > FLUSHALL OK 127.0 .0 .1 :6379 > exists name (integer) 1 127.0 .0 .1 :6379 > expire name 5 (integer) 1 127.0 .0 .1 :6379 > ttl name (integer) -2 127.0 .0 .1 :6379 > move name 1 (integer) 1 127.0 .0 .1 :6379 > append name hello (integer) 9 127.0 .0 .1 :6379 > incr views (integer) 7 127.0.0.1:6379> incr views (integer) 8 127.0.0.1:6379> decr views (integer) 7 127.0.0.1:6379> incrby views 10 (integer) 17 127.0.0.1:6379> decrby views 15 (integer) 2 127.0.0.1:6379> set name wangtianyi OK 127.0.0.1:6379> get name "wangtianyi" 127.0.0.1:6379> getrange name 0 5 "wangti" 127.0.0.1:6379> getrange name 0 -1 "wangtianyi" 127.0.0.1:6379> set key1 aaaaa OK 127.0.0.1:6379> get key1 "aaaaa" 127.0.0.1:6379> setrange key1 1 bb (integer) 5127.0.0.1:6379> get key1 "abbaa" 127.0.0.1:6379> setex mykey 30 "hello" OK 127.0.0.1:6379> ttl mykey (integer) 23127.0.0.1:6379> setnx id 11111 (integer) 1127.0.0.1:6379> keys * 1) "key1" 2) "id" 3) "name" 127.0.0.1:6379> ttl mykey (integer) -2127.0.0.1:6379> setnx id 22222 (integer) 0127.0.0.1:6379> get id "11111" 127.0.0.1:6379> mset k1 v1 k2 v2 k3 v3 OK 127.0.0.1:6379> keys * 1) "k2" 2) "k1" 3) "k3" 127.0.0.1:6379> mget k1 k2 k3 1) "v1" 2) "v2" 3) "v3" 127.0.0.1:6379> msetnx k1 v1 k4 v4 (integer) 0127.0.0.1:6379> get k4 (nil) key (user:id:filed) value 127.0.0.1:6379> mset user:1:name wang user:1:id 10 OK 127.0.0.1:6379> mget user:1:name user:1:id 1) "wang" 2) "10" 127.0.0.1:6379> getset db redis (nil) 127.0.0.1:6379> get db "redis" 127.0.0.1:6379> getset db mongodb "redis" 127.0.0.1:6379> get db "mongodb"
List 有序可重复 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 127.0 .0 .1 :6379 > lpush list one (integer) 1 127.0 .0 .1 :6379 > lpush list two (integer) 2127.0.0.1:6379> lpush list three (integer) 3127.0.0.1:6379> lrange list 0 -1 1) "three" 2) "two" 3) "one" 127.0.0.1:6379> lpush list foer (integer) 4127.0.0.1:6379> lrange list 0 2 1) "foer" 2) "three" 3) "two" 127.0.0.1:6379> rpush list five (integer) 5127.0.0.1:6379> lrange list 0 -1 1) "foer" 2) "three" 3) "two" 4) "one" 5) "five" 127.0.0.1:6379> lpop list "foer" 127.0.0.1:6379> rpop list "five" 127.0.0.1:6379> lrange list 0 -1 1) "three" 2) "two" 3) "one" 127.0.0.1:6379> lindex list 0 "three" 127.0.0.1:6379> llen list (integer) 3 127.0.0.1:6379> lpush list 1 (integer) 1127.0.0.1:6379> lpush list 2 (integer) 2127.0.0.1:6379> lpush list 3 (integer) 3127.0.0.1:6379> lpush list 3 (integer) 4127.0.0.1:6379> lrange list 0 -1 1) "3" 2) "3" 3) "2" 4) "1" 127.0.0.1:6379> lrem list 1 1 (integer) 1127.0.0.1:6379> lrange list 0 -1 1) "3" 2) "3" 3) "2" 127.0.0.1:6379> lrem list 2 3 (integer) 2127.0.0.1:6379> lrange list 0 -1 1) "2" 127.0.0.1:6379> lrange mylist 0 -1 1) "wang1" 2) "wang2" 3) "wang3" 4) "wang4" 127.0.0.1:6379> ltrim mylist 1 2 OK 127.0.0.1:6379> lrange mylist 0 -1 1) "wang2" 2) "wang3" 127.0.0.1:6379> lpush user1 wang1 (integer) 1127.0.0.1:6379> lpush user1 wang2 (integer) 2127.0.0.1:6379> lpush user1 wang3 (integer) 3127.0.0.1:6379> rpoplpush user1 user2 "wang1" 127.0.0.1:6379> lrange user2 0 -1 1) "wang1" 127.0.0.1:6379> exists list (integer) 0127.0.0.1:6379> lset list 0 wang (error) ERR no such key127.0.0.1:6379> lpush list wang1 (integer) 1 127.0.0.1:6379> lrange list 0 0 1) "wang1" 127.0.0.1:6379> lset list 0 wang2 OK 127.0.0.1:6379> lrange list 0 0 1) "wang2" 127.0.0.1:6379> rpush list 1 (integer) 1127.0.0.1:6379> rpush list 2 (integer) 2127.0.0.1:6379> rpush list 3 (integer) 3127.0.0.1:6379> rpush list 4 (integer) 4127.0.0.1:6379> linsert list after 4 5 (integer) 5127.0.0.1:6379> lrange list 0 -1 1) "1" 2) "2" 3) "3" 4) "4" 5) "5" 127.0.0.1:6379> linsert list before 1 0 (integer) 6127.0.0.1:6379> lrange list 0 -1 1) "0" 2) "1" 3) "2" 4) "3" 5) "4" 6) "5"
Set 无序不可重复 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 127.0 .0 .1 :6379 > sadd myset hello world (integer) 2 127.0 .0 .1 :6379 > smembers myset 1 ) "hello" 2 ) "world" 127.0 .0 .1 :6379 > sadd myset wang (integer) 1 127.0 .0 .1 :6379 > smembers myset1 ) "hello" 2 ) "world" 3 ) "wang" 127.0 .0 .1 :6379 > sismember myset wang (integer) 1 127.0 .0 .1 :6379 > sismember myset wang1 (integer) 0 127.0.0.1:6379> scard myset (integer) 3 127.0.0.1:6379> srem myset wang1 (integer) 1 127.0.0.1:6379> smembers myset 1) "hello" 2) "world" 3) "wang" 127.0.0.1:6379> srandmember myset "world" 127.0.0.1:6379> srandmember myset "wang" 127.0.0.1:6379> srandmember myset 2 1) "world" 2) "wang" 127.0.0.1:6379> smembers myset 1) "hello" 2) "world" 3) "wang" 127.0.0.1:6379> spop myset "world" 127.0.0.1:6379> smembers myset 1) "2" 2) "1" 3) "4" 4) "hello" 5) "3" 6) "5" 127.0.0.1:6379> spop myset 2 1) "1" 2) "5" 127.0.0.1:6379> smembers set1 1) "1" 2) "2" 3) "3" 127.0.0.1:6379> smembers set2 1) "4" 2) "5" 3) "6" 127.0.0.1:6379> smove set1 set2 3 (integer) 1127.0.0.1:6379> smembers set1 1) "1" 2) "2" 127.0.0.1:6379> smembers set2 1) "3" 2) "4" 3) "5" 4) "6" 127.0.0.1:6379> sadd set1 1 2 3 4 5 (integer) 5127.0.0.1:6379> sadd set2 5 6 7 8 9 (integer) 5127.0.0.1:6379> sdiff set1 set2 1) "1" 2) "2" 3) "3" 4) "4" 127.0.0.1:6379> sinter set1 set2 1) "5" 127.0.0.1:6379> sunion set1 set2 1) "1" 2) "2" 3) "3" 4) "4" 5) "5" 6) "6" 7) "7" 8) "8" 9) "9"
Hash(Map集合 k-v) 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 127.0 .0 .1 :6379 > hset hash1 k1 v1 (integer) 1 127.0 .0 .1 :6379 > hget hash1 k1 "v1" 127.0 .0 .1 :6379 > hmset hash1 k1 v1 k2 v2 OK 127.0 .0 .1 :6379 > hmget hash1 k1 k2 1 ) "v1" 2 ) "v2" 127.0 .0 .1 :6379 > hgetall hash1 1 ) "k1" 2 ) "v1" 3 ) "k2" 4 ) "v2" 127.0 .0 .1 :6379 > hdel hash1 k1 (integer) 1 127.0 .0 .1 :6379 > hgetall hash11 ) "k2" 2 ) "v2" 127.0 .0 .1 :6379 > hgetall hash11 ) "k2" 2 ) "v2" 3 ) "k1" 4 ) "v1" 5 ) "k3" 6 ) "v3" 127.0 .0 .1 :6379 > hlen hash1 (integer) 3 127.0 .0 .1 :6379 > hexists hash1 k1 (integer) 1 127.0 .0 .1 :6379 > hexists hash1 k5 (integer) 0 127.0.0.1:6379> hkeys hash1 1) "k2" 2) "k1" 3) "k3" 127.0.0.1:6379> hvals hash1 1) "v2" 2) "v1" 3) "v3" 127.0.0.1:6379> hgetall hash1 1) "k2" 2) "v2" 3) "k1" 4) "v1" 5) "k3" 6) "v3" 7) "age" 8) "2" 127.0.0.1:6379> hincrby hash1 age i (integer) 3127.0.0.1:6379> hincrby hash1 age -i (integer) 2 127.0.0.1:6379> hsetnx hash1 k5 v5 (integer) 1 127.0.0.1:6379> hsetnx hash1 k5 v (integer) 0
Zset(有序集合) 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 127.0 .0 .1 :6379 > zadd salary 5000 wang1 1000 wang2 1500 wang3 (integer) 3 127.0 .0 .1 :6379 > zrangebyscore salary -inf +inf 1 ) "wang2" 2 ) "wang3" 3 ) "wang1" 127.0 .0 .1 :6379 > zrangebyscore salary -inf +inf withscores 1 ) "wang2" 2 ) "1000" 3 ) "wang3" 4 ) "1500" 5 ) "wang1" 6 ) "5000" 127.0 .0 .1 :6379 > zrevrange salary 0 -1 withscores 1 ) "wang1" 2 ) "5000" 3 ) "wang2" 4 ) "2000" 5 ) "wang3" 6 ) "1500" 127.0 .0 .1 :6379 > zrangebyscore salary 1500 2000 1 ) "wang3" 127.0 .0 .1 :6379 > zrangebyscore salary 1500 5000 withscores 1 ) "wang3" 2 ) "1500" 3 ) "wang1" 4 ) "5000" 127.0 .0 .1 :6379 > zrangebyscore salary -inf +inf withscores1 ) "wang2" 2 ) "1000" 3 ) "wang3" 4 ) "1500" 5 ) "wang1" 6 ) "5000" 127.0 .0 .1 :6379 > zrem salary wang2 (integer) 1 127.0 .0 .1 :6379 > zrangebyscore salary -inf +inf withscores1 ) "wang3" 2 ) "1500" 3 ) "wang1" 4 ) "5000" 127.0 .0 .1 :6379 > zcard salary (integer) 2 127.0 .0 .1 :6379 > zrevrange salary 0 -1 withscores 1 ) "wang1" 2 ) "5000" 3 ) "wang2" 4 ) "2000" 5 ) "wang3" 6 ) "1500" 127.0 .0 .1 :6379 > zcount salary -inf +inf (integer) 3 127.0 .0 .1 :6379 > zcount salary 1500 2000 (integer) 2
三种特殊数据类型 Geospatial地理位置 有效的经度从-180度到180度。 有效的纬度从-85.05112878度到85.05112878度。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 127.0 .0 .1 :6379 > geoadd china:city 116.40 39.90 beijing (integer) 1 127.0 .0 .1 :6379 > geoadd china:city 121.47 31.23 shanghai(integer) 1 127.0 .0 .1 :6379 > geoadd china:city 106.50 29.53 chongqing(integer) 1 127.0 .0 .1 :6379 > geoadd china:city 114.05 22.52 shenzheng 120.16 30.24 hangzhou(integer) 2 127.0 .0 .1 :6379 > geopos china:city beijing 1 ) 1 ) "116.39999896287918" 2 ) "39.900000091670925" 127.0 .0 .1 :6379 > geopos china:city shanghai1 ) 1 ) "121.47000163793564" 2 ) "31.229999039757836" 127.0 .0 .1 :6379 > geopos china:city chongqing shenzheng 1 ) 1 ) "106.49999767541885" 2 ) "29.529999579006592" 2 ) 1 ) "114.04999762773514" 2 ) "22.520000087950386" 127.0 .0 .1 :6379 > geodist china:city beijing shanghai "1067378.7564" 127.0 .0 .1 :6379 > geodist china:city beijing shanghai km "1067.3788" 127.0 .0 .1 :6379 > georadius china:city 110 30 1000 km 1 ) "chongqing" 2 ) "shenzheng" 3 ) "hangzhou" 127.0 .0 .1 :6379 > georadius china:city 110 30 500 km1 ) "chongqing" 127.0 .0 .1 :6379 > georadius china:city 110 30 1000 km withdist 1 ) 1 ) "chongqing" 2 ) "341.9374" 2 ) 1 ) "shenzheng" 2 ) "924.6408" 3 ) 1 ) "hangzhou" 2 ) "977.5143" 127.0 .0 .1 :6379 > georadius china:city 110 30 1000 km withcoord 1 ) 1 ) "chongqing" 2 ) 1 ) "106.49999767541885" 2 ) "29.529999579006592" 2 ) 1 ) "shenzheng" 2 ) 1 ) "114.04999762773514" 2 ) "22.520000087950386" 3 ) 1 ) "hangzhou" 2 ) 1 ) "120.16000002622604" 2 ) "30.240000322949022" 127.0 .0 .1 :6379 > georadius china:city 110 30 1000 km withdist withcoord count 1 1 ) 1 ) "chongqing" 2 ) "341.9374" 3 ) 1 ) "106.49999767541885" 2 ) "29.529999579006592" 127.0 .0 .1 :6379 > georadius china:city 110 30 1000 km withdist withcoord count 3 1 ) 1 ) "chongqing" 2 ) "341.9374" 3 ) 1 ) "106.49999767541885" 2 ) "29.529999579006592" 2 ) 1 ) "shenzheng" 2 ) "924.6408" 3 ) 1 ) "114.04999762773514" 2 ) "22.520000087950386" 3 ) 1 ) "hangzhou" 2 ) "977.5143" 3 ) 1 ) "120.16000002622604" 2 ) "30.240000322949022" 127.0 .0 .1 :6379 > georadiusbymember china:city beijing 1000 km 1 ) "beijing" 127.0 .0 .1 :6379 > georadiusbymember china:city beijing 2000 km1 ) "chongqing" 2 ) "shenzheng" 3 ) "hangzhou" 4 ) "shanghai" 5 ) "beijing" 127.0 .0 .1 :6379 > geohash china:city beijing shanghai1 ) "wx4fbxxfke0" 2 ) "wtw3sj5zbj0" 127.0 .0 .1 :6379 > zrange china:city 0 -1 1 ) "chongqing" 2 ) "shenzheng" 3 ) "hangzhou" 4 ) "shanghai" 5 ) "beijing" 127.0 .0 .1 :6379 > zrem china:city beijing (integer) 1 127.0 .0 .1 :6379 > zrange china:city 0 -1 1 ) "chongqing" 2 ) "shenzheng" 3 ) "hangzhou" 4 ) "shanghai"
Hyperloglog 基数统计 网页的UV( UV:独立访客 一个人访问一个网站多次,但是还是算作一个人)
传统的方式,set保存用户的id,然后统计set中元素的数量
大数据量时可能会有误差
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 127.0 .0 .1 :6379 > pfadd pf1 a b c d e f g (integer) 1 127.0 .0 .1 :6379 > pfcount pf1 (integer) 7 127.0 .0 .1 :6379 > pfadd pf2 a a c c b b d d (integer) 1127.0.0.1:6379> pfcount pf2 (integer) 4127.0.0.1:6379> pfmerge pf3 pf1 pf2 OK 127.0.0.1:6379> pfcount pf3 (integer) 7
Bitmap位图场景 统计用户信息,活跃,不活跃;登录,未登录;打卡,未打卡;两个状态的都可以用Bitmap
Bitmap位图,数据结构!操作二进制位来进行记录,就只有0,1两种状态
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 127.0 .0 .1 :6379 > setbit sign 0 1 (integer) 0 127.0 .0 .1 :6379 > setbit sign 1 1 (integer) 0 127.0 .0 .1 :6379 > setbit sign 2 0 (integer) 0 127.0 .0 .1 :6379 > setbit sign 3 0 (integer) 0 127.0 .0 .1 :6379 > setbit sign 4 0 (integer) 0 127.0 .0 .1 :6379 > setbit sign 5 1 (integer) 0 127.0 .0 .1 :6379 > setbit sign 6 1 (integer) 0 127.0 .0 .1 :6379 > getbit sign 1 (integer) 1 127.0 .0 .1 :6379 > getbit sign 2 (integer) 0 127.0 .0 .1 :6379 > bitcount sign (integer) 4
事务 Redis事务本质:一组命令的集合!一个事务中的所有命令都会被序列化,在事务执行过程中,会按照顺序执行!
一次性(在一个队列中一次性执行)、顺序性(在队列中按照顺序执行)、排他性(事务在执行时不会被干扰)!执行一系列的命令
Redis事务没有隔离级别的概念
所有命令在事务中,并没有被执行!只有发起执行命令的时候才会执行! Exec(执行)
Redis单条命令保存原子性,但是事务不保证原子性
redis事务:
开启事务(multi)
命令入队()
执行事务(exec)
1 2 3 4 5 6 7 8 9 10 11 12 127.0 .0 .1 :6379 > multi OK 127.0 .0 .1 :6379 > set k1 v1 QUEUED 127.0 .0 .1 :6379 > set k2 v2 QUEUED 127.0 .0 .1 :6379 > get k2 QUEUED 127.0 .0 .1 :6379 > exec 1 ) OK2 ) OK3 ) "v2"
事务执行完后就没了,如果还要用事务,就需要重新开启。
取消事务
1 2 3 4 5 6 7 8 9 10 11 12 13 14 127.0 .0 .1 :6379 > multi OK 127.0 .0 .1 :6379 > set k1 v1QUEUED 127.0 .0 .1 :6379 > set k2 v2QUEUED 127.0 .0 .1 :6379 > set k3 v3QUEUED 127.0 .0 .1 :6379 > discard OK 127.0 .0 .1 :6379 > exec(error) ERR EXEC without MULTI 127.0 .0 .1 :6379 > get k3 (nil)
编译时异常(代码有问题!命令有错),在事务中所有的命令都不会被执行!
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 127.0 .0 .1 :6379 > multiOK 127.0 .0 .1 :6379 > set k1 v1QUEUED 127.0 .0 .1 :6379 > set k2 v2QUEUED 127.0 .0 .1 :6379 > set k3 v3QUEUED 127.0 .0 .1 :6379 > getset k3 (error) ERR wrong number of arguments for 'getset' command 127.0 .0 .1 :6379 > set k4 v4QUEUED 127.0 .0 .1 :6379 > set k5 v5QUEUED 127.0 .0 .1 :6379 > exec (error) EXECABORT Transaction discarded because of previous errors. 127.0 .0 .1 :6379 > get k1 (nil)
运行时异常(比如1/0),如果事务队列中存在语法 错误,那么执行命令的时候,其他命令可以正常的执行,错误命令抛出异常!
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 127.0 .0 .1 :6379 > multiOK 127.0 .0 .1 :6379 > set k1 v1QUEUED 127.0 .0 .1 :6379 > incr k1 QUEUED 127.0 .0 .1 :6379 > set k2 v2QUEUED 127.0 .0 .1 :6379 > set k3 v3QUEUED 127.0 .0 .1 :6379 > get k1QUEUED 127.0 .0 .1 :6379 > get k2QUEUED 127.0 .0 .1 :6379 > exec1 ) OK2 ) (error) ERR value is not an integer or out of range 3 ) OK4 ) OK5 ) "v1" 6 ) "v2"
监控 (Watch) 可以实现乐观锁
悲观锁:
很悲观,认为什么时候都会出问题,无论做什么都会加锁(效率低)
乐观锁:
单线程
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 127.0 .0 .1 :6379 > set money 100 OK 127.0 .0 .1 :6379 > set out 0 OK 127.0 .0 .1 :6379 > watch money OK 127.0 .0 .1 :6379 > multi OK 127.0 .0 .1 :6379 > decrby money 20 QUEUED 127.0 .0 .1 :6379 > incrby out 20 QUEUED 127.0 .0 .1 :6379 > exec1 ) (integer) 80 2 ) (integer) 20
测试多线程修改值,使用watch可以当作redis的乐观锁操作!
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 127.0 .0 .1 :6379 > watch money OK 127.0 .0 .1 :6379 > multi OK 127.0 .0 .1 :6379 > decrby money 10 QUEUED 127.0 .0 .1 :6379 > incrby out 10 QUEUED 127.0 .0 .1 :6379 > exec (nil) 127.0 .0 .1 :6379 > get money"80" 127.0 .0 .1 :6379 > set money 1000 OK 127.0 .0 .1 :6379 > unwatch OK 127.0 .0 .1 :6379 > watch money OK 127.0 .0 .1 :6379 > multiOK 127.0 .0 .1 :6379 > decrby money 10 QUEUED 127.0 .0 .1 :6379 > incrby out 10 QUEUED 127.0 .0 .1 :6379 > exec 1 ) (integer) 990 2 ) (integer) 30
Jedis Jedis是Redis官方推荐的Java连接开发工具!