在大多数情况下,
SADD或
ZADD使用流水线命令会更好。如果存在另一个客户端可能会在其间获取密钥的风险,请使用MULTI /
EXEC事务,从而获得不完整的对象。
在某些情况下,在哈希字段中对列表进行字符串化可能是合理的。
关于“快速退出键”,请确保使用
UNlink代替
DEL。
如果选择进行字符串化,则以下是使用Lua和Lua
CJSON库在散列字段中自动支持插入和删除到JSON编码数组的方法:
插入 :
local items = cjson.depre(redis.call('HGET', KEYS[1], 'items'))table.insert(items, ARGV[1])return redis.call('HSET', KEYS[1], 'items', cjson.enpre(items))按值删除 :
local items = cjson.depre(redis.call('HGET', KEYS[1], 'items'))local pos = -1;for i, v in ipairs(items) do if ARGV[1] == v then pos = i break endendif pos == -1 then return -1else table.remove(items, pos) return redis.call('HSET', KEYS[1], 'items', cjson.enpre(items))end用法示例 :
> HGETALL meta_key1) "user"2) "12345"3) "tag"4) "D12321341234123"5) "items"6) "{}"> eval "local items = cjson.depre(redis.call('HGET', KEYS[1], 'items')) n table.insert(items, ARGV[1]) n return redis.call('HSET', KEYS[1], 'items', cjson.enpre(items))" 1 meta_key value1(integer) 0> HGETALL meta_key1) "user"2) "12345"3) "tag"4) "D12321341234123"5) "items"6) "["value1"]"> eval "local items = cjson.depre(redis.call('HGET', KEYS[1], 'items')) n table.insert(items, ARGV[1]) n return redis.call('HSET', KEYS[1], 'items', cjson.enpre(items))" 1 meta_key value2(integer) 0> HGETALL meta_key1) "user"2) "12345"3) "tag"4) "D12321341234123"5) "items"6) "["value1","value2"]"> eval "local items = cjson.depre(redis.call('HGET', KEYS[1], 'items')) n local pos = -1; n for i, v in ipairs(items) do n if ARGV[1] == v then n pos = i n break n end n end n if pos == -1 then n return -1 n else n table.remove(items, pos) n return redis.call('HSET', KEYS[1], 'items', cjson.enpre(items)) n end" 1 meta_key value1(integer) 0> HGETALL meta_key1) "user"2) "12345"3) "tag"4) "D12321341234123"5) "items"6) "["value2"]"> eval "local items = cjson.depre(redis.call('HGET', KEYS[1], 'items')) n local pos = -1; n for i, v in ipairs(items) do n if ARGV[1] == v then n pos = i n break n end n end n if pos == -1 then n return -1 n else n table.remove(items, pos) n return redis.call('HSET', KEYS[1], 'items', cjson.enpre(items)) n end" 1 meta_key value3(integer) -1> HGETALL meta_key1) "user"2) "12345"3) "tag"4) "D12321341234123"5) "items"6) "["value2"]"


