Redis:如何通过名称空间/规则一次保存(和读取)键值对



我想利用Redis来保存和读取用户的动态列表
从本质上讲,Redis是键值对存储。如何一次读取所有保存的用户?(例如,创建命名空间"users/user_id")

由于我是Redis的初学者,
您认为在上述情况下使用Redis是否正确/有效?

谢谢。

当使用键/值存储对象时,您应该通过组合域名和唯一id来创建特定于域的键。例如,一个用户对象可能看起来像这样:

// typical user data model
var User = function(params) {
    if (!params) params = {};
    this.id = params.id;
    this.username = params.username;
    this.email = params.email;
    // other stuff...
};

然后可以像这样创建域密钥:

var createUserDomainKey = function(id) {
    return 'User:' + id;
};

如果id为"e9f6671440e111e49f14-77817cb77f36",则密钥为:

User:e9f6671440e111e49f14-77817cb77f36

由于redis将存储字符串值,因此需要进行序列化,可能需要使用json来保存用户对象。假设一个有效的使用对象会做这样的事情:

var client = redis.createClient(),
    key = createUserDomainKey( user.id ),
    json = JSON.stringify( user ) ;
client.set( key, json, function(err, result) {
    if (err) throw err; // do something here...
    // result is 'OK'
});

对于返回所有用户的简单消防软管查询,您可以这样做:

var client = redis.createClient();
client.keys( createUserDomainKey( '*' ), function(err, keys) {
    if (err) throw err; // do something here
    // keys contains all the keys matching 'User:*'
});

请注意,redis人员不鼓励在生产中使用"键",因此更好的方法是使用排序集构建自己的索引,但如果用户列表限制在几百个,则没有问题。

由于它返回一个键列表,因此需要循环并让每个用户解析json字符串以恢复真实对象。假设有一个填充的密钥列表,你可以这样做:

var client = redis.getClient(),
    users = [];
var loopCallback = function(err, value) {
    if (!err && value) {
        // parse and add the user model to the list
        users.push( JSON.parse( value ) );
    }
    // pull the next key, if available
    var key = keys.pop();
    if (key) {
        client.get( key, loopCallback );
    } else {
        // list is complete so return users, probably through a callback;
    }
}
// start the loop
loopCallback();

这是一个很好的通用解决方案,但也有其他解决方案使用排序集,当您希望每次访问都能访问整个列表时,这些排序集的移动效率很高。该解决方案使您能够在知道ID时获得单个用户对象。

我希望这能有所帮助。

ps:在这个项目的AbstractBaseDao模块中可以找到一个完整的单元测试实现。

最新更新