.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 已经更新 与数据库 一致