Redis缓存集群.net核心

i2loujxw  于 4个月前  发布在  Redis
关注(0)|答案(1)|浏览(52)

我有一个问题。我想把我的数据存储在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;
}

字符串
这两种方法我都试过了,但我不认为我会得到想要的结果。

vkc1a9a2

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.html
1.它不是最佳的,特别是在大型数据库中-即使您增加页面大小(参数之一),也可能需要很长时间才能完成
另一种方法是对每个type使用 hash,以key为键,但是:这意味着每个type都被绑定到单个分片,影响分布。如果你有很多类型,这可能不是问题,但是如果你只有几个类型,集群中的单个节点可能会占用 * 所有 * 数据。

相关问题