Redis -- Set,map,Zset 集合类型详解

本文深入探讨了Redis中的Set(集合)、Hash(哈希)和Zset(有序集合)三种数据结构,详细介绍了它们的使用方法,包括添加、删除、查找和操作元素等。通过实例展示了如何利用这些数据结构实现排序、存储用户属性信息、创建排行榜等功能。同时,讨论了它们在实际场景中的应用,如班级成绩表、工资排序等,为数据库设计提供了实践指导。
摘要由CSDN通过智能技术生成

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.带权重进行判断
排行榜应用实现

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值