TTL 在 Redis 缓存中的作用

Redis TTL(Time To Live)与缓存的关系

TTL(Time To Live,生存时间)是 Redis 提供的一种自动过期机制,用于控制键值对的存活时间。当 TTL 到期后,Redis 会自动删除该键,避免长期占用内存。这对于缓存系统来说至关重要,因为它能够有效防止缓存过载,并确保数据的一致性和实时性。


1. TTL 相关的 Redis 命令

1.1. 设置 TTL

  • EXPIRE key seconds:为 key 设置 seconds 秒的 TTL。
  • PEXPIRE key milliseconds:为 key 设置 milliseconds 毫秒的 TTL。
  • SETEX key seconds value:设置 key 的值,同时指定 seconds 秒的过期时间。
  • PSETEX key milliseconds value:设置 key 的值,同时指定 milliseconds 毫秒的过期时间。

示例:

SETEX user:1001 3600 "Alice"  # 设置1小时后过期
PEXPIRE user:1001 60000       # 设置60秒后过期

Python 代码示例:

import rediscache = redis.Redis(host='localhost', port=6379, decode_responses=True)# 设置缓存数据并指定 TTL
cache.setex("user:1001", 3600, "Alice")  # 1小时后过期
cache.pexpire("user:1001", 60000)        # 60秒后过期

1.2. 查询 TTL

  • TTL key:返回 key 还有多少秒过期。
  • PTTL key:返回 key 还有多少毫秒过期。

示例:

TTL user:1001   # 查询 key 还剩多少秒过期
PTTL user:1001  # 查询 key 还剩多少毫秒过期

Python 代码示例:

ttl = cache.ttl("user:1001")
print(f"user:1001 剩余 TTL: {ttl} 秒")

1.3. 移除 TTL

  • PERSIST key:移除 key 的 TTL,使其永久存在。

示例:

PERSIST user:1001  # 让 user:1001 永不过期

Python 代码示例:

cache.persist("user:1001")  # 取消 TTL,使其永久存在

2. TTL 在缓存中的作用

2.1. 避免缓存污染

  • 设定合理的 TTL 可以避免缓存存储长期无用的数据,减少内存占用。
cache.setex("session:12345", 1800, "session_data")  # 30分钟后自动删除

2.2. 解决缓存雪崩

缓存雪崩 是指大量缓存数据在同一时间过期,导致所有请求直接访问数据库,造成数据库崩溃。

解决方案:

  • 使用随机 TTL,让不同的 key 过期时间分散,防止同时失效。
import randomttl = 3600 + random.randint(0, 600)  # 1小时 + 0~10分钟随机时间
cache.setex("user:1001", ttl, "Alice")

2.3. 解决缓存击穿

缓存击穿 发生在某个热点数据突然过期,大量请求同时访问数据库,导致数据库压力过大。

解决方案:

  1. 热点数据设置较长 TTL 或永不过期

    cache.set("hot_key", "important_data")
    cache.persist("hot_key")  # 使其永久有效
    
  2. 使用互斥锁防止并发查询

    lock = cache.setnx("lock:user:1001", 1)  # 尝试加锁
    if lock:value = get_data_from_db("user:1001")cache.setex("user:1001", 3600, value)  # 更新缓存cache.delete("lock:user:1001")  # 释放锁
    

2.4. 解决缓存穿透

缓存穿透 是指大量查询数据库中不存在的数据,导致每次请求都无法命中缓存,直接访问数据库。

解决方案:

  1. 缓存空值

    value = cache.get("user:9999")
    if value is None:db_value = get_data_from_db("user:9999")if db_value is None:cache.setex("user:9999", 3600, "NULL")  # 存一个空值,防止查询数据库else:cache.setex("user:9999", 3600, db_value)
    
  2. 使用布隆过滤器(Bloom Filter) 预判 key 是否可能存在,减少无效查询。


3. TTL 相关的 Redis 淘汰策略

Redis 提供了多种淘汰策略,决定当 Redis 内存满时哪些数据会被删除

  • volatile-lru:淘汰最近最少使用的已设置 TTL 的 key。
  • allkeys-lru:在所有 key 中淘汰最近最少使用的 key(适用于纯缓存模式)。
  • volatile-ttl:优先淘汰存活时间最短的 key。
  • noeviction:内存满时直接返回错误,不淘汰任何 key(默认策略)。

