Redis 逻辑过期策略设计思路

ops/2025/2/12 20:54:04/

引言:

当我们平常使用Redis缓存的时候,会出现一种场景, redis的key到过期时间了,总是需要到数据库里面去查一遍数据再set回redis,这个时候如果数据库响应比较慢,那么就会造成用户等待,如果刚好并发比较大,则有可能给数据库造成巨大的压力,甚至导致服务不可用。

特别是在MPP分析库的场景尤为突出。

但是我们Redis又不能设置为永不过期,因为这样就获取不到最新的数据了。

那么,有什么办法能不穿透数据库,但是又能在redis中一直取到最新的数据呢? Redis 逻辑过期策略诞生

Redis 逻辑过期策略是什么?

就是通过LogicalExpiredTime 和 PhysicalExpiredTime 来让相对新的热点数据相对长期的存在于Redis中。

实现原理

SET请求

当客户端发起SET请求的时候,会封装成一个RV对象,对象里面包含 Timestamp 和 Value 两个属性。

Timestamp 存储当前set时候的时间戳,Value 存储真正的数据

图1-set请求

GET请求

当客户端发起GET请求的时候,首先判断Value是否有值。如果没有,说明物理过期时间已经过期了,这个时候执行LoadValue函数,一般是从数据库里面加载数据,然后再调用Set请求,将数据set进Redis,并将数据返回给Client。

如果有值的话,会取Timestamp的值和逻辑过期时间做对比,不管对比结果如何,都将当前value返回给客户端。

如果 Timestamp/1000 + LogicExpiredTime >= Now 则表名逻辑时间已经过期,则开启异步LoadValue并SET。
图2-get请求


http://www.ppmy.cn/ops/7446.html

相关文章

Ant Design中Tree使用defaultExpandAll属性后不会默认展开所有节点怎么办?

最近做前端项目时,使用到了 tree 组件,选择使用 Ant Design 中的 tree 组件,默认所有节点初始时全部展开,使用 defaultExpandAll 属性。但是显示的时候,一个节点都没展开。于是调研了一下这个问题。发现有以下问题&…

深入解析Tomcat的工作流程

tomcat解析 Tomcat是一个广泛使用的开源Servlet容器,用于托管Java Web应用程序。理解Tomcat的工作流程对于开发人员和系统管理员来说是非常重要的。本文将深入探讨Tomcat的工作原理,包括请求处理、线程池管理、类加载、以及与Web服务器之间的通信。 ###…

安全访问服务边缘(SASE):网络新时代的安全与连接解决方案

随着信息技术的飞速发展,在企业纷纷拥抱数字业务的过程中,由于边缘计算、云服务、混合网络的逐渐兴起,使得本就漏洞百出的传统网络安全架构更加岌岌可危,企业和组织面临着日益复杂且多变的网络安全挑战。传统的网络安全解决方案往…

Flutter - iOS 开发者速成篇

首先 安装FLutter开发环境:M1 Flutter SDK的安装和环境配置 然后了解Flutter和Dart 开源电子书:Flutter实战 将第一章初略看一下,你就大概了解一下Flutter和Dart这门语言 开始学习Dart语言 作为有iOS经验的兄弟们,学习Dart最快…

每日一题(4.17)

目录 Leecode-16-最接近的三数之和题目示例解题思路代码实现 Leecode-面试题01.07-旋转矩阵题目示例解题思路代码实现 Leecode-16-最接近的三数之和 题目 给你一个长度为 n 的整数数组 nums 和 一个目标值 target。请你从 nums 中选出三个整数,使它们的和与 targe…

软件设计:UML 模型图总结

1. 相关链接 参考教程: https://sparxsystems.com/resources/tutorials/ https://sparxsystems.com/enterprise_architect_user_guide/15.2/model_domains/whatisuml.html Unified Modeling Language (UML) description, UML diagram examples, tutorials and r…

知识图谱的起源与发展

文章目录 知识图谱的发展历史知识图谱的重要性知识图谱与Ontology、语义网络之间的区别知识图谱的定义 知识图谱的发展历史 知识图谱始于20世纪50年代,至今大致分为三个发展阶段:第一阶段 (1955年—1977年)是知识图谱的起源阶段&a…

Swift-20-基础数据类型

数据定义 语法规则 先来看下下面的代码 import Cocoavar num1 "four" //a var num2: String "four" //b var num3 4 //c var num4: Int 4 //d上面的几行代码都能正常运行,其中a和b行等价,c和d行等价。区另就在于是否声…