redis 基础之--set && hash(五)

Set是String类型的无序集合,集合中的成员是唯一的,这就意味着集合中不能出现重复的数据,可以在两个不同的集合中对数据进行对并取值。

1、set (集合)

场景:例如A用户有个微信群,B用户也有个微信群,但是AB互相不认识,AB的群都在腾讯服务器上,服务器用set对两个微信群进行了对比 ,发现A、B两个微信群众均有张三,李四和王五,服务器这个时候会觉得A、B应该认识,就给给A或B推你们有几个共同好友,你和A或B可能认识。

1.1、sadd 创建集合数据

127.0.0.1:6379[1]> sadd set1 zhangsan lisi
(integer) 2
127.0.0.1:6379[1]> sadd set2 wangwu liliu zhangsan
(integer) 3

# 继续追加数据也用sadd
127.0.0.1:6379[1]> sadd set2 zhaoqi
(integer) 1

1.2、smembers 查看集合数据

127.0.0.1:6379[1]> smembers set1
1) "zhangsan"
2) "lisi"
127.0.0.1:6379[1]> smembers set2
1) "zhaoqi"
2) "zhangsan"
3) "wangwu"
4) "liliu"

1.3、type 查看类型

127.0.0.1:6379[1]> type set1
set

1.4、sdiff 获取集合的差集

差集: 属于A而不属于B的元素称为A与B的(差)集

# lisi只在A中有,B中是没有的
127.0.0.1:6379[1]> sdiff set1 set2
1) "lisi"

1.5、sinter 获取集合的交集

交集: 已属于A并且属于B的元素称为A与B的(交)集

# A和B的群中只有张三同时是A和B的好友
127.0.0.1:6379[1]> sinter set1 set2
1) "zhangsan"

1.6、sunion 获取集合的并集

并集: 已属于A或属于B的元素称为A与B的(并)集

# 其实就是A与B的元素总集合
127.0.0.1:6379[1]> sunion set1 set2
1) "zhaoqi"
2) "zhangsan"
3) "wangwu"
4) "lisi"
5) "liliu"

2、sorted set (有序集合)

Redis有序集合和集合一样也是string类型元素的集合,且不允许重复的成员,不同的是每个元素都会关联一个double(双精度浮点型类型的分数,redis正是通过该分数来为集合中的成员进行从小到大的排序,有序集合的成员是唯一的,但分数(score)却可以重复,集合是通过哈希表实现的,所以添加,删除,查找的复杂度都是O(1),集合中最大的成员数为2^32-1(4294967295,每个集合可存储40多亿个成员)。

场景: 例如每个腾讯视频中的影片排序,每个影片不允许有重复的片名,但是可以允许有相同的播放次数,例如关联的double,系统会自动将播放量多的影片放到首页比较显眼的位置。

2.1、zadd 生产有序集合

# 此处生成了2个集合,zset1、zset2 和 zset3,v1中的5就是double分数,类似于上边说的影片播放量
127.0.0.1:6379[1]> zadd zset1 5 v1
(integer) 1
127.0.0.1:6379[1]> zadd zset1 10 v2
(integer) 1
127.0.0.1:6379[1]> zadd zset1 10 v3
(integer) 1
127.0.0.1:6379[1]> zadd zset1 8 v4
(integer) 1
127.0.0.1:6379[1]> zadd zset2 6 v5
(integer) 1
127.0.0.1:6379[1]> zadd zset2 7 v6
(integer) 1
127.0.0.1:6379[1]> zadd zset2 8 v7
(integer) 1

# 可以一次写多个
127.0.0.1:6379[1]> zadd zset3 1 v1 2 v2 3 v3
(integer) 3

# 查看类型
127.0.0.1:6379[1]> type zset1
zset

2.2、zcard 查看集合长度

127.0.0.1:6379[1]> zcard zset1
(integer) 4
127.0.0.1:6379[1]> zcard zset2
(integer) 3
127.0.0.1:6379[1]> zcard zset3
(integer) 3

# zset4没有,所以是0
127.0.0.1:6379[1]> zcard zset4
(integer) 0

2.3、zrange 基于索引返回数值

每个数据都是有一个索引,第一个数据的索引是0,第二个数据的索引是1,一类类推

# 创建zset5 值分别是v1...v5,取出下标为1到下标为3的的所有数,下边为1对应v2,下标为3对应v4
127.0.0.1:6379[1]> zrange key start stop [WITHSCORES]	# 模板
127.0.0.1:6379[1]> zadd zset5 1 v1 2 v2 3 v3 4 v4 5 v5 6 v6
(integer) 6
127.0.0.1:6379[1]> zrange zset5 1 3
1) "v2"
2) "v3"
3) "v4"
127.0.0.1:6379[1]> zrange zset5 0 3
1) "v1"
2) "v2"
3) "v3"
4) "v4"
127.0.0.1:6379[1]> zrange zset5 2 2
1) "v3"

