TTL 在 Redis 缓存中的作用

打印 上一主题 下一主题

主题 973|帖子 973|积分 2919

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有账号?立即注册

x
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 毫秒的过期时间。
示例:
  1. SETEX user:1001 3600 "Alice"  # 设置1小时后过期
  2. PEXPIRE user:1001 60000       # 设置60秒后过期
复制代码
Python 代码示例:
  1. import redis
  2. cache = redis.Redis(host='localhost', port=6379, decode_responses=True)
  3. # 设置缓存数据并指定 TTL
  4. cache.setex("user:1001", 3600, "Alice")  # 1小时后过期
  5. cache.pexpire("user:1001", 60000)        # 60秒后过期
复制代码

1.2. 查询 TTL



  • TTL key:返回 key 尚有多少秒过期。
  • PTTL key:返回 key 尚有多少毫秒过期。
示例:
  1. TTL user:1001   # 查询 key 还剩多少秒过期
  2. PTTL user:1001  # 查询 key 还剩多少毫秒过期
复制代码
Python 代码示例:
  1. ttl = cache.ttl("user:1001")
  2. print(f"user:1001 剩余 TTL: {ttl} 秒")
复制代码

1.3. 移除 TTL



  • PERSIST key:移除 key 的 TTL,使其永久存在。
示例:
  1. PERSIST user:1001  # 让 user:1001 永不过期
复制代码
Python 代码示例:
  1. cache.persist("user:1001")  # 取消 TTL,使其永久存在
复制代码

2. TTL 在缓存中的作用

2.1. 避免缓存污染



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

2.2. 解决缓存雪崩

缓存雪崩 是指大量缓存数据在同一时间过期,导致全部请求直接访问数据库,造成数据库崩溃。
解决方案:


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

2.3. 解决缓存击穿

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

  • 热点数据设置较长 TTL 或永不过期
    1. cache.set("hot_key", "important_data")
    2. cache.persist("hot_key")  # 使其永久有效
    复制代码
  • 使用互斥锁防止并发查询
    1. lock = cache.setnx("lock:user:1001", 1)  # 尝试加锁
    2. if lock:
    3.     value = get_data_from_db("user:1001")
    4.     cache.setex("user:1001", 3600, value)  # 更新缓存
    5.     cache.delete("lock:user:1001")  # 释放锁
    复制代码

2.4. 解决缓存穿透

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

  • 缓存空值
    1. value = cache.get("user:9999")
    2. if value is None:
    3.     db_value = get_data_from_db("user:9999")
    4.     if db_value is None:
    5.         cache.setex("user:9999", 3600, "NULL")  # 存一个空值,防止查询数据库
    6.     else:
    7.         cache.setex("user:9999", 3600, db_value)
    复制代码
  • 使用布隆过滤器(Bloom Filter) 预判 key 是否大概存在,减少无效查询。

3. TTL 相干的 Redis 镌汰策略

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


  • volatile-lru:镌汰近来最少使用的已设置 TTL 的 key。
  • allkeys-lru:在全部 key 中镌汰近来最少使用的 key(适用于纯缓存模式)。
  • volatile-ttl:优先镌汰存活时间最短的 key。
  • noeviction:内存满时直接返回错误,不镌汰任何 key(默认策略)。
设置 Redis 镌汰策略:
  1. CONFIG SET maxmemory-policy allkeys-lru
复制代码

4. 总结



  • TTL 是 Redis 自动过期机制,用于设置数据的生存时间,避免恒久占用内存。
  • 合理设置 TTL 可以有用防止缓存雪崩、缓存击穿、缓存穿透等问题。
  • TTL 与 Redis 镌汰策略(LRU、TTL 镌汰)结合使用,可以优化缓存性能。
TTL 在 Redis 缓存中的作用不可忽视,合理使用 TTL 可以极大提拔系统的稳定性和效率。

免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。
回复

使用道具 举报

0 个回复

倒序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

写过一篇

金牌会员
这个人很懒什么都没写!
快速回复 返回顶部 返回列表