问题标签 [stackexchange.redis]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
1 回答
2995 浏览

redis - Stackexchange.Redis ConnectionMultiplexer.Connect() 在连接失败时什么都不做?

我尝试通过连接到我的 Redis Serverinstance,ConnectionMultiplexer.Connect("127.0.0.1");但尽管没有服务器启动并运行,连接不会引发错误或引发任何ConnectionFailed事件。我仔细检查了我没有运行任何独立实例或 Redis 的 Windows 服务。

如何检查连接是否成功?我在 .Net 4.5 上运行并使用 StackExchange.Redis 版本 4.0.30319

谢谢

0 投票
1 回答
6506 浏览

c# - 尝试在 redis 中的 2 组中插入 750 个项目时出现 StackExchange TimeoutException

最初我试图将一些项目集合插入到 2 个 redis 集中(也许这根本不是一个好主意,但是......)。我尝试一次添加的条目数量: 750+

现在我在尝试使用 StackExchange.redis客户端执行此操作时确实收到超时异常,有趣的是我能够使用我之前调查过的“旧版”booksleeve 客户端完成类似的操作。

所以,我肯定在某些事情上错了(甚至可能在我最初的 bookSleeve 实现中),只是想弄清楚到底出了什么问题。以下是我与 redis 客户端一起使用的代码示例: BookSleeve:

StackExchange.redis 实现相同的代码:

开始单元测试后,我收到 StackExchange 客户端的下一个错误:

Message: Timeout performing EXEC, inst: 3, queue: 3, qu=0, qs=3, qc=0, wr=0/0

Source: in StackExchange.Redis.ConnectionMultiplexer.ExecuteSyncImpl[T](Message message, ResultProcessor1 processor, ServerEndPoint server) in c:\TeamCity\buildAgent\work\18a91a3757cef937\StackExchange.Redis\StackExchange\Redis\ConnectionMultiplexer.cs:line 1693 in StackExchange.Redis.RedisBase.ExecuteSync[T](Message message, ResultProcessor1 processor, ServerEndPoint server) in c:\TeamCity\buildAgent\work\18a91a3757cef937\StackExchange.Redis\StackExchange\Redis\RedisBase.cs:line 92 in StackExchange.Redis.RedisTransaction.Execute(CommandFlags flags) in c:\TeamCity\buildAgent\work\18a91a3757cef937\StackExchange.Redis\StackExchange\Redis\RedisTransaction.cs:line 51 in DFS.Cache.CacheManager.RedisStackExchange.RedisContestCacheManager.RegisterAvailableContests(IList1 contests) in d:\Projects\DFS\Code\DFS\DFS.Cache.CacheManager.RedisStackExchange\RedisContestCacheManager.cs:line 131

只是想知道,我到底做错了什么。提前感谢您的任何建议!

PS 对于 stackEchange.redis 配置,我使用的是 Marc 从 github 提供的配置示例(可在此处获得:StackExchange/StackExchange.Redis/blob/master/Docs/Configuration.md)

PS 请查看当前的 StackExchange 客户端配置文件:

标准条目(用于集合)如下所示:

PS 在 Marc 的回复之后,我运行了几个测试并在单元测试中遇到了一些其他错误,例如

所以我同意这是连接问题,与当前切换到 StackExchange.redis 客户端无关。

0 投票
0 回答
494 浏览

c# - 使用 Sets 和 .Net 客户端在 redis 中管理 2 个集合。这是正确的方法吗?

我正在尝试为 .NET 领域工作/研究 redis,我有一个印象,定义的任务不是最好用 Sets 和 redis 本身覆盖(因为我确实有需要修改的实体) - 所以也许最好使用这里有一些其他方法/或redis数据类型(最初的想法之一是使用redis哈希(管理属性),但后来我决定尝试使用集合,因为我需要获取相关实体的集合,这个操作似乎是一般最重要的一项)。所以,我现在做了什么:

现在我确实有实体的下一个配置:

我正在尝试做的是管理具有 2 个集合的实体项目:

  1. 当前- 可供客户端使用的实体项目(最多 5000 个)的集合(缓存)
  2. 原始- 必须批准的实体项目的集合(最多 10% 的当前集合的唯一 ID)

