当前位置: 代码网 > it编程>数据库>Redis > Redis中Key过期时间的设置与应用方式

Redis中Key过期时间的设置与应用方式

2025年11月19日 Redis 我要评论
一、设置key过期时间的命令(一)expire命令expire用于设置一个key在指定秒数后过期。其语法为:expire key seconds 。比如,我们要将名为user:1:session的ke

一、设置key过期时间的命令

(一)expire命令

expire用于设置一个key在指定秒数后过期。其语法为:expire key seconds

比如,我们要将名为user:1:session的key设置为3600秒(1小时)后过期,在redis客户端中执行:

127.0.0.1:6379> expire user:1:session 3600
(integer) 1

返回值1表示设置成功,如果key不存在或设置失败则返回0 。此命令适用于对时间精度要求不高,以秒为单位设置过期时间的场景,像一般的缓存数据失效时间设置。

(二)pexpire命令

pexpire与expire类似,不过它是以毫秒为单位设置key的过期时间,语法为:pexpire key milliseconds

若要将message:1这个key设置为5000毫秒(5秒)后过期,操作如下:

127.0.0.1:6379> pexpire message:1 5000
(integer) 1

该命令适用于对时间精度要求较高的场景,例如某些对消息时效性要求严格的消息队列场景。

(三)expireat命令

expireat通过指定一个unix时间戳(以秒为单位),让key在该时间点过期。语法为:expireat key timestamp

假设我们获取到当前时间戳为1693382400(对应2023年9月1日00:00:00),要让cache:data这个key在2023年9月2日00:00:00过期,即时间戳1693468800,则执行:

127.0.0.1:6379> expireat cache:data 1693468800
(integer) 1

这种方式适用于需要在特定时间点让key失效的场景,如限时活动相关数据的过期控制。

(四)pexpireat命令

pexpireat同样是基于时间戳设置过期时间,但时间戳是以毫秒为单位,语法为:pexpireat key milliseconds - timestamp

比如要让token:user1在2023年9月1日00:00:01.500过期,对应的毫秒时间戳为1693382401500,操作如下:

127.0.0.1:6379> pexpireat token:user1 1693382401500
(integer) 1

适用于对过期时间点精度要求极高的场景,如金融交易中某些临时凭证的过期时间设置。

二、在设置值时同时设置过期时间

(一)set命令结合ex参数

使用set key value ex seconds可以在设置key值的同时指定其在多少秒后过期。

例如,设置product:1:price的值为99.9,并让它在86400秒(1天)后过期:

127.0.0.1:6379> set product:1:price 99.9 ex 86400
ok

这种方式在需要创建新的缓存数据并设置过期时间时非常便捷,代码更简洁。

(二)set命令结合px参数

set key value px milliseconds用于在设置key值时指定毫秒级别的过期时间。

比如设置tmp:data的值为some temp data,并在3000毫秒(3秒)后过期:

127.0.0.1:6379> set tmp:data "some temp data" px 3000
ok

适用于对时间精度要求高且在设置值时就确定过期时间的场景。

(三)setex命令

setex key seconds value专门用于设置一个带有过期时间(秒为单位)的字符串值。

如设置news:1:content的值为一篇新闻内容,并让它在7200秒(2小时)后过期:

127.0.0.1:6379> setex news:1:content "this is a news" 7200
ok

在只针对字符串类型的key设置值和过期时间时,setex命令更为直观。

三、获取key的剩余过期时间

(一)ttl命令

ttl用于获取一个key的剩余过期时间(以秒为单位)。语法为:ttl key

对于之前设置的user:1:session,可以这样获取其剩余过期时间:

127.0.0.1:6379> ttl user:1:session
(integer) 3590

返回值3590表示该key还有3590秒过期。如果key不存在或已过期,返回-2;如果key没有设置过期时间(即永久有效),返回-1 。此命令常用于检查缓存数据何时失效,以便提前进行数据更新等操作。

(二)pttl命令

pttl获取key的剩余过期时间(以毫秒为单位),语法为:pttl key

对于设置了毫秒级过期时间的message:1,获取剩余过期时间操作如下:

127.0.0.1:6379> pttl message:1
(integer) 4990

