redis是一個高性能、使用方便的非關系型數據庫,我們在使用redis時,基本只需要關注存數據,取數據的功能,即set,get,非常適合用作緩存服務器,降低后端數據庫壓力。有時,想確認下數據是否是從redis里讀的,以及redis是怎么取得數據,這時就可以使用monitor功能了。
一個典型的功能場景:前臺用戶請求一條數據,后端拿到用戶id后,在redis緩存中查找該用戶數據,沒有找到,于是從db中拿,找到后,返回給前臺,并在redis里存放該用戶的數據,下次有請求后,就可以直接從redis里拿,返回給前臺,怎么確認數據是從redis里取的?當然,如果數據量大,查詢時又沒索引,從數據庫里取,和從redis里取的時間消耗是不一樣的。從時間消耗上,就基本可以判斷數據是從哪里取的。但如果數據量不大,無法從時間消耗上判斷,就需要查看redis的請求日志,要注意的是,單純從redis.conf中配置logfile,loglevel選項,是看不到redis請求和操作日志的,打印的都是些無關緊要的信息,這時可以用monitor命令來完成。
使用方法:
登錄redis-cli命令行,輸入monitor,即可進入到redis監控模式。
127.0.0.1:6379> monitor
OK
隨后即可看到,當有請求時,redis具體都做了什么,我們另外打開一個redis-cli,隨便插入一條數據,比如set "hello" "world",monitor監控到
再模擬下上面的那個用戶請求數據的功能場景:
def get_user_info(uuid):
#如果redis中存在該用戶的信息,則直接返回
if REDIS.exists(uuid):
returnREDIS.get(uuid)
#否則從mysql中取,并在redis中設置該信息
try:
info = mysql_op.query(uuid)
assert info is not None
REDIS.set(uuid, info, ex=3600)
except Exception, e:
raise e
return info
首次運行后,對應到redis的監控如下,可以看到,redis里沒有找到,然后從mysql中查找,并做了set操作將信息存起來,再次運行后,發現redis里存在,因此直接從redis里get數據。
當然,為了演示,上面只是一個簡單的例子,并沒有考慮連接性能問題,也沒有考慮數據更新,比如用戶是做一個更新或者刪除操作,則相應的也要把redis里的信息也同步更新。