分页列表缓存,你真的知道怎么做吗?

发布于:2024-10-24 编辑:匿名 来源:网络

来自开源中国的红树兄写了很多关于缓存的文章。其中多级缓存思想和分页列表缓存知识点给了我很多启发。

这篇文章我们讲一下分页列表缓存,希望能够帮助大家提高对缓存技术的理解。 1 直接缓存分页列表结果显而易见,这是最简单易懂的方式。

?我们根据不同的分页条件来缓存分页结果。伪代码如下: 代码语言: javascript copy public List getPageList(String param,int page,int size) { String key = "productList:page:" + page + "size:" + size + "param :" + 参数; List<产品> dataList = cacheUtils.get(key); if(dataList != null) { return dataList; } dataList = queryFromDataBase(参数,页面,大小); if(dataList != null) { cacheUtils.set(key, dataList, Constants.ExpireTime);这种方案的优点是工程简单,性能快,但是它有一个非常明显的缺陷:列表缓存的粒度很大。

如果列表中的数据增加或删除,为了保证数据的一致性,需要修改分页列表缓存。有两种方式:1、依靠缓存过期来实现惰性,但业务场景必须具有包容性; 2.使用Redis键找到业务的分页缓存并执行删除命令。

但keys命令对性能影响很大,会造成Redis较大的延迟。在生产环境中使用keys命令是危险的,发生事故的几率很高,所以不建议使用。

2 查询对象ID列表,然后缓存每个对象条目。缓存分页结果虽然使用方便,但是缓存粒度太大,保证数据一致性比较麻烦。

所以我们的目标是在更细粒度的级别上控制缓存。我们查询商品分页对象ID列表,然后为每个商品对象创建一个缓存,并将商品ID和商品对象缓存聚合成一个列表返回给前端。

伪代码如下: 核心流程: 1、从数据库中查询分页ID List 代码语言:javascript copy // 从数据库中查询分页商品ID List ProductIdList = queryProductIdListFromDabaBase(param, page, size);对应SQL类似: 代码语言:javascript copy SELECT id FROM productsORDER BY id LIMIT (page - 1) * size, size 2.从缓存中批量获取product对象 代码语言:javascript copy Map cachedProductMap = cacheUtils. mget(产品IdList);如果我们使用本地缓存,直接从本地缓存中一一聚合也是极快的。如果我们使用分布式缓存,Redis自然支持批量查询命令,例如mget和hmget。

3、组装未命中的产品ID 代码语言:javascript copy List noHitIdList = new ArrayList<>(cachedProductMap.size()); for (Long ProductId : ProductIdList) { if (!cachedProductMap.containsKey(productId)) { noHitIdList.add(productId); }因为缓存可能会因为过期或者其他原因而没有命中,所以我们需要找到哪些商品不在缓存中。 4、批量从数据库中查询缺失的商品信息列表,并重新加载到缓存中。

首先从数据库中批量查询缺失的产品信息列表。请注意,这是一个批次。

代码语言:javascript copy List noHitProductList = batchQuery(noHitIdList);参数是错过缓存的产品ID列表,组装成对应的SQL,所以性能更快: 代码语言:javascript copy SELECT * FROM products WHERE id IN (1,2,3,4);然后将这些遗漏的商品信息存储到缓存中,使用Redis的mset命令。代码语言:javascript copy // 将未命中的商品添加到缓存中 Map noHitProductMap = noHitProductList.stream() .collect( Collectors.toMap(Product::getId, Function.identity()) );cacheUtils .mset( noHitProductMap);//将未命中的商品添加到聚合地图中 cachedProductMap.putAll(noHitProductMap); 5. 遍历产品ID列表并组装对象列表。

代码语言: javascript copy for (Long ProductId : ProductIdList) { Product Product = cachedProductMap.get(productId); if (产品!= null) { result.add(产品);目前的方案中,当缓存命中时,经过两次网络IO和第一次数据库查询IO,第二次Redis查询IO,性能会更好。所有操作均为批量操作。

即使有缓存未命中,整体速度也更快。“查询对象ID列表,然后缓存每个对象条目”这种解决方案更加灵活。

我们查询对象ID列表的时候,可以不限于数据库,还可以是搜索引擎、Redis等。下图是开源中国的搜索流程:本质是:只搜索的分页结果包含业务对象ID,需要从缓存+MySQL中获取对象的详细信息。

3 缓存对象ID列表并缓存每个对象条目。作者曾经重构过一个类似朋友圈的服务。

进入班级页面,班级成员的所有动态都以瀑布流的形式展示。我们使用推送模式将每个动态ID存储在Redis ZSet数据结构中。

Redis ZSet 是一种有序集合类型的数据结构,它由多个有序且唯一的字符串元素组成,每个元素都与一个浮点值关联。 ZSet使用member->score结构:member:排序后的标识符,也是默认的第二排序维度(当score相同时,Redis按照字典顺序对member进行排序)score:排序后的分数,存储类型为double? 编辑添加图片评论,不超过文字(可选)如上图所示:ZSet存储一个动态ID列表,member的值为动态编号,score的值为创建时间。

分页效果可以通过ZSet的ZREVRANGE命令来实现。 ZREVRANGE 是 Redis 中用于排序集的命令之一。

用于根据成员的得分从大到小返回有序集合中指定范围的成员。为了达到分页效果,需要传递以下分页参数: 通过ZREVRANGE命令,我们可以查询动态ID列表。

查询完动态ID列表后,还需要缓存每个动态对象条目。动态对象包括功能数据,例如详细信息、评论、喜欢和收藏。

我们需要为这些数据提供单独的缓存配置。无论是查询缓存还是重写缓存,为了提高系统性能,批量操作都更加高效。

如果缓存对象结构简单,则使用mget和hmget命令;如果结构复杂,可以考虑使用pipleline和Lua脚本模式。我选择的批量解决方案是Redis的管道功能。

我们来模拟一下获取动态寻呼列表的过程:使用ZSet的ZREVRANGE命令,传入寻呼参数,查询动态ID列表;传递动态ID列表参数,通过Redis的管道功能从缓存中批量获取动态详情、评论、点击等。就像,收集这些功能数据并将它们组装成一个列表。

4 小结 本文介绍了三种实现分页列表缓存的方式:直接缓存分页列表结果、查询对象ID列表、仅缓存每个对象条目、缓存对象ID列表、同时缓存每个对象条目。这三种方法是一层一层的。

分页列表缓存,你真的知道怎么做吗?

站长声明

版权声明:本文内容由互联网用户自发贡献,本站不拥有所有权,不承担相关法律责任。如果发现本站有涉嫌抄袭的内容,欢迎发送邮件 举报,并提供相关证据,一经查实,本站将立刻删除涉嫌侵权内容。

标签:

相关文章

  • 武汉市汉阳区加快元宇宙创新发展支持政策(试行)

    武汉市汉阳区加快元宇宙创新发展支持政策(试行)

    汉阳区加快元宇宙创新发展支持政策(试行) 为贯彻落实武汉市关于加快元宇宙创新发展的决策部署加快推动汉阳区涉元宇宙相关技术、管理和商业模式创新应用,培育新业态、新模式,推动信息技术与各类业态紧密结合,推动汉阳区元宇宙产业蓬勃发展。 数字经济。 根据汉阳市实际情

    06-18

  • 超强续航金立M5拍摄评测

    超强续航金立M5拍摄评测

    配备大mAh电池的金立M5采用F/2.0大光圈百万像素摄像头和百万像素前置摄像头。 硬件符合目前主流手机配置。 至于金立M5的各项功能,我们来看看它在场景中的表现如何。 拍照界面 金立M5的拍照界面中规中矩。 左上方是拍摄模式,可以选择相机拍摄功能,功能也很齐全。 右上角是设

    06-18

  • 英飞凌和 Eatron 合作

    英飞凌和 Eatron 合作

    Silicon Semiconductor,共同推进汽车电池管理解决方案。 Infineon Technologies 和 Eatron Technologies 合作,为 AURIX? TC4x 微控制器 (MCU) 带来先进的机器学习解决方案和算法。 此次合作旨在推进汽车电池管理系统 (BMS)。 Eatron 利用其 MCU 系列最先进的机器学习功能和

    06-06

  • 小鸟推送获得华欧创投数千万A轮融资, “城市消费第一股”虎视眈眈1.3万亿元市场!

    小鸟推送获得华欧创投数千万A轮融资, “城市消费第一股”虎视眈眈1.3万亿元市场!

    据投资界1月14日消息,鸟推近期获得华鸥资本领投的数千万元A轮私募。 本次融资由MISS X女性众创平台独家提供。 作为小鸟推动的财务顾问,MISS X将继续与其在投融资、产业资源整合等领域开展全方位、深入的合作。 据悉,本轮融资将主要用于补充小鸟推送团队扩张、产品生态完善

    06-18

  • 搜狗发布2019年Q1财报:营收超17亿元,AI驱动业务发展新机遇

    搜狗发布2019年Q1财报:营收超17亿元,AI驱动业务发展新机遇

    4月29日,搜狗发布未经审计的第一季度财报。 财报显示,搜狗一季度总营收17亿元,同比增长8%,超出预期。 搜狗手机输入法日均语音请求量较去年同期增长69%,峰值达到6亿次,稳居国内语音应用前茅。 此外,作为人工智能领域的领先者,搜狗一季度加大了对智能硬件的投入,积极探

    06-18

  • 红杉腾讯今日再获IPO:市值3601亿

    红杉腾讯今日再获IPO:市值3601亿

    今天,红杉腾讯又获香港IPO。 据投资界(ID:pedaily2)10月30日消息,世茂服务今日正式在香港联交所主板挂牌上市。 本次IPO共发行5.88亿股,发行价格为16.6港元/股。 世茂服务开盘价为15.8港元。 按开盘价计算,市值突破1亿港元。 世茂服务的背后是一代闽商传奇人物——许荣

    06-17

  • SK海力士营收三年来首次突破10万亿韩元,乐观认为内存热潮将持续

    SK海力士营收三年来首次突破10万亿韩元,乐观认为内存热潮将持续

    SK海力士周二(27日)公布截至6月30日的年度第二季度业绩,营收同比(季度)增长20%。 (增长22%)??至10万亿韩元,营业收入年增长38%(季度增长%)至2万亿韩元,营业利润率年增长3个百分点(季度增长10个百分点)至26%,净利润年增长57%(季度增长%)至1万亿韩元。 随着第二

    06-08

  • OPPO Find N2已经跨越了一个临界点

    OPPO Find N2已经跨越了一个临界点

    这个世界上有一群人,叫做“等待党”。 他们拿着钱观望,等待本代产品降价,等待下一代产品升级,等待闲鱼二手价格暴跌,等待新款上市,然后接管了妻子的旧手机。 他们在等什么?与其说现在是好时机,不如说是等待“临界点”。 可能是心理代价,可能是运行某款游戏大作的流畅

    06-21

  • 能空子电子发布2023年年Q1财报:净利润同比增长150%

    能空子电子发布2023年年Q1财报:净利润同比增长150%

    投资界(ID:pedaily)6月16日消息,能空子电子(纳斯达克股票代码:NAAS)发布年Q1未经审计财务报告:公司净利润万元(万美元),同比增长%,非国际通用会计标准会计亏损1.02亿元(万美元),净亏损率收窄60 % 去年同期。 能空子电子预计本财年净利润将在5亿元人民币(1万美

    06-18

  • 兰亭集势递交IPO赴美上市申请,融资8625万美元

    兰亭集势递交IPO赴美上市申请,融资8625万美元

    据4月18日消息,B2C外贸电商网站兰亭集势今日向美国证监会提交Form F-1,拟在美国上市美国。   文件显示,兰亭集势计划在纽交所上市,交易代码为“LITB”,并通过首次公开募股筹集1万美元。 主承销商为瑞士信贷和Stifel Financial Corp,其他承销商包括太平洋皇冠证券和Opp

    06-18

  • Udesk IVR系统通过接入第三方接口,让企业服务更加高效

    Udesk IVR系统通过接入第三方接口,让企业服务更加高效

    .wp-block-column h3{margin-left:0} 随着技术的不断发展,人机交互(HCI)已经成为一种是我们日常生活中不可缺少的一部分。 在这一领域,IVR(交互式语音应答系统)作为人机交互的重要工具,得到了广泛的应用。 然而,传统的IVR系统往往只能提供一些预设的语音菜单和应答,无

    06-17

  • 智能驾驶高科技创新公司星易到获近亿元C轮融资

    智能驾驶高科技创新公司星易到获近亿元C轮融资

    据投资界(ID:pedaily)4月2日消息,近日,北京星易到科技有限公司(以下简称“星易到”)获C轮融资。 “星易道”)宣布获得近亿元C轮融资。 本轮融资由建鼎(无锡)电子有限公司和江苏悦达金泰基金管理有限公司大数据产业基金领投,资金将用于大规模量产线建设车载毫米波雷

    06-17