前言

Redis作为一种优异的依据key/value的缓存,有十分不错的功用和稳定性,无论是在作业中,仍是面试中,都常常会呈现。

今天这篇文章就跟咱们一同聊聊,我在实际作业中运用Redis的10种场景,希望对你会有所协助。

作业顶用Redis最多的10种场景

此外,本文Giteegitee.com/dvsusan/sus… 已经录入,上面有大厂面试完整考点,作业经验共享,欢迎Star。

1. 计算拜访次数

关于许多官方网站的主页,常常会有一些计算主页拜访次数的需求。

拜访次数只有一个字段,假如保存到数据库中,再最终做汇总明显有些费事。

该事务场景能够运用Redis,界说一个key,比方:OFFICIAL_INDEX_VISIT_COUNT。

在Redis中有incr命令,能够完成给value值加1操作:

incrOFFICIAL_INDEX_VISIT_COUNT

当然假如你想一次加的值大于1,能够用incrby命令,例如:

incrbyOFFICIAL_INDEX_VISIT_COUNT5

这样能够一次性加5。

2. 获取分类树

在许多网站都有分类树的功用,假如没有生成静态的html页面,想通过调用接口的方式获取分类树的数据。

咱们一般为了功用考虑,会将分类树的json数据缓存到Redis傍边,为了后面在网站傍边能够快速获取数据。

否则在接口中需求运用递归查询数据库,然后拼接成分类树的数据结构

这个进程十分费事,并且需求多次查询数据库,功用很差。

因此,能够考虑用一个守时使命,异步将分类树的数据,直接缓存到Redis傍边,界说一个key,比方:MALL_CATEGORY_TREE。

然后接口中直接运用MALL_CATEGORY_TREE这个key从缓存中获取数据即可。

能够直接用key/value字符串保存数据。

不过需求留意的是,假如分类树的数据十分多可能会呈现大key的问题,优化计划能够参考我的别的一篇文章《分类树,我从2s优化到0.1s》。

3. 做分布式锁

分布式锁可能是运用Redis最常见的场景之一,相关于其他的分布式锁,比方:数据库分布式锁或许Zookeeper分布式锁,依据Redis的分布式锁,有更好的功用,被广泛运用于实际作业中。

咱们运用下面这段代码能够加锁:

try{
Stringresult=jedis.set(lockKey,requestId,"NX","PX",expireTime);
if("OK".equals(result)){
returntrue;
}
returnfalse;
}finally{
unlock(lockKey);
}

但上面这段代码在有些场景下,会有一些问题,开释锁可能会开释了别人的锁。

说实话Redis分布式锁虽然很常用,但坑也挺多的,假如用不好的话,很简略踩坑。

假如咱们对Redis分布式锁的一些坑比较感兴趣,能够看看我的另一篇文章《聊聊redis分布式锁的8大坑》,文章中有十分详细的介绍。

4. 做排行榜

许多网站有排行榜的功用,比方:商城中有产品销量的排行榜,游戏网站有玩家获得积分的排行榜。

一般情况下,咱们能够运用Sorted Set保存排行榜的数据。

运用ZADD能够增加排行榜的数据,运用ZRANGE能够获取排行榜的数据。

例如:

ZADDrank:score100"周星驰"
ZADDrank:score90"周杰伦"
ZADDrank:score80"周润发"
ZRANGErank:score0-1WITHSCORES

回来数据:

1)"周星驰"
2)"100"
3)"周杰伦"
4)"90"
5)"周润发"
6)"80"

5. 记录用户登录状况

一般下,用户登录成功之后,用户登录之后的状况信息,会保存到Redis中。

这样后面该用户拜访其他接口的时分,会直接从Redis中查询用户登录状况,假如能够查到数据,阐明用户已登录,则允许做后续的操作。

假如从Redis中没有查到用户登录状况,阐明该用户没有登录,或许登录状况失效了,则直接跳转到用户登录页面。

运用Redis保存用户登录状况,有个好处是它能够设置一个过期时刻,比方:该时刻能够设置成30分钟。

jedis.set(userId,userInfo,1800);

在Redis内部有专门的job,会将过期的数据删去,也有获取数据时实时删去的逻辑。

6. 限流

运用Redis还有一个十分常用的的事务场景是做限流

当然还有其他的限流方式,比方:运用nginx,但运用Redis控制能够更精密。

比方:约束同一个ip,1分钟之内只能拜访10次接口,10分钟之内只能拜访50次接口,1天之内只能拜访100次接口。

假如超越次数,则接口直接回来:恳求太频频了,请稍后重试。

跟上面保存用户登录状况类似,需求在Redis中保存用户的恳求记录。

比方:key是用户ip,value是拜访的次数从1开始,后面每拜访一次则加1。

