马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。
您需要 登录 才可以下载或查看,没有账号?立即注册
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 毫秒的过期时间。
示例:
- SETEX user:1001 3600 "Alice" # 设置1小时后过期
- PEXPIRE user:1001 60000 # 设置60秒后过期
复制代码 Python 代码示例:
- import redis
- cache = 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 random
- ttl = 3600 + random.randint(0, 600) # 1小时 + 0~10分钟随机时间
- cache.setex("user:1001", ttl, "Alice")
复制代码 2.3. 解决缓存击穿
缓存击穿 发生在某个热点数据忽然过期,大量请求同时访问数据库,导致数据库压力过大。
解决方案:
- 热点数据设置较长 TTL 或永不过期
- cache.set("hot_key", "important_data")
- cache.persist("hot_key") # 使其永久有效
复制代码 - 使用互斥锁防止并发查询
- 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. 解决缓存穿透
缓存穿透 是指大量查询数据库中不存在的数据,导致每次请求都无法掷中缓存,直接访问数据库。
解决方案:
- 缓存空值
- 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)
复制代码 - 使用布隆过滤器(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 可以极大提拔系统的稳定性和效率。
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。 |