redis数据类型list、hash、set、zset
list
hash
set
zset
list
可以在redis命令行自己查看帮助文档,help @list
LPUSH key value [value …] 从对象的左边开始放数据,压入数据
lpush nihao a b c d 存放的顺序是d c b a ,使用lpop key从左边弹出数据,lpop nihao 最先弹出d,最后才弹出a;
127.0.0.1:6379> lrange nihao 0 -1
1) "d"
2) "c"
3) "b"
4) "a"
rpush nihao2 a b c d e 存放的顺序是 a b c d e,使用rpop key从左边弹出数据,rpop nihao2 最先弹出e,最后才弹出a;
127.0.0.1:6379> lrange nihao2 0 -1
1) "a"
2) "b"
3) "c"
4) "d"
5) "e"
小结:我们对list使用同向命令时lpush、lpop和rpush、rpop的时候,对list可以做栈的使用。我们对list使用反向命令如:lpush、rpop左边进,右边出;即先进先出,此时就是队列。
lrange key start stop查看key里的数据,redis的索引有正负索引。
127.0.0.1:6379> lrange nihao2 0 0
1) "a"
127.0.0.1:6379> lrange nihao2 0 -5
1) "a"
127.0.0.1:6379> lrange nihao2 0 -4
1) "a"
2) "b"
lindex key index 根据下标取出key里的值
127.0.0.1:6379> lindex nihao 0 取出第一个值
"d"
127.0.0.1:6379> lindex nihao -1 取出最后一个值
"a"
127.0.0.1:6379> lset nihao 1 ccc 把key为nihao的第一个索引的值修改为ccc
127.0.0.1:6379> lrange nihao 0 -1 查看nihao的值
1) "d"
2) "ccc"
3) "b"
4) "a"
小结:这种操作类似于数组,对下标(索引)进行操作,list是不会去重的。
127.0.0.1:6379> lpush key1 1 a 2 b 3 c 4 a 5 d
127.0.0.1:6379> lrange key1 0 -1
1) "d"
2) "5"
3) "a"
4) "4"
5) "c"
6) "3"
7) "b"
8) "2"
9) "a"
10) "1"
lrem key count value 移除list中元素的个数以及值
127.0.0.1:6379> lrem key1 2 a 移除key1中2个a
127.0.0.1:6379> lrange key1 0 -1
1) "d"
2) "5"
3) "4"
4) "c"
5) "3"
6) "b"
7) "2"
8) "1"
linsert key BEFORE|AFTER pivot(元素的值) value 在list里插入一个数,一个list中有相同的值,插入数据的时候会在第一个值的地方插入。
127.0.0.1:6379> linsert key1 after 4 a
127.0.0.1:6379> linsert key1 after b a
127.0.0.1:6379> lrange key1 0 -1
1) "d"
2) "5"
3) "4"
4) "a"
5) "c"
6) "3"
7) "b"
8) "a"
9) "2"
10) "1"
blpop key [key …] timeout 阻塞时间为0表示一直等着。多个客户端阻塞等待,谁先阻塞,当key有值的时候谁会先取到值并释放连接。
hash
help @hash 查看帮助文档
hset key field value
127.0.0.1:6379> hset people name eye
hmset key field value [field value ...]
张三的性别,身高,年龄
127.0.0.1:6379> hset zhangsan gender F
127.0.0.1:6379> hmset zhangsan age 13 height 188
127.0.0.1:6379> hmget zhangsan age height gender 获取zhangsan的属性的值
1) "13"
2) "188"
3) "F"
127.0.0.1:6379> hgetAll zhangsan 获取张三的所有属性和值
1) "gender"
2) "F"
3) "age"
4) "13"
5) "height"
6) "188"
set 存放无序但有去重
命令:sadd key member [member …] 添加数据
smembers key 查看key的所有值
srem key member [member …] 删除元素
127.0.0.1:6379> sadd key3 haha hehe haha xixi hahah
127.0.0.1:6379> smembers key3 获取结果,发现对haha进行了去重处理。
1) "xixi"
2) "hehe"
3) "hahah"
4) "haha"
127.0.0.1:6379> srem key3 xixi haha 删除元素xixi haha
127.0.0.1:6379> smembers key3 查看结果
1) "hehe"
2) "hahah"
验证交集、并集、差集
命令:sinter key [key …] 几个key取交集,结果直接返回给客户端
sinterstore destination key [key …] 几个key取交集返回的结果存放在destination目标key中,整个过程在服务端完成,减少了磁盘的IO操作。
sunion key [key …] 几个key取并集,结果直接返回给客户端
sunionstore destination key [key …]
sdiff key [key …]取差集,具有方向性,具体看哪个key在前面
127.0.0.1:6379> sadd key4 1 3 2 4 5
127.0.0.1:6379> sadd key5 76 7 3 4 9 10
127.0.0.1:6379> sinter key4 key5
1) "3"
2) "4"
127.0.0.1:6379> sinterstore tar(结果存放的key) key4 key5 取交集
127.0.0.1:6379> smembers tar
1) "3"
2) "4"
127.0.0.1:6379> sunion key4 key5 取并集
1) "1"
2) "2"
3) "3"
4) "4"
5) "5"
6) "7"
7) "9"
8) "10"
9) "76"
127.0.0.1:6379> sdiff key4 key5 取差集
1) "1"
2) "2"
3) "5"
127.0.0.1:6379> sdiff key5 key4
1) "7"
2) "9"
3) "10"
4) "76"
随机事件
srandmember key [count]
count为正数:取出一个去重的结果集,但不能超过原有key的数据集;
count为负数:取出一个重复的结果集,一定满足所需的数量
count为0:不返回
使用场景1:抽奖。假如3个奖品,集合里存用户
srandmember key 2 从集合里取两个不重复的人
srandmember key -2 从集合中取两个,可重复的
127.0.0.1:6379> sadd key6 zhangsan lisi wangwu zhaoliu
127.0.0.1:6379> srandmember key6 3
1) "wangwu"
2) "zhangsan"
3) "lisi"
127.0.0.1:6379> srandmember key6 -3(抽取的人可能是1个人, 2个人,3个人)
1) "zhangsan"
2) "zhaoliu"
3) "zhangsan"
场景2:奖品多,人少 count设置为负数
场景3:奖品数小于人数
spop key [count] 取出一个
小结:无序与随机性,元素的放入多少的不同,元素的存储顺序不同
sorted_set
是一个集合,有很多元素,在排序的时候元素需要给出分值,如果分值相同则会按照名称的字典顺序排序;每个元素都有正负向索引。
zadd key [NX|XX] [CH] [INCR] score member [score member …]
127.0.0.1:6379> zadd key1 8 zhangsan 2 lisi 3 wangwu
增加一个数据集,默认的存放顺序是根据分值物理内存左边小,右边大,不随命令发生变化
127.0.0.1:6379> zrange key1 0 -1
1) "lisi"
2) "wangwu"
3) "zhangsan"
127.0.0.1:6379> zrange key1 0 -1 withscores 按照索引取值
1) "lisi"
2) "2"
3) "wangwu"
4) "3"
5) "zhangsan"
6) "8"
zrangebyscore key min max [WITHSCORES] [LIMIT offset count]按照分值去取
127.0.0.1:6379> zrangebyscore key1 2 8 取出2-8分的数据
1) "lisi"
2) "wangwu"
3) "zhangsan"
zrange key start stop 取出前几位,按照升序排序
127.0.0.1:6379> zrange key1 0 1
1) "lisi"
2) "wangwu"
zrevrange key start stop 取出前几位,按照分值进行降序排序
127.0.0.1:6379> zrevrange key1 0 1
1) "zhangsan"
2) "wangwu"
127.0.0.1:6379> zrange key1 -2 -1 还是按照升序取后两个
1) "wangwu"
2) "zhangsan"
zscore key member 获取分值
127.0.0.1:6379> zscore key1 zhangsan
"8"
zrank key member 获取排名
127.0.0.1:6379> zrank key1 wangwu
(integer) 1
zincrby key increment member
127.0.0.1:6379> zincrby key1 1 zhangsan 对zhangsan分数加1
"9"
127.0.0.1:6379> zrange key1 0 -1 withscores
1) "lisi"
2) "2"
3) "wangwu"
4) "3"
5) "zhangsan"
6) "9"
并集、交集
zunionstore destination numkeys key [key …] [WEIGHTS weight] [AGGREGATE SUM|MIN|MAX]
127.0.0.1:6379> zadd key1 80 zhaoliu 60 lisi 70 wangwu
127.0.0.1:6379> zadd key2 40 zhangsan 60 sunqi 40 liuba
zunionstore unionKey 2 key1 key2 说明:2表示2个key 后面接key的名称
127.0.0.1:6379> zrange unionKey 0 -1 withscores 查看目标key结果集的权重和分值
1) "liuba"
2) "40"
3) "lisi"
4) "60"
5) "sunqi"
6) "60"
7) "wangwu"
8) "70"
9) "zhaoliu"
10) "120"
127.0.0.1:6379> zunionstore unionKey1 2 key1 key2 weights 1 0.5
127.0.0.1:6379> zrange unionKey1 0 -1 withscores
1) "liuba"
2) "20"
3) "sunqi"
4) "30"
5) "lisi"
6) "60"
7) "wangwu"
8) "70"
9) "zhaoliu"
10) "100"
取最大值
127.0.0.1:6379> zunionstore maxunion1 2 key1 key2 AGGREGATE max