using Newtonsoft.Json; using StackExchange.Redis; namespace Znyc.CloudCar.Caching { public class RedisOperationRepository : IRedisOperationRepository { private readonly ConnectionMultiplexer _redis; private readonly IDatabase _database; public RedisOperationRepository(ConnectionMultiplexer redis) { _redis = redis; _database = redis.GetDatabase(); } private IServer GetServer() { var endpoint = _redis.GetEndPoints(); return _redis.GetServer(endpoint.First()); } /// /// /// /// public async Task Clear() { foreach (var endPoint in _redis.GetEndPoints()) { var server = GetServer(); foreach (var key in server.Keys()) { await _database.KeyDeleteAsync(key); } } } /// /// 检查给定 key 是否存在 /// /// /// public bool Exists(string key) { return _database.KeyExists(key); } /// /// 检查给定 key 是否存在 /// /// 键 /// public Task ExistsAsync(string key) { return _database.KeyExistsAsync(key); } /// /// 获取指定 key 的值 /// /// 键 /// public string Get(string key) { return _database.StringGet(key); } /// /// 获取指定 key 的值 /// /// byte[] 或其他类型 /// 键 /// public T Get(string key) { var value = _database.StringGet(key); if (value.HasValue) { return JsonConvert.DeserializeObject(value); } else { return default; } } /// /// 获取指定 key 的值 /// /// 键 /// public async Task GetAsync(string key) { return await _database.StringGetAsync(key); } /// /// 获取指定 key 的值 /// /// byte[] 或其他类型 /// 键 /// public async Task GetAsync(string key) { var value = await _database.StringGetAsync(key); if (value.HasValue) { return JsonConvert.DeserializeObject(value); } else { return default; } } /// /// 设置指定 key 的值,所有写入参数object都支持string | byte[] | 数值 | 对象 /// /// 键 /// 值 /// public bool Set(string key, object value) { return _database.StringSet(key, JsonConvert.SerializeObject(value)); } /// /// 设置指定 key 的值,所有写入参数object都支持string | byte[] | 数值 | 对象 /// /// 键 /// 值 /// 有效期 /// public bool Set(string key, object value, TimeSpan expire) { return _database.StringSet(key, JsonConvert.SerializeObject(value), expire); } /// /// 设置指定 key 的值,所有写入参数object都支持string | byte[] | 数值 | 对象 /// /// 键 /// 值 /// public async Task SetAsync(string key, object value) { return await _database.StringSetAsync(key, JsonConvert.SerializeObject(value)); } /// /// 设置指定 key 的值,所有写入参数object都支持string | byte[] | 数值 | 对象 /// /// 键 /// 值 /// 有效期 /// public Task SetAsync(string key, object value, TimeSpan expire) { return _database.StringSetAsync(key, JsonConvert.SerializeObject(value), expire); } /// /// /// /// /// public bool Del(string key) { return _database.KeyDelete(key); } /// /// /// /// /// public Task DelAsync(string key) { return _database.KeyDeleteAsync(key); } /// /// 将 key 所储存的值加上给定的增量值(increment) /// /// 键 /// public async Task IncrAsync(string key) { return await _database.StringIncrementAsync(key); } /// /// 将 key 所储存的值加上给定的增量值(increment) /// /// 键 /// public long Incr(string key) { return _database.StringIncrement(key); } #region Hash /// /// 将哈希表 key 中的字段 field 的值设为 value /// /// 键 /// 字段 /// 值 /// 如果字段是哈希表中的一个新建字段,并且值设置成功,返回true。如果哈希表中域字段已经存在且旧值已被新值覆盖,返回false。 public bool HSet(string key, string filed, object value) { return _database.HashSet(key, filed, JsonConvert.SerializeObject(value)); } /// /// 将哈希表 key 中的字段 field 的值设为 value /// /// 键 /// 字段 /// 值 /// 如果字段是哈希表中的一个新建字段,并且值设置成功,返回true。如果哈希表中域字段已经存在且旧值已被新值覆盖,返回false。 public Task HSetAsync(string key, string filed, object value) { return _database.HashSetAsync(key, filed, JsonConvert.SerializeObject(value)); } /// /// 同时将多个field-value对设置到哈希表key中 /// /// /// /// //public Task HMSetAsync(string key, object[] value) //{ // return _database.HMSetAsync(key, value); //} /// /// 获取在哈希表中指定 key 的所有字段和值 /// /// /// /// public async Task> HGetAllAsync(string key) { IDictionary keyValues = new Dictionary(); var res = await _database.HashGetAllAsync(key); foreach (var item in res) { keyValues.Add(item.Name, item.Value); } return keyValues; } #endregion #region Redis 有序集合(sorted set) /// /// 向有序集合添加一个或多个成员,或者更新已存在成员的分数 /// /// /// /// /// public async Task ZAddAsync(string key, string member, double score) { return await _database.SortedSetAddAsync(key, member, score); } /// /// 用于计算集合中元素的数量 /// /// /// public async Task ZCardAsync(string key) { return await _database.SortedSetLengthAsync(key); } /// /// 有序集合中对指定成员的分数加上增量 increment /// /// /// /// /// public async Task ZIncrByAsync(string key, string member, double increment = 1) { return await _database.SortedSetIncrementAsync(key, member, increment); } /// /// 通过索引区间返回有序集合成指定区间内的成员 /// /// /// /// /// true倒序排列,false正序排列 /// public async Task> ZRemRangeByRankAsync(string key, long start, long stop, bool sortType = true) { if (sortType) { return (await _database.SortedSetRangeByRankAsync(key, start, stop, Order.Descending)).ToStringArray().ToList(); } else { return (await _database.SortedSetRangeByRankAsync(key, start, stop, Order.Ascending)).ToStringArray().ToList(); } } /// /// 返回有序集中的成员和分数,通过索引,分数从高到低 /// /// /// public async Task> ZRevRangeWithScoresAsync(string key) { return ConvertSortedSetEntryToDictionary(await _database.SortedSetRangeByScoreWithScoresAsync(key)); } /// /// 删除 /// /// /// /// public async Task SortedSetRemoveAsync(string key, string member) { return await _database.SortedSetRemoveAsync(key, member); } /// /// 数据转换 /// /// /// public SortedSetEntry[] ConvertDictionaryToSortedSetEntry(IDictionary keyValues) { List setEntries = new List(); foreach (var item in keyValues) { setEntries.Add(new SortedSetEntry(item.Key, item.Value)); } return setEntries.ToArray(); } /// /// 数据转换字典 /// /// /// public IDictionary ConvertSortedSetEntryToDictionary(SortedSetEntry[] setEntries) { IDictionary keyValues = new Dictionary(); foreach (var item in setEntries) { keyValues.Add(item.Element, item.Score); } return keyValues; } #endregion } }