【Rdeis 10】dotnetcore三大Redis客户端对比和使用心得 前言
2021-04-08 17:28
var redisDB = new CSRedisClient[16]; // 多客户端
for (var a = 0; a redisDB[a] = new CSRedisClient(Configuration.GetConnectionString("redis") + ",defaultDatabase=" + a);
services.AddSingleton(redisDB);
// ---------------------------- _redisDB[0].IncrByAsync("ProfileUsageCap", -1) _redisDB[0].HGetAsync(profileUsage, eqidPair.ProfileId.ToString()) _redisDB[0].HIncrByAsync(profileUsage, eqidPair.ProfileId.ToString(), -1);
内置的静态操作类RedisHelper, 与Redis-Cli 命令完全一致, 故他能原生支持”blocking pops”。
// 实现后台服务,持续消费MQ消息 public class BackgroundJob : BackgroundService { private readonly CSRedisClient[] _redisDB; private readonly IConfiguration _conf; private readonly ILogger _logger; public BackgroundJob(CSRedisClient[] csRedisClients,IConfiguration conf,ILoggerFactory loggerFactory) { _redisDB = csRedisClients; _conf = conf; _logger = loggerFactory.CreateLogger(nameof(BackgroundJob)); } // Background 需要实现的后台任务 protected override async Task ExecuteAsync(CancellationToken stoppingToken) { _redisDB[0] = new CSRedisClient(_conf.GetConnectionString("redis") + ",defualtDatabase=" + 0); RedisHelper.Initialization(_redisDB[0]); while (!stoppingToken.IsCancellationRequested) { var key = $"eqidpair:{DateTime.Now.ToString("yyyyMMdd")}"; // 阻塞式从右侧读取List首消息 var eqidpair = RedisHelper.BRPop(5, key); // TODO Handler Message else await Task.Delay(1000, stoppingToken); } } } -----RedisMQ 生产者--- // 将一个或多个msg插入List头部 RedisHelper.LPush(redisKey, eqidPairs.ToArray());
Redis的一点小经验:
-
对自己要使用的Redis API 的时间复杂度心里要有数,尽量不要使用长时间运行的命令如keys *,可通过redis.io SlowLog命令观测 哪些命令耗费较长时间
-
Redis Key可按照“:”分隔定义成有业务意义的字符串,如NewUsers:201909:666666(某些Redis UI可直观友好查看该业务)
-
合适确定Key-Value的大小:Redis对于small value更友好, 如果值很大,考虑划分到多个key
-
关于缓存穿透,面试的时候会问,自行搜索布隆过滤器。
-
redis虽然有持久化机制,但在实际中会将key-value 持久化到关系型数据库,因为对于某些结构化查询,SQL更为有效。
----- 20190829 多说两句-------
以上三大客户端,Microsoft.Extensions.Caching.StackExchangeRedis 与其他两者的定位还是有很大差距的,单纯使用Redis 缓存特性, 有微软出品,必属精品情结的可使用此客户端;
StackExchange.Redis、CSRedisCore 对于Redis全功能特性支持的比较全,但是我也始终没有解决StackExchange.Redis : RedisTimeoutException 超时的问题,换成CSRedisCore 确实没有出现Redis相关异常。
---- 2019-09-25 update--------
- CSRedisCore 挖坑填坑经历
- 受到公号一些网友的启发,再次使用StackExchange.Redis , 并在redis配置中增加 abortConnect= false(缺省为true,表示不尝试重连),超时问题不再出现。
转载于:https://www.cnblogs.com/JulianHuang/p/11418881.html
上一篇:JS异步加载的方式
文章标题:【Rdeis 10】dotnetcore三大Redis客户端对比和使用心得 前言
文章链接:http://soscw.com/index.php/essay/72969.html