Redis -- Set集合类型详解
Set(集合)
set中的值是不能重复的
127.0.0.1:6379[3]> SADD myset "hello" # set集合中添加元素
(integer) 1
127.0.0.1:6379[3]> SADD myset "luchong"
(integer) 1
127.0.0.1:6379[3]> SADD myset "love luchong"
(integer) 1
127.0.0.1:6379[3]> SMEMBERS myset # 查看set中所有的值(set本身无序)
1) "luchong"
2) "hello"
3) "love luchong"
127.0.0.1:6379[3]> SISMEMBER myset hello # 判断set中是否存在某一个值
(integer) 1
127.0.0.1:6379[3]> SISMEMBER myset lc
(integer) 0
127.0.0.1:6379[3]> SCARD myset # 获取set集合中元素的个数
(integer) 3
127.0.0.1:6379[3]> SADD myset "lc"
(integer) 1
127.0.0.1:6379[3]> SCARD myset
(integer) 4
127.0.0.1:6379[3]> SMEMBERS myset
1) "lc"
2) "luchong"
3) "hello"
4) "love luchong"
127.0.0.1:6379[3]> SREM myset hello # 移除set中的指定元素
(integer) 1
127.0.0.1:6379[3]> SCARD myset
(integer) 3
127.0.0.1:6379[3]> SMEMBERS myset
1) "lc"
2) "luchong"
3) "love luchong"
#############################################
127.0.0.1:6379[3]> SRANDMEMBER myset # 随机拿出set中的一个元素
"luchong"
127.0.0.1:6379[3]> SRANDMEMBER myset
"lc"
127.0.0.1:6379[3]> SRANDMEMBER myset
"love luchong"
127.0.0.1:6379[3]> srandmember myset
"lc"
127.0.0.1:6379[3]> SRANDMEMBER myset
"luchong"
127.0.0.1:6379[3]> SRANDMEMBER myset 2 # 随机拿出set中的两个元素
1) "luchong"
2) "love luchong"
127.0.0.1:6379[3]>
##############################################
127.0.0.1:6379[3]> SMEMBERS myset # 随机弹出(删除)set集合中的某个元素
1) "lc"
2) "luchong"
3) "love luchong"
127.0.0.1:6379[3]> SPOP myset
"love luchong"
127.0.0.1:6379[3]> SPOP myset
"lc"
127.0.0.1:6379[3]> SMEMBERS myset
1) "luchong"
127.0.0.1:6379[3]>
#############################################
127.0.0.1:6379[3]> SADD myset "hello"
(integer) 1
127.0.0.1:6379[3]> SADD myset "luchong"
(integer) 1
127.0.0.1:6379[3]> sadd myset "world"
(integer) 1
127.0.0.1:6379[3]> sadd myset2 "set2"
(integer) 1
127.0.0.1:6379[3]> SMEMBERS myset
1) "luchong"
2) "world"
3) "hello"
127.0.0.1:6379[3]> SMEMBERS myset2
1) "set2"
127.0.0.1:6379[3]> SMOVE myset myset2 luchong # 将一个set集合中指定的值移除到另一个指定的set集合中
(integer) 1
127.0.0.1:6379[3]> SMEMBERS myset
1) "world"
2) "hello"
127.0.0.1:6379[3]> SMEMBERS myset2
1) "luchong"
2) "set2"
127.0.0.1:6379[3]>
#############################################
数字集合类:
差集
交集
并集
127.0.0.1:6379[3]> SADD key1 a
(integer) 1
127.0.0.1:6379[3]> SADD key1 b
(integer) 1
127.0.0.1:6379[3]> SADD key1 c
(integer) 1
127.0.0.1:6379[3]> SADD key2 c
(integer) 1
127.0.0.1:6379[3]> SADD key2 d
(integer) 1
127.0.0.1:6379[3]> SADD key2 e
(integer) 1
127.0.0.1:6379[3]> SMEMBERS key1
1) "b"
2) "a"
3) "c"
127.0.0.1:6379[3]> SMEMBERS key2
1) "e"
2) "d"
3) "c"
127.0.0.1:6379[3]> SDIFF key1 key2 # 差集
1) "b"
2) "a"
127.0.0.1:6379[3]> SINTER key1 key2 # 交集 (共同好友)
1) "c"
127.0.0.1:6379[3]> sunion key1 key2 # 并集
1) "a"
2) "c"
3) "b"
4) "e"
5) "d"
127.0.0.1:6379[3]>
hash(哈希)
Map集合, 存的是: key-map。这时候值是map集合。本质和string类型没什么区别,还是一个简单的key-value
127.0.0.1:6379[3]> HSET myhash field1 luchong # 在hash中给定一个具体的K-V
(integer) 1
127.0.0.1:6379[3]> HGET myhash field1 # 在hash中根据key获取一个值
"luchong"
127.0.0.1:6379[3]> HMSET myhash field1 hello field2 world # 在hash中给定多个具体的K-V
OK
127.0.0.1:6379[3]> HMGET myhash field1 field2 # 在hash中根据多个key获取多个值
1) "hello"
2) "world"
127.0.0.1:6379[3]> HGETALL myhash # 获取hash中所有的书数据(key和value)
1) "field1"
2) "hello"
3) "field2"
4) "world"
127.0.0.1:6379[3]> HGETALL myhash # 根据key删除指定的key和value
1) "field2"
2) "world"
127.0.0.1:6379[3]>
##################################################
127.0.0.1:6379[3]> flushdb
OK
127.0.0.1:6379[3]> HMSET myhash field1 hello field2 world
OK
127.0.0.1:6379[3]> HGETALL myhash
1) "field1"
2) "hello"
3) "field2"
4) "world"
127.0.0.1:6379[3]> HLEN myhash # 获取hash的长度
(integer) 2
127.0.0.1:6379[3]> HEXISTS myhash field1 # 判断hash中指定key对应的字段是否存在
(integer) 1
127.0.0.1:6379[3]> HEXISTS myhash key1
(integer) 0
127.0.0.1:6379[3]> HKEYS myhash # 获取hash中所有的key
1) "field1"
2) "field2"
127.0.0.1:6379[3]> HVALS myhash # 获取hash中所有的value
1) "hello"
2) "world"
127.0.0.1:6379[3]>
################################################
127.0.0.1:6379[3]> HSET myhash field3 5
(integer) 1
127.0.0.1:6379[3]> HINCRBY myhash field3 1 # 指定增量
(integer) 6
127.0.0.1:6379[3]> HINCRBY myhash field3 -1
(integer) 5
127.0.0.1:6379[3]> HSETNX myhash field4 hello # 如果不存在则可以设置
(integer) 1
127.0.0.1:6379[3]> HSETNX myhash field4 world # 如果存在则不能设置
(integer) 0
127.0.0.1:6379[3]>
hash适合用于存放user的各种属性信息。
hash更适合用于对象的存储,String适合用于字符串的存储
127.0.0.1:6379[3]> HMSET user:1 name luchong age 23
OK
127.0.0.1:6379[3]> HGETALL user:1
1) "name"
2) "luchong"
3) "age"
4) "23"
127.0.0.1:6379[3]>
Zset(有序集合)
在set的基础上,增加了一个值。set k1 v1 zset k1 score1 v1
127.0.0.1:6379[3]> ZADD myset 1 one # 添加一个值
(integer) 1
127.0.0.1:6379[3]> ZADD myset 2 two 3 three # 添加多个值
(integer) 2
127.0.0.1:6379[3]> ZRANGE myset 0 -1
1) "one"
2) "two"
3) "three"
127.0.0.1:6379[3]>
#####################################
#排序如何实现??
127.0.0.1:6379[3]> ZADD salary 2500 xiaohong
(integer) 1
127.0.0.1:6379[3]> ZADD salary 5000 zhangsan
(integer) 1
127.0.0.1:6379[3]> ZADD salary 1500 luchong
(integer) 1
127.0.0.1:6379[3]> ZRANGE salary 0 -1
1) "luchong"
2) "xiaohong"
3) "zhangsan"
127.0.0.1:6379[3]> ZRANGE salary 0 -1 # 显示所有的值
1) "luchong"
2) "xiaohong"
3) "zhangsan"
127.0.0.1:6379[3]> ZRANGEBYSCORE salary -inf +inf withscores # 按从小到大的方式排序展示所有的值(带score)
1) "luchong"
2) "1500"
3) "xiaohong"
4) "2500"
5) "zhangsan"
6) "5000"
127.0.0.1:6379[3]> ZRANGEBYSCORE salary -inf +inf # 按从小到大的方式排序展示所有的值
1) "luchong"
2) "xiaohong"
3) "zhangsan"
127.0.0.1:6379[3]> ZREVRANGE salary 0 -1 # 从大到小的方式排序展示所有的值
1) "zhangsan"
2) "xiaohong"
3) "luchong"
127.0.0.1:6379[3]>
######################################
127.0.0.1:6379[3]> ZREM salary xiaohong # 删除指定的元素
(integer) 1
127.0.0.1:6379[3]> ZRANGE salary 0 -1
1) "luchong"
2) "zhangsan"
127.0.0.1:6379[3]> ZCARD salary # 获取有序集合中的元素个数
(integer) 2
127.0.0.1:6379[3]>
案例思路:set排序,存储班级成绩表,工资排序
普通消息:1. 重要消息 2.带权重进行判断
排行榜应用实现