nge
127.0.0.1:6379> spop stest 3
1) "5"
2) "3"
3) "1"
127.0.0.1:6379> sadd stest 1 2 3 4 5 6
(integer) 6
127.0.0.1:6379> smembers stest
1) "1"
2) "2"
3) "3"
4) "4"
5) "5"
6) "6"
127.0.0.1:6379> spop stest 10
1) "1"
2) "2"
3) "3"
4) "4"
5) "5"
6) "6"
Srandmember
127.0.0.1:6379> smembers stest
1) "1"
2) "2"
3) "3"
4) "4"
5) "5"
127.0.0.1:6379> srandmember stest -1
1) "3"
127.0.0.1:6379> srandmember stest -10
1)"3"
2)"1"
3)"3"
4)"4"
5)"3"
6)"4"
7)"3"
8)"3"
9)"1"
10) "3"
127.0.0.1:6379> srandmember stest 10
1) "1"
2) "2"
3) "3"
4) "4"
5) "5"
Srem
127.0.0.1:6379> smembers stest
1) "1"
2) "2"
3) "3"
4) "4"
5) "5"
127.0.0.1:6379> srem stest 10 9
(integer) 0
127.0.0.1:6379> srem stest 1 3 5
(integer) 3
127.0.0.1:6379> smembers stest
1) "2"
2) "4"
Sunion
127.0.0.1:6379> smembers stest
1) "2"
2) "4"
127.0.0.1:6379> smembers stest2
1) "4"
2) "5"
3) "6"
4) "7"
5) "8"
127.0.0.1:6379> sunion stest stest2
1) "2"
2) "4"
3) "5"
4) "6"
5) "7"
6) "8"
Sunionstore
127.0.0.1:6379> smembers stest3
1) "1"
2) "2"
127.0.0.1:6379> smembers stest
1) "2"
2) "4"
127.0.0.1:6379> smembers stest2
1) "4"
2) "5"
3) "6"
4) "7"
5) "8"
127.0.0.1:6379> sunionstore stest3 steststest2
(integer) 6
127.0.0.1:6379> smembers stest3
1) "2"
2) "4"
3) "5"
4) "6"
5) "7"
6) "8"
注意:
在测试的时候发现一个问题,介绍set集合的时候总是说 set集合是无序的可以有的情况set确是有序的,下面演示
127.0.0.1:6379> smember stest
(error) ERR unknown command 'smember'
127.0.0.1:6379> sadd stest 1
(integer) 1
127.0.0.1:6379> smembers stest
1) "1"
127.0.0.1:6379> sadd stest 4
(integer) 1
127.0.0.1:6379> sadd stest 2
(integer) 1
127.0.0.1:6379> sadd stest -1
(integer) 1
127.0.0.1:6379> sadd stest 10
(integer) 1
127.0.0.1:6379> smembers stest
1) "-1"
2) "1"
3) "2"
4) "4"
5) "10"
可以看到我按照无序添加元素,最后获取出来还是有序的为什么呢?
在redis里,集合的编码有两种,intset(整数集合)或者hashtable(哈希表)。intset编码的集合里面的元素是有序的(按照整数从小到大排列),hashtable编码的集合是无序的。
1.当集合同时满足下面两个条件时,会使用intset编码:
保存的所有元素都是整数
2.元素数量不超过512个(这个值可以通过配置文件里的set-max-intset-entries进行调整)
127.0.0.1:6379> object encoding stest
"intset"
127.0.0.1:6379> sadd stest2 c c# javaphp go
(integer) 5
127.0.0.1:6379> smembers stest2
1) "c#"
2) "php"
3) "c"
4) "java"
5) "go"
127.0.0.1:6379> object encoding stest2
"hashtable"
Sortedset数据结构
String数据结构介绍:key-value型的数据,根据redis官方文档,value的最大值为512M
一些特殊的string命令·
使用场景 1.原先单机环境中统计在线人数,变成分布式部署之后可以使用INCR/DECR 2.由于Redis本身极高的读写性能,一些秒杀的场景库存增减可以基于Redis来做而不是直接操作DB 结果展示 Incr: 127.0.0.1:6379> incr zbh (error) ERR value is not an integer or outof range 127.0.0.1:6379> incr zy (integer) 322 127.0.0.1:6379> get zy "322" 127.0.0.1:6379> incr zy (integer) 323 127.0.0.1:6379> get zy "323" decr 127.0.0.1:6379> decrzbh (error) ERR value is not an integer or outof range 127.0.0.1:6379> get zy "323" 127.0.0.1:6379> decr zy (integer) 322 127.0.0.1:6379> get zy "322" 127.0.0.1:6379> 127.0.0.1:6379> get zbh "zzh" incrby 127.0.0.1:6379> incrby zbh 10 (error) ERR value is not an integer or outof range 127.0.0.1:6379> get zy "332" 127.0.0.1:6379> incrby zy 3 (integer) 335 127.0.0.1:6379> get zy "335" decrby 127.0.0.1:6379> decrby zbh 1 (error) ERR value is not an integer or outof range 127.0.0.1:6379> get zbh "zzh" 127.0.0.1:6379> get zy "335" 127.0.0.1:6379> decrby zy 23123 (integer) -22788 127.0.0.1:6379> get zy "-22788" Hash数据结构Hash与string的区别,其实就是在key-value外面套了一层
结果展示: Hset: key = thash field =zzh 127.0.0.1:6379> hset thash zzh 111 (integer) 1 127.0.0.1:6379> hset t zzh 111 (integer) 1 Hget: 127.0.0.1:6379> hget t zzh "111" Hexists 127.0.0.1:6379> hexists t zzh (integer) 1 127.0.0.1:6379> hexists t z (integer) 0 Hgetall: 127.0.0.1:6379> hgetall t 1) "zzh" 2) "111" 3) "1" 4) "1" 127.0.0.1:6379> hgetall thash 1) "zzh" 2) "111" Hkeys: 127.0.0.1:6379> hkeys thash 1) "zzh" 127.0.0.1:6379> hkeys t 1) "zzh" 2) "1" Hvals: 127.0.0.1:6379> hgetall thash 1) "zzh" 2) "101" 3) "z" 4) "123" 5) "zz" 6) "321" 7) "zzz" 8) "231" 127.0.0.1:6379> hvals thash 1) "101" 2) "123" 3) "321" 4) "231" hincrby 127.0.0.1:6379> hkeys thash 1) "zzh" 127.0.0.1:6379> hincrby thash z -1 (integer) -1 127.0.0.1:6379> hget thash z "-1" Hlen 127.0.0.1:6379> hlen thash (integer) 2 Hmget: 127.0.0.1:6379> hkeys thash 1) "zzh" 2) "z" 127.0.0.1:6379> hmget thash zzh z zz z1 1) "101" 2) "-1" 3) (nil) 4) (nil) Hmset 127.0.0.1:6379> hkeys thash 1) "zzh" 2) "z" 127.0.0.1:6379> hmset thash z 123 zz 321zzz 231 OK 127.0.0.1:6379> hgetall thash 1) "zzh" 2) "101" 3) "z" 4) "123" 5) "zz" 6) "321" 7) "zzz" 8) "231" Hdel 127.0.0.1:6379> hkeys thash 1) "zzh" 2) "z" 3) "zz" 4) "zzz" 127.0.0.1:6379> hdel thash z zz z1 (integer) 2 127.0.0.1:6379> hkeys thash 1) "zzh" 2) "zzz" List数据结构
结果展示 Lpush 127.0.0.1:6379> lpush ltest 1 2 3 4 5 (integer) 5 Lpushx 127.0.0.1:6379> lpushx ltest -1 (integer) 6 127.0.0.1:6379> lpushx ll -1 (integer) 0 Lpop 127.0.0.1:6379> lpop ltest "-1" Lrange 127.0.0.1:6379> lrange ltest -1 -3 (empty list or set) 127.0.0.1:6379> lrange ltest 0 3 1) "5" 2) "4" 3) "3" 4) "2"127.0.0.1:6379> lrangeltest 0 -1 1) "5" 2) "4" 3) "3" 4) "2" 5) "1" 127.0.0.1:6379> lrange ltest -3 -1 1) "3" 2) "2" 3) "1" 127.0.0.1:6379> lrange ltest 0 100 1) "5" 2) "4" 3) "3" 4) "2" 5) "1" Lset 127.0.0.1:6379> lrange ltest 0 100 1) "5" 2) "4" 3) "3" 4) "2" 5) "1" 127.0.0.1:6379> lset ltest 100 23 (error) ERR index out of range 127.0.0.1:6379> lset ltest 0 -1 OK 127.0.0.1:6379> lrange ltest 0 100 1) "-1" 2) "4" 3) "3" 4) "2" 5) "1" lindex 127.0.0.1:6379> lindex ltest 100 (nil) 127.0.0.1:6379> lindex ltest -1 "1" 127.0.0.1:6379> lindex ltest -100 (nil) Linsert 127.0.0.1:6379> linsert ltest before -1100 (integer) 6 127.0.0.1:6379> linsert ltest after -1100 (integer) 7 Llen 127.0.0.1:6379> llen ltes (integer) 0 127.0.0.1:6379> llen ltest (integer) 7 Rpop 127.0.0.1:6379> rpop ltest "1" rpoplpush 127.0.0.1:6379> rpoplpush ltest ltest2 "2" 127.0.0.1:6379> rpoplpush ll ltest2 (nil) 127.0.0.1:6379> rpoplpush t ltest2 (error) WRONGTYPE Operation against a keyholding the wrong kind of value 127.0.0.1:6379> rpoplpush t t (error) WRONGTYPE Operation against a keyholding the wrong kind of value 127.0.0.1:6379> rpoplpush ltest ltest "3" Rpush/rpushx 127.0.0.1:6379> rpush ltest 1 2 3 4 (integer) 9 127.0.0.1:6379> rpush ltest4 1 2 3 (integer) 3 127.0.0.1:6379> rpushx llll -1 (integer) 0 lrem 127.0.0.1:6379> lrange ltest 0 -1 1) "2" 2) "3" 3) "100" 4) "-1" 5) "100" 6) "4" 7) "1" 8) "2" 9) "4" 127.0.0.1:6379> lrem ltest -1 4 (integer) 1 127.0.0.1:6379> lrange ltest 0 -1 1) "2" 2) "3" 3) "100" 4) "-1" 5) "100" 6) "4" 7) "1" 8) "2" 127.0.0.1:6379> lrem ltest 1 4 (integer) 1 127.0.0.1:6379> lrange ltest 0 -1 1) "2" 2) "3" 3) "100" 4) "-1" 5) "100" 6) "1" 7) "2" 127.0.0.1:6379> lrem ltest 0 100 (integer) 2 127.0.0.1:6379> lrange ltest 0 -1 1) "2" 2) "3" 3) "-1" 4) "1" 5) "2" Lrim 127.0.0.1:6379> lrange ltest 0 -1 1) "2" 2) "3" 3) "-1" 4) "1" 5) "2" 127.0.0.1:6379> ltrim ltest 0 2 OK 127.0.0.1:6379> lrange ltest 0 -1 1) "2" 2) "3" 3) "-1" 注意: 操作List千万注意区分LPUSH、RPUSH两个命令,把数据添加到表头和把数据添加到表尾是完全不一样的两种结果。 另外List还有BLPOP、BRPOP、BRPOPLPUSH三个命令没有说,它们是几个POP的阻塞版本,即没有数据可以弹出的时候将阻塞客户端直到超时或者发现有可以弹出的元素为止。 Set数据结构
结果展示: Sadd 127.0.0.1:6379> sadd stest 1 2 3 4 5 (integer) 5 Sacrd 127.0.0.1:6379> scard stest (integer) 5 Sdiff 127.0.0.1:6379> sadd stest2 3 4 5 6 7 (integer) 5 127.0.0.1:6379> sdiff stest stest2 1) "1" 2) "2" smembers 127.0.0.1:6379> smembers set (empty list or set) 127.0.0.1:6379> smembers stest 1) "1" 2) "2" 3) "3" 4) "4" 5) "5" Sdiffstore 127.0.0.1:6379> smembers stest3 1) "1" 2) "2" 3) "3" 4) "4" 127.0.0.1:6379> sdiffstore stest3 steststest2 (integer) 2 127.0.0.1:6379> smembers stest3 1) "1" 2) "2" Sinter 127.0.0.1:6379> smembers stest 1) "1" 2) "2" 3) "3" 4) "4" 5) "5" 127.0.0.1:6379> smembers stest2 1) "3" 2) "4" 3) "5" 4) "6" 5) "7" 127.0.0.1:6379> sinter stest stest2 1) "3" 2) "4" 3) "5" Sinterstore 127.0.0.1:6379> smembers stest3 1) "1" 2) "2" 127.0.0.1:6379> smembers stest 1) "1" 2) "2" 3) "3" 4) "4" 5) "5" 127.0.0.1:6379> smembers stest2 1) "3" 2) "4" 3) "5" 4) "6" 5) "7" 127.0.0.1:6379> sinterstore stest3 steststest2 (integer) 3 127.0.0.1:6379> smembers stest3 1) "3" 2) "4" 3) "5" Sismember 127.0.0.1:6379> sismember stest 1 (integer) 1 127.0.0.1:6379> sismember stest 10 (integer) 0 Smove 127.0.0.1:6379> smembers stest2 1) "1" 2) "3" 3) "4" 4) "5" 5) "6" 6) "7" 127.0.0.1:6379> smove stest stest2 2 (integer) 1 127.0.0.1:6379> smembers sets2 (empty list or set) 127.0.0.1:6379> smembers stest2 1) "1" 2) "2" 3) "3" 4) "4" 5) "5" 6) "6" 7) "7" Spop 127.0.0.1:6379> sadd stest 7 6 5 4 3 2 1 (integer) 7 127.0.0.1:6379> smembers stest 1) "1" 2) "2" 3) "3" 4) "4" 5) "5" 6) "6" 7) "7" 127.0.0.1:6379> spop stest -1 (error) ERR index out of range 127.0.0.1:6379> spop stest 3 1) "5" 2) "3" 3) "1" 127.0.0.1:6379> sadd stest 1 2 3 4 5 6 (integer) 6 127.0.0.1:6379> smembers stest 1) "1" 2) "2" 3) "3" 4) "4" 5) "5" 6) "6" 127.0.0.1:6379> spop stest 10 1) "1" 2) "2" 3) "3" 4) "4" 5) "5" 6) "6" Srandmember 127.0.0.1:6379> smembers stest 1) "1" 2) "2" 3) "3" 4) "4" 5) "5" 127.0.0.1:6379> srandmember stest -1 1) "3" 127.0.0.1:6379> srandmember stest -10 1)"3" 2)"1" 3)"3" 4)"4" 5)"3" 6)"4" 7)"3" 8)"3" 9)"1" 10) "3" 127.0.0.1:6379> srandmember stest 10 1) "1" 2) "2" 3) "3" 4) "4" 5) "5" Srem 127.0.0.1:6379> smembers stest 1) "1" 2) "2" 3) "3" 4) "4" 5) "5" 127.0.0.1:6379> srem stest 10 9 (integer) 0 127.0.0.1:6379> srem stest 1 3 5 (integer) 3 127.0.0.1:6379> smembers stest 1) "2" 2) "4" Sunion 127.0.0.1:6379> smembers stest 1) "2" 2) "4" 127.0.0.1:6379> smembers stest2 1) "4" 2) "5" 3) "6" 4) "7" 5) "8" 127.0.0.1:6379> sunion stest stest2 1) "2" 2) "4" 3) "5" 4) "6" 5) "7" 6) "8" Sunionstore 127.0.0.1:6379> smembers stest3 1) "1" 2) "2" 127.0.0.1:6379> smembers stest 1) "2" 2) "4" 127.0.0.1:6379> smembers stest2 1) "4" 2) "5" 3) "6" 4) "7" 5) "8" 127.0.0.1:6379> sunionstore stest3 steststest2 (integer) 6 127.0.0.1:6379> smembers stest3 1) "2" 2) "4" 3) "5" 4) "6" 5) "7" 6) "8" 注意: 在测试的时候发现一个问题,介绍set集合的时候总是说 set集合是无序的可以有的情况set确是有序的,下面演示 127.0.0.1:6379> smember stest (error) ERR unknown command 'smember' 127.0.0.1:6379> sadd stest 1 (integer) 1 127.0.0.1:6379> smembers stest 1) "1" 127.0.0.1:6379> sadd stest 4 (integer) 1 127.0.0.1:6379> sadd stest 2 (integer) 1 127.0.0.1:6379> sadd stest -1 (integer) 1 127.0.0.1:6379> sadd stest 10 (integer) 1 127.0.0.1:6379> smembers stest 1) "-1" 2) "1" 3) "2" 4) "4" 5) "10" 可以看到我按照无序添加元素,最后获取出来还是有序的为什么呢? 在redis里,集合的编码有两种,intset(整数集合)或者hashtable(哈希表)。intset编码的集合里面的元素是有序的(按照整数从小到大排列),hashtable编码的集合是无序的。 1.当集合同时满足下面两个条件时,会使用intset编码: 保存的所有元素都是整数 2.元素数量不超过512个(这个值可以通过配置文件里的set-max-intset-entries进行调整) 127.0.0.1:6379> object encoding stest "intset" 127.0.0.1:6379> sadd stest2 c c# javaphp go (integer) 5 127.0.0.1:6379> smembers stest2 1) "c#" 2) "php" 3) "c" 4) "java" 5) "go" 127.0.0.1:6379> object encoding stest2 "hashtable" Sortedset数据结构
结果展示: Zadd 127.0.0.1:6379> zadd ztest 1 5 -1 10 7 33 11 (integer) 4 127.0.0.1:6379> zadd ztest2 10 java 5php 7 c# 6 c (integer) 4 127.0.0.1:6379> zadd ztest3 java 4 c 5 (error) ERR value is not a valid float Zcard 127.0.0.1:6379> zcard ztest (integer) 4 127.0.0.1:6379> zcard ztest3 (integer) 0 Zcount 127.0.0.1:6379> zcount ztest 5 10 (integer) 1 Zrange 127.0.0.1:6379> zrange ztest2 0 -1 1) "js" 2) "php" 3) "c" 4) "c#" 5) "java" 127.0.0.1:6379> zrange ztest2 0 -1withscores 1)"js" 2)"5" 3)"php" 4)"5" 5)"c" 6)"6" 7)"c#" 8)"7" 9)"java" 10) "10" Zrevrange 127.0.0.1:6379> zrevrange ztest2 0 -1 1) "java" 2) "c#" 3) "c" 4) "php" 5) "js" 127.0.0.1:6379> zrevrange ztest2 0 -1withscores 1)"java" 2)"10" 3)"c#" 4)"7" 5)"c" 6)"6" 7)"php" 8)"5" 9)"js" 10) "5" Zrank 127.0.0.1:6379> zrange ztest 0 -1withscores 1) "10" 2) "-1" 3) "5" 4) "1" 5) "11" 6) "3" 7) "3" 8) "7" 127.0.0.1:6379> zrank ztest 10 (integer) 0 Zrem 127.0.0.1:6379> zrange ztest 0 -1 1) "10" 2) "5" 3) "11" 4) "3" 127.0.0.1:6379> zrem ztest 11 (integer) 1 127.0.0.1:6379> zrange ztest 0 -1 1) "10" 2) "5" 3) "3" Zremrangebyrank 127.0.0.1:6379> zrange ztest 0 -1withscores 1) "10" 2) "-1" 3) "5" 4) "1" 5) "3" 6) "7" 127.0.0.1:6379> zremrangebyrank ztest 510 (integer) 0 127.0.0.1:6379> zremrangebyrank ztest 23 (integer) 1 127.0.0.1:6379> zrange ztest 0 -1withscores 1) "10" 2) "-1" 3) "5" 4) "1" Zremrangebyscores 127.0.0.1:6379> zrange ztest2 0 -1withscores 1)"js" 2)"5" 3)"php" 4)"5" 5)"c" 6)"6" 7)"c#" 8)"7" 9)"java" 10) "10" 127.0.0.1:6379> zremrangebyscore ztest26 10 (integer) 3 127.0.0.1:6379> zrange ztest2 0 -1withscores 1) "js" 2) "5" 3) "php" 4) "5" 注意: 这个地方排名的时候稍微注意下,和我们认为的排名有些微区别,比如1 1 23,由于有两个1,因此3正序的Rank应当为2(以0为下标),但实际上会是3,所以Rank应当理解为元素在集合中的下标位置更加准确。 | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
结果展示:
Zadd
127.0.0.1:6379> zadd ztest 1 5 -1 10 7 33 11
(integer) 4
127.0.0.1:6379> zadd ztest2 10 java 5php 7 c# 6 c
(integer) 4
127.0.0.1:6379> zadd ztest3 java 4 c 5
(error) ERR value is not a valid float
Zcard
127.0.0.1:6379> zcard ztest
(integer) 4
127.0.0.1:6379> zcard ztest3
(integer) 0
Zcount
127.0.0.1:6379> zcount ztest 5 10
(integer) 1
Zrange
127.0.0.1:6379> zrange ztest2 0 -1
1) "js"
2) "php"
3) "c"
4) "c#"
5) "java"
127.0.0.1:6379> zrange ztest2 0 -1withscores
1)"js"
2)"5"
3)"php"
4)"5"
5)"c"
6)"6"
7)"c#"
8)"7"
9)"java"
10) "10"
Zrevrange
127.0.0.1:6379> zrevrange ztest2 0 -1
1) "java"
2) "c#"
3) "c"
4) "php"
5) "js"
127.0.0.1:6379> zrevrange ztest2 0 -1withscores
1)"java"
2)"10"
3)"c#"
4)"7"
5)"c"
6)"6"
7)"php"
8)"5"
9)"js"
10) "5"
Zrank
127.0.0.1:6379> zrange ztest 0 -1withscores
1) "10"
2) "-1"
3) "5"
4) "1"
5) "11"
6) "3"
7) "3"
8) "7"
127.0.0.1:6379> zrank ztest 10
(integer) 0
Zrem
127.0.0.1:6379> zrange ztest 0 -1
1) "10"
2) "5"
3) "11"
4) "3"
127.0.0.1:6379> zrem ztest 11
(integer) 1
127.0.0.1:6379> zrange ztest 0 -1
1) "10"
2) "5"
3) "3"
Zremrangebyrank
127.0.0.1:6379> zrange ztest 0 -1withscores
1) "10"
2) "-1"
3) "5"
4) "1"
5) "3"
6) "7"
127.0.0.1:6379> zremrangebyrank ztest 510
(integer) 0
127.0.0.1:6379> zremrangebyrank ztest 23
(integer) 1
127.0.0.1:6379> zrange ztest 0 -1withscores
1) "10"
2) "-1"
3) "5"
4) "1"
Zremrangebyscores
127.0.0.1:6379> zrange ztest2 0 -1withscores
1)"js"
2)"5"
3)"php"
4)"5"
5)"c"
6)"6"
7)"c#"
8)"7"
9)"java"
10) "10"
127.0.0.1:6379> zremrangebyscore ztest26 10
(integer) 3
127.0.0.1:6379> zrange ztest2 0 -1withscores
1) "js"
2) "5"
3) "php"
4) "5"
注意:
这个地方排名的时候稍微注意下,和我们认为的排名有些微区别,比如1 1 23,由于有两个1,因此3正序的Rank应当为2(以0为下标),但实际上会是3,所以Rank应当理解为元素在集合中的下标位置更加准确。