我将对这些集合执行的操作是:

  1. 从当前集合中获取所有实体项目:GetCurrent - 最关键的任务
  2. 修改原始集合:

    2.1)将新实体添加到 Raw 中(可以更改当前集合中的适当计数器/状态):AddRaw

    2.2) 更新 Raw 中的现有实体(如果此类 Id 已经可用):UpdateRaw

  3. 修改当前集合

    3.1)原始集合的所有更改都应用于当前(如果尚未完成):SyncCurrent

    3.2)返回原始集合实体(增量更改)

    3.3)清除原始集合实体(集合被重置)

方法:

  1. 定义 Set 类型的集合(能够获取与集合相关的项目列表):SMEMBERS

  2. 创建其他集合 Current:Ids, Raw:Ids 将仅包含集合中项目的 Id - 定义项目是否在原始集合中:SISMEMBER

  3. 将新项目添加到集合中:SADD

  4. 修改 Set(s) 中的项目:获取(SMEMBERS:SSCAN使用 Id 作为掩码元素或迭代项目(SMEMBERS),获取具有 ID 的实体),RemoveOldFromSet:SREM,AddUpdated:SADD

问题,问题(在单元测试期间确定):(所有报告的问题似乎都与与 redis 服务器本身的连接有关,而不是 StackExchange.redis 客户端的功能)

  1. 新的 StackExchange 客户端有时会在 SMEMBERS 上引发超时异常(当前集合中有 500 个项目)

  2. StackExchange 事务在尝试将项目(750 多个条目)插入当前和当前集合时抛出超时异常:Ids,当前 connectionTimeOut 和 SyncTimeOutrs 设置为 5000 毫秒(5 秒)

在运行了一些测试之后(集合内有数百个项目,我认为选择的方法最初是错误的,必须重新设计 - 使用 Microsoft 的缓存。)是否有其他人有类似的疑问或可以根据自己的经验说类似的任务应该没有按照我刚才描述的方式实施?

先感谢您。

0 投票
2 回答
7542 浏览

c# - 我在 Stack Exchange Redis 中找不到与键等效的命令

我刚刚切换到 Stack Exchange Redis,但找不到等效的命令键。它是省略还是在其他地方而不是 getdatabase()?

0 投票
1 回答
37239 浏览

stackexchange.redis - StackExchange.Redis 超时和“没有可用于服务此操作的连接”

我在我们的生产环境中遇到以下问题(Web-Farm - 4 个节点,在它之上负载均衡器):

1)Timeout performing HGET key, inst: 3, queue: 29, qu=0, qs=29, qc=0, wr=0/0 at StackExchange.Redis.ConnectionMultiplexer.ExecuteSyncImpl[T](Message message, ResultProcessor``1 processor, ServerEndPoint server) in ConnectionMultiplexer.cs:line 1699这在一分钟内发生 3-10 次

2)No connection is available to service this operation: HGET key at StackExchange.Redis.ConnectionMultiplexer.ExecuteSyncImpl[T](Message message, ResultProcessor``1 processor, ServerEndPoint server) in ConnectionMultiplexer.cs:line 1666

我尝试按照 Marc 的建议实现(也许我解释错了)——与 Redis 的连接比多个连接更好。我做了以下实现:

实际上 dispose 现在没有被使用。此外,我还有一些可能导致这种行为的实现细节(我只使用哈希): 1. 添加、删除哈希 - 异步 2. 获取 -sync

有人可以帮助我如何避免这种行为吗?

提前非常感谢!

已解决 - 评估网络功能后增加客户端连接超时。

更新2:实际上它并没有解决问题。当缓存卷开始增加时,例如从 2GB。然后我看到了同样的模式,实际上这些超时大约每 5 分钟发生一次。我们的网站每 5 分钟被冻结一段时间,直到分叉操作完成。然后我发现有一个选项可以每 x 秒进行一次分叉(保存到磁盘):

就我而言,它是“保存 300 10”——如果发生至少 10 次更新,则每 5 分钟保存一次。我还发现“叉子”可能非常昂贵。评论“保存”部分完全解决了问题。我们可以评论“保存”部分,因为我们只使用 Redis 作为“内存中的缓存”——我们不需要任何持久性。这是我们的缓存服务器“Redis 2.4.6”windows 端口的配置:https ://github.com/rgl/redis/downloads