假如value超越一定的次数,则直接拦截这种反常的ip。

当然也需求设置一个过期时刻,反常ip假如超越这个过期时刻,比方:1天,则恢复正常了,该ip能够再建议恳求了。

或许约束同一个用户id。

7. 位计算

比方现在有个需求:有个网站需求计算一周内接连登陆的用户,以及一个月内登陆过的用户。

这个需求运用传统的数据库,完成起来比较费事,但运用Redis的bitmap让咱们能够实时的进行类似的计算。

bitmap 是二进制的byte数组,也能够简略了解成是一个普通字符串。它将二进制数据存储在byte数组中以达到存储数据的意图。

保存数据命令运用setbit,语法:

setbitkeyoffsetvalue

详细示例:

setbituser:view:2024-01-171234561

往bitmap数组中设置了用户id=123456的登录状况为1,符号2024-01-17已登录。

然后通过命令getbit获取数据,语法:

getbitkeyoffset

详细示例:

getbituser:view:2024-01-17123456

假如获取的值是1,阐明这一天登录了。

假如咱们想计算一周内接连登录的用户,只需求遍历用户id,依据日期中数组中去查询状况即可。

最近就业方式比较困难,为了感谢各位小伙伴对苏三一直以来的支撑,我特地创建了一些作业内推群, 看看能不能协助到咱们。

你能够在群里发布招聘信息,也能够内推作业,也能够在群里投递简历找作业,也能够在群里沟通面试或许作业的话题。

作业顶用Redis最多的10种场景

进群方式

增加,苏三的私人微信:su_san_java,备注:内推+所在城市,即可加入。

8. 缓存加快

咱们在作业中运用Redis作为缓存加快,这种用法也是十分常见的。

假如查询订单数据,先从Redis缓存中查询,假如缓存中存在,则直接将数据回来给用户。

假如缓存中不存在,则再从数据库中查询数据,假如数据存在,则将数据保存到缓存中,然后再回来给用户。

假如缓存和数据库都不存在,则直接给用户回来数据不存在。

流程图如下:

作业顶用Redis最多的10种场景
但运用缓存加快的事务场景,需求留意一下,可能会呈现:缓存击穿、穿透和雪崩等问题,感兴趣的小伙伴,能够看看我的另一篇文章《烂大街的缓存穿透、缓存击穿和缓存雪崩,你真的懂了?》,里边有十分详细的介绍。

9. 做音讯行列

咱们说起行列常常想到是:kafka、rabbitMQ、RocketMQ等这些分布式音讯行列。

其实Redis也有音讯行列的功用,咱们之前有个支付体系,便是用的Redis行列功用。

PubSub(发布订阅)是Redis2.0版别引进的音讯传递模型。

顾名思义,顾客能够订阅一个或多个channel,生产者向对应channel发送音讯后,一切订阅者都能收到相关音讯。对应channel发送音讯后,一切订阅者都能收到相关音讯。

在java代码中能够完成MessageListener接口,来消费行列中的音讯。

@Slf4j
@Component
publicclassRedisMessageListenerListenerimplementsMessageListener{
@Autowired
privateRedisTemplate<String,Object>redisTemplate;
@Override
publicvoidonMessage(Messagemessage,byte[]pattern){
Stringchannel=newString(pattern);
RedisSerializer<?>valueSerializer=redisTemplate.getValueSerializer();
Objectdeserialize=valueSerializer.deserialize(message.getBody());
if(deserialize==null)return;
Stringmd5DigestAsHex=DigestUtils.md5DigestAsHex(deserialize.toString().getBytes(StandardCharsets.UTF_8));
Booleanresult=redisTemplate.opsForValue().setIfAbsent(md5DigestAsHex,"1",20,TimeUnit.SECONDS);
if(Boolean.TRUE.equals(result)){
log.info("接纳的成果:{}",deserialize.toString());
}else{
log.info("其他服务处理中");
}
}
}

10. 生成大局ID

在有些需求生成大局ID的事务场景,其实也能够运用Redis。

能够运用incrby命令,运用原子性操作,能够履行下面这个命令:

incrbyuserid10000

在分库分表的场景,关于有些批量操作,咱们能够从Redis中,一次性拿一批id出来,然后给事务体系运用。

最终说一句(求重视,别白嫖我)

假如这篇文章对您有所协助,或许有所启发的话,帮助扫描下发二维码重视一下,您的支撑是我坚持写作最大的动力。

求一键三连:点赞、转发、在看。

重视大众号:【苏三说技能】,在大众号中回复:面试、代码神器、开发手册、时刻管理有超赞的粉丝福利,别的回复:加群,能够跟许多BAT大厂的长辈沟通和学习。