4-Redis五大数据类型之set+hash+zset
set 集合
set是无序不重复的集合 无序就无法通过下标或者序列号查询 不重复 天然有去重的效果
集合的命令都是以S开头的
添加元素 ,查询元素
127.0.0.1:6379> sadd myset "key" #set集合添加一个元素
(integer) 1
127.0.0.1:6379> sadd myset "key1"
(integer) 1
127.0.0.1:6379> sadd myset "key2"
(integer) 1
127.0.0.1:6379> SMEMBERS myset #查询所有元素
1) "key"
2) "key1"
3) "key2"
查询判断 删除元素
127.0.0.1:6379> SISMEMBER myset key1 #判断是否是set集合元素
(integer) 1 # 是 回复1
127.0.0.1:6379> SISMEMBER myset key5
(integer) 0 #不是 回复2
127.0.0.1:6379> sadd myset "key2"
(integer) 0
127.0.0.1:6379> SCARD myset #查询元素数量
(integer) 3
127.0.0.1:6379> SREM myset key #删除指定元素 key
(integer) 1
127.0.0.1:6379> SMEMBERS myset #返回集合mykey中的所有成员
1) "key1"
2) "key2"
返回随机元素
适用于抽奖
127.0.0.1:6379> SRANDMEMBER myset #返回集合中的一个随机元素
"key1"
127.0.0.1:6379> SRANDMEMBER myset
"key2"
127.0.0.1:6379> SRANDMEMBER myset
"key2"
127.0.0.1:6379> SRANDMEMBER myset
"key2"
127.0.0.1:6379> SRANDMEMBER myset
"key2"
127.0.0.1:6379> SRANDMEMBER myset
"key1"
127.0.0.1:6379> SRANDMEMBER myset 2 #返回集合中的两个随机元素
1) "key1"
2) "key2"
移除随机元素
127.0.0.1:6379> SMEMBERS myset #查看所有元素
1) "key4"
2) "key1"
3) "key3"
4) "key2"
5) "key5"
127.0.0.1:6379> spop myset #移除集合中的一个随机元素
"key1"
127.0.0.1:6379> spop myset
"key5"
127.0.0.1:6379> SMEMBERS myset
1) "key2"
2) "key3"
3) "key4"
移除一个元素添加到另一个set
127.0.0.1:6379> flushdb
OK
127.0.0.1:6379>
127.0.0.1:6379>
127.0.0.1:6379>
127.0.0.1:6379>
127.0.0.1:6379> sadd myset key1
(integer) 1
127.0.0.1:6379> sadd myset key2
(integer) 1
127.0.0.1:6379> sadd myset key3
(integer) 1
127.0.0.1:6379> sadd myset key4
(integer) 1
127.0.0.1:6379> sadd myset key5
(integer) 1
127.0.0.1:6379> SADD myset2 key6
(integer) 1
127.0.0.1:6379> SMEMBERS myset #返回 myset 所有元素1-5
1) "key4"
2) "key1"
3) "key3"
4) "key2"
5) "key5"
127.0.0.1:6379> SMEMBERS myset2 #返回 myset2所有元素
1) "key6"
127.0.0.1:6379> SMOVE myset myset2 key1 #删除myset中的key1放到myset2中
(integer) 1
127.0.0.1:6379> SMEMBERS myset2 #确实加进来key1
1) "key6"
2) "key1"
127.0.0.1:6379> SMEMBERS myset # 确实少了key1
1) "key3"
2) "key2"
3) "key5"
4) "key4"
数学集合
社交应用场景
将b站用户A所有关注的人放到一个set1
将b站点用户A所有的粉丝放到set2
将用户B所有关注的人放到一个set3
将用户B所有的粉丝放到set4
A与B的共同关注 set1和set3的交集
包括 共同好友 你关注的人也关注了谁等等功能的实现
127.0.0.1:6379> FLUSHDB
OK
127.0.0.1:6379>
127.0.0.1:6379> SADD set1 a #添加元素到set1
(integer) 1
127.0.0.1:6379> SADD set1 b
(integer) 1
127.0.0.1:6379> SADD set1 c
(integer) 1
127.0.0.1:6379> SADD set2 c#添加元素到set2
(integer) 1
127.0.0.1:6379> SADD set2 d
(integer) 1
127.0.0.1:6379> SADD set2 e
(integer) 1
127.0.0.1:6379> SMEMBERS set1 #查询set1所有元素
1) "a"
2) "c"
3) "b"
127.0.0.1:6379> SMEMBERS set2 #查询set2所有元素
1) "e"
2) "d"
3) "c"
127.0.0.1:6379> SDIFF set1 set2 #求差集 输出set1中有 set2中没有的
1) "a"
2) "b"
127.0.0.1:6379> SINTER set1 set2 #求交集 输出set1与set2的交集
1) "c"
127.0.0.1:6379> SUNION set1 set2 #求并集 求set1+set2元素的集合
1) "c"
2) "b"
3) "e"
4) "d"
5) "a"
127.0.0.1:6379>
Hash哈希
Hash 哈希 Map集合
从key-value 到 key
hash的命令都是以以H开头的命令
127.0.0.1:6379> HSET hash1 name xiaoqiang #存值
(integer) 1
127.0.0.1:6379> HGET hash1 name #取值
"xiaoqiang"
127.0.0.1:6379> HMSET hash1 name gouzi name1 gouzi #批量存值
OK
127.0.0.1:6379> HMGET hash1 name name1 #批量取值
1) "gouzi"
2) "gouzi"
127.0.0.1:6379> HGETALL hash1 #取出所有的值 key value都有
1) "name"
2) "gouzi"
3) "name1"
4) "gouzi"
127.0.0.1:6379> HDEL hash1 name #删除指定元素的值
(integer) 1
127.0.0.1:6379> HGETALL hash1 #确认已删除
1) "name1"
2) "gouzi"
127.0.0.1:6379> HLEN hash1 #获取hash的长度
(integer) 1
127.0.0.1:6379> hmset hash1 name3 day1 name3 day2 name4 day3 批量添加元素
OK
127.0.0.1:6379> HGETALL hash1
1) "name1"
2) "gouzi"
3) "name3"
4) "day2"
5) "name4"
6) "day3"
127.0.0.1:6379> HLEN hash1 #再次查询长度
(integer) 3
127.0.0.1:6379>
127.0.0.1:6379> HEXISTS hash1 name3 #查询hash1中 元素 name3是否存在
(integer) 1
127.0.0.1:6379> HKEYS hash1 #查询值中所有的key
1) "name1"
2) "name3"
3) "name4"
127.0.0.1:6379> HVALS hash1 # 查询值中所有的value
1) "gouzi"
2) "day2"
3) "day3"
127.0.0.1:6379> HSET bash name8 8
(integer) 1
127.0.0.1:6379> HINCRBY bash name8 1 #name8value自增1
(integer) 9
127.0.0.1:6379> HINCRBY bash name8 -1 #name8 自增-1 也就是减1
(integer) 8
127.0.0.1:6379> HSETNX bash name9 heyman #如果不存在name9就创建并赋值
(integer) 1 #返回1 说明不存在
127.0.0.1:6379> HSETNX bash name9 heyman
(integer) 0 #返回0 说明存在了
zset有序集合
使用场景
需要排序的数字
成绩 身高 年龄等等
区分不同的权重值 一般朋友1 重要朋友2
网站视频排行榜 播放量 点赞量加权
微博热搜率排行
127.0.0.1:6379> ZADD zset1 1 one #指定序列添加
(integer) 1
127.0.0.1:6379> ZADD zset1 2 two 3 shree #批量指定序列添加值
(integer) 2
127.0.0.1:6379> ZRANGE zset1 0 -1 #查询zset中所有的值 按照序列排序的
1) "one"
2) "two"
3) "shree"
127.0.0.1:6379> zadd tall 175 laozhang
(integer) 1
127.0.0.1:6379> zadd tall 185 laochen
(integer) 1
127.0.0.1:6379> zadd tall 223 yaoming
(integer) 1
127.0.0.1:6379> ZRANGEBYSCORE tall -inf +inf #返回所有的值 value从小打到大排列
1) "laozhang"
2) "laochen"
3) "yaoming"
127.0.0.1:6379> ZRANGEBYSCORE tall -inf +inf withscores #同上并输出score 值
1) "laozhang"
2) "175"
3) "laochen"
4) "185"
5) "yaoming"
6) "223"
127.0.0.1:6379> ZRANGEBYSCORE tall -inf 175 withscores #输出value从最小到175区间
1) "laozhang"
2) "175"
127.0.0.1:6379> ZREVRANGE tall 0 -1 #返回所有的值 从大到小排列
1) "yaoming"
2) "laochen"
127.0.0.1:6379> ZREM tall laozhang #移除hash中的一个元素 laozhang
(integer) 1
127.0.0.1:6379> ZRANGE tall 0 -1 #确认移除
1) "laochen"
2) "yaoming"
127.0.0.1:6379> ZCARD tall #输出hash中元素的数量
(integer) 2
127.0.0.1:6379> ZRANGE tall 0 -1
1) "laochen"
2) "yaoming"
127.0.0.1:6379> flushdb
OK
127.0.0.1:6379> zadd zset1 1 hey #添加有序set
(integer) 1
127.0.0.1:6379> ZADD zset1 2 my 3 world#批量添加有序set
(integer) 2
127.0.0.1:6379> ZCOUNT zset1 1 3#统计[1-3]之间的元素数量
(integer) 3
本章命令集锦
set
SMEMBERS myset #查看所有元素
spop myset #移除集合中的一个随机元素
SMOVE myset myset2 key1 #删除myset中的key1放到myset2中
SDIFF set1 set2 #求差集 输出set1中有 set2中没有的
SINTER set1 set2 #求交集 输出set1与set2的交集
SUNION set1 set2 #求并集 求set1+set2元素的集合
hash
HSET hash1 name xiaoqiang #存值
HGET hash1 name #取值
HMSET hash1 name gouzi name1 gouzi #批量存值
HMGET hash1 name name1 #批量取值
HGETALL hash1 #取出所有的值 key value都有
HDEL hash1 name #删除指定元素的值
HLEN hash1 #获取hash的长度
hmset hash1 name3 day1 name3 day2 name4 day3 批量添加元素
HEXISTS hash1 name3 #查询hash1中 元素 name3是否存在
HKEYS hash1 #查询值中所有的key
HVALS hash1 # 查询值中所有的value
HINCRBY bash name8 1 #name8的value自增1
HINCRBY bash name8 -1 #name8 自增-1 也就是减1
HSETNX bash name9 heyman #如果不存在name9就创建并赋值
zset
ZADD zset1 1 one #指定序列添加
ZADD zset1 2 two 3 shree #批量指定序列添加值
ZRANGE zset1 0 -1 #查询zset中所有的值 按照序列排序的
ZRANGEBYSCORE tall -inf +inf #返回所有的值 value从小打到大排列
ZRANGEBYSCORE tall -inf +inf withscores #同上并输出score 值
ZRANGEBYSCORE tall -inf 175 withscores #输出value从最小到175区间的值
ZREVRANGE tall 0 -1 #返回所有的值 从大到小排列
ZREM tall laozhang #移除hash中的一个元素 laozhang
ZCARD tall #输出hash中元素的数量
ZADD zset1 2 my 3 world#批量添加有序set