c# - Redis - 通过一些 "key"获取单个元素

标签 c# caching azure collections redis

我和我的团队有一个 C# 电子商务引擎。本站使用内存缓存,缓存迁移到redis。

我们在 azure 中有一个 Web 应用程序,在 azure redis 中也有一个托管缓存。

每当我们需要缓存集合时,请使用 smembers 命令。

以产品集合为例。假设我们在该缓存集合中有 1,000 个项目。 每次我们要访问一个产品,都需要运行smembers命令,获取所有的缓存集合,大概需要250毫秒。问题是应用程序的设计需要在单个页面上运行 5 次,这大大增加了加载时间。

例子:

public Product GetProductById(int productId)
{
    Product product = null;
    try
    {
        List<Product> products = GetAllProducts();

        if (products != null && products.Count > 0)
            product = products.Find((p) => p.ProductId == productId);

    }
    catch (Exception ex)
    {
        Console.WriteLine(ex.ToString());
    }
    return product;
}

public List<Product> GetAllProducts()
{
    return GetCollectionFromSet<Product>(PRODUCTS_ALL_KEY);            
}

/// <summary>
/// SMEMBERS key 
/// </summary>
/// <returns>Array reply: all elements of the set.
/// <remarks>http://redis.io/commands/smembers</remarks>
public List<TEntity> GetCollectionFromSet<TEntity>(string Urn)
{
   try
   {
       List<TEntity> list = new List<TEntity>();
       IDatabase cache = Connection.GetDatabase();
       RedisValue[] values2 = cache.SetMembers(Urn);

       foreach (RedisValue value in values2)
       {
           var entityInBit = Deserialize<TEntity>(value);
           list.Add(entityInBit);
        }
        return list;

        }
    catch (Exception ex)
    {
        Console.WriteLine(ex.ToString());
        return null;
    }
 }

StackOverflow 迷你分析器示例

Load Time

最大的问题是:有没有办法在不通过 C# LINQ 获取整个集合和过滤器的情况下获取单个元素?

最佳答案

简短的回答是“不”。您正在将数据序列化为 Redis 不了解的格式,因此它无法为您应用任何过滤。

为了获得更高效的查找,您需要更改存储数据的方式,例如,如果您的每个产品都存储为标准键,您可以直接执行 O(1) 查找来获取它 -如果您预先知道所有 ID,则可以通过管道传输。

关于c# - Redis - 通过一些 "key"获取单个元素,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29934133/

相关文章:

c# - 接收命令时通过 TCP 发送字符串

c# - 我可以在 Linq 查询中选择多个对象吗

file - hadoop中的分布式缓存

database-design - 您将如何使用 noSQL 类型的数据库来实现 twitter?

sql-server - 将本地 SQL Server 数据库数据以 Parquet 格式复制到 Azure

javascript - 如何在javascript中将json对象存储在数组中 var objdata = $.parseJSON(data.d);

c# - 按软键盘的回车键时将焦点从一个文本框移到另一个文本框

caching - 当 load 执行时调用 invalidate 时,google Guava LoadingCache 会做什么?

powershell - 禁止显示 Azure Stop-AzureRMVM cmdlet 警告消息框

azure - 在 azure-functions 中使用外部程序