文章目录
1 set类型
1.1 set类型介绍
- 存储大量的数据,在
查询方面提供更高的效率
- 能够保存大量的数据,高效的内部存储机制,
便于查询
- 与hash存储结构完全相同,仅存储键,不存储值(nil),并且值是
不允许重复的
1.2 操作指令
基本操作(增删改查)
- 添加数据
sadd key member1 [member2]
- 获取全部数据
smembers key
- 随机返回指定个数元素(默认返回一个) 并将元素在集合中删除
spop key [count]
- 返回集合中元素的个数
scard key
- 删除数据
srem key member1 [member2]
eg:
localhost:6379> clear
localhost:6379> sadd ids 1 2 3 4 5
(integer) 5
localhost:6379> scard ids
(integer) 5
localhost:6379> smembers ids
1) "1"
2) "2"
3) "3"
4) "4"
5) "5"
localhost:6379> spop ids 2
1) "5"
2) "2"
localhost:6379> scard ids
(integer) 3
localhost:6379> srem ids 3 # 返回删除数据的个数
(integer) 1
localhost:6379> smembers ids
1) "1"
2) "4"
localhost:6379> srem ids 999 # 测试删除一个不存在的元素,返回值就是0
(integer) 0
- 判断集合中是否包含指定数据
sismember key member
- 随机返回指定个数数据,默认返回一个,这个操作不会删除数据(和spop的区别)
srandmember key [count]
eg:
localhost:6379> sadd ids 1 2 3 4 5
(integer) 5
localhost:6379> smembers ids
1) "1"
2) "2"
3) "3"
4) "4"
5) "5"
localhost:6379> sismember ids 3
(integer) 1
localhost:6379> sismember ids 999
(integer) 0
localhost:6379> srandmember ids 3
1) "2"
2) "5"
3) "1"
localhost:6379> scard ids # srandmember之后数据还是5个
(integer) 5
其他操作(数据的合并)
- 求多个个集合的交、并、差集
sinter key1 [key2] # 交集
sunion key1 [key2] # 并集
sdiff key1 [key2] # 差集合
eg:
localhost:6379> sadd set1 1 2 3 4
(integer) 4
localhost:6379> sadd set2 2 4 6 8
(integer) 4
localhost:6379> sinter set1 set2
1) "2"
2) "4"
localhost:6379> sunion set1 set2
1) "1"
2) "2"
3) "3"
4) "4"
5) "6"
6) "8"
localhost:6379> sdiff set1 set2
1) "1"
2) "3"
- 求多个集合的交、并、差集并存储到指定集合中
sinterstore destination key1 [key2]
sunionstore destination key1 [key2]
sdiffstore destination key1 [key2]
eg:
localhost:6379> sadd set1 1 2 3 4
(integer) 4
localhost:6379> sadd set2 2 4 6 8
(integer) 4
localhost:6379> sinterstore target set1 set2
(integer) 2
localhost:6379> smembers target
1) "2"
2) "4"
1.3 常用命令总结
命令 | 说明 |
---|---|
sadd | 为集合添加元素 |
smembers | 显示集合中所有元素 无序 |
scard | 返回集合中元素的个数 |
spop | 随机返回一个元素 并将元素在集合中删除 |
smove | 从一个集合中向另一个集合移动元素 必须是同一种类型 |
srem | 从集合中删除一个元素 |
sismember | 判断一个集合中是否含有这个元素 |
srandmember | 随机返回元素 |
sdiff | 去掉第一个集合中其它集合含有的相同元素 |
sinter | 求交集 |
sunion | 求和集 |
1.4 set 类型数据操作的注意事项
- set 类型不允许数据重复,如果添加的数据在 set 中已经存在,将只保留一份
- set 虽然与hash的存储结构相同,但是无法启用hash中存储值的空间
2 sorted_set 类型
数据排序
有利于数据的有效展示,需要提供一种可以根据自身特征进行排序的方式
- 在set的存储结构基础上添加可排序字段(得分字段)
2.1 操作指令
基本的操作
- 添加数据
zadd key score1 member1 [score2 member2]
- 获取数据
zrange key start stop [WITHSCORES] # 生序
zrevrange key start stop [WITHSCORES] # 降序
- 可选参数:withscores,是否展示数据的得分
- 删除数据
zrem key member [member ...] # 可删除多个
- 返回集合的元素个数
zcard key
- 显示某一个元素的分数
zscore key member
- 返回数据的排序
zrank key member # 返回这个数据的排名(升序)
zrevrank key member # 返回这个数据的排名(降序)
eg: 设计保存学生成绩
# sc 是key 90是张三的成绩 95是李四的成绩 这里的张三就是value,90就是张三这个数据的得分(score)
localhost:6379>zadd sc 90 zhangsan 95 lisi 88 chenwu 60 liuge
localhost:6379> zrange sc 0 -1 # 同样索引值-1的话,表示倒数第一个,(0,-1)就是获取全部
1) "liuge"
2) "chenwu"
3) "zhangsan"
4) "lisi"
localhost:6379> zrange sc 0 -1 withscores # withscores这个参数就会把每个数据的得分也展示出来
1) "liuge"
2) "60"
3) "chenwu"
4) "88"
5) "zhangsan"
6) "90"
7) "lisi"
8) "95"
localhost:6379> zrem sc liuge lisi # 删除liuge,lisi这两个数据
(integer) 2
localhost:6379> zrange sc 0 -1
1) "chenwu"
2) "zhangsan"
localhost:6379> zscore sc zhangsan # 演示张三这个数据的得分
"90"
localhost:6379> zrange sc 0 -1 withscores
1) "chenwu"
2) "88"
3) "zhangsan"
4) "90"
localhost:6379> zrank sc zhangsan # 张三这个数据的得分排名(升序)
(integer) 1
localhost:6379> zrevrank sc zhangsan # # 张三这个数据的得分排名(倒序)
(integer) 0
条件过滤
- 按照条件获取数据
zrangebyscore key min max [WITHSCORES] [LIMIT] # 获取在指定得分范围(注意是个闭区间)的数据,limit可选参数,指定返回的数据量大小
zrevrangebyscore key max min [WITHSCORES] # 降序获取
eg:
localhost:6379> zadd sc 90 zhangsan 95 lisi 88 chenwu 60 liuge
(integer) 4
localhost:6379> zrange sc 0 -1 withscores
1) "liuge"
2) "60"
3) "chenwu"
4) "88"
5) "zhangsan"
6) "90"
7) "lisi"
8) "95"
localhost:6379> zrangebyscore sc 60 90 withscores # 获取得分在[60,90]之间的数据 ,注意是个闭区间
1) "liuge"
2) "60"
3) "chenwu"
4) "88"
5) "zhangsan"
6) "90"
# 只获取前两个 limit后面第一个数表示从哪个索引开始,第二个数表示获取几个(和MySQL中的limit一样)
localhost:6379> zrangebyscore sc 60 90 withscores limit 0 2
1) "liuge"
2) "60"
3) "chenwu"
4) "88"
localhost:6379>
- 条件删除数据
zremrangebyrank key start stop # 删除这个索引范围的数据
zremrangebyscore key min max # 删除这个得分范围的数据
eg:
localhost:6379> zadd sc 90 zhangsan 95 lisi 88 chenwu 60 liuge
(integer) 4
localhost:6379> zrange sc 0 -1 withscores
1) "liuge"
2) "60"
3) "chenwu"
4) "88"
5) "zhangsan"
6) "90"
7) "lisi"
8) "95"
localhost:6379> zremrangebyrank sc 1 3 # 删除索引在[1,3] 闭区间
(integer) 3
localhost:6379> zrange sc 0 -1 withscores
1) "liuge"
2) "60"
eg:
localhost:6379> zadd sc 90 zhangsan 95 lisi 88 chenwu 60 liuge
(integer) 4
localhost:6379> zrange sc 0 -1 withscores
1) "liuge"
2) "60"
3) "chenwu"
4) "88"
5) "zhangsan"
6) "90"
7) "lisi"
8) "95"
localhost:6379> zremrangebyscore sc 60 90 # 删除得分在[60,90]的的数据
(integer) 3
localhost:6379> zrange sc 0 -1 withscores
1) "lisi"
2) "95"
聚合操作
- 统计得分在指定范围内的数据个数
zcount key min max
eg:
localhost:6379> zadd sc 90 zhangsan 95 lisi 88 chenwu 60 liuge
(integer) 4
localhost:6379> zrange sc 0 -1 withscores
1) "liuge"
2) "60"
3) "chenwu"
4) "88"
5) "zhangsan"
6) "90"
7) "lisi"
8) "95"
localhost:6379> zcount sc 60 90 # 统计得分在[60,90]的数据个数
(integer) 3