设置 Redis 淘汰策略:

CONFIG SET maxmemory-policy allkeys-lru

4. 总结

  • TTL 是 Redis 自动过期机制,用于设置数据的生存时间,避免长期占用内存。
  • 合理设置 TTL 可以有效防止缓存雪崩、缓存击穿、缓存穿透等问题。
  • TTL 与 Redis 淘汰策略(LRU、TTL 淘汰)结合使用,可以优化缓存性能。

TTL 在 Redis 缓存中的作用不可忽视,合理利用 TTL 可以极大提升系统的稳定性和效率。

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

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

相关文章

人形机器人,自动驾驶“老炮”创业第二站

造一台人形机器人,或许正在成为2025年最炙手可热的事情。 从去年第四季度开始,伴随着大模型应用的深入,具身智能概念被点燃,其中最鲜明的一个特点是,大量自动驾驶大佬的转行加入。 随便说几个比较有分量的&#xff0…

MFC常用操作

1,获取STATIC控件的值 CString str; m_STATIC2.GetWindowText(str);//获取STATIC控件的值 MessageBox(str); 2.设置EDIT控件的值 m_EDIT2.SetWindowText(str); GetDlgItem(IDC_EDIT1)->SetWindowText("Leave"); 3.移动控件 m_EDIT2.SetWindowPos(…

Flutter_学习记录_基本组件的使用记录

