大型游戏在线玩

色哥 责任顶用Redis最多的10种场景
发布日期:2025-01-11 02:14    点击次数:200

色哥 责任顶用Redis最多的10种场景

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出来,然后给业务系统使用。



友情链接:

Powered by 大型游戏在线玩 @2013-2022 RSS地图 HTML地图

Copyright Powered by站群 © 2013-2024