秒懂redis五大常用指令

String类型

是redis中最基本的数据类型,一个key对应一个value。

String类型是二进制安全的,意思是 redis 的 string 可以包含任何数据。如数字,字符串,jpg图片或者序列化的对象。

缓存功能

经典使用场景,把常用信息,字符串,图片或者视频等信息放到redis中,redis作为缓存层,mysql做持久化层,降低mysql的读写压力。

127.0.0.1:6379> set hello world
OK
127.0.0.1:6379> get hello
"world"
127.0.0.1:6379> del hello
(integer) 1
127.0.0.1:6379> get hello
(nil)

计数功能

image.png

虽然value是String,但是我们可以把他当做一个Interger类型来做简单的加减操作。

127.0.0.1:6379> get counter
"2"
127.0.0.1:6379> incr counter
(integer) 3
127.0.0.1:6379> get counter
"3"
127.0.0.1:6379> incrby counter 100
(integer) 103
127.0.0.1:6379> get counter
"103"
127.0.0.1:6379> decr counter
(integer) 102
127.0.0.1:6379> get counter
"102"

redis实现分布式锁

这个会专门写一篇相关的内容介绍。此处先知道可以这么做。

集群环境下的Session共享

常见方案spring session + redis实现session共享,

Hash类型

是一个Mapmap,指值本身又是一种键值对结构。可以幻想成有这么一种结构:

Redis<String,Map<String,String>> redisMap = new Redis<>();

那么如何在实际开发中运用好这个数据结构呢?

存储关系型数据库的一行数据

MySQL存储结构

image.png

转换为Redis结构

image.png

我们的key可以用(表名):(行id)进行拼接。数据库的列作为Hash结构的key,对应的唯一行值作为value值。若用 redis 模拟做关系复杂查询开发困难,维护成本高。

淘宝购物车的设计

功能需求

1.全选功能-获取该用户的所有购物车商品

2.商品数量-购物车图标上要显示购物车里商品的总数

3.删除-要能移除购物车里某个商品

4.增加或减少某个商品的数量

redis结构设计

image.png

此时,我们可以使用redis的key作为某用户的购物车,Hash结构的key存储产品id,value作为购买数量。就可以轻松完成需求。

加入数据

向用户1的购物车中加入三类商品:prod001两个,prod002两个,prod003三个。

hmset user1:chart prod001 2 Prod002 2  Prod003 3 

全选

hgetall user1:chart

可以用Redis获取所有商品id(prod001,Prod002,Prod003),再用该id去数据库或redis中获取商品详情。

获取商品类别总数

hlen user1:chart

获取商品数量总数

hvals user1:chart

当然,这只是每个产品对应的数量,我们取出后需要自己进行累加。

移除某个/多个产品

hdel user1:chart prod001 Prod002

增加或减少某个产品的数量

hincrby user1:chart prod001 1   //增加一个prod001 
hdecrby user1:chart prod001 1   //减少一个prod001 

List类型

redis 使用双端链表实现的 List,是有序的,value可以重复,可以通过下标取出对应的value值,左右两边都能进行插入和删除数据。

image.png

微信订阅号(天然的时间顺序)

image.png

每当我们点击订阅了一个公众号后,该公众号就会保存了我们的微信id。根据不同用户订阅信息后,该公众号发布一条信息,就会广播到每一个用户的手机上。这就是常见的发布订阅功能。是不是很像消息队列?

订阅

image.png

发布

image.png

对于某个用户的推送

CSDN给user:1推送一个消息id为9527

lpush user:1 9527

男子别输在说话上也发布了一条消息ID为9528

lpush user:1 9528

用户查看自己的推送消息

lrange user:1 0 5   //查看前五条

Set类型

set集合类型也是用来保存多个字符串的元素,但和list列表不同的是集合中  1. 不允许有重复的元素,2.集合中的元素是无序的,不能通过索引下标获取元素,3.支持集合间的操作,可以取多个集合取交集、并集、差集。

image

抽奖活动

image.png

功能需求

1. 用户点击参与抽奖

2. 卖家在奖池中抽取2名中奖者

3. 卖家查看有多少用户参与本次抽奖

注意

