lua讀取redis數(shù)據(jù)的null判斷示例代碼
前言
為什么要用lua腳本操作redis數(shù)據(jù)庫?
1.減少開銷–減少向redis服務(wù)器的請(qǐng)求次數(shù)
2.原子操作–redis將lua腳本作為一個(gè)原子執(zhí)行
3.可復(fù)用–其他客戶端可以使用已經(jīng)執(zhí)行過的lua腳本
4.增加redis靈活性–lua腳本可以幫助redis做更多的事情
lua腳本本身體積小,啟動(dòng)速度快.
因此,從redis 2.6.0開始,redis在服務(wù)器端內(nèi)置lua解釋器,下面話不多說了,來開始本文的正文:
最近在配合移動(dòng)端調(diào)試的時(shí)候,被抓去debug一個(gè)在清除redis緩存之后才會(huì)出現(xiàn)的網(wǎng)關(guān)錯(cuò)誤。于是打開服務(wù)器上的log定位到類似錯(cuò)誤:
[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é)果為空時(shí),返回的結(jié)果不是nil而是userdata類型的ngx.null。
因?yàn)閚il在lua中有特殊的意義,如果一個(gè)變量被設(shè)置為nil相當(dāng)于告知該變量未定義(不存在)一樣,如果把redis查詢的結(jié)果為空設(shè)置為nil,而該查詢的key對(duì)應(yīng)在redis中又是存在的,就無法把查詢?yōu)榭蘸臀炊x區(qū)分開來了,這樣顯然是不合理的。所以必須使用一個(gè)userdata類型的值來表示這個(gè)查詢記錄為空,但是又不等同于未定義變量(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é)
以上就是這篇文章的全部?jī)?nèi)容了,希望本文的內(nèi)容對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,如果有疑問大家可以留言交流,謝謝大家對(duì)腳本之家的支持。
- 簡(jiǎn)介L(zhǎng)ua腳本與Redis數(shù)據(jù)庫的結(jié)合使用
- Nginx+Lua+Redis構(gòu)建高并發(fā)Web應(yīng)用
- 詳解利用redis + lua解決搶紅包高并發(fā)的問題
- 利用nginx+lua+redis實(shí)現(xiàn)反向代理方法教程
- 利用Lua定制Redis命令的方法詳解
- Go語言中通過Lua腳本操作Redis的方法
- Redis執(zhí)行Lua腳本的好處與示例代碼
- redis中如何使用lua腳本讓你的靈活性提高5個(gè)逼格詳解
- Redis如何使用lua腳本實(shí)例教程
- phpredis執(zhí)行LUA腳本示例代碼
相關(guān)文章
Lua Table轉(zhuǎn)C# Dictionary的方法示例
這篇文章主要給大家介紹了關(guān)于Lua Table轉(zhuǎn)C# Dictionary的相關(guān)資料,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧。2018-03-03Lua在各個(gè)操作系統(tǒng)中的開發(fā)環(huán)境配置教程
這篇文章主要介紹了Lua在各個(gè)操作系統(tǒng)中的開發(fā)環(huán)境配置教程,包括Mac OS和Windows和Linux這三大系統(tǒng)下的安裝,需要的朋友可以參考下2015-05-05Ruby元編程技術(shù)詳解(Ruby Metaprogramming techniques)
這篇文章主要介紹了Ruby元編程技術(shù)詳解(Ruby Metaprogramming techniques),本文講解了11個(gè)關(guān)于元編程的技術(shù)和技巧,需要的朋友可以參考下2015-04-04Lua教程(四):在Lua中調(diào)用C語言、C++的函數(shù)
這篇文章主要介紹了Lua教程(四):在Lua中調(diào)用C語言、C++的函數(shù),本文給出了多個(gè)示例講解如何在Lua中調(diào)用C/C++寫的函數(shù),需要的朋友可以參考下2014-09-09lua中使用packagepath解決多個(gè)項(xiàng)目的路徑?jīng)_突問題
這篇文章主要介紹了lua中使用packagepath解決多個(gè)項(xiàng)目的路徑?jīng)_突問題,本文描述了問題的產(chǎn)生環(huán)境和原因,并給出了解決方法,需要的朋友可以參考下2015-04-04C語言中通過LUA API訪問LUA腳本變量的簡(jiǎn)單例子
這篇文章主要介紹了C語言中通過LUA API訪問LUA腳本變量的簡(jiǎn)單例子,需要的朋友可以參考下2014-11-11