网易首页 > 网易号 > 正文 申请入驻

用上这个开源本地缓存工具,Redis读写完全没压力!

0
分享至

作者:热黄油啤酒

高频数据流处理系统中,Redis的压力也会很大,同时I/0开销才是耗时的主要原因。

前言

我们开发中经常用到Redis作为缓存,将高频数据放在Redis中能够提高业务性能,降低MySQL等关系型数据库压力,甚至一些系统使用Redis进行数据持久化,Redis松散的文档结构非常适合业务系统开发,在精确查询,数据统计业务有着很大的优势。

但是高频数据流处理系统中,Redis的压力也会很大,同时I/0开销才是耗时的主要原因,这时候为了降低Redis读写压力我们可以用到本地缓存,Guava为我们提供了优秀的本地缓存API,包含了过期策略等等,编码难度低,个人非常推荐。

设计示例

Redis懒加载缓存

数据在新增到MySQL不进行缓存,在精确查找进行缓存,做到查询即缓存,不查询不缓存。

1)流程图

2)代码示例

  • // 伪代码示例 Xx代表你的的业务对象 如User Goods等等
    public class XxLazyCache {
    @Autowired
    private RedisTemplate
  • redisTemplate;
    @Autowired
    private XxService xxService;// 你的业务service
    /**
    * 查询 通过查询缓存是否存在驱动缓存加载 建议在前置业务保证id对应数据是绝对存在于数据库中的
    */
    public Xx getXx(int id) {
    // 1.查询缓存里面有没有数据
    Xx xxCache = getXxFromCache(id);
    if(xxCache != null) {
    return xxCache;// 卫语句使代码更有利于阅读
    }
    // 2.查询数据库获取数据 我们假定到业务这一步,传过来的id都在数据库中有对应数据
    Xx xx = xxService.getXxById(id);
    // 3.设置缓存、这一步相当于Redis缓存懒加载,下次再查询此id,则会走缓存
    setXxFromCache(xx);
    return xx;
    }
    }
    /**
    * 对xx数据进行修改或者删除操作 操作数据库成功后 删除缓存
    * 删除请求 - 删除数据库数据 删除缓存
    * 修改请求 - 更新数据库数据 删除缓存 下次在查询时候就会从数据库拉取新的数据到缓存中
    */
    public void deleteXxFromCache(long id) {
    String key = "Xx:" + xx.getId();
    redisTemplate.delete(key);
    }
    private void setXxFromCache(Xx xx) {
    String key = "Xx:" + xx.getId();
    redisTemplate.opsForValue().set(key, xx);
    }
    private Xx getXxFromCache(int id) {
    // 通过缓存前缀拼装唯一主键作为缓存Key 如Xxx信息 就是Xxx:id
    String key = "Xx:" + id;
    return redisTemplate.opsForValue().get(key);
    }
    }
    // 业务类
    public class XxServie {
    @Autowired
    private XxLazyCache xxLazyCache;
    // 查询数据库
    public Xx getXxById(long id) {
    // 省略实现
    return xx;
    }
    public void updateXx(Xx xx) {
    // 更新MySQL数据 省略
    // 删除缓存
    xxLazyCache.deleteXxFromCache(xx.getId());
    }
    public void deleteXx(long id) {
    // 删除MySQL数据 省略
    // 删除缓存
    xxLazyCache.deleteXxFromCache(xx.getId());
    }
    }
    // 实体类
    @Data
    public class Xx {
    // 业务主键
    private Long id;
    // ...省略
    }

3)优点

  • 保证最小的缓存量满足精确查询业务,避免冷数据占用宝贵的内存空间;
  • 对增删改查业务入侵小、删除即同步;
  • 可插拔,对于老系统升级,历史数据无需在启动时初始化缓存。

4)缺点

  • 数据量需可控,在无限增长业务场景不适用;
  • 在微服务场景不利于全局缓存应用。

5)总结

  • 空间最小化;
  • 满足精确查询场景;
  • 总数据量可控推荐使用;
  • 微服务场景不适用。
Redis结合本地缓存

微服务场景下,多个微服务使用一个大缓存,流数据业务下,高频读取缓存对Redis压力很大,我们使用本地缓存结合Redis缓存使用,降低Redis压力,同时本地缓存没有连接开销,性能更优。

1)流程图

2)业务场景

在流处数处理过程中,微服务对多个设备上传的数据进行处理,每个设备有一个code,流数据的频率高,在消息队列发送过程中使用分区发送,我们需要为设备code生成对应的自增号,用自增号对kafka中topic分区数进行取模,这样如果有10000台设备,自增号就是0~9999,在取模后就进行分区发送就可以做到每个分区均匀分布,这个自增号我们使用redis的自增数生成,生成后放到redis的hash结构进行缓存,每次来一个设备,我们就去这个hash缓存中取,没有取到就使用自增数生成一个,然后放到redis的hash缓存中,这时候每个设备的自增数一经生成是不会再发生改变的,我们就想到使用本地缓存进行优化,避免高频的调用redis去获取,降低redis压力。