也许它已经在 MSOpentech 中的 Redis windows 端口的最新版本中得到了解决:http://msopentech.com/blog/2013/04/22/redis-on-windows-stable-and-reliable/ 我还没有测试过.

无论如何,StackExchange.Redis 与这个问题无关,它在我们的生产环境中工作得相当稳定,这要感谢 Marc Gravell。

最后更新: Redis 是单线程解决方案 - 它最终速度很快,但是当涉及到释放内存(删除过时或过期的项目)时,问题出现了,因为一个线程应该回收内存(不是快速操作 - 无论使用什么算法),并且同一个线程应该处理 GET、SET 操作。当我们谈论中等负载的生产环境时,当然会发生这种情况。即使您在达到内存屏障时使用带有从属的集群,它也会具有相同的行为。

0 投票
1 回答
548 浏览

stackexchange.redis - StackExchange.Redis:找不到 Redis 命令之一

Redis中有一个名为“Keys”的命令,当给定一个模式时,您可以获得所有匹配的键。但我在 StackExchange.Redis 中找不到它。谁能告诉我在 StackExchange.Redis 中哪里可以找到这个命令?

0 投票
4 回答
41019 浏览

c# - StackExchange.Redis ConnectionMultiplexer.Connect() 间歇性工作

StackExchange.Redis用来与 3 个不同的 Redis 实例通信:1 个在同一子网上,2 个远程。这是我的配置代码:

最后一行大约 70% 的时间会引发连接异常:

无法连接到 redis 服务器;要创建断开连接的多路复用器,请禁用 AbortOnConnectFail

为什么这是间歇性的和/或我做错了什么?当我在命令提示符下 ping Redis 服务器时,丢包率为 0%,响应时间小于 1 毫秒。网络很稳定。

谢谢!

编辑

以下是失败时的日志输出:

0 投票
2 回答
12290 浏览

c# - 使用 StackExchange.Redis 的 Redis 键空间通知

我环顾四周,找不到如何使用 StackExchange.Redis 库在 Redis 上执行对键空间通知的订阅。

检查可用测试我发现 pubsub 使用通道,但这更像是服务总线/队列,而不是订阅特定的 Redis 键事件。

是否可以使用 StackExchange.Redis 来利用此 Redis 功能?

0 投票
1 回答
2497 浏览

redis - Stackexchange.Redis,我可以一次发布到多个频道吗?

我可以使用 glob 样式模式将消息发布到同一命令中的多个通道,例如Connection.GetSubscriber().Publish("room/*", "my message")消息会发布到与该模式匹配的所有通道吗?

如果我误解了 Redis 中的基本 pub/sub 模式,上述问题可能毫无意义。我的理解是,每个Subscribe命令都会在 Redis 服务器上建立一个通道,因此服务器知道通道 ID,因此当服务器接收到发布命令时,它应该能够将发布的消息“扇出”到所有匹配的通道glob 样式的模式。如果我错了,请纠正。

另外一个问题,我假设我也可以使用 glob 样式模式订阅多个频道,对吗?

谢谢

0 投票
0 回答
943 浏览

c# - StackExchange.Redis,无法从服务器故障和恢复中恢复

我运行一个测试应用程序,它通过以下方式连接到 Redis 服务器:

当我现在关闭服务器时(当我的客户端仍在运行时),我收到以下错误消息:

与 Redis 服务器的连接失败:127.0.0.1:6379/Interactive 上的 SocketFailure,输入缓冲区:0,未完成:0,最后读取:9 秒前,最后写入:9 秒前,保持活动:-1 秒,待处理:0 , state: ConnectedEstablished, last-heartbeat: 0s ago, last-mbeat: 0s ago, global: 0s ago

一切都按预期进行(我无法评论上面的确切错误消息内容,因为它来自 StackExchange.Redis 内部)但是当我重新启动服务器时,客户端不再从服务器关闭中恢复,回调不会在Connection.ConnectionRestored. 有什么我做错了吗?

我的 C# 客户端是 StackExchange.Redis 版本 1.0.242.0 (v4.0.30319),我运行的是 MS Open Tech Group 的 2.8.4 版本,尽管我怀疑错误来自 StackExchange.Redis。