.net core canal 使用 (四) cannal 同步更新 redis

nuget 

CSRedisCore 

 

  public static class RedisExtend
    {
        public static IServiceCollection AddCustomRedis(this IServiceCollection services, IConfiguration configuration)
        {
            RedisOptions redisOptions = services.Configure<RedisOptions>(configuration.GetSection("RedisOptions"))
                .BuildServiceProvider().GetService<IOptionsSnapshot<RedisOptions>>()?.Value;

            if (redisOptions == null)
            {
                throw new ArgumentNullException("RedisOptions 读取失败");
            }

            return services.AddTransient<CSRedisClient>(provider =>
               {
                   return new CSRedisClient(redisOptions.ConnectionString);
               });
        }
    }

 

  public class RedisOptions { public string ConnectionString { get; set; } } 

 

    public class RedisPrefix
    {
        /// <summary>
        /// 热备数据 热卖key
        /// </summary>
        public const string SparingHotDatasKey = "SparingData:Hot:Product:Id:";

        /// <summary>
        /// 热备数据 秒杀key
        /// </summary>
        public const string SparingKillDatasKey = "SparingData:Kill:Product:Id:";
    }

 

appsettings.json

  "RedisOptions": {
    "ConnectionString": "192.168.0.192:6379"
  },

注入

 builder.Services.AddCustomRedis(builder.Configuration); 

这段代码是 接上一篇 的代码 增加了 redis

 /// <summary>
    /// product 处理
    /// </summary>
    public class CanalProduct : CanalHandle<Product>
    {
        private readonly ILogger<CanalProduct> _logger;
        private readonly CSRedisClient _cSRedisClient;
        public CanalProduct(ILogger<CanalProduct> logger, CSRedisClient cSRedisClient)
        {
            _logger = logger;
            _cSRedisClient = cSRedisClient;
        }

        /// <summary>
        /// 获取转换后的product 实例
        /// </summary>
        /// <param name="columns"></param>
        /// <returns></returns>
        public override Product GetModel(List<Column> columns)
        {
            Product product = new Product();
            foreach (var column in columns)
            {
                if (column.Name.Equals(nameof(Product.Id)))
                {
                    product.Id = long.Parse(column.Value.ToString());
                }

                if (column.Name.Equals(nameof(Product.Name)))
                {
                    product.Name = column.Value.ToString();
                }
                if (column.Name.Equals(nameof(Product.Price)))
                {
                    product.Price = Convert.ToDecimal(column.Value);
                }
            }
            return product;
        }
        public override async void Insert(Product t)
        {
            _logger.LogInformation($@"Insert开始 id={t.Id} name= {t.Name}, Price = {t.Price}");
            //消息确认
            await CanalProvide.AckAsync(MessageId);
        }

        public override async void Update(Product t)
        {
            _logger.LogInformation($@"Update开始  id={t.Id} name= {t.Name}, Price = {t.Price}");
        
//消息确认 await CanalProvide.AckAsync(MessageId); //更新 redis string key = RedisPrefix.SparingHotDatasKey + t.Id; await _cSRedisClient.HSetAsync(key, t.Id.ToString(), JsonConvert.SerializeObject(t)); } public override async void Delete(Product t) { _logger.LogInformation($@"Delete开始 id={t.Id} name= {t.Name}, Price = {t.Price}"); //消息确认 await CanalProvide.AckAsync(MessageId); } }

 

测试

原来 redis 存储数据 我要更新 mysql 同时 更新redis

 mysql 更新

 redis 已经更新 与数据库 一致

 

posted on 2023-07-03 12:03  是水饺不是水饺  阅读(70)  评论(0)    收藏  举报

导航