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
}
}