讓Redis 非同步 即時返回資料並非同步更新資料

2021-09-19 23:35:29 字數 3639 閱讀 3035

設定stale時段,在此期間的get請求即時返回資料之後,通過非同步任務更新資料

這裡用了 tornado.ioloop; 任意語言的的非同步機制當然沒有問題

pythonfrom tornado.ioloop import ioloop

class stalerediscache(rediscache):

#def __init__(self, hosts=['localhost'], duration=600, stale=100):

def __init__(self, hosts=['localhost'], duration=600, stale=7200):

self.stale = stale

rediscache.__init__(self, hosts, duration)

def get_value(self, key, callback=none, *args, **kwargs):

l = none

r = self._get_redis(key)

res = r.pipeline().ttl(key).get(key).execute()

if res[1]:

try:

l = json.loads(res[1])

except exception, e:

raise e

if not res[0] or res[0] < self.stale and callback:

def func():

value = callback and callback(*args, **kwargs)

logging.info("set_value for key %s" % key)

#r.pipeline().set(key, json.dumps(value)).expire(key, kwargs.get('duration', self.duration)).execute()

r.pipeline().set(key, json.dumps(value)).expire(key, int(kwargs.get('duration', self.duration)) + self.stale).execute()

return value

# redis-cli版本不同,res[0] 可能為 none(<=2.6.*) or -2(>=2.6)

if not res[0] or res[0] == -2:

return func()

ioloop.current().add_timeout(ioloop.current().time(), func)

return l

# 這裡已經不需要單獨的 set_value 介面,因為再 get_value 中已經實現

def set_value(self, key, value, duration=60):

pass

pythonstale_cache = stalerediscache([('localhost', 6379, 0)])

def sc_callback:

return sth.from.mongo or bla bla bla...

def abc:

value = stale_cache.get_value('key1', sc_callback)

有沒有很簡潔呢~

在第乙個示意圖中,設定了stale=100, 比self.duration=600還小;

這樣其實並沒有發揮 stale非同步更新資料的優勢;

stale redis 部分的**做了2處改動

這樣一來,最終的效果是:

如果資料過期,沒有命中(miss),立即執行callback並返回值,然後將值存入redis,並設定過期時間為600+7200

如果hit命中,ttl過期時間大於7200(距離上次更新資料不到600s),直接返回資料

如果hit命中,ttl過期時間小於7200(距離上次更新資料超過600s),返回資料並非同步更新資料

距離上一次更新資料超過7200+600之後,還沒有請求,則資料過期

koa 介面返回資料 koa 介面非同步返回資料問題

用koajs實現了乙個介面,介面裡面讀取了乙個文字檔案,但是返回資料的時候不能等待檔案處理完成後返回資料,而是在最外層才能返回資料。求解。已解決,附上 use strict const readline require readline const fs require fs const path ...

讓Solr返回JSON資料

http localhost 1985 solr select q 3a version 2.2 start 0 rows 10 indent on wt json solr的http請求後加乙個wt引數 返回則是text plain的json字串。如下圖所示 預設的是返回xml資料,將以上請求引數...

讓Solr返回JSON資料

http localhost 1985 solr select q 3a version 2.2 start 0 rows 10 indent on wt json solr的http請求後加乙個wt引數 返回則是text plain的json字串。如下圖所示 預設的是返回xml資料,將以上請求引數...