问题标签 [azure-redis-cache]

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 回答
7136 浏览

c# - 使用 StackExchange.Redis 客户端更新 Redis 缓存中的字典对象

我正在使用 azure redis 缓存和 StackExchange.redis 客户端来访问它。我试图弄清楚在 redis 中更新字典值的最佳方法是什么。

上面代码片段中的 _cache 是 StackExchange.Redis.IDatabase 类型。

在初始化时,我将字典对象存储为

FetchAndCacheAsync("诊断", () => new Dictionary());

我有一个函数将被频繁调用以更新字典对象中给定键的 DateTime。

问题:以我对redis缓存的基本知识,我只能想到以下方法来更新存储在redis缓存中的字典的特定键值。

但这对我来说似乎不合适。我相信一定有更好的方法来做到这一点。有什么建议吗?

0 投票
1 回答
2003 浏览

azure - Azure 上的 StackExchange.Redis 引发超时执行 get 并且没有可用的连接异常

我最近将一个提供数据馈送和动态生成的图像(6k rpm 吞吐量)的 MVC 应用程序从 v3.9.67 ServiceStack.Redis 客户端切换到最新的 StackExchange.Redis 客户端(v1.0.450),我看到一些性能下降和一些新的例外。

我们的 Redis 实例是 S4 级别(13GB),CPU 显示相当稳定的 45% 左右,网络带宽显得相当低。我不完全确定如何解释 Azure 门户中的获取/设置图,但它向我们展示了大约 1M 获取和 100k 集(似乎这可能以 5 分钟为增量)。

客户端库切换很简单,我们仍在使用 v3.9 ServiceStack JSON 序列化程序,因此客户端库是唯一更改的部分。

我们使用 New Relic 进行的外部监控清楚地表明,我们在 ServiceStack 和 StackExchange 库之间的平均响应时间从大约 200 毫秒增加到大约 280 毫秒(StackExchange 更慢),没有其他变化。

我们记录了一些异常情况,其中包含以下消息:

执行 GET feed-channels 超时:ag177kxj_egeo-_nek0cew,inst:12,mgr:非活动,队列:30,qu=0,qs=30,qc=0,wr=0/0,in=0/0

我理解这意味着队列中有许多命令已发送,但 Redis 没有响应,这可能是由于长时间运行的命令超过了超时时间造成的。当我们的一个数据服务背后的 sql 数据库正在备份时,这些错误出现了一段时间,所以也许这就是原因?在扩展该数据库以减少负载后,我们还没有看到更多此类错误,但 DB 查询应该发生在 .Net 中,我看不出这将如何阻止 redis 命令或连接。

今天早上,我们还在短时间内(几分钟)记录了大量错误,其中包含以下消息:

没有可用于服务此操作的连接:SETEX feed-channels:vleggqikrugmxeprwhwc2a:last-retry

我们习惯于使用 ServiceStack 库出现短暂的连接错误,这些异常消息通常是这样的:

无法连接:sPort:63980

我的印象是 SE.Redis 应该在后台为我重试连接和命令。我还需要通过 SE.Redis 将我们的调用包装在我自己的重试策略中吗?也许不同的超时值会更合适(尽管我不确定要使用什么值)?

我们的 redis 连接字符串设置了这些参数:abortConnect=false,syncTimeout=2000,ssl=true. 我们使用 的单例实例ConnectionMultiplexer和 的瞬态实例IDatabase

我们绝大多数的 Redis 使用都通过一个 Cache 类,实现的重要部分如下,以防我们做一些愚蠢的事情导致我们出现问题。

我们的key一般是10-30左右的字符串。值主要是标量或相当小的序列化对象集(通常为数百字节到几 kB),尽管我们也将 jpg 图像存储在缓存中,因此大部分数据从几百 kB 到几 MB 不等。

也许我应该对小值和大值使用不同的多路复用器,对于较大的值可能需要更长的超时时间?或者几个/几个多路复用器以防万一一个停顿?

0 投票
4 回答
623 浏览

azure - Azure Redis 缓存 + Azure 上的 WordPress

我已按照本文中的说明进行配置,但 redis 状态始终显示未连接。我试图打开 redis 缓存实例的诊断,但似乎没有任何请求到达服务本身。有任何想法吗?

