首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Redis:如何通过命名空间/规则同时保存(并读取)键值对?

Redis:如何通过命名空间/规则同时保存(并读取)键值对?
EN

Stack Overflow用户
提问于 2014-09-20 16:02:18
回答 1查看 1.7K关注 0票数 0

我想利用Redis来保存和读取用户的动态列表

从本质上说,Redis是键值对存储。如何同时读取所有保存的用户?(例如,创建名称空间“user/user_id”)

既然我是红人初学者,

你认为在上述情况下使用Redis是正确/有效的吗?

谢谢。

EN

回答 1

Stack Overflow用户

发布于 2014-09-20 17:01:35

当使用键/值存储对象时,应该通过组合域名和唯一id来创建特定于域的密钥。例如,可能如下所示的用户对象:

代码语言:javascript
复制
// 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...
};

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

代码语言:javascript
复制
var createUserDomainKey = function(id) {
    return 'User:' + id;
};

如果id为'e9f6671440e111e49f14-77817cb77f36‘,关键是:

代码语言:javascript
复制
User:e9f6671440e111e49f14-77817cb77f36

由于redis将存储字符串值,因此需要序列化,可能是使用json来保存用户对象。假设一个有效的use对象会执行如下操作:

代码语言:javascript
复制
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'
});

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

代码语言:javascript
复制
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字符串以恢复真正的对象。假设有一个填充的键列表,您可以这样做:

代码语言:javascript
复制
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的这个项目。模块中可以找到一个完整的实现,其中包含了单元测试。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/25950655

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档