redis存储中的五种基本数据结构string,hash,list,set,zset,以及每种结构的常用操作,

26 篇文章 1 订阅

五种基本数据结构

在这里插入图片描述

redis中的String操作

对数据批量插入和批量查找

其实操作的时候就是类似传一个数组进去

demo如下

这个是我在控制台直接敲的

127.0.0.1:6379[1]> mset user:2:111 test1 user:2:222 test2
OK
127.0.0.1:6379[1]> mget user:2:111 user:2:222
1) "test1"
2) "test2"

分布式锁setnx

在这里插入图片描述

在这里插入图片描述

计数器INCR原子加

类似java里的atomicLong的累加(这个其实atomicLong在高并发下性能不高,LongAdder对其进行了优化)

这里要表达的意思就是原子累加特性

127.0.0.1:6379[1]> INCR user:3
(integer) 1
127.0.0.1:6379[1]> INCR user:3
(integer) 2
127.0.0.1:6379[1]> INCR user:3
(integer) 3
127.0.0.1:6379[1]> INCR user:3
(integer) 4
127.0.0.1:6379[1]> INCR user:3
(integer) 5
127.0.0.1:6379[1]> get user:3
"5"
127.0.0.1:6379[1]> 

指定值原子累加

既然有+1+1…这种累加,自然也可以指定数字的原子累加
平时可以把累加的值放到内存里,比如累加到1000时,同步一次值到redis中,这样对redis压力就会比较小。但是可能系统还没累加到1000然后挂了,这个时候又没有同步到redis就会有问题

127.0.0.1:6379[1]> INCRBY user:3 1000
(integer) 1005
127.0.0.1:6379[1]> get user:3
"1005"

redis中的hash操作

redis中的hash结构其实类似于一个嵌套Map
Map<String,<String,Object>>

在这里插入图片描述

操作其实和String类型的差不多,只是前面多个h代表hash
在这里插入图片描述

hash的批量操作

在这里插入图片描述

控制台demo如下

hmset 的时候user:4是最外层Map的key,test3和test4是里面Map的key
hmget的时候至少要输入2个参数,user:4是最外层Map的key,test3和test4是里面Map的key

这里查询的主要是里面Map的数据

127.0.0.1:6379[1]> hmset user:4 test3 333 test4 444
OK
127.0.0.1:6379[1]> hmget user:4 test3 test4
1) "333"
2) "444"

对于这种指定值的存取,hash会比string快,不过虽然hash存取很快。但是在redis6.0之前还是有一个很大的限制,就是它是单线程的,要是一个key里存了10W+数据,一次性全拉出来就很慢,就会导致后面的操作阻塞

实际中应用hash较多的应该是购物车了

前缀+用户id作为key 里面 前缀+商品id value为数量
这就很完美了

单个set值就 hset key1 key2 value2

批量set值就是 hmset key1 key2 value2 key3 value3

原子性增加数量可以 hincrby key1 key2 qty(要增加的数量)

获取这个hash结构的key的长度 HLEN key

删除就是 hdel key

获取这个key的所有值 hgetall key

127.0.0.1:6379[1]> HGETALL cart:1
1) "10088"
2) "1"
3) "10089"
4) "1"
5) "10090"
6) "1"

在这里插入图片描述

hash结构相对于string结构的优缺点

优点:1-同类数据整合存储管理方便
2-相比string操作消耗内存和cpu更小
3-相比string存储更省空间

缺点:1-过期功能只能用在最外面的key上,不能用在里面的field中,也就是要设置过期的话,这个key对应的所有数据都会同时过期
2-在redis集群架构下不适合大规模使用,会有集群倾斜现象发生,也就是分布不均匀,都集中在其中一个redis节点上

redis集群提示图
在这里插入图片描述

redis list结构

表面还是key-value,只是这个value是个链表,并且可以操作头尾元素

假设值只用
LPUSH插入
LPOP取
那么就是一个先进后出,后进先出的栈

如果是
LPUSH
RPOP
那么就是一个先进先出的队列

利用BRPOP还可以实现阻塞队列
BRPOP在这个链表里没有数据时会一直等待,有值的时候就可以取出来

常用操作
在这里插入图片描述

应用场景
在这里插入图片描述

实际应用demo
比如说微信和微博关注公众号后接受到的公众号发送的消息就可以用队列来实现

公众号1发了一条消息
LPUSH 用户1:id mesaageContent

公众号2发了一条消息,它也把消息内容push进 用户1:id这个key里面
LPUSH 用户1:id mesaageContent

