redis自帶的lua腳本
127.0.0.1:6379> hget team wyc
"{\"name\":\"wyycc\",\"age\":\"444\"}"
想要通過redis官方的lua腳本拓展來傳遞name,age等直接返回對應的值。如果傳遞name,age等redis的hash中存在的value,則返回其結果,如果不存在返回nil,使得傳入和返回結果一一對應。
- redis的lua拓展自帶了cjson等庫,可以很方便的處理json數據。
- 當返回table中有nil時停止,后續的數據無法返回
- nil在lua的table中相當刪除某個key,table.insert()是無法插入到table中的
- 想要返回nil,則插入lua的FALSE。Lua boolean false -> Redis Nil bulk reply
127.0.0.1:6379> eval "return {1,2,3.3333,'foo',nil,'bar'}" 0
1) (integer) 1
2) (integer) 2
3) (integer) 3
4) "foo"
后面的0表明傳入幾個參數,KEYS,ARGV兩個table中接受傳入的參數
127.0.0.1:6379> eval "local substring = redis.call('hget',KEYS[1],KEYS[2]) if not substring then return false end substring = cjson.decode(substring) local result = {} for _, v in ipairs(ARGV) do table.insert(result,substring[v] or false) end return result" 2 team wyc age len name
1) "444"
2) (nil)
3) "wyycc"
OpenResty的lua_resty_redis返回為空的判斷
local res, err = red:get("dog")
if not res then
ngx.say("failed to get dog: ", err)
return
end
if res == ngx.null then
ngx.say('res is null')
else
ngx.say('res is not empty')
end
ngx.say(type(res))
ngx.say(res)
結果:
res is null
userdata
null
- lua_resty_redis的redis操作返回的數據打印出來是null,但是不等同於lua中的nil,也不能直接和null比較,里面是lua的8中數據類型中的userdata。文檔中已經有描述了:A non-nil Redis "bulk reply" results in a Lua string as the return value. A nil bulk reply results in a ngx.null return value. lua_resty_redis文檔