【缓存设计】记一种不错的缓存设计思路

这篇具有很好参考价值的文章主要介绍了【缓存设计】记一种不错的缓存设计思路。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

前言

之前与同事讨论接口性能问题时听他介绍了一种缓存设计思路,觉得不错,做个记录供以后参考。

场景

假设有个以下格式的接口:

GET /api?keys={key1,key2,key3,...}&types={1,2,3,...}

其中 keys 是业务主键列表,types 是想要取到的信息的类型。

请求该接口需要返回业务主键列表对应的业务对象列表,对象里需要包含指定类型的信息。

业务主键可能的取值较多,千万量级,type 取值范围为 1-10,可以任意组合,每种 type 对应到数据库是 1-N 张表,示意:
【缓存设计】记一种不错的缓存设计思路,# Redis,java

现在设想这个接口遇到了性能瓶颈,打算添加 Redis 缓存来改善响应速度,应该如何设计?

设计思路

方案一:
最简单粗暴的方法是直接使用请求的所有参数作为缓存 key,请求的返回内容为 value。

方案二:
如果稍做一下思考,可能就会想到文首我提到的觉得不错的思路了:

  1. 使用 业务主键:表名 作为缓存 key,表名里对应的该业务主键的记录作为 value;

  2. 查询时,先根据查询参数 keys,以及 types 对应的表,得到所有 key1:tb_1_1、key1:tb_1_2 这样的组合,使用 Redis 的 mget 命令,批量取到所有缓存中存在的信息,剩下没有命中的,批量到数据库里查询到结果,并放入缓存;

  3. 在某个表的数据有更新时,只需刷新 涉及业务主键:该表名 的缓存,或令其失效即可。

小结

在以上两种方案之间做评估和选择,考虑几个方面:

  • 缓存命中率;

  • 缓存数量、占用空间大小;

  • 刷新缓存是否方便;

稍作思考和计算,就会发现此场景下方案二的优势。

另外,就是需要根据实际业务场景,如业务对象复杂度、读写次数比等,来评估合适的缓存数据的粒度和层次,是对应到某一级组合后的业务对象(缓存值对应存储 + 部分逻辑),还是最基本的数据库表/字段(存储的归存储,逻辑的归逻辑)。文章来源地址https://www.toymoban.com/news/detail-680159.html

到了这里,关于【缓存设计】记一种不错的缓存设计思路的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • redis缓存设计-Redis(八)

    上篇文章介绍了redis缓存设计,热点key,bigkey注意事项。 原创 redis缓存设计-Redis(七) https://blog.csdn.net/ke1ying/article/details/131268967 命令使用 hgetall,lrange,smembers,zrange,sinter等并非不能使用,要指定明确的值,遍历的话要使用 hscan、sscan、zscan 代替。 禁止使用keys,flushall,

    2024年02月10日
    浏览(39)
  • java初中级面试题(SSM+Mysql+微服务(SpringCloud+Dubbo)+消息队列(RocketMQ)+缓存(Redis+MongoDB)+设计模式+搜索引擎(ES)+JVM

    目录 基础篇 一、Get 和 Post 的区别 二、Java 多态的具体体现 三、StringBuffer StringBuilder String 区别 四、==和 equals 区别 五、重写 equals 需要重写 hashCode 吗 六、java 的基本数据类型 七、List, Set, Collection, Collections   八、ArrayList 和 LinedList 区别 九、HashMap 和 Hashtable 区别 十、Forward

    2023年04月20日
    浏览(126)
  • Redis缓存设计与性能优化

    缓存穿透是指查询一个根本不存在的数据, 缓存层和存储层都不会命中 , 通常出于容错的考虑, 如果从存储层查不到数据则不写入缓存层。 缓存穿透将导致不存在的数据每次请求都要到存储层去查询, 失去了缓存保护后端存储的意义。 造成缓存穿透的基本原因有两个:

    2024年02月07日
    浏览(48)
  • 49.Redis缓存设计与性能优化

    缓存与数据库双写不一致 小概率事件 //线程1 写数据库stock = 5 ---------------》更新缓存 //线程2 写数据库stock = 4 -----》更新缓存 //线程1 ------》写数据库stock = 10 -----》删除缓存 //线程2 -----------------------------------------------------------------------------------------------》写数据库stock = 9 -

    2024年02月08日
    浏览(43)
  • 6. Redis缓存设计与性能优化

    本文是按照自己的理解进行笔记总结,如有不正确的地方,还望大佬多多指点纠正,勿喷。 课程内容: 1、多级缓存架构详解 2、缓存穿透缓存击穿缓存雪崩详解 3、热点缓存key重建优化 4、缓存与数据库双写不一致终极解决 5、Redis开发规范与性能优化 ngnix到Lua到web层,到re

    2024年02月11日
    浏览(53)
  • 【java缓存、redis缓存、guava缓存】java中实现缓存的几种方式

    这种方式可以简单实现本地缓存,但是实际开发中不推荐使用,下面我们来实现一下这种方式。 首先创建一个管理缓存的类 这个类中有一个静态代码块,静态代码块会在类加载时就执行,我们可以在这里完成对缓存的初始化,决定缓存内一开始就有哪些数据 另外我们还可以

    2024年02月16日
    浏览(36)
  • 【Redis(7)】缓存技术的挑战及设计方案

    缓存是计算机科学中用于提升系统性能的一种关键技术。在本文中,我们将针对缓存的基本概念、可能遇到的问题、优缺点、常见策略以及设计一个高可用、高性能、高并发缓存方案的思路进行探讨。 缓存是一种数据存储实践,它将频繁访问的数据保存在快速访问的存储介质

    2024年04月25日
    浏览(36)
  • Redis缓存设计与性能优化【并发创建同一个缓存,解决方案:互斥锁】

    开发人员使用“缓存+过期时间”的策略既可以加速数据读写, 又保证数据的定期更新, 这种模式基本能够满足绝大部分需求。 但是有两个问题如果同时出现, 可能就会对应用造成致命的危害: 当前key是一个热点key(例如一个热门的娱乐新闻),并发量非常大。 重建缓存不

    2024年04月09日
    浏览(52)
  • 酌情参考——chatGPT给的一些语义框架的学术思路,语义和图谱结合似乎是个不错的方向

    语义和图谱结合似乎是个不错的方向 我个人觉得可以用知识图谱,用 语义框架作为学术上理论依据,来解决学生领域认知问题。 2023年9月12日18:02:48的idea。 附:认知相关 文旭:认知语言学的研究方法 - 向上好青年的文章 - 知乎

    2024年02月09日
    浏览(44)
  • 缓存解析:从架构设计到Redis应用及最佳实践

    在现代软件架构中,缓存是优化数据检索、提高应用性能的关键组件。缓存的存储位置多种多样,每个位置针对特定的优化目标和需求。理解这些层级对于设计高效的系统至关重要。 浏览器缓存 :这是最接近用户端的缓存层。浏览器缓存存储了用户经常访问的静态资源,如

    2024年01月22日
    浏览(49)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包