2.4、zrank 返回某个数值的索引

127.0.0.1:6379[1]> zrank zset5 v3
(integer) 2

2.5、实例演示

# 创建排行榜
127.0.0.1:6379[1]> zadd paihangbang 90 nezha 200 zhanlang 300 honghaixingdong 50 zhuluoji
(integer) 4
127.0.0.1:6379[1]> zrange paihangbang 0 -1
1) "zhuluoji"
2) "nezha"
3) "zhanlang"
4) "honghaixingdong"

注意: 0是第一个索引,如果想取出全部数据怎么办,用 “0 -1”

2.5.1、withscores 根据评分进行排行
127.0.0.1:6379[1]> zrange paihangbang 0 -1 WITHSCORES
1) "zhuluoji"
2) "50"
3) "nezha"
4) "90"
5) "zhanlang"
6) "200"
7) "honghaixingdong"
8) "300"

3、哈希(hash)

hash是一个string类型的field和value的映射表,hash特别适合用于存储对象,Relis中每个hash可以存储2^32-1键值对(40多亿)

3.1、hset 生成数据

127.0.0.1:6379[1]> hset hash1 name zhangsan age 20
(integer) 2			# 两个数据(name,age)发生变化,从无到有
127.0.0.1:6379[1]> hset hash1 name zhangsan age 20 addr henan
(integer) 1			# 一个数据发生了变化,原来的数据(name,age)没有变化

3.2、hget 取数据

127.0.0.1:6379[1]> hget hash1 name
"zhangsan"
127.0.0.1:6379[1]> hget hash1 name age
(error) ERR wrong number of arguments for 'hget' command

注意: hget只能取一个字段,例如取hash1中的name字段,如果取多个字段会报错,取全部字段用

3.3、hkeys 获取全部数据

127.0.0.1:6379[1]> hkeys hash1
1) "name"
2) "addr"

3.4、hdel 删除字段

# 删除age字段
127.0.0.1:6379[1]> hdel hash1 age
(integer) 1
127.0.0.1:6379[1]> hget hash1 age
(nil)

3.5、hset 修改数据

修改数据直接用hset进行覆盖即可

# 生成数据
127.0.0.1:6379[1]> hset hash1 name zhangsan age 20 addr henan
(integer) 1

# 修改年龄为22
127.0.0.1:6379[1]> hset hash1 age 22
(integer) 0
127.0.0.1:6379[1]> hget hash1 age
"22"

3.6、hmset 生成多个数据

127.0.0.1:6379[1]> hmset hash2 name lisi age 24
OK

3.7、hmget 获取多个数据

127.0.0.1:6379[1]> hmget hash2 name age
1) "lisi"
2) "24"

3.8、hgetall 获取所以key和value

127.0.0.1:6379[1]> hgetall hash2
1) "nanme"
2) "lisi"
3) "age"
4) "24"
5) "name"
6) "lisi"

说明: 一般这些命令是给运维人员使用的,开发人员会使用开发命令进行数据的增删改查!

说明: 笔记是参考马哥视频整理出来的,如有侵权请联系删除!

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值