- android - RelativeLayout 背景可绘制重叠内容
- android - 如何链接 cpufeatures lib 以获取 native android 库?
- java - OnItemClickListener 不起作用,但 OnLongItemClickListener 在自定义 ListView 中起作用
- java - Android 文件转字符串
我正在使用 StackeExchange.Redis在我们的 .NET Core C# 项目中与 Redis 交互的项目。
在重负载下,我们的 Redis 连接将开始失败,并出现以下异常:
StackExchange.Redis.RedisServerException: OOM command not allowed when used memory > 'maxmemory'
问题是我们剩余的可用内存量大得离谱。我们使用的是 Elasticache,因此很容易查找:
我们还可以通过 shell 连接到 Elasticache,并查看是否有可用内存,并与其进行交互。
这是我用作连接信息层的代码。
public class RedisTimeConnectionManager : IRedisConnectionManager
{
// More info about the Lazy<> pattern https://stackoverflow.com/questions/28792196/how-does-connectionmultiplexer-deal-with-disconnects
// Additional information about the multiplexer: https://github.com/StackExchange/StackExchange.Redis/blob/master/docs/Basics.md
private static Lazy<ConnectionMultiplexer> RedisConnectionMultiplexer = new Lazy<ConnectionMultiplexer>(() =>
{
return ConnectionMultiplexer.Connect(ConnectionString);
});
private static string ConnectionString { get; set; }
public RedisTimeConnectionManager(string connectionString)
{
ConnectionString = connectionString;
}
public ConnectionMultiplexer GetConnectionMultiplexer()
{
return RedisConnectionMultiplexer.Value;
}
public IDatabase GetDatabaseConnection()
{
return RedisConnectionMultiplexer.Value.GetDatabase();
}
}
然后我将此连接层传递给我的 Redis“时间”管理器。这是引发 OOM 错误的代码:
public class TimeRedisManager : ITimeRedisManager
{
private IRedisConnectionManager RedisConnectionManager { get; }
public TimeRedisManager(IRedisConnectionManager redisConnectionManager)
{
RedisConnectionManager = redisConnectionManager;
}
public async Task<RedisUserTimelineGetValueDto> GetValueAsync(string id)
{
string key = $"time:{id}";
HashEntry[] entries = await RedisConnectionManager.GetDatabaseConnection().HashGetAllAsync(key);
// Parse and return values...
}
}
因为 Elasticache 有超过 7.5GB 的可用内存,并且因为我可以通过 shell 与它交互,所以我假设它要么是 StackExchange.Redis 库,要么是我的代码中的连接管理问题。
.NET 核心 2.1StackExchange.Redis v 2.0.513
最后一件重要的事情 - 当这个异常发生时,它会一直发生。重新启动与 Redis 交互的服务不会执行任何操作。只有重启 Elasticache 节点才能解决问题。
最佳答案
Redis 可能占用其中存储数据所需内存的 2 倍。
在这里阅读更多:https://redis.io/topics/admin
If you are using Redis in a very write-heavy application, while saving an RDB file on disk or rewriting the AOF log Redis may use up to 2 times the memory normally used. The additional memory used is proportional to the number of memory pages modified by writes during the saving process, so it is often proportional to the number of keys (or aggregate types items) touched during this time. Make sure to size your memory accordingly.
因此,如果 Redis 中存储的数据占用 8 Gb 的空间,在重负载下 Redis 可能会消耗 16 Gbs。如果是这种情况,您可能需要相应地调整内存。
关于Redis Out of Memory 异常,但仍然有足够的内存,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52993019/
对于我的问题,我找不到更好的措辞。 在我的应用程序中的某个时刻,我设置了一些非常密集的动画。问题是,在高端设备上,动画运行流畅且赏心悦目。另一方面,我测试过的一台低端设备在制作动画时表现非常糟糕。 试
我正在修补 OTP 模块 ( yubico_pam ),并尝试访问管理员选择的控制标志(例如必需,足够, ETC)。 有什么想法吗?这是否可行(无需解析文件)? 最佳答案 无法在 API 中查询此信息
我有一些为 Linux 编写的 C 代码,依赖于套接字和 arpa/inet.h 以及 libusb.h,我想在 MinGW 下为 Windows 编译它。 (请注意,当前项目只有一个非常简单的 Ma
我是一名优秀的程序员,十分优秀!