Redis lua 常用脚本记录

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

未完待续……

你可能感兴趣的:(Redis lua 常用脚本记录)