gpt4 book ai didi

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

转载 作者:可可西里 更新时间:2023-11-01 11:39:18 24 4
gpt4 key购买 nike

我想利用 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/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com