RedisLock.cs
(开头部分) 3KB这里只显示每个文件的开头 60 行。登录后可以解锁完整代码。
using CSRedis;
using System.Threading;
using System.Threading.Tasks;
namespace RedisLock_Demo
{
public class RedisLock
{
/// <summary>
/// 锁key
/// </summary>
private readonly string lockKey = "RedisLock";
/// <summary>
/// 锁的过期秒数
/// </summary>
private readonly int lockTime = 20;
/// <summary>
/// 续命线程取消令牌
/// </summary>
private CancellationTokenSource tokenSource = new CancellationTokenSource();
public RedisLock()
{
//RedisHelper.Initialization(new CSRedis.CSRedisClient("127.0.0.1:6379,password=123456,poolsize=50,ssl=false,writeBuffer=10240"));
RedisHelper.Initialization(new CSRedis.CSRedisClient("127.0.0.1:6379,poolsize=50,ssl=false,writeBuffer=10240"));
}
/// <summary>
/// 获取锁
/// </summary>
/// <param name="requestId">请求id保证释放锁时的客户端和加锁的客户端一致</param>
/// <returns></returns>
public bool GetLock(string requestId)
{
//设置key 设置过期时间20s
while (true)
{
//设置key Redis2.6.12以上版本,可以用set获取锁。set可以实现setnx和expire,这个是原子操作
if (RedisHelper.Set(lockKey, requestId, lockTime, RedisExistence.Nx))
{
//设置成功后开启子线程为key续命
CreateThredXm();
return true;
}
}
}
/// <summary>
/// 为锁续命(防止业务操作时间大于锁自动释放时间,锁被自动释放掉)
/// </summary>
void CreateThredXm()
{
Task.Run(() =>
{
while (true)
{
Thread.Sleep(10);
//外部取消 退出子线程
if (tokenSource.IsCancellationRequested)
{
return;
}
后面还有 27 行代码,解锁后查看完整代码
24 小时内免费解锁 3 个项目,之后 1 积分/个。 规则说明
AI 解读
登录后可用,每次 10 积分,解读结果公开显示在下面。
还没有人解读过这个文件。
