設定stale時段,在此期間的get請求即時返回資料之後,通過非同步任務更新資料這裡用了 tornado.ioloop; 任意語言的的非同步機制當然沒有問題
python
from 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
有沒有很簡潔呢~python
stale_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資料,將以上請求引數...