You cannot select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

270 lines
7.5 KiB
C#

This file contains ambiguous Unicode characters!

This file contains ambiguous Unicode characters that may be confused with others in your current locale. If your use case is intentional and legitimate, you can safely ignore this warning. Use the Escape button to highlight these characters.

using CSRedis;
using Microsoft.IdentityModel.Logging;
using Newtonsoft.Json;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using NLog;
using DS.Module.Core;
using Amazon.Runtime.Internal.Util;
using MySqlConnector.Logging;
namespace DS.Module.RedisModule
{
public class RedisService: IRedisService
{
CSRedisClient csRedis;
private static readonly NLog.Logger Logger = LogManager.GetCurrentClassLogger();
private readonly string redisConfig;
public RedisService(IServiceProvider serviceProvider)
{
redisConfig = AppSetting.app(new string[] { "RedisInfo", "RedisConfig" });
csRedis = new CSRedisClient(redisConfig);
RedisHelper.Initialization(csRedis);
}
/// <summary>
/// 设置长时间存在的值
/// </summary>
/// <param name="key"></param>
/// <param name="value"></param>
/// <returns></returns>
public bool SetLongValue(string key, string value)
{
try
{
csRedis.Set(key, value);
return true;
}
catch (Exception ex)
{
Logger.Error("RedisDataHelper-SetValue" + ex.Message);
return false;
}
}
/// <summary>
/// 设置值,并设置清除时间
/// </summary>
/// <param name="key"></param>
/// <param name="value"></param>
/// <param name="outSecond"></param>
/// <returns></returns>
public bool SetValue(string key, string value, int outSecond)
{
try
{
csRedis.Set(key, value, outSecond);
return true;
}
catch (Exception ex)
{
Logger.Error("RedisDataHelper-SetValue" + ex.Message);
return false;
}
}
/// <summary>
/// 设置值,存在则覆盖,并沿用之前的清除时间
/// </summary>
/// <param name="key"></param>
/// <param name="value"></param>
/// <returns></returns>
public bool SetValue(string key, string value)
{
try
{
if (csRedis.Exists(key))
{
long time = csRedis.Ttl(key);
csRedis.Set(key, value, Convert.ToInt32(time));
}
else
csRedis.Set(key, value);
return true;
}
catch (Exception ex)
{
Logger.Error($"RedisDataHelper-SetValue[{key}-{value}]" + ex.Message);
return false;
}
}
/// <summary>
/// 是否存在key
/// </summary>
/// <param name="key"></param>
/// <returns></returns>
public bool Exists(string key)
{
try
{
return csRedis.Exists(key);
}
catch (Exception ex)
{
Logger.Error("RedisDataHelper-KeyExists" + ex.Message);
return false;
}
}
/// <summary>
/// 更新Key把自动注销时间设置为原来的key的时间,不存在返回false
/// </summary>
/// <param name="key"></param>
/// <param name="value"></param>
/// <returns></returns>
public bool UpdateValue(string key, string value)
{
try
{
if (csRedis.Exists(key))
{
long time = csRedis.Ttl(key);
csRedis.Set(key, value, Convert.ToInt32(time));
return true;
}
return false;
}
catch (Exception ex)
{
Logger.Error($"RedisDataHelper-SetValue[{key}-{value}]" + ex.Message);
return false;
}
}
public string? GetValue(string key)
{
try
{
return csRedis.Get(key);
}
catch (Exception ex)
{
Logger.Error($"RedisDataHelper-GetValue[{key}]" + ex.Message);
return null;
}
}
/// <summary>
/// 获得json序列化后的
/// </summary>
/// <typeparam name="T"></typeparam>
/// <param name="key"></param>
/// <returns></returns>
public T? GetValue<T>(string key)
{
try
{
var data = csRedis.Get(key);
return JsonConvert.DeserializeObject<T>(data);
}
catch (Exception ex)
{
Logger.Error($"RedisDataHelper-GetValue[{key}]" + ex.Message);
return default;
}
}
public T? GetEntity<T>(string key)
{
try
{
var data = csRedis.Get(key);
return JsonConvert.DeserializeObject<T>(data);
}
catch (Exception ex)
{
Logger.Error($"RedisDataHelper-GetList[{key}]" + ex.Message);
return default;
}
}
public List<T>? GetLike<T>(string key)
{
try
{
var dataList = csRedis.Keys(key + "*");
List<T> list = new List<T>();
foreach (string item in dataList)
{
var data = GetEntity<T>(item);
if (data != null)
{
list.Add(data);
}
}
return list;
}
catch (Exception ex)
{
Logger.Error($"RedisDataHelper-GetList[{key}]" + ex.Message);
return default;
}
}
public void DeleteKey(string key)
{
try
{
csRedis.Del(key);
}
catch (Exception ex)
{
Logger.Error($"RedisDataHelper-DeleteKey[{key}]" + ex.Message);
}
}
public void DeleteLike(string key)
{
try
{
var dataList = csRedis.Keys(key + "*");
foreach (string item in dataList)
{
DeleteKey(item);
}
}
catch (Exception ex)
{
Logger.Error($"RedisDataHelper-DeleteLike[{key}]" + ex.Message);
}
}
private bool AcquireLock(string lockKey, string lockValue, int lockTimeoutSeconds)
{
// 尝试获取锁
bool lockAcquired = csRedis.SetNx(lockKey, lockValue);
// 如果成功获取锁,设置锁的超时时间
if (lockAcquired)
{
csRedis.Expire(lockKey, lockTimeoutSeconds);
}
return lockAcquired;
}
private void ReleaseLock(string lockKey, string lockValue)
{
// 释放锁
// 使用 Lua 脚本确保只有持有锁的客户端才能释放锁
string luaScript = @"
if redis.call('get', KEYS[1]) == ARGV[1] then
return redis.call('del', KEYS[1])
else
return 0
end";
csRedis.Eval(luaScript, lockKey, new[] { lockValue });
}
}
}