0 投票
2 回答
11852 浏览

c# - Stackexchange.Redis 超时和套接字故障

我使用 Azure Redis(使用 Stackexchange.Redis)作为缓存存储,它通常工作正常。但是我时不时会遇到超时错误,我无法确定它发生的原因。

我的redis连接设置:

我在同一秒钟内得到所有这些异常(多次调用):[我也在 GET 操作中得到这些。几乎所有这些异常都在 StringSet 和 StringGet 上。我很少在 HashSets 或 HashGets 上遇到异常]

我猜设置对象花费的时间比预期的要长,这可能是由于对象很大,所以我可能会增加同步超时,但这会隐藏其他问题吗?

我只是在对 stackexchange.redis 的同步调用中得到这些异常,当调用是异步时我没有看到异常。

堆栈跟踪:

编辑:我正在使用 StackExchange.Redis 1.0.414 包,我正在使用 MessagePack 序列化我的对象

0 投票
10 回答
74970 浏览

c# - 无法连接到 redis 服务器;创建一个断开的多路复用器

我有以下代码可以连接到 azure redis 缓存。

我用这种方式

但是每天有 1 或 2 次我得到这个例外:

附加信息:无法连接到 redis 服务器;要创建断开连接的多路复用器,请禁用 AbortOnConnectFail。PING 上的 UnableToResolvePhysicalConnection

问题是如果缓存连接失败,我如何重构此代码以访问数据库?

0 投票
3 回答
2670 浏览

.net - 无法通过 StackExchange.Redis 重新连接到 Azure Redis

警告:好的,这是一个奇怪的地方,我不确定 SO 是否是正确的地方。

我有一个连接到 Azure Redis 缓存实例的 Azure 网站。(使用 StackExchange.Redis)

一切都很好,然后有一天 - 网站无法连接到 Redis。

错误:

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

这是我的连接字符串:

mycache.redis.cache.windows.net,ssl=true,password=xxxxxx,syncTimeout=5000

以下是我的诊断步骤:

  1. 尝试从本地连接到 Azure Redis。结果:成功(所以代码很好?)
  2. 尝试启动新的 Azure Redis 实例,从 Azure 连接。结果:失败(网站无法连接到任何 azure Redis 实例?)
  3. 启动新的 Azure 网站,代码与错误代码相同,指向现有的 Redis 缓存。结果:成功(嗯,什么?)
  4. 归档新的 MVC 网站,添加 StackExchange.Redis,部署到新的 Azure 网站,连接到 Redis。结果:成功(所以 Redis 很好?)
  5. 将上面的 vanilla MVC 网站部署到现有的Azure 网站(因此与 4 相同的代码,连接到相同的 Redis,唯一的区别是它使用旧的 Azure 网站物理机/网络)。结果:失败(wtf??)

所以 - 我认为 Redis 已将 Azure 网站“列入黑名单”?(这甚至可能吗?)我知道客户端(我的代码)不会尝试继续重新连接,但我已经多次退回该站点,它就是无法重新连接到 Redis。

使用相同的代码连接到相同的 Redis 实例成功启动的Azure 网站这一事实告诉我,Azure/Redis 中出现了某种黑名单/路由问题。

有任何想法吗?

编辑

看起来问题出在 Azure VNET 上。当我的网站是 Azure 虚拟网络的一部分时,它无法连接到 Redis。但是当我将它网络中取出时,它连接正常。在今天之前,此设置运行良好。

所以我想知道 Azure 是否进行了更改,使 VNET 中的网站无法连接到 Azure Redis?(我知道没有意义)

编辑 2

附件是 Redis 连接尝试的日志。

例外:无法连接到 redis 服务器;要创建断开连接的多路复用器,请禁用 AbortOnConnectFail。PING 连接字符串删除时的SocketFailure :6380,密码 =密码删除,ssl=True 连接连接字符串删除:6380/交互式... BeginConnect:连接字符串删除:6380 指定了 1 个唯一节点 请求平局从连接字符串删除:6380

