最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Redis中Key過(guò)期時(shí)間的設(shè)置與應(yīng)用方式

 更新時(shí)間:2025年11月19日 09:02:23   作者:沒事學(xué)AI  
文章主要介紹了Redis中設(shè)置和管理Key過(guò)期時(shí)間的多種命令,包括EXPIRE、PEXPIRE、EXPIREAT、PEXPIREAT、SET命令結(jié)合EX或PX參數(shù)、SETEX命令,以及獲取剩余過(guò)期時(shí)間的TTL和PTTL命令,最后通過(guò)緩存、會(huì)話管理和分布式鎖等應(yīng)用場(chǎng)景展示了這些命令的實(shí)際應(yīng)用

一、設(shè)置Key過(guò)期時(shí)間的命令

(一)EXPIRE命令

EXPIRE用于設(shè)置一個(gè)Key在指定秒數(shù)后過(guò)期。其語(yǔ)法為:EXPIRE key seconds 。

比如,我們要將名為user:1:session的Key設(shè)置為3600秒(1小時(shí))后過(guò)期,在Redis客戶端中執(zhí)行:

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

返回值1表示設(shè)置成功,如果Key不存在或設(shè)置失敗則返回0 。此命令適用于對(duì)時(shí)間精度要求不高,以秒為單位設(shè)置過(guò)期時(shí)間的場(chǎng)景,像一般的緩存數(shù)據(jù)失效時(shí)間設(shè)置。

(二)PEXPIRE命令

PEXPIRE與EXPIRE類似,不過(guò)它是以毫秒為單位設(shè)置Key的過(guò)期時(shí)間,語(yǔ)法為:PEXPIRE key milliseconds

若要將message:1這個(gè)Key設(shè)置為5000毫秒(5秒)后過(guò)期,操作如下:

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

該命令適用于對(duì)時(shí)間精度要求較高的場(chǎng)景,例如某些對(duì)消息時(shí)效性要求嚴(yán)格的消息隊(duì)列場(chǎng)景。

(三)EXPIREAT命令

EXPIREAT通過(guò)指定一個(gè)Unix時(shí)間戳(以秒為單位),讓Key在該時(shí)間點(diǎn)過(guò)期。語(yǔ)法為:EXPIREAT key timestamp 。

假設(shè)我們獲取到當(dāng)前時(shí)間戳為1693382400(對(duì)應(yīng)2023年9月1日00:00:00),要讓cache:data這個(gè)Key在2023年9月2日00:00:00過(guò)期,即時(shí)間戳1693468800,則執(zhí)行:

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

這種方式適用于需要在特定時(shí)間點(diǎn)讓Key失效的場(chǎng)景,如限時(shí)活動(dòng)相關(guān)數(shù)據(jù)的過(guò)期控制。

(四)PEXPIREAT命令

PEXPIREAT同樣是基于時(shí)間戳設(shè)置過(guò)期時(shí)間,但時(shí)間戳是以毫秒為單位,語(yǔ)法為:PEXPIREAT key milliseconds - timestamp 。

比如要讓token:user1在2023年9月1日00:00:01.500過(guò)期,對(duì)應(yīng)的毫秒時(shí)間戳為1693382401500,操作如下:

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

適用于對(duì)過(guò)期時(shí)間點(diǎn)精度要求極高的場(chǎng)景,如金融交易中某些臨時(shí)憑證的過(guò)期時(shí)間設(shè)置。

二、在設(shè)置值時(shí)同時(shí)設(shè)置過(guò)期時(shí)間

(一)SET命令結(jié)合EX參數(shù)

使用SET key value EX seconds可以在設(shè)置Key值的同時(shí)指定其在多少秒后過(guò)期。

例如,設(shè)置product:1:price的值為99.9,并讓它在86400秒(1天)后過(guò)期:

127.0.0.1:6379> SET product:1:price 99.9 EX 86400
OK

這種方式在需要?jiǎng)?chuàng)建新的緩存數(shù)據(jù)并設(shè)置過(guò)期時(shí)間時(shí)非常便捷,代碼更簡(jiǎn)潔。

(二)SET命令結(jié)合PX參數(shù)

SET key value PX milliseconds用于在設(shè)置Key值時(shí)指定毫秒級(jí)別的過(guò)期時(shí)間。

比如設(shè)置tmp:data的值為some temp data,并在3000毫秒(3秒)后過(guò)期:

127.0.0.1:6379> SET tmp:data "some temp data" PX 3000
OK

適用于對(duì)時(shí)間精度要求高且在設(shè)置值時(shí)就確定過(guò)期時(shí)間的場(chǎng)景。

(三)SETEX命令

SETEX key seconds value專門用于設(shè)置一個(gè)帶有過(guò)期時(shí)間(秒為單位)的字符串值。

如設(shè)置news:1:content的值為一篇新聞內(nèi)容,并讓它在7200秒(2小時(shí))后過(guò)期:

127.0.0.1:6379> SETEX news:1:content "This is a news" 7200
OK