1. 用户参加活动不可重复参加。set可以帮我们去重。

2. 我们抽奖环节,抽到的用户就要从奖池中干掉,否则下次参加有可能重复抽取。

redis结构设计

活动设置为redis的key,参与抽奖的用户设为value。

模拟参与抽奖

sadd active:001 user1   //客户端参与抽奖,正常只能添加一条
sadd active:001 user2		//下面都是其他客户端参与的抽奖
sadd active:001 user3
sadd active:001 user4

抽2名幸运观众

srandmember active:001 2  //随机获取2名,本方法不适合此处
spop active:001 2    //获取并删除2名用户

查看参与抽奖的用户人数

smembers active:001

微信点赞

image.png

功能需求

1. 张三对消息ID008点赞

2. 张三取消ID008点赞

3. 检查用户是否点赞

4. 获取消息ID008所有的点赞用户列表

5. 消息ID008的点赞数计算

redis结构设计

某用户的某条朋友圈设置为redis的key,点赞的用户设为value。

点赞

sadd user1:friend:Wechat1  user2:id  //点赞是用户行为,一个客户端只能点一个
sadd user1:friend:Wechat1  user3:id  //下面都是其他客户端点赞
sadd user1:friend:Wechat1  user4:id  
sadd user1:friend:Wechat1  user5:id  

取消点赞

srem user1:friend:Wechat1  user2:id

检查用户是否点过赞

sismember user1:friend:Wechat1  user2:id

获取消息ID008所有的点赞用户列表

smembers user1:friend:Wechat1

消息ID008的点赞数计算

scard  user1:friend:Wechat1

微博关系设计

image.png

set特殊指令

setA={A,B,C}     setB={B, C}

集合与集合之间的交集

sinter setA setB-->得到集合{B,C}

 集合与集合之间的并集

sunion setA setB -->得到集合{A,B,C}

集合与集合之间的差集

sdiff  setA setB-->得到集合{A}

条件

1. James老师关注的人

sadd jamesCares lison,peter,king,av

2. Lison老师关注的人

sadd lisonCares james,av,cjk,king

3. av老师关注的人

sadd avCares deer,cjk,king

计算

1. James和lison共同关注的人

sinter jamesCares lisonCares     //计算结果为 {av, king}

2. lison关注的人,avCares是否也关注(使用java代码实现)

sismember lisonCares king && sismember avCares king

   3. 我可能认识的人

SDIFF lisonCares jamesCares

Zet存储

Zset有序集合和set集合,list列表有着必然的联系,保留了set集合不能有重复成员的特性,区别是,有序集合中的元素是可以排序的,它给每个元素设置一个分数,作为排序的依据。从结构上有点像Hash结构,但Zset的key不是让我们用来和value做映射关系的,而是专门用来排序用的。

image.png

百度热搜榜

image.png

功能需求

看到某天根据热度排行的数据列表。由于list列表只会根据时间排序,因此不符合我们的需求,因此我们需要选择根据数据热点排行的zset。

redis结构设计

一每一天为单位,统计热点数据。因此Redis的key设置为当天日期,value设置为各种话题。

新增话题

zadd topic:2021-06-04 1 XinGuanFeiYan 1 GaoKaoDaoJiShi //新冠肺炎,高考倒计时

点击话题(会根据点击数实时排序)

ZINCRBY topic:2021-06-04 1 XinGuanFeiYan  //增加一个点击数
ZINCRBY topic:2021-06-04 -1 XinGuanFeiYan  //减少一个点击数(实际中不会发生负数)

展示今日前9排名

zrevrange topic:2021-06-04 0 9  withscores

统计近3日点击数据

zunionstore topic:3day  3  topic:2021-06-04  topic:2021-06-03  topic:2021-06-02

展示近3日的排行前9名(在合并点击数据的基础上统计)

zrevrange topic:3day  0  9   withscores

List,Set与Zset的异同

 

数据结构

是否允许元素重复

是否有序

有序实现方式

应用场景

列表(List)

数组下标

时间轴列表,消息队列

集合(Set)

点赞数,抽奖,微博关系

有序集合(Zset)

热点度key

话题排行榜

 
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

大将黄猿

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值