Redis看成一种优秀的基于key/value的缓存,有极度可以的性能和褂讪性色哥,不管是在责任中,已经口试中,齐普通会出现。
今天这篇著作就跟天下一说念聊聊,我在本色责任中使用Redis的10种场景,但愿对你会有所匡助。
8000页BAT大佬写的刷题条记,让我offer拿笔直软
1. 统计探问次数
中国 肛交关于好多官方网站的首页,普通会有一些统计首页探问次数的需求。
探问次数唯惟一个字段,若是保存到数据库中,再终末作念汇总明显有些远离。
该业务场景可以使用Redis,界说一个key,比如:OFFICIAL_INDEX_VISIT_COUNT。
在Redis中有incr号召,可以完毕给value值加1操作:
incr OFFICIAL_INDEX_VISIT_COUNT
虽然若是你想一次加的值大于1,可以用incrby号召,举例:
incrby OFFICIAL_INDEX_VISIT_COUNT 5
这么可以一次性加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{ String result = jedis.set(lockKey, requestId, "NX", "PX", expireTime); if ("OK".equals(result)) { return true; } return false;} finally { unlock(lockKey);}
但上头这段代码在有些场景下,会有一些问题,开释锁可能会开释了别东说念主的锁。
说真话Redis分离式锁虽说很常用,但坑也挺多的,若是用不好的话,很容易踩坑。
若是天下对Redis分离式锁的一些坑比拟感风趣风趣,可以望望我的另一篇著作《聊聊redis分离式锁的8大坑》,著作中有极度注见解先容。
4. 作念名次榜
好多网站知名次榜的功能,比如:商城中有商品销量的名次榜,游戏网站有玩家获取积分的名次榜。
普通情况下色哥,咱们可以使用Sorted Set保存名次榜的数据。
使用ZADD可以添加名次榜的数据,使用ZRANGE可以获取名次榜的数据。
举例:
ZADD rank:score 100 "周星驰"ZADD rank:score 90 "周杰伦"ZADD rank:score 80 "周润发"ZRANGE rank:score 0 -1 WITHSCORES
复返数据:
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,语法:
setbit key offset value
具体示例:
setbit user:view:2024-01-17 123456 1
往bitmap数组中建树了用户id=123456的登录景况为1,象征2024-01-17已登录。
然后通过号召getbit获取数据,语法:
getbit key offset
具体示例:
getbit user:view:2024-01-17 123456
若是获取的值是1,阐扬这一天登录了。
若是咱们想统计一周内流畅登录的用户,只需要遍历用户id,凭据日历中数组中去查询景况即可。
最近服务相貌比拟贫困,为了感谢诸君小伙伴对苏三一直以来的复旧,我特意创建了一些责任内推群, 望望能不成匡助到天下。
你可以在群里发布招聘信息,也可以内推责任,也可以在群里送达简历找责任,也可以在群里相通口试或者责任的话题。
进群情势
8. 缓存加快
咱们在责任中使用Redis看成缓存加快,这种用法亦然曲常常见的。
若是查询订单数据,先从Redis缓存中查询,若是缓存中存在,则径直将数据复返给用户。
若是缓存中不存在,则再从数据库中查询数据,若是数据存在,则将数据保存到缓存中,然后再复返给用户。
若是缓存和数据库齐不存在,则径直给用户复返数据不存在。
经过图如下:
但使用缓存加快的业务场景,需要驻扎一下,可能会出现:缓存击穿、穿透和雪崩等问题,感风趣风趣的小伙伴,可以望望我的另一篇著作《烂大街的缓存穿透、缓存击穿慈祥存雪崩,你果真懂了?》,里面有极度注见解先容。
9. 作念音信队伍
咱们提及队伍普通猜想是:kafka、rabbitMQ、RocketMQ等这些分离式音信队伍。
其实Redis也有音信队伍的功能,咱们之前有个支付系统,即是用的Redis队伍功能。
PubSub(发布订阅)是Redis2.0版块引入的音信传递模子。
顾名想义,忽地者可以订阅一个或多个channel,分娩者向对应channel发送音信后,总计订阅者齐能收到干系音信。对应channel发送音信后,总计订阅者齐能收到干系音信。
在java代码中可以完毕MessageListener接口,来忽地队伍中的音信。
@Slf4j@Componentpublic class RedisMessageListenerListener implements MessageListener { @Autowired private RedisTemplate redisTemplate; @Override public void onMessage(Message message, byte[] pattern) { String channel = new String(pattern); RedisSerializer valueSerializer = redisTemplate.getValueSerializer; Object deserialize = valueSerializer.deserialize(message.getBody); if (deserialize == null) return; String md5DigestAsHex = DigestUtils.md5DigestAsHex(deserialize.toString.getBytes(StandardCharsets.UTF_8)); Boolean result = 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号召,运用原子性操作,可以引申底下这个号召:
incrby userid 10000
在分库分表的场景,关于有些批量操作,咱们可以从Redis中色哥,一次性拿一批id出来,然后给业务系统使用。