在只針對(duì)字符串類型的Key設(shè)置值和過(guò)期時(shí)間時(shí),SETEX命令更為直觀。

三、獲取Key的剩余過(guò)期時(shí)間

(一)TTL命令

TTL用于獲取一個(gè)Key的剩余過(guò)期時(shí)間(以秒為單位)。語(yǔ)法為:TTL key 。

對(duì)于之前設(shè)置的user:1:session,可以這樣獲取其剩余過(guò)期時(shí)間:

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

返回值3590表示該Key還有3590秒過(guò)期。如果Key不存在或已過(guò)期,返回-2;如果Key沒有設(shè)置過(guò)期時(shí)間(即永久有效),返回-1 。此命令常用于檢查緩存數(shù)據(jù)何時(shí)失效,以便提前進(jìn)行數(shù)據(jù)更新等操作。

(二)PTTL命令

PTTL獲取Key的剩余過(guò)期時(shí)間(以毫秒為單位),語(yǔ)法為:PTTL key

對(duì)于設(shè)置了毫秒級(jí)過(guò)期時(shí)間的message:1,獲取剩余過(guò)期時(shí)間操作如下:

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

返回值4990表示還有4990毫秒過(guò)期。同樣,Key不存在或已過(guò)期返回-2,永久有效返回-1 。適用于需要精確了解剩余毫秒級(jí)過(guò)期時(shí)間的場(chǎng)景。

四、移除Key的過(guò)期時(shí)間

使用PERSIST命令可以移除一個(gè)Key的過(guò)期時(shí)間,使其變?yōu)橛谰糜行?。語(yǔ)法為:PERSIST key 。

例如,之前設(shè)置了過(guò)期時(shí)間的cache:data,若要讓它永久有效,執(zhí)行:

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

返回值1表示操作成功,之后再使用TTL cache:data查詢,會(huì)返回-1,表示該Key已變?yōu)橛谰糜行?。在某些情況下,原本設(shè)置了過(guò)期時(shí)間的Key,由于業(yè)務(wù)需求變更,需要長(zhǎng)期保存時(shí),就可使用PERSIST命令。

五、應(yīng)用場(chǎng)景及案例

(一)緩存場(chǎng)景

在Web應(yīng)用中,常使用Redis作為緩存來(lái)提升數(shù)據(jù)讀取速度。例如,電商網(wǎng)站中商品詳情數(shù)據(jù)的緩存。

假設(shè)我們有一個(gè)商品詳情頁(yè)面,每次查詢數(shù)據(jù)庫(kù)獲取商品詳情數(shù)據(jù)開銷較大??梢詫⑸唐吩斍閿?shù)據(jù)緩存到Redis中,并設(shè)置合理的過(guò)期時(shí)間。

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:
        # 從數(shù)據(jù)庫(kù)獲取商品詳情數(shù)據(jù)
        product_detail = get_product_detail_from_db(product_id)
        if product_detail:
            # 將數(shù)據(jù)緩存到Redis,設(shè)置1小時(shí)過(guò)期
            r.setex(product_key, 3600, product_detail)
    return product_detail

這里使用SETEX命令在設(shè)置商品詳情數(shù)據(jù)時(shí),同時(shí)設(shè)置了1小時(shí)的過(guò)期時(shí)間。當(dāng)緩存過(guò)期后,下次請(qǐng)求會(huì)重新從數(shù)據(jù)庫(kù)獲取數(shù)據(jù)并更新緩存,保證數(shù)據(jù)的實(shí)時(shí)性。

(二)會(huì)話管理場(chǎng)景

在Web應(yīng)用的用戶會(huì)話管理中,Redis可用于存儲(chǔ)用戶會(huì)話信息。

例如,用戶登錄成功后,將用戶的會(huì)話信息存儲(chǔ)在Redis中,并設(shè)置過(guò)期時(shí)間,以自動(dòng)清理長(zhǎng)時(shí)間未活動(dòng)的會(huì)話。

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}
    # 將會(huì)話信息存儲(chǔ)到Redis,設(shè)置30分鐘過(guò)期
    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函數(shù)創(chuàng)建用戶會(huì)話時(shí),使用SETEX設(shè)置會(huì)話信息在30分鐘后過(guò)期。GET_SESSION函數(shù)用于獲取會(huì)話信息,若會(huì)話已過(guò)期,GET操作返回None,提示用戶重新登錄。

(三)分布式鎖場(chǎng)景

在分布式系統(tǒng)中,使用Redis實(shí)現(xiàn)分布式鎖時(shí),設(shè)置Key的過(guò)期時(shí)間可防止死鎖。

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函數(shù)中,使用SET命令結(jié)合EX參數(shù)設(shè)置鎖的過(guò)期時(shí)間為10秒。如果持有鎖的進(jìn)程在10秒內(nèi)未完成操作并釋放鎖,Redis會(huì)自動(dòng)刪除鎖Key,防止其他進(jìn)程永遠(yuǎn)無(wú)法獲取鎖,即避免死鎖。

總結(jié)

