【愚公系列】2022年05月 .NET架构班 052-分布式中间件 .Net Core下使用Redis落地情况分析
【摘要】 @TOC 一、.Net Core下使用Redis高级使用 1.存储商品对象,一条商品数据情况:当客户端通过集群电商系统从redis中查询数据的时候,如何实现查询呢?方案:单个查询#region 1、存储商品对象,一条商品数据{ // 1、从redis中取对象 string productjson = _connectionMultiplexer.GetDatabase(0).St...
@TOC
一、.Net Core下使用Redis高级使用
1.存储商品对象,一条商品数据
情况:当客户端通过集群电商系统从redis中查询数据的时候,如何实现查询呢?
方案:单个查询
#region 1、存储商品对象,一条商品数据
{
// 1、从redis中取对象
string productjson = _connectionMultiplexer.GetDatabase(0).StringGet("product");
if (string.IsNullOrEmpty(productjson))
{
// 2、从数据库中查询
product = _productDbContext.Products.FirstOrDefault(s => s.Id == 1);
// 3、存储到redis中
string demojson = JsonConvert.SerializeObject(product);//序列化
_connectionMultiplexer.GetDatabase(0).StringSet("product", demojson);
return product;
}
product = JsonConvert.DeserializeObject<Product>(productjson);//反序列化
return product;
}
#endregion
2.存储商品对象-集合商品数据
情况:当客户端通过集群电商系统从redis中查询数据的时候,都是一个一个查询的,如何实现批量查询呢?
方案:批量查询
/// <summary>
/// 商品控制器
/// </summary>
[ApiController]
[Route("[controller]")]
public class ProductController : ControllerBase
{
private readonly ConnectionMultiplexer _connectionMultiplexer;
public ProductController(ConnectionMultiplexer connectionMultiplexer)
{
_connectionMultiplexer = connectionMultiplexer;
}
/// <summary>
/// 查询商品
/// </summary>
/// <param name="productCreateDto"></param>
/// <returns></returns>
[HttpPost]
public Product GetProduct()
{
#region 2、存储商品对象-集合商品数据
{
// 1、从redis中取对象
RedisValue[] productvalues = _connectionMultiplexer.GetDatabase(0).SetMembers("products");
List<Product> products = new List<Product>();
if (productvalues.Length == 0)
{
// 2、从数据库中查询
products = _productDbContext.Products.ToList();
// 3、存储到redis中
List<RedisValue> redisValues = new List<RedisValue>();
foreach (var product1 in products)
{
string productjson = JsonConvert.SerializeObject(product1);//序列化
redisValues.Add(productjson);
}
_connectionMultiplexer.GetDatabase(0).SetAdd("products", redisValues.ToArray());
return products;
}
// 4、序列化,反序列化
foreach (var redisValue in productvalues)
{
product = JsonConvert.DeserializeObject<Product>(redisValue);//反序列化
products.Add(product);
}
return product;
}
#endregion
}
}
3.存储商品对象-集合-分页查询
情况:当客户端通过集群电商系统从redis批量查询数据的时候,全部一起查询,由于数据量过大,导致查询性能低下,如何提升查询性能?
方案:分页查询
/// <summary>
/// 商品控制器
/// </summary>
[ApiController]
[Route("[controller]")]
public class ProductController : ControllerBase
{
private readonly ConnectionMultiplexer _connectionMultiplexer;
public ProductController(ConnectionMultiplexer connectionMultiplexer)
{
_connectionMultiplexer = connectionMultiplexer;
}
/// <summary>
/// 查询商品
/// </summary>
/// <param name="productCreateDto"></param>
/// <returns></returns>
[HttpPost]
public Product GetProduct()
{
#region 3、存储商品对象-集合-分页查询
{
// 1、从redis中取对象
RedisValue[] productvalues = _connectionMultiplexer.GetDatabase(0).SetScan("products", 10, 0, 10).ToArray();
List<Product> products = new List<Product>();
if (productvalues.Length == 0)
{
// 2、从数据库中查询
products = _productDbContext.Products.ToList();
// 3、存储到redis中
List<RedisValue> redisValues = new List<RedisValue>();
foreach (var product1 in products)
{
string productjson = JsonConvert.SerializeObject(product1);//序列化
redisValues.Add(productjson);
}
_connectionMultiplexer.GetDatabase(0).SetAdd("products", redisValues.ToArray());
}
// 4、序列化,反序列化
foreach (var redisValue in productvalues)
{
product = JsonConvert.DeserializeObject<Product>(redisValue);//反序列化
products.Add(product);
}
return product;
}
#endregion
}
}
4.存储商品对象-字典形式
分析:当客户端通过电商网站,每次购买一件商品,就会导致商品销量增加,由于商品存储到redis是以json的形式进行存储的,导致每次修改商品销量字段都需要进行商品数据序列化和反序列化,由于序列化和反序列化比较多,导致修改商品销量性能底下,如何提升性能?
方案:Hash字典
/// <summary>
/// 商品控制器
/// </summary>
[ApiController]
[Route("[controller]")]
public class ProductController : ControllerBase
{
private readonly ConnectionMultiplexer _connectionMultiplexer;
public ProductController(ConnectionMultiplexer connectionMultiplexer)
{
_connectionMultiplexer = connectionMultiplexer;
}
/// <summary>
/// 查询商品
/// </summary>
/// <param name="productCreateDto"></param>
/// <returns></returns>
[HttpPost]
public Product GetProduct()
{
#region 4、存储商品对象-字典形式
{
string ProductSold = _connectionMultiplexer.GetDatabase(0).HashGet("productHash", "ProductSold");
if (string.IsNullOrEmpty(ProductSold))
{
product = _productDbContext.Products.FirstOrDefault(s => s.Id == 1);
_connectionMultiplexer.GetDatabase(0).HashSet("productHash", "ProductSold", product.ProductStock);
_connectionMultiplexer.GetDatabase(0).KeyExpire("productHash", TimeSpan.FromSeconds(10));
}
// 1、增加销量
_connectionMultiplexer.GetDatabase(0).HashIncrement("productHash", "ProductSold");
return product;
}
#endregion
}
}
5.存储商品对象-事务
分析:当客户端通过电商网站,每次购买一件商品,就会导致商品销量增加,扣减库存,当使用redis Hash进行销量增加和库存扣减,当同时进行销量增加和库存扣减的时候,如果其中一个操作失败了。会出现数据不一致的问题,如何解决?
方案:redis事务
/// <summary>
/// 商品控制器
/// </summary>
[ApiController]
[Route("[controller]")]
public class ProductController : ControllerBase
{
private readonly ConnectionMultiplexer _connectionMultiplexer;
public ProductController(ConnectionMultiplexer connectionMultiplexer)
{
_connectionMultiplexer = connectionMultiplexer;
}
/// <summary>
/// 查询商品
/// </summary>
/// <param name="productCreateDto"></param>
/// <returns></returns>
[HttpPost]
public Product GetProduct()
{
string ProductSold = _connectionMultiplexer.GetDatabase(0).HashGet("productHash", "ProductSold");
string ProductStock = _connectionMultiplexer.GetDatabase(0).HashGet("productHash", "ProductStock");
if (string.IsNullOrEmpty(ProductStock))
{
product = _productDbContext.Products.FirstOrDefault(s => s.Id == 1);
//创建事务
ITransaction transaction = _connectionMultiplexer.GetDatabase(0).CreateTransaction();
//transaction.AddCondition(Condition.HashEqual("productHash", "ProductSold", product.ProductSold));//乐观锁
transaction.HashSetAsync("productHash", "ProductSold", product.ProductSold);
transaction.HashSetAsync("productHash", "ProductStock", product.ProductStock);
//transaction.HashSetAsync("productHash", "ProductSold", 100); // 修改原油值
bool commit = transaction.Execute();
// commit 为true:那么就是提交成功 如果为false,提交失败
if (commit)
{
Console.WriteLine("提交成功");
}
else
{
Console.WriteLine("回滚成功");
}
}
return product;
}
}
6.存储商品对象-批量操作
分析:当数据库中商品销量数据存储到redis的时候,是一个个存储的,由于一个一个存储,多次和redis建立连接,导致添加效率下降,如何提升添加商品销量数据的性能?
方案:批量添加
/// <summary>
/// 商品控制器
/// </summary>
[ApiController]
[Route("[controller]")]
public class ProductController : ControllerBase
{
private readonly ConnectionMultiplexer _connectionMultiplexer;
public ProductController(ConnectionMultiplexer connectionMultiplexer)
{
_connectionMultiplexer = connectionMultiplexer;
}
/// <summary>
/// 查询商品
/// </summary>
/// <param name="productCreateDto"></param>
/// <returns></returns>
[HttpPost]
public Product GetProduct()
{
#region 6、存储商品对象-批量操作
{
var batch = _connectionMultiplexer.GetDatabase(0).CreateBatch();
List<Product> products = new List<Product>();
// 2、从数据库中查询
products = _productDbContext.Products.ToList();
// 3、存储到redis中
for (int i = 0; i < products.Count; i++)
{
batch.HashSetAsync("productHash" + i, "ProductSold", products[i].ProductSold);
}
batch.Execute();
return product;
}
#endregion
}
}
【版权声明】本文为华为云社区用户原创内容,转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息, 否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱:
cloudbbs@huaweicloud.com
- 点赞
- 收藏
- 关注作者
评论(0)