前言
Redis作为一种优异的依据key/value的缓存,有十分不错的功用和稳定性,无论是在作业中,仍是面试中,都常常会呈现。
今天这篇文章就跟咱们一同聊聊,我在实际作业中运用Redis的10种场景,希望对你会有所协助。
此外,本文Gitee:gitee.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,依据日期中数组中去查询状况即可。
最近就业方式比较困难,为了感谢各位小伙伴对苏三一直以来的支撑,我特地创建了一些作业内推群, 看看能不能协助到咱们。
你能够在群里发布招聘信息,也能够内推作业,也能够在群里投递简历找作业,也能够在群里沟通面试或许作业的话题。
进群方式
增加,苏三的私人微信:su_san_java,备注:内推+所在城市,即可加入。
8. 缓存加快
咱们在作业中运用Redis作为缓存加快,这种用法也是十分常见的。
假如查询订单数据,先从Redis缓存中查询,假如缓存中存在,则直接将数据回来给用户。
假如缓存中不存在,则再从数据库中查询数据,假如数据存在,则将数据保存到缓存中,然后再回来给用户。
假如缓存和数据库都不存在,则直接给用户回来数据不存在。
流程图如下: 但运用缓存加快的事务场景,需求留意一下,可能会呈现:缓存击穿、穿透和雪崩等问题,感兴趣的小伙伴,能够看看我的另一篇文章《烂大街的缓存穿透、缓存击穿和缓存雪崩,你真的懂了?》,里边有十分详细的介绍。
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大厂的长辈沟通和学习。