Redis 伺服器端使用 lua 的 if-modified-since 快取模式 - r4um
從快取中檢索資料使用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 |
相關文章
- Django使用redis快取伺服器DjangoRedis快取伺服器
- Redis 6.0 客戶端快取的伺服器端實現Redis客戶端快取伺服器
- OpenResty+lua+redis+mysql多級快取RESTRedisMySql快取
- C#客戶端Redis伺服器的分散式快取C#客戶端Redis伺服器分散式快取
- 如何使用 Redis 快取Redis快取
- Laravel使用Redis快取LaravelRedis快取
- 使用伺服器端控制AJAX頁面快取伺服器快取
- Mybatis的二級快取、使用Redis做二級快取MyBatis快取Redis
- 使用Redis做為MySQL的快取RedisMySql快取
- Django(39)使用redis配置快取DjangoRedis快取
- Redis的快取穿透、快取雪崩、快取擊穿的區別Redis快取穿透
- Redis使用Lua指令碼Redis指令碼
- Redis快取擊穿、快取穿透、快取雪崩Redis快取穿透
- [Redis]快取穿透/快取擊穿/快取雪崩Redis快取穿透
- 快取工廠之Redis快取快取Redis
- JAVA快取-Redis入門級使用Java快取Redis
- springboot +lettuce +redis 快取使用Spring BootRedis快取
- Redis快取穿透Redis快取穿透
- Redis快取篇(四)快取異常Redis快取
- Redis快取穿透、快取雪崩、redis併發問題分析Redis快取穿透
- WEB 應用快取解析以及使用 Redis 實現分散式快取Web快取Redis分散式
- 為什麼要使用Redis做快取Redis快取
- Redis分散式快取安裝和使用Redis分散式快取
- ASP.NET使用Redis共享快取示例ASP.NETRedis快取
- 什麼是redis的快取雪崩與快取穿透Redis快取穿透
- redis作為mysql的快取伺服器(讀寫分離)RedisMySql快取伺服器
- Redis詳解(十二)------ 快取穿透、快取擊穿、快取雪崩Redis快取穿透
- 面試總結 —— Redis “快取穿透”、“快取擊穿”、“快取雪崩”面試Redis快取穿透
- Redis——快取穿透、快取擊穿、快取雪崩、分散式鎖Redis快取穿透分散式
- Redis快取穿透、快取雪崩、快取擊穿好好說說Redis快取穿透
- 什麼是redis快取雪崩、快取穿透、快取擊穿Redis快取穿透
- redis→分散式快取Redis分散式快取
- redis快取介紹Redis快取
- Entrust 在使用 Redis 做快取引擎的時候,快取不更新的問題RustRedis快取
- Redis快取篇(一)Redis是如何工作的Redis快取
- redis中lua指令碼的簡單使用Redis指令碼
- 探討下如何更好的使用快取 —— Redis快取的特殊用法以及與本地快取一起構建多級快取的實現快取Redis
- REDIS快取穿透,快取擊穿,快取雪崩原因+解決方案Redis快取穿透