using CSRedis; using Microsoft.Extensions.Configuration; using Microsoft.Extensions.DependencyInjection; namespace QYZH.InteractiveMagazine.Infrastructure.Redis { public static class RedisExtensions { public static TimeSpan expireSecond = TimeSpan.FromMinutes(20); /// /// AddCSRedisCacheExtension /// /// /// /// public static IServiceCollection AddCSRedisCacheExtension(this IServiceCollection services, IConfiguration configuration) { if (services == null) throw new ArgumentNullException("services"); if (configuration == null) throw new ArgumentNullException("configuration"); var redisOptions = configuration.Get(); services.AddSingleton(redisOptions); var csredis = new CSRedisClient(redisOptions.ConnectionString, redisOptions.Sentinels, redisOptions.ReadOnly); RedisHelper.Initialization(csredis); services.AddSingleton(csredis);//csredis注册为单例 //services.AddSingleton(new Microsoft.Extensions.Caching.Redis.CSRedisCache(RedisHelper.Instance)); return services; } /// /// 获取缓存,如果换成不存在则执行方法生成缓存 /// /// /// /// /// /// public static T GetOrSet(this CSRedisClient redisCache, string key, Func factory, TimeSpan? expireTime = null) where T : class { var result = redisCache.Get(key); if (factory != null && result == null) { result = factory(); if (expireTime == null || !expireTime.HasValue) expireTime = expireSecond; redisCache.Set(key, result, expireTime.Value); } return result; } /// /// 获取缓存,如果缓存不存在则执行方法生成缓存 /// /// /// /// /// /// public static async Task GetOrSetAsync(this CSRedisClient redisCache, string key, Func factory, TimeSpan? expireTime = null) { var result = await redisCache.GetAsync(key); if (result == null && factory != null) { result = factory(); if (expireTime == null || !expireTime.HasValue) expireTime = expireSecond; if (result != null) await redisCache.SetAsync(key, result, expireTime.Value); } return result; } } public class RedisCacheOption { /// /// 连接字符串 /// public string ConnectionString { get; set; } /// /// 哨兵设置 /// public string[] Sentinels { get; set; } /// /// 是否只读 /// public bool ReadOnly { get; set; } = false; public int[] ExpireSecondRange { get; set; } public int? ExpireSecond { get; set; } = 3600; } }