__Booksleeve_TieBreak... 允许端点 00:00:05 响应... 等待任务完成,IOCP: (Busy=0,Free=1000,Min=1,Max=1000), WORKER: (Busy=4,Free=32763 ,Min=1,Max=32767) 并非所有任务都干净利落地完成,IOCP: (Busy=0,Free=1000,Min=1,Max=1000), WORKER: (Busy=5,Free=32762,Min=1, Max=32767) connection-string-removed :6380 没有响应 等待任务完成,IOCP: (Busy=0,Free=1000,Min=1,Max=1000), WORKER: (Busy=5,Free=32762,Min =1,Max=32767) 并非所有任务都干净利落地完成,IOCP: (Busy=0,Free=1000,Min=1,Max=1000), WORKER: (Busy=5,Free=32762,Min=1,Max= 32767)连接字符串已删除:6380 未能提名 (WaitingForActivation) 未检测到主机 连接字符串已删除:6380:独立v2.0.0,大师;保活:00:01:00;int:连接;子:连接;未使用:DidNotRespond连接字符串已删除:6380:int ops=0,qu=2,qs=0,qc=0,wr=0,socks=1;sub ops=0, qu=0, qs=0, qc=0, wr=0, socks=1 循环操作计数快照;int: 0 (0.00 ops/s; 跨越 10s); sub: 0​​ (0.00 ops/s; 跨越 10s) 同步超时: 0; 一劳永逸:0;最后一次心跳:-1s 前重置失败的连接以重试...重试;剩余尝试:2... 1 个指定的唯一节点正在从连接字符串移除请求平局中断 :6380 > __Booksleeve_TieBreak... 允许端点 00:00:05 响应...等待任务完成,IOCP: (Busy=0,Free=1000,Min=1,Max=1000), WORKER: (Busy=6, Free=32761,Min=1,Max=32767) 并非所有任务都干净利落地完成,IOCP: (Busy=0,Free=1000,Min=1,Max=1000), WORKER: (Busy=7,Free=32760,Min =1,Max=32767) connection-string-removed :6380 没有响应 等待任务完成,IOCP: (Busy=0,Free=1000,Min=1,Max=1000), WORKER: (Busy=7,Free= 32760,Min=1,Max=32767) 并非所有任务都干净利落地完成,IOCP: (Busy=0,Free=1000,Min=1,Max=1000), WORKER: (Busy=7,Free=32760,Min=1 ,Max=32767) connection-string-removed :6380 提名失败 (WaitingForActivation) No masters detected connection-string-removed:6380:独立v2.0.0,大师;保活:00:01:00;int:连接;子:连接;未使用:DidNotRespond connection-string-removed :6380: int ops=0, qu=2, qs=0, qc=0, wr=0, async=3, socks=2; sub ops=0, qu=0, qs=0, qc=0, wr=0, socks=2 循环操作计数快照;int: 0 (0.00 ops/s; 跨越 10s); sub: 0​​ (0.00 ops/s; 跨越 10s) 同步超时: 0; 一劳永逸:0;最后一次心跳:-1s 前重置失败的连接以重试...重试;剩余尝试:1... 1 个指定的唯一节点正在从连接字符串删除请求 tie-break :6380 > __Booksleeve_TieBreak... 允许端点 00:00:05 响应...等待任务完成,IOCP:(忙碌 = 0 ,空闲=1000,最小=1,最大=1000), 工人: (忙=8,空闲=32759,最小=1,最大=32767) EndConnect: connection-string-removed :6380 (socket shutdown) Connect complete: connection-string-removed :6380 所有任务干净完成,IOCP: (Busy=0,Free=1000,Min=1,Max=1000), WORKER: (Busy =11,Free=32756,Min=1,Max=32767) connection-string-removed :6380 faulted: SocketFailure on PING 等待任务完成,IOCP: (Busy=0,Free=1000,Min=1,Max=1000) , WORKER: (Busy=11,Free=32756,Min=1,Max=32767) 并非所有任务都干净利落地完成, IOCP: (Busy=0,Free=1000,Min=1,Max=1000), WORKER: (Busy =7,Free=32760,Min=1,Max=32767) connection-string-removed :6380 提名失败 (WaitingForActivation) No masters detected connection-string-removed:6380:独立v2.0.0,大师;保活:00:01:00;int:连接;子:连接;未使用:DidNotRespond connection-string-removed :6380: int ops=0, qu=2, qs=0, qc=0, wr=0, async=7, socks=3; sub ops=0, qu=0, qs=0, qc=0, wr=0, socks=3 循环操作计数快照;int: 0 (0.00 ops/s; 跨越 10s); sub: 0​​ (0.00 ops/s; 跨越 10s) 同步超时: 0; 一劳永逸:0;最后一次心跳:-1s 前