1.TextWidge的常用属性 1.1TextAlign: 文本对齐属性 常用的样式有: TextAlign.center 居中TextAlign.left 左对齐TextAlign.right 有对齐 使用案例: body: Center(child: Text(开启 TextWidget 的旅程吧,珠珠, 开启 TextWidget 的旅程吧&a…

什么是COLLATE排序规则?

在当今数字化世界中,数据的整理、比较和排序是至关重要的。在数据库管理和编程语言中,我们经常需要对字符串进行排序,以展示或处理信息。为了实现这一点,各种系统和工具提供了排序规则,其中COLLATE排序规则就是其中的一…

打印输入单词字符数量统计直方图-C语言第二版

1. 编程要求 多年前写过一篇用 C 语言实现打印单词字符数量统计的直方图的文章, 现在看上去有些混乱, 对一些任务划分不清晰, 全部混在一起. 于是重写了这个编程题, 希望可以给初学者一些参考, 并且我分别用 C, C, Java, Python 四种语言完成了这道编程题, 有兴趣的可以看我另…

【QT】-explicit关键字

explicit explicit 是一个 C 关键字,用于修饰构造函数。它的作用是防止构造函数进行隐式转换。 为什么需要 explicit? 在没有 explicit 的情况下,构造函数可以用于隐式类型转换。这意味着,如果你有一个接受某种类型的参数的构造…

【C++模板】:如何判断自定义类型是否实现某个函数

一、引子 偶尔我们会面对这样的尴尬的场景,我们需要显示的去判断在某个自定义类型中,是否已经提供了我们期待的API接口,以避免产生“莫须有”的错误。阁下该如何破解此问题! 这里,直接给出一种通用的方法,…

认识Django项目模版文件——Django学习日志(二)

1.默认文件介绍 └── djangoproject1/├── djangoproject1/│ ├── urls.py [URL和函数的对应关系]【常用文件】│ ├── settings.py [项目配置文件]【常用文件】│ ├── _init_.py│ ├── wsgi.py [接受网络请求] 【不要动】│ └──…

【JS逆向】前端加密对抗基础

目录 逆向基础断掉调试基本常见的加解密方式 encrypt-labs靶场搭建过程靶场基本教程AES加密key前端体现(固定key)AES服务端获取keyRSA非对称加密DES加密存在规律key明文加签sign加签key在服务端signAESRAS组合 逆向基础 断掉调试 通过浏览器站点控制台(F12),进行断…

C# 多线程同步(Mutex | Semaphore)

Mutex: 用于保护临界区,确保同一时间只有一个线程能够访问共享资源; Semaphore: 允许同时有多个线程访问共享资源,但会限制并发访问的数量。 Mutex运行输出 Semaphore运行输出 namespace SyncThreadDemo {internal class Program{static stri…

复位信号的同步与释放(同步复位、异步复位、异步复位同步释放)

文章目录 背景前言一、复位信号的同步与释放1.1 同步复位1.1.1 综述1.1.2 优缺点 1.2 recovery time和removal time1.3 异步复位1.3.1 综述1.3.2 优缺点 1.4 同步复位 与 异步复位1.5 异步复位、同步释放1.5.1 总述1.5.2 机理1.5.3 复位网络 二、思考与补充2.1 复…

git远程仓库如何修改

1.需要做的事情:把git的远程仓库修改掉,在git创建一个自己的仓库 如果你是私有化的话,可以生成一个自己token令牌也可以。到时候push的时候会让你登录你就可以输入你的token令牌和用户名。 2.查看当前仓库的远程地址是不是自己的 &#xff…

mysql 学习3 SQL语句--整体概述。SQL通用语法;DDL创建数据库,查看数据库,删除数据库,使用数据库;

SQL通用语法 SQL语句分类 DDL data definition language : 用来创建数据库,创建表,创建表中的字段,创建索引。因此成为 数据定义语言 DML data manipulation language 有了数据库和表以及字段后,那么我们就需要给这个表中 添加数…

【xcode 16.2】升级xcode后mac端flutter版的sentry报错

sentry_flutter 7.11.0 报错 3 errors in SentryCrashMonitor_CPPException with the errors No type named terminate_handler in namespace std (line 60) and No member named set_terminate in namespace std 替换sentry_flutter版本为: 8.3.0 从而保证oc的…

【回忆迷宫——处理方法+DFS】

题目 代码 #include <bits/stdc.h> using namespace std; const int N 250; int g[N][N]; bool vis[N][N]; int dx[4] {0, 0, -1, 1}; int dy[4] {-1, 1, 0, 0}; int nx 999, ny 999, mx, my; int x 101, y 101; //0墙 (1空地 2远方) bool jud(int x, int y) {if…

wireshark工具简介

目录 1 wireshark介绍 2 wireshark抓包流程 2.1 选择网卡 2.2 停止抓包 2.3 保存数据 3 wireshark过滤器设置 3.1 显示过滤器的设置 3.2 抓包过滤器 4 wireshark的封包列表与封包详情 4.1 封包列表 4.2 封包详情 参考文献 1 wireshark介绍 wireshark是非常流行的网络…

⽤vector数组实现树的存储(孩⼦表示法)c++

在我们遇到的算法题中&#xff0c; ⼀般给出的树结构都是有编号的&#xff0c;这样会简化我们之后存储树的操作 &#xff0c;⼀般提供两个信息&#xff1b; 结点的个数 n;n-1条x结点与y结点相连的边 题⽬描述: ⼀共9个结点셈 1号结点为根节点&#xff0c;接下来8⾏&#xff…

C语言-内存管理

1、malloc()函数 用于动态分配一块指定大小的内存&#xff0c;并返回指向这块内存的指针。如果分配失败&#xff0c; 返回 NULL。 int* ptr (int*)malloc(sizeof(int) * 10); // 分配一个包含 10 个整数的内存 if (ptr NULL) {printf("Memory allocation failed!\n&q…

蓝桥杯lesson3---string的使用

&#x1f308;个人主页&#xff1a;羽晨同学 &#x1f4ab;个人格言:“成为自己未来的主人~” string的概念 string字符串是一种更加高级的封装&#xff0c;string字符串中包含了大量的方法&#xff0c;这些方法使得字符串的操作变得更加简单&#xff0c;string的使用&…

動態住宅IP提升網站訪問成功率

動態住宅IP通常與普通家庭用戶的網路連接相關聯。這種IP地址的特點在於&#xff0c;它是動態變化的&#xff0c;用戶在每次連接時可能會獲得不同的IP地址。這與靜態IP形成了鮮明對比&#xff0c;後者在連接期間保持不變。傳統上&#xff0c;IP地址分為住宅IP和數據中心IP兩類。…