3)代码示例


  • * 此缓存演示如何结合redis自增数 hash 本地缓存使用进行设备自增数的生成、缓存、本地缓存
    * 本地缓存使用Guava Cache
    public class DeviceIncCache {
    * 本地缓存
    private Cache
  • localCache = CacheBuilder.newBuilder()
    .concurrencyLevel(16) // 并发级别
    .initialCapacity(1000) // 初始容量
    .maximumSize(10000) // 缓存最大长度
    .expireAfterAccess(1, TimeUnit.HOURS) // 缓存1小时没被使用就过期
    .build();
    @Autowired
    private RedisTemplate
    redisTemplate;
    /**
    * redis自增数缓存的key
    */
    private static final String DEVICE_INC_COUNT = "device_inc_count";
    /**
    * redis设备编码对应自增数的hash缓存key
    */
    private static final String DEVICE_INC_VALUE = "device_inc_value";
    /**
    * 获取设备自增数
    */
    public int getInc(String deviceCode){
    // 1.从本地缓存获取
    Integer inc = localCache.get(deviceCode);
    if(inc != null) {
    return inc;
    }
    // 2.本地缓存未命中,从redis的hash缓存获取
    inc = (Integer)redisTemplate.opsForHash().get(DEVICE_INC_VALUE, deviceCode);
    // 3. redis的hash缓存中没有,说明是新设备,先为设备生成一个自增号
    if(inc == null) {
    inc = redisTemplate.opsForValue().increment(DEVICE_INC_COUNT).intValue;
    // 添加到redis hash缓存
    redisTemplate.opsForHash().put(DEVICE_INC_VALUE, deviceCode, inc);
    }
    // 4.添加到本地缓存
    localCache.put(deviceCode, inc);
    // 4.返回自增数
    return inc;
    }
    }

4)优点

redis保证数据可持久,本地缓存保证超高的读取性能,微服务共用redis大缓存的场景能有效降低redis压力;

guava作为本地缓存,提供了丰富的api,过期策略,最大容量,保证服务内存可控,冷数据不会长期占据内存空间;

服务重启导致的本地缓存清空不会影响业务进行;

微服务及分布式场景使用,分布式情况下每个服务实例只会缓存自己接入的那一部分设备的自增号,本地内存空间最优;

在示例业务中,自增数满足了分布区发送的均匀分布需求,也可以满足统计设备接入数目的业务场景,一举两得。

5)缺点

增加编码复杂度,不直接;

只适用于缓存内容只增不改的场景。

6)总结

本地缓存空间可控,过期策略优;

适用于微服务及分布式场景;

缓存内容不能发生改变;

性能优。

后记

redis提供了丰富的数据类型及api,非常适合业务系统开发,统计计数(increment,decrement),标记位(bitmap),松散数据(hash),先进先出、队列式读取(list);guava缓存作为本地缓存,能够高效的读取的同时,提供了大量api方便我们控制本地缓存的数据量及冷数据淘汰;我们充分的学习这些特性能够帮助我们在业务开发中更加轻松灵活,在空间与时间上找到一个平衡点。

来源: dbaplus社群

特别声明:以上内容(如有图片或视频亦包括在内)为自媒体平台“网易号”用户上传并发布,本平台仅提供信息存储服务。

Notice: The content above (including the pictures and videos if any) is uploaded and posted by a user of NetEase Hao, which is a social media platform and only provides information storage services.

相关推荐
热点推荐
“困”在霍尔木兹海峡的人: 炮火连天、缺水断菜、口粮告急,通航遥遥无期⋯⋯

“困”在霍尔木兹海峡的人: 炮火连天、缺水断菜、口粮告急,通航遥遥无期⋯⋯

每日经济新闻
2026-03-21 08:44:06
福建宁德一派出所教导员办公室猥亵15岁女生,一审被判2年9个月,家属欲申请抗诉

福建宁德一派出所教导员办公室猥亵15岁女生,一审被判2年9个月,家属欲申请抗诉

大风新闻
2026-03-21 11:58:12
江苏亿万富豪汪立平被查,数月前从股市套现超29亿元,曾豪言“有恒心、立恒业”

江苏亿万富豪汪立平被查,数月前从股市套现超29亿元,曾豪言“有恒心、立恒业”

华夏时报
2026-03-21 13:50:13
突然传出巨响!没用也没碰 怎么就炸了?你的这个物品要留意……

突然传出巨响!没用也没碰 怎么就炸了?你的这个物品要留意……

极目新闻
2026-03-21 15:37:02
“1分钟内遭路虎别停8次”当事人:连单位领导、岳父老领导都施压要求和解

