asp.net-mvc - 阻止对 Redis key 的访问 (ServiceStack)

标签 asp.net-mvc redis servicestack

我正在尝试使用 ServiceStack Redis 客户端来实现我认为非常常见的缓存场景,但我很难找到一个很好的示例。

在 ASP.NET MVC 应用程序中,我们对外部 Web 服务进行相对长时间运行(且按计量)的调用,并将结果缓存一段时间。在缓存实现中,需要阻止对该 key 的其他请求,直到 Web 服务调用完成,以避免额外的(昂贵的)调用。

那么,实现键级锁的最佳方式是什么? Redis 开箱即用吗? ServiceStack 的 IRedisClient.AcquireLock 会吗?非常适合这个,或者如果我们不处理分布式锁,这是否太过分了?或者我最好自己实现锁,就像描述的那样 here

提前致谢!

最佳答案

Redis 是一个非阻塞异步服务器,Redis 没有内置语义来阻止客户端连接,直到 key 空闲为止。

注意:Redis 是一个远程 NoSQL 数据存储,因此您实现的涉及 Redis 的任何锁都是按设计“分布式”的。 ServiceStack 的 AcquireLock 使用 Redis 的原始 SETNX 锁定语义来确保只有 1 个客户端连接拥有锁定,所有其他客户端/连接都保持阻塞状态,直到使用指数重试回退乘数进行轮询来释放锁定为止.

为了实现无需轮询的分布式锁,您需要创建一个解决方案,结合使用 SETNX + redis 的 Pub/Sub 支持来通知等待的客户端锁已被释放。

关于asp.net-mvc - 阻止对 Redis key 的访问 (ServiceStack),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14387802/

相关文章:

servicestack - 如何使用 ServiceStack、自己的用户存储库和设备 ID 对请求进行身份验证?

sql-server - 如何将 ASP.NET Identity 表集成到现有数据库中

asp.net-mvc - Intellisense 在 VS 2019 中不建议旧的 MVC5 项目

c# - stackexchange redis hashscan一次性返回所有字段

django - 通过使用 redis 列表进行过滤来控制 Django 查询集结果的排序

servicestack - 从许可服务/API 中删除 "ServiceStack"提及

c# - 基于 ASP.NET Core 中的现有数据库创建 Entity Framework 模型

c# - MVC 5 全局用户帐户对象

redis - 没有Redis的Django channel

C# ServiceStack.Redis SetAll 过期