自用于检索来自缓存数据的模式类型的自模典可以保存有效的网络带宽和计算周期。
数据修改时间引用应来自客户端,并作为根据仅仅最后一次上次连接到服务器的客户端的非确认类型的方法,作为请求的一部分而不是在服务器侧被发送。
在Redis服务器端利用Lua在Redis上利用Lua,在延迟方面的开销非常少,这类模式是可能的。
我们可以将键的最后修改时间存储在哈希中,并仅在较新的时检索值,而不是发送的时间客户端。
以下Lua代码段存储/检索基于散列中的键的修改时间,称为my_keystime。
local keys_mtime_hset =" my_keysmtime"本地键=键[1]本地mtime = tonumber(argv [1])本地key_mtime = redis。呼叫(' hget',keys_mtime_hset,key)key_mtime = tonumber(key_mtime) - 如果哈希集中的缺少键返回键的值。 - 或键mtime>如果不是key_mtime或key_mtime> mtime然后,Mify返回Redis。呼叫(' get' key)结束返回nil
local keys_mtime_hset =" my_keysmtime"本地键=键[1]本地值= argv [1]本地mtime = tonumber(argv [2])redis。致电('设置',key,presigs)redis。呼叫(' hset',keys_mtime_hset,key,mtime)
客户端在检索和设置密钥时发送修改时间。 Redis Lua脚本是原子的。
mtime_get =""" local keys_mtime_hset =" my_keysmtime" local key = keys [1]本地mtime = tonumber(argv [1])local key_mtime = redis.call(& #39; hget',keys_mtime_hset,key_mtime = tonumber(key_mtime) - 如果哈希集中的缺少键返回键的值.--或键mtime>如果不是key_mtime或key_mtime> mtime然后,然后返回redis.call(' get',key)endroTurn零""" mtime_set ="" local keys_mtime_hset =" my_keysmtime" local key =键[1]本地值= argv [1]本地mtime = tonumber(argv [2])redis .call(' set' key,value)redis.call(' hset' keys_mtime_hset,key,mtime)""" m1 = int(时间())r = redis。 redis(host =' localhost',port = 6379)mtget = r。 register_script(mtime_get)mtset = r。 register_script(mtime_set)t_k ="你好" t_v ="世界" r。删除(t_k)打印(mtget(keys = [t_k],args = [m1]))打印(mtset(keys = [t_k],args = [t_v,m1]))打印(r。get(t_k))打印(mtget(keys = [t_k],args = [m1-100]))打印(mtget(keys = [t_k],args = [m1 + 100])))
这会产生多少开销?一个简单的基准显示不应很多,因为HGet是O(1)操作。
重复= 10000号= 3 g = timeit。计时器(" r.get(t_k)",globals = globals())timings_get = g。重复(重复=重复,数字=数字)g = timeit。定时器(" mtget(keys = [t_k],args = [m1 - 100])",globals = globals())timings_hits_mtget = g。重复(重复=重复,数字=数字)g = timeit。计时器(" mtget(keys = [t_k],args = [m1 + 100])",globals = globals())timings_miss_mtget = g。重复(重复=重复,数字=数字)
从该基准测试中运行并绘制时间,x轴是呼叫的时间。
正如预期的那样,有轻微的开销,普通是基于最快的修改时间的最慢。请参阅此Jupyter Notebook以获取全工作示例和图表源。