“1分钟内遭路虎别停8次”当事人:连单位领导、岳父老领导都施压要求和解

观察者网
2026-03-20 10:54:45
战满全部11局!吴宜泽5-6惜败奥沙利文,无缘世界公开赛决赛

战满全部11局!吴宜泽5-6惜败奥沙利文,无缘世界公开赛决赛

全景体育V
2026-03-21 17:24:08
冷脸拒绝采访 王钰栋获董路力挺:你骂他他凭啥不能瞪你 将心比心

冷脸拒绝采访 王钰栋获董路力挺:你骂他他凭啥不能瞪你 将心比心

风过乡
2026-03-21 17:23:32
暴涨超20%,有商家暂停接单!广州网友:想不到它会涨价

暴涨超20%,有商家暂停接单!广州网友:想不到它会涨价

羊城攻略
2026-03-20 23:04:43
64118人!工体再创上座率纪录,中超历史第2,仅少3439人

64118人!工体再创上座率纪录,中超历史第2,仅少3439人

奥拜尔
2026-03-21 17:17:59
正部级高官任上落马,此前曾受过党内处分

正部级高官任上落马,此前曾受过党内处分

中国新闻周刊
2026-03-21 17:11:03
“梅姨”现身并落网!对贩卖儿童事实供认不讳,已被依法逮捕

“梅姨”现身并落网!对贩卖儿童事实供认不讳,已被依法逮捕

南方都市报
2026-03-21 11:35:00
沙特、阿联酋、卡塔尔、土耳其、巴基斯坦、阿塞拜疆、巴林、埃及、约旦、科威特、黎巴嫩、叙利亚联合声明

沙特、阿联酋、卡塔尔、土耳其、巴基斯坦、阿塞拜疆、巴林、埃及、约旦、科威特、黎巴嫩、叙利亚联合声明

澎湃新闻
2026-03-19 16:00:32
申军良回应“梅姨”落网:我找了她10年,在她住过的村子挨家打听,几次差点把命搭进去,不找到她这辈子不甘心

申军良回应“梅姨”落网:我找了她10年,在她住过的村子挨家打听,几次差点把命搭进去,不找到她这辈子不甘心

极目新闻
2026-03-21 17:23:19
劲报!伊朗又一高官遭斩首,川普痛骂北约盟友是“懦夫”

劲报!伊朗又一高官遭斩首,川普痛骂北约盟友是“懦夫”

史政先锋
2026-03-21 14:41:41
“梅姨案”时间线|追踪23年,“隐身”人贩终现形

“梅姨案”时间线|追踪23年,“隐身”人贩终现形

澎湃新闻
2026-03-21 18:06:27
海南陵水发生交通事故致2死5伤,警方通报

海南陵水发生交通事故致2死5伤,警方通报

界面新闻
2026-03-21 17:40:15
大变天!4月1日起,存款10万-50万用户注意,银行新规落地

大变天!4月1日起,存款10万-50万用户注意,银行新规落地

老特有话说
2026-03-21 13:29:15
宅基地确权最后冲刺:今年不把名字改成儿子的,以后可能就改不了

宅基地确权最后冲刺:今年不把名字改成儿子的,以后可能就改不了

混沌录
2026-03-19 21:59:03
两年巨亏超2.5亿,95后女董事长因涉嫌信息披露违法违规被立案

两年巨亏超2.5亿,95后女董事长因涉嫌信息披露违法违规被立案

三湘都市报
2026-03-21 09:30:32
伊朗外长说寻求彻底结束战争而非临时停火

伊朗外长说寻求彻底结束战争而非临时停火

新华社
2026-03-21 16:10:04
2026-03-21 18:51:00
Nodejs开发
Nodejs开发
分享只有程序员懂的干货
648文章数 823关注度
往期回顾 全部

科技要闻

宇树招股书拆解,人形机器人出货量第一!

头条要闻

伊朗发射3800公里射程的导弹 最令美军战栗的细节披露

头条要闻

伊朗发射3800公里射程的导弹 最令美军战栗的细节披露

体育要闻

谁在决定字母哥未来?

娱乐要闻

CMG盛典获奖名单:章子怡高叶同获影后

财经要闻

通胀警报拉响,加息潮要来了?

汽车要闻

小鹏汽车2025年Q4盈利净赚3.8亿 全年营收767亿

态度原创

旅游
游戏
本地
数码
公开课

旅游要闻

山东日照:“闹春牛”带火春日乡村游

《红色沙漠》重磅内幕!开发者怒喷:抄袭《塞尔达》

本地新闻

春色满城关不住|绍兴春日顶流,这片樱花海藏不住了

数码要闻

迷你主机新玩法:双系统+AI一键装

公开课

李玫瑾:为什么性格比能力更重要?

无障碍浏览 进入关怀版