【愚公系列】2022年05月 .NET架构班 052-分布式中间件 .Net Core下使用Redis落地情况分析

举报
愚公搬代码 发表于 2022/05/02 22:12:13 2022/05/02
【摘要】 @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

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。