基于社区电商的Redis缓存架构-用户分享内容的分页列表缓存延迟构建以及异步通知缓存重建

news2024/12/24 18:34:21

分页列表缓存的延迟构建

首先,先来讲一下业务场景,用户会在 APP 中去分享内容,那么假如用户分享的是美食菜谱内容,在用户分享之后,先将这个美食菜谱的内容作为 k-v 进行缓存,但是呢,其实对于用户分享的美食菜谱内容其实是会进行分页查询的,比如说别人点击进入你的主页,肯定是分页查询你主页分享的内容,那么我们就要考虑一下什么时候对这个分页查询的缓存列表进行构建呢?

那么这里列表缓存的构建时机有两个:

  • 第一个是真正来查询该用户分享的内容列表时(延迟构建,在真正查询时再进行构建,避免占用 Redis 内存),此时先在数据库中查询分页数据,再去缓存中构建分页缓存
  • 第二个是用户修改或者新增分享的内容时,此时通过 RocketMQ 来异步通知,去对缓存中的分页列表进行重新的构建

那么可以来看一种并发下的极端情况:

当用户 A 新增分享的时候,另一个用户 B 此时正好来查询用户 A 的分享列表,用户 B 线程先去缓存中查询,发现没有,再去数据库中查询用户 A 的分享列表,此时 B 拿到了 A 新增分享之前的旧数据,此时如果用户 A 新增分享并落库,并且去缓存中对用户 A 的列表缓存进行重建,那么此时缓存列表中是用户 A 的最新数据,但是此时用户 B 的线程在数据库中已经查到了用户 A 的旧数据,用户 B 的线程继续执行,将用户 A 的旧数据给放入到列表缓存中,覆盖掉了用户 A 更新的缓存,那么此时就会导致缓存数据库不一致

解决办法就是在这两处构建缓存的时候都加上分布式锁即可,加分布式锁的地方在下图标红的位置:

查询用户列表时,分页缓存的构建流程:

在这里插入图片描述

用户新增或修改分享时,对分页缓存的重建流程:
在这里插入图片描述

那么同样的,既然在查询的时候加了锁,就还存在冷门用户突然火了的情况,大量用户线程来查询这个用户的分享列表,发现缓存中没有,去竞争这把锁,解决方法仍然为:将大量用户线程竞争锁由串行改为并行

解决方案就是,将查询用户的分享列表获取锁的地方添加一个获取锁的超时时间,这样大量用户线程阻塞在获取锁的地方,如果超过这个锁获取的超时时间,就直接返回查询失败,只要有一个用户线程将这个列表加载到了缓存当中,那么其他用户再次查询的话,就直接从缓存中查了,不会再大量阻塞在获取锁的地方

那么上边只说了整体的分页列表缓存的延迟构建的整体的一个流程,那么具体的分页列表缓存是如何来进行构建的呢?key 是如何进行设计的呢?

分页列表的缓存的 key 为:user_cookbook:page:{userId}:{pageNo},主要有 userId 和 pageNo 来进行控制,pageNo 的话表示查询的是缓存中的第几页

那么在数据库中直接根据 pageNopageSize 查询到分页数据,再将分页数据转为 JSON 串存入 Redis 缓存当中,用户需要查询哪一页的数据直接根据 pageNo 来进行控制即可

总结

  • 在查询时,给获取锁添加超时时间,避免突然大量请求访问冷门数据,大量线程阻塞等待锁
  • 如果多处操作缓存和数据库,要注意加同一把锁,来保证数据的一致性
  • 在 MQ 的通知中,加锁的话,注意需要阻塞等待加锁,而不是拿不到锁就退出,因为 MQ 中的通知需要修改缓存,收到通知后是一定要修改的
  • 分页缓存的 key 的设计:user_cookbook:page:{userId}:{pageNo}
  • 对于数据库中不存在的数据,在 Redis 中使用 {} 来进行缓存,避免缓存穿透,空缓存就可以将过期时间设置的短一些,避免大量空缓存占用缓存空间

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1274180.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Microsoft Remote Desktop高效、安全、稳定的远程办公解决方案

在今天的数字化时代,Remote Desktop远程办公已成为许多人的日常生活。无论你是因为工作需要,还是因为在家中需要访问公司服务器,微软远程连接软件都是一个理想的选择。 微软远程连接软件Remote Desktop是一款高效、安全、稳定的远程办公解决…

Clickhouse Join

ClickHouse中的Hash Join, Parallel Hash Join, Grace Hash Join https://www.cnblogs.com/abclife/p/17579883.html https://clickhouse.com/blog/clickhouse-fully-supports-joins-full-sort-partial-merge-part3 总结 本文描述并比较了ClickHouse中基于内存哈希表的3种连接…

Nginx基线检查

扩展知识: Nginx主配置文件:/etc/nginx/nginx.conf 这是Nginx的主要配置文件,用于配置全局的设置、HTTP块、事件处理、邮件等内容。 打开并编辑配置文件 vim /etc/nginx/nginx.conf 一、关于禁止显示服务器版本号和操作系统版本信息: 简介: 在错误页面和响应头中显示…

2024年软考高级信息系统项目管理师备考攻略

软考高级信息系统项目管理师是一项合格性考试,考试内容相对有限,因此真题的重复率较高。下一次考试与上一次相比,重复率不高,但与之前所有年份的真题相比,重复率较高。在这几次考试中,我认为最重要的是务必…

SQL Sever 基础知识 - 数据筛选

