我想利用Redis来保存和读取用户的动态列表。
从本质上说,Redis是键值对存储。如何同时读取所有保存的用户?(例如,创建名称空间“user/user_id”)
既然我是红人初学者,
你认为在上述情况下使用Redis是正确/有效的吗?
谢谢。
发布于 2014-09-20 17:01:35
当使用键/值存储对象时,应该通过组合域名和唯一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来保存用户对象。假设一个有效的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不鼓励在生产中使用“键”,所以更好的方法是使用排序集构建自己的索引,但是如果用户列表限制在几百个,那么就没有问题了。
因为它返回一个键列表,所以您需要遍历并得到每个用户,然后解析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的这个项目。模块中可以找到一个完整的实现,其中包含了单元测试。
https://stackoverflow.com/questions/25950655
复制相似问题