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

Redis 原子保種的實(shí)現(xiàn)示例

 更新時(shí)間:2026年03月31日 10:33:22   作者:Leon_Jinhai_Sun  
本文主要介紹了Redis 原子保種的實(shí)現(xiàn)示例,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧

功能一句話概括:
“確保 Redis 里存在該 key,且其 TTL ≥ 60 s,否則用 setnx 寫(xiě)入初始 seed 并把過(guò)期時(shí)間設(shè)為 5 min。”

據(jù)此可取名:ensure_seed_with_ttl

下面給出完整封裝(含類型提示、日志英文、異常兜底),并給出兩處可優(yōu)化點(diǎn)及優(yōu)化后的代碼。

一、原始邏輯直接封裝

import datetime
import logging
from typing import Optional
log = logging.getLogger(__name__)
def ensure_seed_with_ttl(
    rediz,
    redis_key: str,
    item_type,
    msg: Optional[str] = None,
) -> None:
    """
    Ensure the Redis key exists and has a TTL of at least 60 s.
    If the key does not exist, atomically set it to the initial seed
    and give it a 5-minute expiration.
    """
    if not rediz.exists(redis_key):
        seed = ensure_seed_reference(item_type)
        result = rediz.setnx(redis_key, seed.ref_seq)
        log.info(
            "Seed ensured in Redis: result=%s, next_seq=%s, msg=%s",
            result, seed.ref_seq, msg
        )
    ttl = rediz.ttl(redis_key)
    if ttl < 60 or ttl == -1:          # -1 表示 key 存在但沒(méi)有過(guò)期時(shí)間
        rediz.expire(redis_key, datetime.timedelta(minutes=5))

二、可優(yōu)化的兩點(diǎn)

  1. 競(jìng)爭(zhēng)窗口
    兩個(gè)客戶端可能同時(shí)通過(guò) exists 判斷為 False,然后都執(zhí)行 setnx,雖然 setnx 本身是原子性的,但日志會(huì)打印兩次“Seed ensured …”,容易誤導(dǎo)。
    優(yōu)化:把“判存在 + 設(shè)值 + 設(shè)過(guò)期”做成一條原子事務(wù)(Lua 腳本或 Redis pipeline)。

  2. 減少一次 TTL 查詢
    如果 setnx 成功,我們可以直接把過(guò)期時(shí)間設(shè)為 5 min,省去一次 ttl 查詢;
    只有 setnx 失?。╧ey 已存在)時(shí)才需要 ttl 檢查。

三、優(yōu)化后代碼(Lua 腳本一次原子執(zhí)行)

import datetime
import logging
from typing import Optional
log = logging.getLogger(__name__)
# Lua 腳本:如果 key 不存在,則 set value 并設(shè)置 5 min 過(guò)期;
# 如果 key 已存在但 ttl<60,則延長(zhǎng)到 5 min;
# 返回 1 表示寫(xiě)入了新 seed,返回 0 表示僅調(diào)整過(guò)期時(shí)間。
_ENSURE_SEED_LUA = """
local key, value, min_ttl, full_ttl = KEYS[1], ARGV[1], tonumber(ARGV[2]), tonumber(ARGV[3])
local exists = redis.call('exists', key)
if exists == 0 then
    redis.call('setnx', key, value)
    redis.call('expire', key, full_ttl)
    return 1
else
    local ttl = redis.call('ttl', key)
    if ttl < min_ttl then
        redis.call('expire', key, full_ttl)
    end
    return 0
end
"""
def ensure_seed_with_ttl(
    rediz,
    redis_key: str,
    item_type,
    msg: Optional[str] = None,
) -> None:
    """
    Atomically ensure the Redis key exists and has a TTL of at least 60 s.
    If the key does not exist, atomically set it to the initial seed
    and give it a 5-minute expiration.
    """
    seed = ensure_seed_reference(item_type)
    written = rediz.eval(
        _ENSURE_SEED_LUA,
        1,                      # number of keys
        redis_key,
        seed.ref_seq,           # ARGV[1]
        60,                     # ARGV[2]  min_ttl
        int(datetime.timedelta(minutes=5).total_seconds())  # ARGV[3]  full_ttl
    )
    if written == 1:
        log.info(
            "Seed ensured in Redis: next_seq=%s, msg=%s",
            seed.ref_seq, msg
        )

優(yōu)化效果

  • 競(jìng)爭(zhēng)窗口消失,全程原子;
  • 減少一次 ttl 網(wǎng)絡(luò)往返(在 key 不存在場(chǎng)景);
  • 日志只在真正寫(xiě)入 seed 時(shí)打印一次,避免重復(fù)誤導(dǎo)。

