当前位置: 首页 > 面试题库 >

StackExchange.Redis-LockTake / LockRelease的用法

边翔宇
2023-03-14
问题内容

我将Redis与StackExchange.Redis一起使用。我有多个线程将在某个时候访问并编辑同一键的值,因此我需要同步数据的操作。

查看可用的功能,我发现有两个功能,即TakeLock和ReleaseLock。但是,这些函数同时具有键和值参数,而不是预期要锁定的单个键。GitHub上的intellisene文档和源代码没有解释如何使用LockTake和LockRelease函数,以及如何传递键和值参数。

问:StackExchange.Redis中LockTake和LockRelease的正确用法是什么?

我打算做的伪代码示例:

//Add Items Before Parallel Execution
redis.StringSet("myJSONKey", myJSON);

//Parallel Execution
Parallel.For(0, 100, i =>
    {
        //Some work here
        //....

        //Lock
        redis.LockTake("myJSONKey");

        //Manipulate
        var myJSONObject = redis.StringGet("myJSONKey");
        myJSONObject.Total++;
        Console.WriteLine(myJSONObject.Total);
        redis.StringSet("myJSONKey", myNewJSON);

        //Unlock
        redis.LockRelease("myJSONKey");

        //More work here
        //...
    });

问题答案:

锁由三部分组成:

  • 密钥(数据库中锁的唯一名称)
  • 值(一个调用方定义的令牌,该令牌可用于指示谁“拥有”该锁,并检查是否正确完成了释放和扩展该锁)
  • 持续时间(故意锁是有限持续时间的东西)

如果没有其他价值,guid可能会做出合适的“价值”。我们倾向于使用机器名(如果多个进程可能在同一台机器上竞争,则使用机器名的简化版本)。

另外,请注意,锁定只是一种 推测 ,而不是 阻塞 。您很可能 无法 获取锁,因此您可能需要对此进行测试并可能添加一些重试逻辑。

一个典型的例子可能是:

RedisValue token = Environment.MachineName;
if(db.LockTake(key, token, duration)) {
    try {
        // you have the lock do work
    } finally {
        db.LockRelease(key, token);
    }
}

请注意,如果工作很长(尤其是循环),则可能需要LockExtend在中间添加一些偶尔的调用-再次记住要检查是否成功(以防超时)。

还要注意, 所有 单独的redis命令都是原子的,因此您不必担心两个谨慎的操作会相互竞争。对于更复杂的多操作单元,可以选择 事务脚本



 类似资料:
  • 本文向大家介绍StackExchange.Redis 基本用法,包括了StackExchange.Redis 基本用法的使用技巧和注意事项,需要的朋友参考一下 在线示例            

  • 问题内容: 这个想法是使用更少的连接和更好的性能。连接是否随时终止? 对于另一个问题,是否打开新连接? 问题答案: 不,多路复用器不会过期。没有GetDatabase不会打开新连接。basics.md涵盖了所有内容 -特别是: 从GetDatabase返回的对象是便宜的直通对象,不需要存储。

  • 本文向大家介绍StackExchange.Redis 基本,包括了StackExchange.Redis 基本的使用技巧和注意事项,需要的朋友参考一下 示例 连接后,您可以通过调用ISubscriber.Publish方法来发布消息: 消费者可以使用该ISubscriber.Subscribe方法订阅频道。发布者发送的消息将由传递给此方法的处理程序处理。            

  • StackExchange.Redis 是 Stackoverflow 开发的 Redis C# 客户端,是目前.net应用使用的最多的 redis 客户端,性能优越。 Redis 简介 Redis 是一个使用 ANSI C 编写的开源、支持网络、基于内存、可选持久性的键值对存储数据库。 从2015年6月开始,Redis 的开发由 Redis Labs 赞助,而2013年5月至2015年6月期间,

  • 本文向大家介绍StackExchange.Redis 设定值,包括了StackExchange.Redis 设定值的使用技巧和注意事项,需要的朋友参考一下 示例 Redis中的所有值最终都存储为一种RedisValue类型:            

  • 问题内容: 我环顾四周,无法找到如何使用StackExchange.Redis库在Redis上执行对键空间通知的订阅。 检查可用的测试,我发现使用通道是pubsub,但这更像是服务总线/队列,而不是订阅特定的Redis键事件。 是否可以使用StackExchange.Redis来利用此Redis功能? 问题答案: 常规订户API应该可以正常工作-在用例上没有任何假设,并且应该可以正常工作。 但是,