1、根据唯一索引查询对象
适用范围: 对象使用JSON序列化, {model_name}:id 作为 key,属性中有唯一索引与 id映射
例如:
public class User { public Long userId; public String userName; // unique public String email; // unique }
在 Redis 中一个 User (userId = 123456) 包含以下键值:
// 曾经登录过的用户 id 记录 hash key => "ub:123", field => "456", value => loginTimes // u:{id} => user json key: "u:123456", value => "{\"userId\":123456,\"userName\":\"foo\",\"email\":\"[email protected]\"}" // u_email:{email} => userId key: "u_email:[email protected]", value => "123456" // u_name:{userName} => userId key: "u_name:foo", value => "123456"
在 Redis 中使用 lua 脚本通过唯一索引查询 user json:
local uid = redis.call('GET', KEYS[1]) local model_name = ARGV[1] if uid ~= nil then return redis.call('GET', model_name..':'..uid) end return ''
redis-cli --eval model_byindex.lua u_email:[email protected] , u
2、根据属性索引查找对象列表
适用范围:对象使用JSON序列化, {model_name}:id 作为 key,属性中有索引与 id映射
例如:
public class Category { public Integer id; public String name; public Integer parentId; }
在 Redis 中一个 Category(id = 4, name=子分类, parentId=1) 包含以下键值:
// cate:{id} => category json key: cate:4, value: "{\"id\":4,\"name\":\"子分类\",\"parentId\":1}" // cate~idx:{pid}:ids => children cate ids (zSet) key: cate~idx:1:ids, value: [4, 5, 6]
在 Redis 中使用 lua 脚本通过索引(parentId)查询 category json:
local ids = redis.call('ZRANGE', KEYS[1], 0, -1) local model_name = ARGV[1] if ids ~= nil and next(ids) ~= nil then local keys = {} for _, v in ipairs(ids) do table.insert(keys, model_name..':'..v) end if next(keys) ~= nil then return redis.call('MGET', unpack(keys)) end return {}; end return {}
redis-cli --eval List_byIndex.lua cate~idx:1:ids , cate
未完待续……