到此這篇關(guān)于Redis 原子保種的實(shí)現(xiàn)示例的文章就介紹到這了,更多相關(guān)Redis 原子保種內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • 一文解決Redis后臺(tái)持久化失敗的問(wèn)題:內(nèi)存不足導(dǎo)致fork失敗

    一文解決Redis后臺(tái)持久化失敗的問(wèn)題:內(nèi)存不足導(dǎo)致fork失敗

    Redis作為一個(gè)內(nèi)存數(shù)據(jù)庫(kù),在執(zhí)行后臺(tái)持久化(例如 BGSAVE 命令時(shí))需要fork一個(gè)子進(jìn)程來(lái)生成數(shù)據(jù)庫(kù)快照(RDB 文件),在生產(chǎn)環(huán)境中,有時(shí)你可能會(huì)在Redis日志中遇到持久化失敗的問(wèn)題,本文將詳細(xì)介紹該問(wèn)題的原因以及如何通過(guò)調(diào)整內(nèi)核和Redis配置來(lái)解決此問(wèn)題
    2025-07-07
  • Linux服務(wù)器快速安裝Redis6.0步驟示例詳解

    Linux服務(wù)器快速安裝Redis6.0步驟示例詳解

    這篇文章主要為大家介紹了Linux服務(wù)器快速安裝Redis6.0步驟示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2023-12-12
  • Unable?to?connect?to?Redis無(wú)法連接到Redis解決的全過(guò)程

    Unable?to?connect?to?Redis無(wú)法連接到Redis解決的全過(guò)程

    這篇文章主要給大家介紹了關(guān)于Unable?to?connect?to?Redis無(wú)法連接到Redis解決的相關(guān)資料,文中通過(guò)圖文以及實(shí)例代碼將解決的過(guò)程介紹的非常詳細(xì),需要的朋友可以參考下
    2023-03-03
  • Redis不同數(shù)據(jù)類型使用場(chǎng)景代碼實(shí)例

    Redis不同數(shù)據(jù)類型使用場(chǎng)景代碼實(shí)例

    這篇文章主要介紹了Redis不同數(shù)據(jù)類型使用場(chǎng)景代碼實(shí)例,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2020-12-12
  • Redis緩存數(shù)據(jù)庫(kù)表(列單獨(dú)緩存)的示例代碼

    Redis緩存數(shù)據(jù)庫(kù)表(列單獨(dú)緩存)的示例代碼

    在Redis中緩存數(shù)據(jù)庫(kù)表數(shù)據(jù),而不使用JSON結(jié)構(gòu)來(lái)表示value,通常意味著我們會(huì)將數(shù)據(jù)庫(kù)表的每一行數(shù)據(jù)映射為Redis中的一個(gè)或多個(gè)鍵值對(duì),這篇文章主要介紹了Redis緩存數(shù)據(jù)庫(kù)表(列單獨(dú)緩存),需要的朋友可以參考下
    2024-03-03
  • Redis key鍵的具體使用

    Redis key鍵的具體使用

    Redis 是一種鍵值(key-value)型的緩存型數(shù)據(jù)庫(kù),它將數(shù)據(jù)全部以鍵值對(duì)的形式存儲(chǔ)在內(nèi)存中,本文就來(lái)介紹一下key鍵的具體使用,感興趣的可以了解一下
    2024-02-02
  • Redis7.2.x主從復(fù)制的實(shí)現(xiàn)示例

    Redis7.2.x主從復(fù)制的實(shí)現(xiàn)示例

    本文主要介紹了Redis7.2.x主從復(fù)制的實(shí)現(xiàn)示例,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2024-06-06
  • Redis數(shù)據(jù)遷移RedisShake的實(shí)現(xiàn)方法

    Redis數(shù)據(jù)遷移RedisShake的實(shí)現(xiàn)方法

    本文主要介紹了Redis數(shù)據(jù)遷移RedisShake的實(shí)現(xiàn)方法,文中通過(guò)示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2022-04-04
  • 淺談Redis如何應(yīng)對(duì)并發(fā)訪問(wèn)

    淺談Redis如何應(yīng)對(duì)并發(fā)訪問(wèn)

    本文主要介紹了Redis如何應(yīng)對(duì)并發(fā)訪問(wèn),文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2022-08-08
  • Redis中Bloom filter布隆過(guò)濾器的學(xué)習(xí)

    Redis中Bloom filter布隆過(guò)濾器的學(xué)習(xí)

    布隆過(guò)濾器是一個(gè)非常長(zhǎng)的二進(jìn)制向量和一系列隨機(jī)哈希函數(shù)的組合,可用于檢索一個(gè)元素是否存在,本文就詳細(xì)的介紹一下Bloom filter布隆過(guò)濾器,具有一定的參考價(jià)值,感興趣的可以了解一下
    2022-12-12

最新評(píng)論

托克逊县| 临漳县| 平湖市| 常熟市| 青神县| 云安县| 库伦旗| 平利县| 岑巩县| 定边县| 岢岚县| 博罗县| 洞头县| 沛县| 丰城市| 东兴市| 华宁县| 介休市| 辽源市| 太谷县| 姚安县| 宜川县| 高雄市| 府谷县| 孟州市| 深泽县| 微山县| 临江市| 鹤峰县| 哈尔滨市| 翁牛特旗| 佛教| 崇阳县| 台南市| 连城县| 玉环县| 成武县| 青阳县| 湘潭市| 钟山县| 迁安市|