node.js - Redis:如何通过命名空间/规则一次保存(和读取)键值对?

标签 node.js redis storage database nosql

我想利用 Redis 来保存和读取用户的动态列表
Redis本质上是Key-Value对存储。如何一次读取所有已保存的用户? (例如,创建命名空间“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...
};

然后可以像这样创建域 key :

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

如果 id 是 'e9f6671440e111e49f14-77817cb77f36' 则 key 将是这样的:

User:e9f6671440e111e49f14-77817cb77f36

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

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 人员不鼓励在生产中使用“键”,因此更好的方法是使用 sorted-set 构建您自己的索引,但如果您的用户列表仅限于几百个,则没有问题。

并且由于它返回一个键列表,您需要遍历并获取每个用户,然后解析 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:可以在 this project. 的 AbstractBaseDao 模块中找到带有单元测试的完整实现。

关于node.js - Redis:如何通过命名空间/规则一次保存(和读取)键值对?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25950655/

相关文章:

serialization - redis 不同语言的客户端可以混合使用吗?

xamarin - 函数式编程和依赖倒置 : how to abstract storage?

node.js - 在 Node.js 中使用 express-jwt token 保护非 api (res.render) 路由

node.js - -bash : node: command not found (on EC2 instance)

performance - RediSearch,创建单个索引好还是多个索引好?

javascript - 等待 promise 从父函数解析

android - Unity 和 Oculus Go。读/写内部存储器

powershell - 无法在美国中西部创建 AZURE CLASSIC 存储帐户

mysql - 使用 NodeJS 刷新 MySQL 查询页面时出现 404

node.js - 如何在 Node js中定义属性文件?