mirror of
http://git.coreshop.cn/jianweie/coreshoppro.git
synced 2025-12-06 16:23:26 +08:00
【调整】优化redis仓储,实现LockTake/LockRelease锁处理并发问题。
This commit is contained in:
@@ -10,21 +10,110 @@ namespace CoreCms.Net.Caching.AutoMate.RedisCache
|
||||
/// </summary>
|
||||
public interface IRedisOperationRepository
|
||||
{
|
||||
/// <summary>
|
||||
/// 延长锁(续约)
|
||||
/// </summary>
|
||||
/// <param name="key"></param>
|
||||
/// <param name="value"></param>
|
||||
/// <param name="cacheTime"></param>
|
||||
/// <returns></returns>
|
||||
bool LockExtend(string key, string value, TimeSpan cacheTime);
|
||||
|
||||
//获取 Reids 缓存值
|
||||
/// <summary>
|
||||
/// 延长锁(续约)
|
||||
/// </summary>
|
||||
/// <param name="key"></param>
|
||||
/// <param name="value"></param>
|
||||
/// <param name="cacheTime"></param>
|
||||
/// <returns></returns>
|
||||
Task<bool> LockExtendAsync(string key, string value, TimeSpan cacheTime);
|
||||
|
||||
/// <summary>
|
||||
/// 释放锁
|
||||
/// </summary>
|
||||
/// <param name="key"></param>
|
||||
/// <param name="value"></param>
|
||||
/// <returns></returns>
|
||||
bool LockRelease(string key, string value);
|
||||
|
||||
/// <summary>
|
||||
/// 释放锁
|
||||
/// </summary>
|
||||
/// <param name="key"></param>
|
||||
/// <param name="value"></param>
|
||||
/// <returns></returns>
|
||||
Task<bool> LockReleaseAsync(string key, string value);
|
||||
|
||||
/// <summary>
|
||||
/// 获取锁
|
||||
/// </summary>
|
||||
/// <param name="key"></param>
|
||||
/// <param name="value"></param>
|
||||
/// <param name="cacheTime"></param>
|
||||
/// <returns></returns>
|
||||
public bool LockTake(string key, string value, TimeSpan cacheTime);
|
||||
|
||||
/// <summary>
|
||||
/// 获取锁
|
||||
/// </summary>
|
||||
/// <param name="key"></param>
|
||||
/// <param name="value"></param>
|
||||
/// <param name="cacheTime"></param>
|
||||
/// <returns></returns>
|
||||
public Task<bool> LockTakeAsync(string key, string value, TimeSpan cacheTime);
|
||||
|
||||
|
||||
/// <summary>
|
||||
/// 获取值
|
||||
/// </summary>
|
||||
/// <param name="key"></param>
|
||||
/// <returns></returns>
|
||||
Task<string> Get(string key);
|
||||
|
||||
RedisValue StringGet(string key);
|
||||
|
||||
/// <summary>
|
||||
/// 搜索获取匹配Key
|
||||
/// </summary>
|
||||
/// <param name="pattern"></param>
|
||||
/// <returns></returns>
|
||||
List<string> SearchKey(string pattern);
|
||||
|
||||
//获取值,并序列化
|
||||
Task<TEntity> Get<TEntity>(string key);
|
||||
|
||||
//保存
|
||||
Task Set(string key, object value, TimeSpan cacheTime);
|
||||
Task<bool> StringSetAsync(string key, string value, TimeSpan cacheTime);
|
||||
|
||||
bool StringSet(string key, string value, TimeSpan cacheTime);
|
||||
|
||||
bool StringSet(string key, string value);
|
||||
|
||||
bool StringSet(string key, RedisValue value);
|
||||
|
||||
bool StringSet(string key, RedisValue value, TimeSpan cacheTime);
|
||||
|
||||
|
||||
Task SetAsync(string key, object value, TimeSpan cacheTime);
|
||||
|
||||
Task<long> StringIncrement(string key, long value=1);
|
||||
|
||||
|
||||
//判断是否存在
|
||||
Task<bool> Exist(string key);
|
||||
Task<bool> KeyExistsAsync(string key);
|
||||
|
||||
bool KeyExists(string key);
|
||||
|
||||
/// <summary>
|
||||
/// 获取键 过期时间
|
||||
/// </summary>
|
||||
/// <param name="key"></param>
|
||||
/// <returns></returns>
|
||||
Task<TimeSpan?> KeyTime(string key);
|
||||
|
||||
//移除某一个缓存值
|
||||
Task Remove(string key);
|
||||
Task KeyDeleteAsync(string key);
|
||||
void KeyDelete(string key);
|
||||
|
||||
//全部清除
|
||||
Task Clear();
|
||||
@@ -131,26 +220,46 @@ namespace CoreCms.Net.Caching.AutoMate.RedisCache
|
||||
Task ListClearAsync(string redisKey);
|
||||
|
||||
|
||||
|
||||
/// <summary>
|
||||
/// 有序集合/定时任务延迟队列用的多(直接传分钟)
|
||||
/// 有序集合/定时任务延迟队列用的多
|
||||
/// </summary>
|
||||
/// <param name="redisKey">key</param>
|
||||
/// <param name="redisValue">元素</param>
|
||||
/// <param name="score">分数</param>
|
||||
Task SortedSetAddAsync(string redisKey, string redisValue, double score);
|
||||
|
||||
Task<bool> SortedSetAddAsync(string redisKey, string redisValue, double score);
|
||||
|
||||
/// <summary>
|
||||
/// 有序集合/定时任务延迟队列用的多(直接传时间)
|
||||
/// 插入zset
|
||||
/// </summary>
|
||||
/// <param name="redisKey">key</param>
|
||||
/// <param name="redisValue">元素</param>
|
||||
/// <param name="dt">时间</param>
|
||||
Task SortedSetAddAsync(string redisKey, string redisValue, DateTime dt);
|
||||
/// <param name="key">key</param>
|
||||
/// <param name="msg">消息</param>
|
||||
/// <param name="time">延迟执行时间</param>
|
||||
/// <returns></returns>
|
||||
Task<bool> SortedSetAddAsync(string key, string msg, DateTime time);
|
||||
|
||||
#region 会员陌小北(QQ:1078350533) 添加的 几个有序集合功能
|
||||
/// <summary>
|
||||
/// 返回有序集合中指定成员的索引
|
||||
/// </summary>
|
||||
/// <param name="key"></param>
|
||||
/// <param name="value"></param>
|
||||
/// <returns></returns>
|
||||
Task<long?> SortedSetRankAsync(string key, string value);
|
||||
|
||||
/// <summary>
|
||||
/// 返回有序集合中的分数
|
||||
/// </summary>
|
||||
/// <param name="key"></param>
|
||||
/// <param name="value"></param>
|
||||
/// <returns></returns>
|
||||
Task<double?> SortedSetScoreAsync(string key, string value);
|
||||
|
||||
/// <summary>
|
||||
/// 返回有序集合中的分数
|
||||
/// </summary>
|
||||
/// <param name="key"></param>
|
||||
/// <param name="value"></param>
|
||||
/// <returns></returns>
|
||||
double? SortedSetScore(string key, string value);
|
||||
/// <summary>
|
||||
/// 返回有序列表里的数据
|
||||
/// </summary>
|
||||
@@ -170,6 +279,7 @@ namespace CoreCms.Net.Caching.AutoMate.RedisCache
|
||||
Task<long> SortedSetRemoveRangeByRankAsync(string redisKey, int start, int stop);
|
||||
|
||||
|
||||
|
||||
/// <summary>
|
||||
/// 返回有序列表里的指定范围数量
|
||||
/// </summary>
|
||||
@@ -177,9 +287,9 @@ namespace CoreCms.Net.Caching.AutoMate.RedisCache
|
||||
/// <param name="start">0 是第一个</param>
|
||||
/// <param name="stop">最大分数值</param>
|
||||
/// <returns></returns>
|
||||
Task<long> SortedSetLengthAsync(string redisKey, int start, int stop);
|
||||
Task<long> SortedSetLengthAsync(string redisKey, long min, long max);
|
||||
|
||||
#endregion
|
||||
|
||||
|
||||
}
|
||||
}
|
||||
|
||||
@@ -6,6 +6,7 @@ using Microsoft.Extensions.Logging;
|
||||
using Newtonsoft.Json;
|
||||
using StackExchange.Redis;
|
||||
|
||||
|
||||
namespace CoreCms.Net.Caching.AutoMate.RedisCache
|
||||
{
|
||||
public class RedisOperationRepository : IRedisOperationRepository
|
||||
@@ -39,22 +40,162 @@ namespace CoreCms.Net.Caching.AutoMate.RedisCache
|
||||
}
|
||||
}
|
||||
|
||||
public async Task<bool> Exist(string key)
|
||||
|
||||
/// <summary>
|
||||
/// 获取锁
|
||||
/// </summary>
|
||||
/// <param name="key"></param>
|
||||
/// <param name="value"></param>
|
||||
/// <param name="cacheTime"></param>
|
||||
/// <returns></returns>
|
||||
public bool LockTake(string key, string value, TimeSpan cacheTime)
|
||||
{
|
||||
return _database.LockTake(key, value, cacheTime);
|
||||
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// 异步获取锁
|
||||
/// </summary>
|
||||
/// <param name="key"></param>
|
||||
/// <param name="value"></param>
|
||||
/// <param name="cacheTime"></param>
|
||||
/// <returns></returns>
|
||||
public async Task<bool> LockTakeAsync(string key, string value, TimeSpan cacheTime)
|
||||
{
|
||||
return await _database.LockTakeAsync(key, value, cacheTime);
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// 延长锁(续约)
|
||||
/// </summary>
|
||||
/// <param name="key"></param>
|
||||
/// <param name="value"></param>
|
||||
/// <param name="cacheTime"></param>
|
||||
/// <returns></returns>
|
||||
|
||||
public bool LockExtend(string key, string value, TimeSpan cacheTime)
|
||||
{
|
||||
return _database.LockExtend(key, value, cacheTime);
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// 延长锁(续约)
|
||||
/// </summary>
|
||||
/// <param name="key"></param>
|
||||
/// <param name="value"></param>
|
||||
/// <param name="cacheTime"></param>
|
||||
/// <returns></returns>
|
||||
|
||||
public async Task<bool> LockExtendAsync(string key, string value, TimeSpan cacheTime)
|
||||
{
|
||||
return await _database.LockExtendAsync(key, value, cacheTime);
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// 释放锁
|
||||
/// </summary>
|
||||
/// <param name="key"></param>
|
||||
/// <param name="value"></param>
|
||||
/// <returns></returns>
|
||||
public bool LockRelease(string key, string value)
|
||||
{
|
||||
return _database.LockRelease(key, value);
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// 异步释放锁
|
||||
/// </summary>
|
||||
/// <param name="key"></param>
|
||||
/// <param name="value"></param>
|
||||
/// <returns></returns>
|
||||
public async Task<bool> LockReleaseAsync(string key, string value)
|
||||
{
|
||||
return await _database.LockReleaseAsync(key, value);
|
||||
}
|
||||
|
||||
|
||||
/// <summary>
|
||||
/// 判断key是否存在
|
||||
/// </summary>
|
||||
/// <param name="key"></param>
|
||||
/// <returns></returns>
|
||||
public async Task<bool> KeyExistsAsync(string key)
|
||||
{
|
||||
|
||||
return await _database.KeyExistsAsync(key);
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// 判断key是否存在
|
||||
/// </summary>
|
||||
/// <param name="key"></param>
|
||||
/// <returns></returns>
|
||||
public bool KeyExists(string key)
|
||||
{
|
||||
|
||||
return _database.KeyExists(key);
|
||||
}
|
||||
|
||||
|
||||
/// <summary>
|
||||
/// 获取键过期时间
|
||||
/// </summary>
|
||||
/// <param name="key"></param>
|
||||
/// <returns></returns>
|
||||
public async Task<TimeSpan?> KeyTime(string key)
|
||||
{
|
||||
|
||||
return await _database.KeyTimeToLiveAsync(key);
|
||||
}
|
||||
|
||||
|
||||
public async Task<string> Get(string key)
|
||||
{
|
||||
return await _database.StringGetAsync(key);
|
||||
}
|
||||
|
||||
public async Task Remove(string key)
|
||||
public RedisValue StringGet(string key)
|
||||
{
|
||||
return _database.StringGet(key);
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// 搜索匹配Key
|
||||
/// </summary>
|
||||
/// <param name="pattern"></param>
|
||||
/// <returns></returns>
|
||||
public List<string> SearchKey(string pattern)
|
||||
{
|
||||
|
||||
var list = new List<string>();
|
||||
var script = "return redis.call('keys',@pattern)";
|
||||
var prepared = LuaScript.Prepare(script);
|
||||
var redisResult = _database.ScriptEvaluate(prepared, new { pattern });
|
||||
if (!redisResult.IsNull)
|
||||
{
|
||||
foreach (var key in (RedisKey[])redisResult)
|
||||
{
|
||||
|
||||
list.Add(key);
|
||||
}
|
||||
}
|
||||
return list;
|
||||
|
||||
}
|
||||
|
||||
public async Task KeyDeleteAsync(string key)
|
||||
{
|
||||
await _database.KeyDeleteAsync(key);
|
||||
}
|
||||
|
||||
public async Task Set(string key, object value, TimeSpan cacheTime)
|
||||
public void KeyDelete(string key)
|
||||
{
|
||||
_database.KeyDelete(key);
|
||||
}
|
||||
|
||||
|
||||
public async Task SetAsync(string key, object value, TimeSpan cacheTime)
|
||||
{
|
||||
if (value != null)
|
||||
{
|
||||
@@ -63,6 +204,65 @@ namespace CoreCms.Net.Caching.AutoMate.RedisCache
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
public async Task<bool> StringSetAsync(string key, string value, TimeSpan cacheTime)
|
||||
{
|
||||
|
||||
return await _database.StringSetAsync(key, value, cacheTime);
|
||||
|
||||
}
|
||||
|
||||
|
||||
|
||||
public bool StringSet(string key, string value, TimeSpan cacheTime)
|
||||
{
|
||||
|
||||
return _database.StringSet(key, value, cacheTime);
|
||||
|
||||
}
|
||||
|
||||
|
||||
public bool StringSet(string key, string value)
|
||||
{
|
||||
|
||||
return _database.StringSet(key, value);
|
||||
|
||||
}
|
||||
|
||||
|
||||
public bool StringSet(string key, RedisValue value, TimeSpan cacheTime)
|
||||
{
|
||||
|
||||
return _database.StringSet(key, value, cacheTime);
|
||||
|
||||
}
|
||||
|
||||
|
||||
public bool StringSet(string key, RedisValue value)
|
||||
{
|
||||
|
||||
return _database.StringSet(key, value);
|
||||
|
||||
}
|
||||
|
||||
|
||||
|
||||
/// <summary>
|
||||
/// Increment 递增
|
||||
/// </summary>
|
||||
/// <param name="key"></param>
|
||||
/// <param name="value"></param>
|
||||
/// <returns></returns>
|
||||
public async Task<long> StringIncrement(string key, long value=1)
|
||||
{
|
||||
|
||||
return await _database.StringIncrementAsync(key, value);
|
||||
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
public async Task<TEntity> Get<TEntity>(string key)
|
||||
{
|
||||
var value = await _database.StringGetAsync(key);
|
||||
@@ -77,6 +277,9 @@ namespace CoreCms.Net.Caching.AutoMate.RedisCache
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
/// <summary>
|
||||
/// 根据key获取RedisValue
|
||||
/// </summary>
|
||||
@@ -229,29 +432,70 @@ namespace CoreCms.Net.Caching.AutoMate.RedisCache
|
||||
|
||||
|
||||
/// <summary>
|
||||
/// 有序集合/定时任务延迟队列用的多(直接传分钟)
|
||||
/// 有序集合/定时任务延迟队列用的多
|
||||
/// </summary>
|
||||
/// <param name="redisKey">key</param>
|
||||
/// <param name="redisValue">元素</param>
|
||||
/// <param name="score">分数</param>
|
||||
public async Task SortedSetAddAsync(string redisKey, string redisValue, double score)
|
||||
public async Task<bool> SortedSetAddAsync(string redisKey, string redisValue, double score)
|
||||
{
|
||||
await _database.SortedSetAddAsync(redisKey, redisValue, score);
|
||||
return await _database.SortedSetAddAsync(redisKey, redisValue, score);
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// 有序集合/定时任务延迟队列用的多(直接传时间)
|
||||
/// 添加到有序集合 用时间
|
||||
/// </summary>
|
||||
/// <param name="redisKey">key</param>
|
||||
/// <param name="redisValue">元素</param>
|
||||
/// <param name="dt">时间</param>
|
||||
public async Task SortedSetAddAsync(string redisKey, string redisValue, DateTime dt)
|
||||
/// <param name="key"></param>
|
||||
/// <param name="msg"></param>
|
||||
/// <param name="time"></param>
|
||||
/// <returns></returns>
|
||||
|
||||
public async Task<bool> SortedSetAddAsync(string key, string msg, DateTime time)
|
||||
{
|
||||
var score = (dt.ToUniversalTime().Ticks - 621355968000000000) / 10000000;
|
||||
await _database.SortedSetAddAsync(redisKey, redisValue, score);
|
||||
var score = (time.ToUniversalTime().Ticks - 621355968000000000) / 10000000;
|
||||
var bl = await _database.SortedSetAddAsync(key, msg, score);
|
||||
//When.NotExists 不更新 直接添加
|
||||
return bl;
|
||||
}
|
||||
|
||||
|
||||
|
||||
#region 小北 添加的 几个有序集合功能
|
||||
|
||||
/// <summary>
|
||||
/// 获取有序集合索引
|
||||
/// </summary>
|
||||
/// <param name="key"></param>
|
||||
/// <param name="value"></param>
|
||||
/// <returns></returns>
|
||||
public async Task<long?> SortedSetRankAsync(string key, string value)
|
||||
{
|
||||
var result= await _database.SortedSetRankAsync(key,value);
|
||||
|
||||
return result;
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// 返回有序集中,成员的分数值。 如果成员元素不是有序集 key 的成员,或 key 不存在,返回 null
|
||||
/// </summary>
|
||||
/// <param name="key"></param>
|
||||
/// <param name="value"></param>
|
||||
/// <returns></returns>
|
||||
public async Task<double?> SortedSetScoreAsync(string key, string value)
|
||||
{
|
||||
var result = await _database.SortedSetScoreAsync(key, value);
|
||||
|
||||
return result;
|
||||
}
|
||||
|
||||
|
||||
public double? SortedSetScore(string key, string value)
|
||||
{
|
||||
var result = _database.SortedSetScore(key, value);
|
||||
|
||||
return result;
|
||||
}
|
||||
|
||||
#region 会员陌小北(QQ:1078350533) 添加的 几个有序集合功能
|
||||
|
||||
/// <summary>
|
||||
/// 返回有序列表里的数据
|
||||
@@ -262,12 +506,16 @@ namespace CoreCms.Net.Caching.AutoMate.RedisCache
|
||||
/// <returns></returns>
|
||||
public async Task<IEnumerable<string>> SortedSetRangeByRankAsync(string redisKey, int start, int stop)
|
||||
{
|
||||
var result = await _database.SortedSetRangeByRankAsync(redisKey, start, stop);
|
||||
var result= await _database.SortedSetRangeByRankAsync(redisKey, start, stop);
|
||||
|
||||
|
||||
|
||||
return result.Select(o => o.ToString());
|
||||
|
||||
}
|
||||
|
||||
|
||||
|
||||
/// <summary>
|
||||
/// 移出序列表里的指定范围数量
|
||||
/// </summary>
|
||||
@@ -275,7 +523,7 @@ namespace CoreCms.Net.Caching.AutoMate.RedisCache
|
||||
/// <param name="start">0 是第一个</param>
|
||||
/// <param name="stop">最大分数值</param>
|
||||
/// <returns></returns>
|
||||
public async Task<long> SortedSetRemoveRangeByRankAsync(string redisKey, int start, int stop)
|
||||
public async Task<long> SortedSetRemoveRangeByRankAsync(string redisKey, int start, int stop)
|
||||
{
|
||||
return await _database.SortedSetRemoveRangeByRankAsync(redisKey, start, stop);
|
||||
}
|
||||
@@ -287,13 +535,12 @@ namespace CoreCms.Net.Caching.AutoMate.RedisCache
|
||||
/// <param name="start">0 是第一个</param>
|
||||
/// <param name="stop">最大分数值</param>
|
||||
/// <returns></returns>
|
||||
public async Task<long> SortedSetLengthAsync(string redisKey, int start, int stop)
|
||||
public async Task<long> SortedSetLengthAsync(string redisKey, long min, long max)
|
||||
{
|
||||
return await _database.SortedSetLengthAsync(redisKey, start, stop);
|
||||
return await _database.SortedSetLengthAsync(redisKey, min, max);
|
||||
|
||||
}
|
||||
|
||||
#endregion 会员陌小北(QQ:1078350533) 添加的 几个有序集合功能
|
||||
|
||||
#endregion 小北 添加的 几个有序集合功能
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user