欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

lua讀取redis數(shù)據(jù)的null判斷示例代碼

 更新時間:2018年09月04日 14:13:14   作者:夏末  
最近在工作中遇到了一個問題,通過查找相關(guān)資料才得知原因是因為返回結(jié)果的問題,下面這篇文章主要給大家介紹了關(guān)于lua讀取redis數(shù)據(jù)的null判斷的相關(guān)資料,文中通過示例代碼介紹的非常詳細,需要的朋友可以參考下

前言

為什么要用lua腳本操作redis數(shù)據(jù)庫?

1.減少開銷–減少向redis服務(wù)器的請求次數(shù)

2.原子操作–redis將lua腳本作為一個原子執(zhí)行

3.可復(fù)用–其他客戶端可以使用已經(jīng)執(zhí)行過的lua腳本

4.增加redis靈活性–lua腳本可以幫助redis做更多的事情

lua腳本本身體積小,啟動速度快.

因此,從redis 2.6.0開始,redis在服務(wù)器端內(nèi)置lua解釋器,下面話不多說了,來開始本文的正文:

最近在配合移動端調(diào)試的時候,被抓去debug一個在清除redis緩存之后才會出現(xiàn)的網(wǎng)關(guān)錯誤。于是打開服務(wù)器上的log定位到類似錯誤:

[error] 7#7: *12030 lua entry thread aborted: runtime error: /data/share/apps/lua/access_check.lua:133: bad argument #1 to 'decode' (string expected, got userdata)

該段代碼的主要作用是在openresty中l(wèi)ua讀取redis中數(shù)據(jù)并解碼為json:

local access_token = redis_client:read_by_key(token_key)
 if access_token == nil then
  -- do something...
  return false
 end

 local obj_token = cjson.decode(access_token)
 -- do something

通過查詢資料得知原因:lua讀取redis數(shù)據(jù)返回結(jié)果為空時,返回的結(jié)果不是nil而是userdata類型的ngx.null。

為什么要這么設(shè)計?

因為nil在lua中有特殊的意義,如果一個變量被設(shè)置為nil相當(dāng)于告知該變量未定義(不存在)一樣,如果把redis查詢的結(jié)果為空設(shè)置為nil,而該查詢的key對應(yīng)在redis中又是存在的,就無法把查詢?yōu)榭蘸臀炊x區(qū)分開來了,這樣顯然是不合理的。所以必須使用一個userdata類型的值來表示這個查詢記錄為空,但是又不等同于未定義變量(ngx.null)。

因此,代碼做如下修改即可:

local access_token = redis_client:read_by_key(token_key)
 if access_token == ngx.null or access_token == nil then
  -- do something...
  return false
 end

 local obj_token = cjson.decode(access_token)
 -- do something

總結(jié)

以上就是這篇文章的全部內(nèi)容了,希望本文的內(nèi)容對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,如果有疑問大家可以留言交流,謝謝大家對腳本之家的支持。

相關(guān)文章

最新評論