Мой WebAPI написан с использованием .NET Framework 4.7.2, и я также использую RedisStackChange 2.8.0
У меня возникла проблема, когда количество ключей в Redis достигло около 7 миллионов ключей:
"< Strong>StackExchange.Redis.RedisTimeoutException: таймаут выполнения GET (5000 мс), следующий: GET xxx, inst: 15, qu: 0, qs: 3, aw: False, rs: ReadAsync, ws: Idle, in: 0, in- канал: 0, выходной канал: 132, serverEndpoint: 10.xx.xx.xx:xxxx, mc: 1/1/0, диспетчер: доступно 7 из 10, clientName: XXXX-XXXX, IOCP: (Busy=9, Free=991,Min=16,Max=1000), WORKER: (Busy=146,Free=32621,Min=16,Max=32767)."
Это приводит к замедлению работы приложения. много, я увеличил время ожидания с 5 до 30 секунд, чтобы решить проблему. (Redis и API используют один и тот же сервер — 48 ГБ оперативной памяти).
Интересно, есть ли лучший способ справиться с этим?
Я впервые задаю вопрос, спасибо для чтения ^^
Ниже приведена сокращенная версия моего кода:
public class RedisClient : IDisposable
{
private ConnectionMultiplexer _connection;
public RedisClient()
{
Connect();
}
public void Connect()
{
var configuration = ConfigurationOptions.Parse(ConfigurationManager.AppSettings["REDIS_CONN_STRING"]);
_connection = ConnectionMultiplexer.Connect(configuration);
}
public static RedisClient GetReConnectInstance()
{
if (_redisClient == null)
{
_redisClient = new RedisClient();
}
return _redisClient;
}
private static RedisClient _redisClient;
public static RedisClient GetInstance()
{
if (_redisClient == null)
{
_redisClient = new RedisClient();
}
return _redisClient;
}
public void Dispose()
{
Dispose(true);
GC.SuppressFinalize(this);
}
protected virtual void Dispose(bool disposing)
{
if (disposing)
{
Close();
}
}
}
public class RedisCacheManager
{
private IDatabase _db;
private IMinvoiceDbContext _minvoiceDbContext;
public RedisCacheManager(IMinvoiceDbContext minvoiceDbContext)
{
_minvoiceDbContext = minvoiceDbContext;
try
{
RedisClient redisClient = RedisClient.GetInstance();
_db = redisClient.Database();
}
catch (Exception ex)
{
Log.Error("RedisCacheManager", ex);
ReconnectDB();
}
}
private void ReconnectDB()
{
try
{
RedisClient redisClient = RedisClient.GetReConnectInstance();
_db = redisClient.Database();
}
catch (Exception ex)
{
Log.Error("ReconnectDB", ex);
}
}
public async Task Get(string key)
{
T rs = default(T);
try
{
var rValue = await _db.StringGetAsync(key);
if (!rValue.HasValue)
return default(T);
rs = Deserialize(rValue);
}
catch (RedisConnectionException ex)
{
Log.Error($"Get: {key}", ex);
ReconnectDB();
}
catch (Exception ex)
{
Log.Error("Get", ex);
}
return rs;
}
}
// WHEN I USE REDIS
RedisCacheManager cacheManager = new RedisCacheManager(_minvoiceDbContext);
string old = await cacheManager.Get(CacheKeyManager.CHECK_TAX_CODE_OLD);
Подробнее здесь: https://stackoverflow.com/questions/790 ... er-of-keys
Тайм-аут Redis при наличии большого количества ключей ⇐ C#
Место общения программистов C#
-
Anonymous
1728292756
Anonymous
Мой WebAPI написан с использованием .NET Framework 4.7.2, и я также использую RedisStackChange 2.8.0
У меня возникла проблема, когда количество ключей в Redis достигло около 7 миллионов ключей:
"< Strong>StackExchange.Redis.RedisTimeoutException: таймаут выполнения GET (5000 мс), следующий: GET xxx, inst: 15, qu: 0, qs: 3, aw: False, rs: ReadAsync, ws: Idle, in: 0, in- канал: 0, выходной канал: 132, serverEndpoint: 10.xx.xx.xx:xxxx, mc: 1/1/0, диспетчер: доступно 7 из 10, clientName: XXXX-XXXX, IOCP: (Busy=9, Free=991,Min=16,Max=1000), WORKER: (Busy=146,Free=32621,Min=16,Max=32767)."
Это приводит к замедлению работы приложения. много, я увеличил время ожидания с 5 до 30 секунд, чтобы решить проблему. (Redis и API используют один и тот же сервер — 48 ГБ оперативной памяти).
Интересно, есть ли лучший способ справиться с этим?
Я впервые задаю вопрос, спасибо для чтения ^^
Ниже приведена сокращенная версия моего кода:
public class RedisClient : IDisposable
{
private ConnectionMultiplexer _connection;
public RedisClient()
{
Connect();
}
public void Connect()
{
var configuration = ConfigurationOptions.Parse(ConfigurationManager.AppSettings["REDIS_CONN_STRING"]);
_connection = ConnectionMultiplexer.Connect(configuration);
}
public static RedisClient GetReConnectInstance()
{
if (_redisClient == null)
{
_redisClient = new RedisClient();
}
return _redisClient;
}
private static RedisClient _redisClient;
public static RedisClient GetInstance()
{
if (_redisClient == null)
{
_redisClient = new RedisClient();
}
return _redisClient;
}
public void Dispose()
{
Dispose(true);
GC.SuppressFinalize(this);
}
protected virtual void Dispose(bool disposing)
{
if (disposing)
{
Close();
}
}
}
public class RedisCacheManager
{
private IDatabase _db;
private IMinvoiceDbContext _minvoiceDbContext;
public RedisCacheManager(IMinvoiceDbContext minvoiceDbContext)
{
_minvoiceDbContext = minvoiceDbContext;
try
{
RedisClient redisClient = RedisClient.GetInstance();
_db = redisClient.Database();
}
catch (Exception ex)
{
Log.Error("RedisCacheManager", ex);
ReconnectDB();
}
}
private void ReconnectDB()
{
try
{
RedisClient redisClient = RedisClient.GetReConnectInstance();
_db = redisClient.Database();
}
catch (Exception ex)
{
Log.Error("ReconnectDB", ex);
}
}
public async Task Get(string key)
{
T rs = default(T);
try
{
var rValue = await _db.StringGetAsync(key);
if (!rValue.HasValue)
return default(T);
rs = Deserialize(rValue);
}
catch (RedisConnectionException ex)
{
Log.Error($"Get: {key}", ex);
ReconnectDB();
}
catch (Exception ex)
{
Log.Error("Get", ex);
}
return rs;
}
}
// WHEN I USE REDIS
RedisCacheManager cacheManager = new RedisCacheManager(_minvoiceDbContext);
string old = await cacheManager.Get(CacheKeyManager.CHECK_TAX_CODE_OLD);
Подробнее здесь: [url]https://stackoverflow.com/questions/79060991/redis-timeout-when-there-are-a-large-number-of-keys[/url]
Ответить
1 сообщение
• Страница 1 из 1
Перейти
- Кемерово-IT
- ↳ Javascript
- ↳ C#
- ↳ JAVA
- ↳ Elasticsearch aggregation
- ↳ Python
- ↳ Php
- ↳ Android
- ↳ Html
- ↳ Jquery
- ↳ C++
- ↳ IOS
- ↳ CSS
- ↳ Excel
- ↳ Linux
- ↳ Apache
- ↳ MySql
- Детский мир
- Для души
- ↳ Музыкальные инструменты даром
- ↳ Печатная продукция даром
- Внешняя красота и здоровье
- ↳ Одежда и обувь для взрослых даром
- ↳ Товары для здоровья
- ↳ Физкультура и спорт
- Техника - даром!
- ↳ Автомобилистам
- ↳ Компьютерная техника
- ↳ Плиты: газовые и электрические
- ↳ Холодильники
- ↳ Стиральные машины
- ↳ Телевизоры
- ↳ Телефоны, смартфоны, плашеты
- ↳ Швейные машинки
- ↳ Прочая электроника и техника
- ↳ Фототехника
- Ремонт и интерьер
- ↳ Стройматериалы, инструмент
- ↳ Мебель и предметы интерьера даром
- ↳ Cантехника
- Другие темы
- ↳ Разное даром
- ↳ Давай меняться!
- ↳ Отдам\возьму за копеечку
- ↳ Работа и подработка в Кемерове
- ↳ Давай с тобой поговорим...
Мобильная версия