通过多个实例扩展Web应用程序是azure cloud的最大优势之一.为了实现对我们的Web角色云应用程序的多个VM支持,我们正在实施Azure Redis缓存.我们使用RedisSessionStateProvider提供程序来维护会话状态.以下是web.config文件中会话管理的配置设置.
<authentication mode="Forms">
<forms loginUrl="~/Login" slidingExpiration="true" timeout="20" defaultUrl="~/Default" />
</authentication>
<sessionState timeout="20" mode="Custom" customProvider="MySessionStateStore">
<providers>
<add name="MySessionStateStore" type="Microsoft.Web.Redis.RedisSessionStateProvider"
host = "dummy.redis.cache.windows.net"
port = "6380"
accessKey = "dummysecretkey"
ssl = "true"
throwOnError = "true"
retryTimeoutInMilliseconds = "5000"
databaseId = "0"
applicationName = ""
connectionTimeoutInMilliseconds = "5000"
operationTimeoutInMilliseconds = "1000"
connectionString = ""/>
</providers>
Run Code Online (Sandbox Code Playgroud)
我们的问题是会话超时没有随着用户的回发而延长,假设我们的用户在上午10:00登录应用程序,那么他的会话数据将在绝对时间上午10:20到期.如果用户在上午10:15回发,那么会话应该在上午10:35到期,但这不会发生,它将在10:20 AM绝对到期.
以下是登录按钮的点击事件中的代码
protected void Button1_Click(object sender, EventArgs e)
{
FormsAuthentication.SetAuthCookie(TextBox1.Text.Trim(), true);
ConnectionMultiplexer connection = ConnectionMultiplexer.Connec("dummy.redis.cache.windows.net,ssl=true,password=dummysecretkey");
IDatabase cache = connection.GetDatabase();
Session["UserName"] = TextBox1.Text;
Response.Redirect("Default.aspx");
}
Run Code Online (Sandbox Code Playgroud)
如果能让我知道在滑动模式下获得会话超时需要做什么,我将不胜感激.最好的祝福, …
我有一个方案,我计划设置Azure Redis缓存条目的过期时间,以确保我们不保留在特定时间点之后没有任何价值的数据,例如
cache.StringSet(this.cacheId, this.Serialize(), expiry);
Run Code Online (Sandbox Code Playgroud)
同样,其目的是通过包含比实际使用的条目更多的条目来防止Redis缓存性能受到任何影响。
Azure Redis是在条目达到定义的过期时间时刷新条目,还是仅在受到压力以减少内存占用量和后端持久存储时才这样做?
在这本书的结尾处,我略有结束:)我有一个原型(太大而无法共享太多依赖项),出于多种原因使用了Redis-其中之一是存储序列化值,并控制更新通过使用带有LockTake/Release
单独键的保护锁来获得该值。
整个应用看起来像这样(注意:此代码段无法重现我的问题!):
using Nito.AsyncEx;
using StackExchange.Redis;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace RedisAzureLockingTest
{
class Program
{
static void Main(string[] args)
{
AsyncContext.Run(async () =>
{
var cm = await ConnectionMultiplexer.ConnectAsync("blah:6379,ssl=false,password=blah,defaultDatabase=1,syncTimeout=5000");
var db = cm.GetDatabase();
// store key
RedisKey key = "thisisourtest";
await db.StringSetAsync(key, "initial value", flags: CommandFlags.DemandMaster); // SET
// acquire lock
RedisKey lockkey = "thisisourtest.lock";
string locktoken = Guid.NewGuid().ToString();
bool success = await db.LockTakeAsync(lockkey, locktoken, TimeSpan.FromDays(1), CommandFlags.DemandMaster);
if (!success) throw new …
Run Code Online (Sandbox Code Playgroud) 我使用Azure Redis缓存来存储一些快速查找数据,这个缓存由10个客户端应用程序读取/连接.所有应用程序都是用.NET 4.6编写的,这包括ASP.NET MVC Web应用程序,Web API以及每1秒运行一次的工作者角色.所有客户端都使用StackExchange.Redis连接到Cache.但是,我得到间歇性超时,我发现在Azure门户中,最大连接数已达到1000(对于我的定价层).由于我只有10个客户端应用程序,而且这些应用程序都不是多线程的,因此可以创建与缓存的1000个连接?
我可以为缓存客户端提供哪些最佳实践?
有没有一种简单的方法可以查看Azure上Redis缓存中的内容?我的意思是某种工具?
我知道如何以编程方式进行操作,但是有时在编写代码时,我希望能够快速查看Redis缓存中的内容而不必切换到其他代码。
我使用 spring-data-redis(2.1.5.RELEASE) 和 jedis(2.10.2) 客户端从作为 spring-boot 应用程序运行的不同服务连接到我的 azure redis 实例。
通过实现以下配置,两个服务具有相同的缓存方法并指向相同的缓存。我面临的问题是,当一个服务尝试读取另一服务创建的缓存值时,会发生反序列化异常。
例外:
org.springframework.data.redis.serializer.SerializationException:无法反序列化;嵌套异常是 org.springframework.core.serializer.support.SerializationFailedException:无法反序列化有效负载。字节数组是DefaultDeserializer相应序列化的结果吗?嵌套异常是 org.springframework.core.NestedIOException:无法反序列化对象类型;嵌套异常是 java.lang.ClassNotFoundException
注意:我仅使用 redis 来缓存从数据库读取的数据。
public RedisCacheWriter redisCacheWriter(RedisConnectionFactory connectionFactory) {
return RedisCacheWriter.nonLockingRedisCacheWriter(connectionFactory);
}
@Bean
public RedisCacheManager cacheManager() {
Map<String, RedisCacheConfiguration> cacheNamesConfigurationMap = new HashMap<>();
cacheNamesConfigurationMap.put("employers", RedisCacheConfiguration.defaultCacheConfig().entryTtl(Duration.ofSeconds(90000)));
cacheNamesConfigurationMap.put("employees", RedisCacheConfiguration.defaultCacheConfig().entryTtl(Duration.ofSeconds(90000)));
RedisCacheManager manager = new RedisCacheManager(redisCacheWriter(), RedisCacheConfiguration.defaultCacheConfig(), cacheNamesConfigurationMap);
manager.setTransactionAware(true);
manager.afterPropertiesSet();
return manager;
}
Run Code Online (Sandbox Code Playgroud)
public RedisCacheWriter redisCacheWriter(RedisConnectionFactory connectionFactory) {
return RedisCacheWriter.nonLockingRedisCacheWriter(connectionFactory);
}
@Bean
public RedisCacheManager cacheManager() {
Map<String, RedisCacheConfiguration> cacheNamesConfigurationMap = new HashMap<>();
cacheNamesConfigurationMap.put("employees", RedisCacheConfiguration.defaultCacheConfig().entryTtl(Duration.ofSeconds(90000)));
RedisCacheManager manager …
Run Code Online (Sandbox Code Playgroud) 我们在 Azure 上有两个 Azure Redis 实例。源位于 Azure 中的“标准”设置。我们需要将所有 35GB 从标准版本复制到高级版本(而不是迁移)。
最好的方法是什么?数据应该是静态的。您无法以标准方式导出数据,也无法进行分片。我们已经达到了最大大小,需要迁移到支持分片的大小。
我们在Azure上有一个Redis缓存Standard 2.5gb
.我们观察到以下行为:
我们时不时地观察到内存使用率大幅下降.似乎有很多资源被驱逐.
注意事项:
我的问题是,除了明确驱逐密钥的应用程序逻辑外,还有其他任何情况Redis会驱逐大量的密钥吗?
Azure Redis 缓存是否允许我设置一个函数,以便在缓存中的某个键过期时可靠地触发?
我们在 .NET Core 3.1 与 Azure Redis 缓存的集成中遇到了问题。抛出的异常是
执行请求时发生未处理的异常。","@l":"错误","@x":"StackExchange.Redis.RedisTimeoutException: 等待响应超时(出站 = 1403KiB,入站 = 5657KiB,已过去 15000 毫秒,超时为15000ms),command=EVAL,下一个:EVAL,inst:0,qu:0,qs:709,aw:True,rs:ReadAsync,ws:写入,in:0,serverEndpoint:redis-scr-mns-dev.redis .cache.windows.net:6380,mc:1/1/0,mgr:10 个可用,共 10 个可用,clientName:xxxxxxxxxxxx,IOCP:(忙碌 = 0,空闲 = 1000,最小 = 4,最大 = 1000),工作人员: (Busy=7,Free=32760,Min=4,Max=32767), v: 2.1.58.34321(请查看这篇文章,了解一些可能导致超时的常见客户端问题: https://stackexchange.github .io/StackExchange.Redis/超时)
是的,我已经阅读了这篇文章,我们正在使用 StackExchange.Redis NuGet 包,最新版本可用。我们已经采取的步骤是
你问的设置是什么?