用户1关注了这2个公众号,然后接受消息可以用 LRANGE范围获取消息,两个下标是闭区间,也就是lrange XXX 0 2 可以获取0 , 1 , 2三个元素,不过lrange只是获取元素并不会像lpop一样获取的同时还删除元素
LRANGE 用户1:id startIndex stopIndex
在这里插入图片描述

用redis的list模拟的队列,有一个好处就是其本身是有序的,比mysql用orderBy获得有序数据要快

redis之set操作

常用操作指令
在这里插入图片描述
应用场景1:
实际可以应用于抽奖环节

添加集合元素,同样最外层也是key,value value才是那个集合
SADD key value1 value2…

获取整个set集合
smembers key

随机获取元素(不会在set集合中删除)
srandmember key count(获取几个)

随机获取元素(同时在set集合中删除),操作和上面的随机获取基本类似
spop key count

在这里插入图片描述

应用场景2:

微博,朋友圈点赞

sadd key value
sadd like:用户id:消息id 点赞的用户id

在set集合中删除这个元素
srem key value

验证set集合中元素是否存在,存在返回1,不存在返回0
sismember key value

获取set集合的size
scard key

在这里插入图片描述

set集合并集差集的常用运算

求交集的元素
sinter set1 set2 set3

127.0.0.1:6379[1]> SMEMBERS act:101
1) "test3"
2) "test2"
127.0.0.1:6379[1]> sadd act:102 test2 test4
(integer) 2
127.0.0.1:6379[1]> SINTER act:101 act:102
1) "test2"

求并集
sunion set1 set2 set3
这里求出来的并集可以看成也是个set集合,所以元素并不会重复,还是唯一的

127.0.0.1:6379[1]> SMEMBERS act:101
1) "test3"
2) "test2"
127.0.0.1:6379[1]> sadd act:102 test2 test4
(integer) 2
127.0.0.1:6379[1]> SINTER act:101 act:102
1) "test2"
127.0.0.1:6379[1]> sadd act:103 test2 test5
(integer) 2
127.0.0.1:6379[1]> sadd act:104 test6 test7
(integer) 2
127.0.0.1:6379[1]> sinter act:101 act:103 act:104
(empty list or set)
127.0.0.1:6379[1]> SUNION act:101 act:102 act:103
1) "test4"
2) "test2"
3) "test3"
4) "test5"
127.0.0.1:6379[1]> SUNION act:101 act:102 act:103 act:104
1) "test5"
2) "test2"
3) "test3"
4) "test4"
5) "test7"
6) "test6"

求差集
sdiff set1 set2 set3
这里求差集有点不同,求的是set1 和后面集合的并集的差集
即set1与(set2 + set3)的并集的差集

127.0.0.1:6379[1]> sdiff act:101 act:102 act:103 act:104
1) "test3"

在这里插入图片描述

redis之有序集合zset

和set集合区别在于每个元素还有自己的分子值
在这里插入图片描述

操作
在这里插入图片描述

zset有序集合的应用场景

demo如微博热搜

add操作
给这个key对应的set里的元素member的分子+1,初始是0
zincrby key count member

范围查找
zrange key startIndex stopIndex

倒序范围查找分子值最大的元素
查找这个key对应的zset集合中分子最大的前十个元素
ZREVRANGE user:11 0 9
这里的startIndex和stopIndex区间是闭区间,并且如果两个值的分子一样,那么获取的时候按照插入的顺序来获取,即分子相同get后插入的元素
zrevrange key startIndex stopIndex

并集操作,获得一个新的并集zset
des为新并集的名称,count是后面要一共几个集合并集,key1,key2则是对应的key
zunionstore des count key1 key2…

控制台demo

127.0.0.1:6379[1]> zincrby user:11 2 test1
"2"
127.0.0.1:6379[1]> zincrby user:11 1 test2
"1"
127.0.0.1:6379[1]> zincrby user:11 3 test3
"3"
127.0.0.1:6379[1]> zincrby user:11 2 test4
"2"
127.0.0.1:6379[1]> ZREVRANGE user:11 0 2
1) "test3"
2) "test4"
3) "test1"
127.0.0.1:6379[1]> zincrby user:12 2 test4
"2"
127.0.0.1:6379[1]> zincrby user:12 2 test3
"2"
127.0.0.1:6379[1]> zincrby user:12 2 test2
"2"
127.0.0.1:6379[1]> zincrby user:12 1 test1
"1"
127.0.0.1:6379[1]> zunionstore user:11-12 2 user:11 user:12
(integer) 5
127.0.0.1:6379[1]> ZRANGE user:11-12 0 99
1) "test"
2) "test1"
3) "test2"
4) "test4"
5) "test3"

在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值