返回值4990表示还有4990毫秒过期。同样,key不存在或已过期返回-2,永久有效返回-1 。适用于需要精确了解剩余毫秒级过期时间的场景。

四、移除key的过期时间

使用persist命令可以移除一个key的过期时间,使其变为永久有效。语法为:persist key

例如,之前设置了过期时间的cache:data,若要让它永久有效,执行:

127.0.0.1:6379> persist cache:data
(integer) 1

返回值1表示操作成功,之后再使用ttl cache:data查询,会返回-1,表示该key已变为永久有效。在某些情况下,原本设置了过期时间的key,由于业务需求变更,需要长期保存时,就可使用persist命令。

五、应用场景及案例

(一)缓存场景

在web应用中,常使用redis作为缓存来提升数据读取速度。例如,电商网站中商品详情数据的缓存。

假设我们有一个商品详情页面,每次查询数据库获取商品详情数据开销较大。可以将商品详情数据缓存到redis中,并设置合理的过期时间。

import redis

r = redis.redis(host='localhost', port=6379, db=0)

def get_product_detail(product_id):
    product_key = f'product:{product_id}:detail'
    product_detail = r.get(product_key)
    if product_detail is none:
        # 从数据库获取商品详情数据
        product_detail = get_product_detail_from_db(product_id)
        if product_detail:
            # 将数据缓存到redis,设置1小时过期
            r.setex(product_key, 3600, product_detail)
    return product_detail

这里使用setex命令在设置商品详情数据时,同时设置了1小时的过期时间。当缓存过期后,下次请求会重新从数据库获取数据并更新缓存,保证数据的实时性。

(二)会话管理场景

在web应用的用户会话管理中,redis可用于存储用户会话信息。

例如,用户登录成功后,将用户的会话信息存储在redis中,并设置过期时间,以自动清理长时间未活动的会话。

import redis
import uuid

r = redis.redis(host='localhost', port=6379, db=0)

def create_session(user_id):
    session_id = str(uuid.uuid4())
    session_key = f'session:{session_id}'
    session_data = {'user_id': user_id}
    # 将会话信息存储到redis,设置30分钟过期
    r.setex(session_key, 1800, str(session_data))
    return session_id

def get_session(session_id):
    session_key = f'session:{session_id}'
    session_data = r.get(session_key)
    if session_data:
        return eval(session_data.decode('utf - 8'))
    return none

上述代码中,create_session函数创建用户会话时,使用setex设置会话信息在30分钟后过期。get_session函数用于获取会话信息,若会话已过期,get操作返回none,提示用户重新登录。

(三)分布式锁场景

在分布式系统中,使用redis实现分布式锁时,设置key的过期时间可防止死锁。

import redis
import time

r = redis.redis(host='localhost', port=6379, db=0)

def acquire_lock(lock_key, expire_time=10):
    lock_value = str(uuid.uuid4())
    success = r.set(lock_key, lock_value, ex=expire_time, nx=true)
    return success, lock_value

def release_lock(lock_key, lock_value):
    pipe = r.pipeline()
    while true:
        try:
            pipe.watch(lock_key)
            if pipe.get(lock_key).decode('utf - 8') == lock_value:
                pipe.multi()
                pipe.delete(lock_key)
                pipe.execute()
                return true
            pipe.unwatch()
            break
        except redis.watcherror:
            continue
    return false

acquire_lock函数中,使用set命令结合ex参数设置锁的过期时间为10秒。如果持有锁的进程在10秒内未完成操作并释放锁,redis会自动删除锁key,防止其他进程永远无法获取锁,即避免死锁。

总结

以上为个人经验,希望能给大家一个参考,也希望大家多多支持代码网。

(0)

相关文章:

版权声明:本文内容由互联网用户贡献,该文观点仅代表作者本人。本站仅提供信息存储服务,不拥有所有权,不承担相关法律责任。 如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 2386932994@qq.com 举报,一经查实将立刻删除。

发表评论

验证码:
Copyright © 2017-2025  代码网 保留所有权利. 粤ICP备2024248653号
站长QQ:2386932994 | 联系邮箱:2386932994@qq.com