以上為個(gè)人經(jīng)驗(yàn),希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。

相關(guān)文章

  • Redis中的配置文件,數(shù)據(jù)持久化,事務(wù)

    Redis中的配置文件,數(shù)據(jù)持久化,事務(wù)

    這篇文章主要介紹了Redis中的配置文件,數(shù)據(jù)持久化,事務(wù)問(wèn)題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。
    2022-12-12
  • 關(guān)于Redis解決Session共享問(wèn)題

    關(guān)于Redis解決Session共享問(wèn)題

    這篇文章主要介紹了Redis解決Session共享問(wèn)題,本文結(jié)合實(shí)例代碼給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2023-07-07
  • 解決redis修改requirepass后不生效的問(wèn)題

    解決redis修改requirepass后不生效的問(wèn)題

    今天小編就為大家分享一篇解決redis修改requirepass后不生效的問(wèn)題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧
    2018-05-05
  • redis集群部署方案和redis常用命令

    redis集群部署方案和redis常用命令

    本文介紹了部署Redis集群的詳細(xì)步驟以及常用命令和管理操作,同時(shí)提醒了生產(chǎn)環(huán)境中的注意事項(xiàng),如配置持久化、密碼認(rèn)證和時(shí)鐘同步,本文給大家介紹的非常詳細(xì),感興趣的朋友跟隨小編一起看看吧
    2026-01-01
  • Ubuntu下安裝redis的2種方法分享

    Ubuntu下安裝redis的2種方法分享

    redis是一個(gè)開源的、使用C語(yǔ)言編寫的、支持網(wǎng)絡(luò)交互的、可基于內(nèi)存也可持久化的Key-Value數(shù)據(jù)庫(kù)。這篇文章對(duì)redis就不進(jìn)行詳細(xì)的介紹了,這篇文章主要給大家介紹了Ubuntu下安裝redis的兩種方法,有需要的朋友們可以參考學(xué)習(xí),下面來(lái)一起看看吧。
    2016-12-12
  • Redis中key過(guò)期策略的實(shí)現(xiàn)

    Redis中key過(guò)期策略的實(shí)現(xiàn)

    Key的過(guò)期機(jī)制是Redis保持高可用性的重要策略,過(guò)期策略分為惰性過(guò)期和定期過(guò)期,惰性過(guò)期在每次訪問(wèn)key時(shí)檢查是否過(guò)期,定期過(guò)期則由serverCron方法定時(shí)清理過(guò)期key,本文就來(lái)詳細(xì)的介紹一下,感興趣的可以了解一下
    2024-09-09
  • Redis基于Bitmap實(shí)現(xiàn)用戶簽到功能

    Redis基于Bitmap實(shí)現(xiàn)用戶簽到功能

    很多應(yīng)用上都有用戶簽到的功能,尤其是配合積分系統(tǒng)一起使用。本文主要介紹了Redis基于Bitmap實(shí)現(xiàn)用戶簽到功能,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2021-06-06
  • redis哈希和集合_動(dòng)力節(jié)點(diǎn)Java學(xué)院整理

    redis哈希和集合_動(dòng)力節(jié)點(diǎn)Java學(xué)院整理

    這篇文章主要為大家詳細(xì)介紹了redis哈希和集合的相關(guān)資料,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2017-08-08
  • redis中hash表內(nèi)容刪除的方法代碼

    redis中hash表內(nèi)容刪除的方法代碼

    在本篇文章里小編給各位整理了關(guān)于redis中hash表內(nèi)容怎么刪除的方法以及技巧代碼,需要的朋友們分享下。
    2019-07-07
  • 使用Redis實(shí)現(xiàn)會(huì)話管理的示例代碼

    使用Redis實(shí)現(xiàn)會(huì)話管理的示例代碼

    文章介紹了如何使用Redis實(shí)現(xiàn)會(huì)話管理,包括會(huì)話的創(chuàng)建、讀取、更新和刪除操作,通過(guò)設(shè)置會(huì)話超時(shí)時(shí)間并重置,可以確保會(huì)話在用戶持續(xù)活動(dòng)期間不會(huì)過(guò)期,此外,展示了使用Redis的Hashes存儲(chǔ)更多信息,并使用Redis集群提高系統(tǒng)的可用性和擴(kuò)展性,感興趣的朋友跟隨小編一起看看吧
    2025-12-12

最新評(píng)論

嫩江县| 苏尼特右旗| 慈溪市| 交城县| 连江县| 汉寿县| 镇远县| 富宁县| 遂昌县| 玉环县| 昌都县| 安康市| 米脂县| 阜新市| 绥江县| 张家港市| 秦安县| 泰和县| 六盘水市| 准格尔旗| 瑞昌市| 钟祥市| 于田县| 永兴县| 平乐县| 海宁市| 乐陵市| 南汇区| 阿坝| 靖州| 连江县| 白银市| 修水县| 华蓥市| 五常市| 内丘县| 酉阳| 南部县| 富蕴县| 礼泉县| 兴和县|