我将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应该可以正常工作-在用例上没有任何假设,并且应该可以正常工作。 但是,