我想利用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模块中可以找到一个完整的单元测试实现。