谁能破译这个?

0 投票
1 回答
673 浏览

stackexchange.redis - Azure Redis 是否通过 http 工作?

Azure Redis 是否支持通过 http 传输。我知道允许我选择是否启用 SSL 的设置。但在我看来,与 Azure Redis 的连接是通过 TCP 进行的。

“每个 Redis Cluster 节点都需要打开两个 TCP 连接。正常的 Redis TCP 端口用于服务客户端,例如 6379,加上数据端口加上 10000 得到的端口,因此示例中为 16379。”

我也在微软论坛上发布了这个问题。可以在这里找到。

0 投票
1 回答
1236 浏览

c# - 即使 TimeSpan.MaxValue 指定过期,HashSet 也会从 Redis 缓存中删除

我正在使用 StackExchange.Redis 客户端访问 Azure Redis 缓存。我正在创建一个哈希集,如下所示:

即使我将到期时间指定为 TimeSpan.MaxValue,哈希集也会在几分钟未使用后被删除。

我错过了什么?

0 投票
1 回答
32947 浏览

c# - mscorlib.dll 中出现“System.Runtime.Serialization.SerializationException”类型的异常,但未在用户代码中处理

我有以下对象:

我正在使用该方法为每个用户为其分配的模块缓存一个特定的键。

第一次工作,当然是从数据库返回数据。但是第二次,(缓存上有一个对象),但模块列表为空:

http://screencast.com/t/OFB1vkvno

我也有来自 stackexchange redis 缓存的这个帮助类:

由于 SEED,我知道有相关数据:

更新1:

这是我第二次尝试获取缓存值时遇到的错误:

mscorlib.dll 中出现“System.Runtime.Serialization.SerializationException”类型的异常,但未在用户代码中处理

堆栈跟踪

0 投票
7 回答
26811 浏览

c# - 没有可用于服务此操作的连接:使用 Azure Redis 缓存时

我有以下代码用于从缓存中获取信息。我不知道我的应用程序是否打开了太多的连接,或者只是这个错误是由于 azure redis 缓存上的暂时故障造成的。

这是堆栈跟踪

[RedisConnectionException:没有可用于服务此操作的连接:GET UserProfileInformation|globaladmin@xx.onmicrosoft.com] StackExchange.Redis.ConnectionMultiplexer.ExecuteSyncImpl(消息消息,ResultProcessor 1 processor, ServerEndPoint server) in c:\TeamCity\buildAgent\work\3ae0647004edff78\StackExchange.Redis\StackExchange\Redis\ConnectionMultiplexer.cs:1922 StackExchange.Redis.RedisBase.ExecuteSync(Message message, ResultProcessor1 处理器,ServerEndPoint 服务器)在 c:\TeamCity\buildAgent\work \3ae0647004edff78\StackExchange.Redis\StackExchange\Redis\RedisBase.cs:80 StackExchange.Redis.RedisDatabase.StringGet(RedisKey key, CommandFlags flags) 在 c:\TeamCity\buildAgent\work\3ae0647004edff78\StackExchange.Redis\StackExchange\Redis\ RedisDatabase.cs:1431 xx.Utils.SampleStackExchangeRedisExtensions.Get(IDatabase cache, String key) 在 C:\Proyectos\xx\xx\Utils\SampleStackExchangeRedisExtensions.cs:20
xx.Cache.UserProfile.GetUserProfile(String identityname) 在 C:\Proyectos\xx\xx\Cache\UserProfile.cs:22
x.Controllers.UserProfileController.GetPropertiesForUser() 在 C:\Proyectos\xx\xx\Controllers\UserProfileController .cs:16
lambda_method(Closure, ControllerBase, Object[]) +61
System.Web.Mvc.ActionMethodDispatcher.Execute(ControllerBase 控制器, Object[] 参数) +14

这是代码

问题是: 1.如何控制如图所示的连接异常,以便用户不会收到错误,而是在 redis 不可用时转到数据库?2. 有没有办法重试 azure redis 缓存的瞬态故障处理?