我和我的团队有一个 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 迷你分析器示例
最大的问题是:有没有办法在不通过 C# LINQ 获取整个集合和过滤器的情况下获取单个元素?
最佳答案
简短的回答是“不”。您正在将数据序列化为 Redis 不了解的格式,因此它无法为您应用任何过滤。
为了获得更高效的查找,您需要更改存储数据的方式,例如,如果您的每个产品都存储为标准键,您可以直接执行 O(1) 查找来获取它 -如果您预先知道所有 ID,则可以通过管道传输。
关于c# - Redis - 通过一些 "key"获取单个元素,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29934133/