Redis 與 Lua 使用中的小問題-原文連接
redis
在 Redis 裏執行 get
或 hget
不存在的 key
或 field
時返回值在終端顯式的是 (nil)
,相似於下面這樣bash
127.0.0.1:6379> get test_version
(nil)
複製代碼
若是在 Lua 腳本中判斷獲取到的值是否爲空值時,就會產生比較迷惑的問題,覺得判斷空值的話就用 nil
就能夠了,然鵝事實卻並非這樣的,以下所示:ide
127.0.0.1:6379> get test_version
(nil)
127.0.0.1:6379> EVAL "local a = redis.call('get',KEYS[1]) print(a) if a == 'nil' then return 1 else return 0 end" 1 test_version test_version
(integer) 0
複製代碼
咱們來看下執行 Lua 腳本返回結果的數據類型是什麼ui
127.0.0.1:6379> get test_version
(nil)
127.0.0.1:6379> EVAL "local a = redis.call('get',KEYS[1]) return type(a)" 1 test_version test_version
"boolean"
複製代碼
經過上面的腳本能夠看到,當 Redis 返回的結果爲 (nil)
時候,其真實的數據類型爲 boolean
,所以咱們直接判斷 nil
是有問題的。spa
經過翻閱官方文檔,找到下面所示的一段話,code
Redis to Lua conversion table.cdn
Lua to Redis conversion table.文檔
經過官方文檔,咱們知道判斷 Lua 腳本返回空值使用,應該直接判斷 true/false
,修改判斷腳本以下所示get
127.0.0.1:6379> get test_version
(nil)
127.0.0.1:6379> EVAL "local a = redis.call('get',KEYS[1]) if a == false then return 'empty' else return 'not empty' end" 1 test_version test_version
"empty"
複製代碼