SQL Sever 基础知识 - 四、数据筛选 四、筛选数据第1节 DISTINCT - 去除重复值1.1 SELECT DISTINCT 子句简介1.2 SELECT DISTINCT 示例1.2.1 DISTINCT 一列示例1.2.2 DISTINCT 多列示例 1.2.3 DISTINCT 具有 null 值示例1.2.4 DISTINCT 与 GROUP BY 对比 第2节 WHERE - 过滤查询…

Linux常用命令----history命令

文章目录 在Linux中,history命令是一个极其有用的工具,它可以帮助用户查看和管理之前执行过的命令历史。这个功能对于快速查找和重用之前的命令特别有帮助。下面,我们将通过一些实例,详细介绍history命令的使用方法。 1. 基本使用…

【机器视觉技术栈】- 机器视觉基础

1.1 为什么采用机器视觉 人眼与机器视觉对比 人眼机器视觉精确性差,64灰度级,不能分辨小于100微米的目标强,256灰度级,可检测微米级目标速度慢,无法看清间隔小于40毫秒的运动目标快,快门时间可达10微秒适…

计算机网络HTTP篇

目录 一、HTTP基本概念 二、GET 与 POST 2.1、GET 与 POST 有什么区别? 2.2、GET 和 POST 方法都是安全和幂等的吗? 三、HTTP 缓存 3.1、强制缓存: 3.2、协商缓存 四、HTTP 特性 4.1、HTTP/1.1 4.1.1、HTTP/1.1 的优点 4.1.2、HTT…

【新品上市】启扬储能管理平板,打造储能管理新模式,助力全场景储能数智化升级!

随着可再生能源的快速发展,储能技术的应用日益广泛,储能系统成为解决可再生能源波动性和不可控制性的关键环节。储能系统通过实时监测、数据分析、远程控制等智能化功能,实现能量的高效利用和系统的稳定运行。 启扬智能推出 工业级储能管理平…

Docker 安装部署 Sentinel Dashboard

1、下载 jar 包 官方 jar 包下载地址:https://github.com/alibaba/Sentinel/releases 或者点击 链接 直接跳转到下载页 进入链接下载你需要的版本 下载完毕(我这里统一放在一个sentinel目录内) 2、编写 Dockerfile 文件(这里我不…

OpenCV快速入门:彩蛋——小游戏制作

文章目录 前言一、游戏玩法1.1 核心玩法1.2 特殊事件 二、功能模块划分2.1 主游戏文件 (main.py)2.2 游戏对象 (game_objects.py)2.3 游戏逻辑 (game_logic.py)2.4 事件和奖励 (events_and_rewards.py)2.5. 游戏界面 (game_ui.py) 三、完整代码3.1 主游戏文件 (main.py)3.1.1 游…

仅仅通过提示词,GPT-4可以被引导成为多个领域的特定专家

The Power of Prompting:提示的力量,仅通过提示,GPT-4可以被引导成为多个领域的特定专家。微软研究院发布了一项研究,展示了在仅使用提策略的情况下让GPT 4在医学基准测试中表现得像一个专家。研究显示,GPT-4在相同的基…

浅聊代理(应用部署)

以前很少接触过项目的上线部署, 我对前后端交互的认知还停留在前端一个请求 对应后端一个API 比如后端提供: /api/backend/categories -GET 前端则通过使用ajax或者axios组件去构建http请求, 发送到: https://host:port/api/backend/categories -GET 一、…

11-22 SSM3

书城分页查询 使用mybatis分页插件: 请完成登陆注册 -> 跳转到首页 解决前端上架时间点击切换 以及侧边栏点击由背景颜色的改变 完成超链接的绑定点击时间 -> jquery $(document).ready(function() { // 初始化上架时间状态为 true(上架&…

SQL server 基线安全加固操作

账号管理、认证授权 ELK-Mssql-01-01-01 编号 ELK-Mssql-01-01-01 名称 为不同的管理员分配不同的账号 实施目的 应按照用户分配账号,避免不同用户间共享账号,提高安全性。 问题影响 账号混淆,权限不明确,存在用户越权使用的可能。 …

【Serverless架构组成及优势适用场景】

目录 引言 一、无服务器函数(Serverless Functions) 二、事件驱动(Event-Driven) 三、自动扩展(Auto Scaling) 四、按需计费(On-Demand Billing) 五、无状态(State…

云轴科技ZStack信创云平台助力国泰君安期货实现信创改造

信创是数字中国建设的重要组成部分,也是数字经济发展的关键推动力量。作为云基础软件企业,云轴科技ZStack 产品矩阵全面覆盖数据中心云基础设施,ZStack信创云首批通过可信云《一云多芯IaaS平台能力要求》先进级,是其中唯一兼容四种…

DS八大排序之直接选择排序和堆排序

前言 上一期我们已经介绍了,排序、为什么要有排序以及排序在实际生活中的应用。并且介绍并实现了直接插入排序和它的优化即希尔排序~!本期我们再来学习一组排序 ---- "选择排序"即直接选择排序和堆排序~! 本期内容介绍 直接选择排…

使用 SDKMAN 管理多版本本地 Java 环境---Centos8 Windows

文章目录 windows 安装centos8 安装卸载sdkman使用 windows 安装 SDKMAN是一个 jdk 多版本管理工具,类似于 nodejs 中的 nvm。可以在本地存在多个 java 环境,快速切换功能,同时,他不止于 java sdk,还有maven、tomcat等…

(四)基于高尔夫优化算法GOA求解无人机三维路径规划研究(MATLAB代码)

一、无人机模型简介: 单个无人机三维路径规划问题及其建模_IT猿手的博客-CSDN博客 参考文献: [1]胡观凯,钟建华,李永正,黎万洪.基于IPSO-GA算法的无人机三维路径规划[J].现代电子技术,2023,46(07):115-120 二、高尔夫优化算法GOA简介 高尔夫优化算法…