Redis 伺服器端使用 lua 的 if-modified-since 快取模式 - r4um

banq發表於2021-06-23

從快取中檢索資料使用if modified since型別可以節省大量網路頻寬和計算週期。資料修改時間參考應該來自客戶端,並作為請求的一部分傳送,而不是基於非確認型別的方法假設在伺服器端,就像客戶端上次連線到伺服器一樣。這種模式可在Redis的伺服器端的 lua on redis,實現在延遲方面非常少的開銷。
我們可以將一個key的最後修改時間儲存在一個雜湊中,並且只有當它比客戶端傳送的時間更新時才檢索該值。
以下 Lua 片段根據名為MY_KEYSTIME的雜湊中鍵的修改時間進行儲存/檢索。
根據修改時間獲取

local keys_mtime_hset = "MY_KEYSMTIME"
local key = KEYS[1]
local mtime = tonumber(ARGV[1])

local key_mtime = redis.call('HGET', keys_mtime_hset, key)
key_mtime = tonumber(key_mtime)
-- if missing key in the hash set return the value of the key.
-- or key mtime > mtime 
if not key_mtime or key_mtime > mtime then
    return redis.call('GET', key)
end

return nil 

設定和更新修改時間:

local keys_mtime_hset = "MY_KEYSMTIME"
local key = KEYS[1]
local value = ARGV[1]
local mtime = tonumber(ARGV[2])

redis.call('SET', key, value)
redis.call('HSET', keys_mtime_hset, key, mtime)


客戶端在檢索和設定key時傳送修改時間。Redis Lua 指令碼是原子的
以下 python 程式碼說明了一個完整的工作示例。

mtime_get=""" local keys_mtime_hset = "MY_KEYSMTIME" local key = KEYS[1] local mtime = tonumber(ARGV[1]) local key_mtime = redis.call('HGET', keys_mtime_hset, key) key_mtime = tonumber(key_mtime) -- if missing key in the hash set return the value of the key. -- or key mtime > mtime if not key_mtime or key_mtime > mtime then return redis.call('GET', key) end return nil """

mtime_set=""" local keys_mtime_hset = "MY_KEYSMTIME" local key = KEYS[1] local value = ARGV[1] local mtime = tonumber(ARGV[2]) redis.call('SET', key, value) redis.call('HSET', keys_mtime_hset, key, mtime) """

m1 = int(time.time())
r = redis.Redis(host='localhost', port=6379)
MTGET=r.register_script(mtime_get)
MTSET=r.register_script(mtime_set)

t_k = "Hello"
t_v = "World"

r.delete(t_k)

print(MTGET(keys=[t_k], args=[m1]))

print(MTSET(keys=[t_k], args=[t_v, m1]))

print(r.get(t_k))

print(MTGET(keys=[t_k], args=[m1 - 100]))

print(MTGET(keys=[t_k], args=[m1 + 100]))


執行:

None
None
b'World'
b'World'
None


 

相關文章