我有一个问题。我想把我的数据存储在Redis集群中,比如在用户集群中存储一系列具有唯一ID的用户,比如User:Id {User:3737}。
我遇到的问题是在代码中,我不知道如何从User集群中获取所有或一个用户的数据。
如果你能帮助我,我将不胜感激。
由于Redis有大量的IDatalog选项,我不知道该用哪些来设置或获取。
有没有一种方法可以根据序列化对象的属性搜索该高速缓存本身?
public async Task Add(TEntity entity, string key)
{
const string signature = nameof(TEntity);
key = $"{signature}:{key}";
var serializedData = JsonConvert.SerializeObject(entity);
await _cache.StringSetAsync(key, serializedData);
}
public async Task<List<Cachable<TEntity>>> GetAll()
{
const string signature = nameof(TEntity);
var data = await _cache.StringGetAsync(signature);
var result = JsonConvert.DeserializeObject<List<Cachable<TEntity>>>(data!)!;
return result;
}
public async Task<List<Cachable<TEntity>>> GetAll()
{
const string signature = nameof(TEntity);
var data = await _cache.HashGetAllAsync(signature);
var some = JsonConvert.SerializeObject(data);
var result = JsonConvert.DeserializeObject<List<Cachable<TEntity>>>(some);
return result;
}
字符串
这两种方法我都试过了,但我不认为我会得到想要的结果。
1条答案
按热度按时间vkc1a9a21#
看起来你把
type
的每个对象作为一个单独的字符串/键存储在redis中,键遵循{type}:{key}
模式,我想你想在redis中找到所有带有前缀的值,即{type}:*
,以查询给定type
的所有对象。假设我已经正确地解释了这一点,那么重要的是要注意,你想做的事情在redis中并不直接支持,尽管这取决于你多久需要这样做一次。
redis中有一个
SCAN
操作,它接受glob通配符(即foo*
);这确实是你所期望的,但是:1.它是一个 server 命令,而不是一个 cluster 命令;这意味着在SE.Redis中,你需要手动从多路复用器中删除端点,并依次对每个节点发出
Keys(...)
(或者每个分片中至少一个)-参见https://stackexchange.github.io/StackExchange.Redis/KeysScan.html1.它不是最佳的,特别是在大型数据库中-即使您增加页面大小(参数之一),也可能需要很长时间才能完成
另一种方法是对每个
type
使用 hash,以key
为键,但是:这意味着每个type
都被绑定到单个分片,影响分布。如果你有很多类型,这可能不是问题,但是如果你只有几个类型,集群中的单个节点可能会占用 * 所有 * 数据。