При использовании StackExchange.Redis для обработки кэша redis ошибка следующая:
StackExchange.Redis.RedisServerException: MISCONF Redis is configured to save RDB snapshots, but is currently not able to persist on disk. Commands that may modify the data set are disabled. Please check Redis logs for details about the error.
Временное решение, изменять файл redis.windows.conf,Сервис Redis нужно перезапустить, установлен следующим образом:
Если вы не хотите перезапускать сервис Redis, можно использовать команду redis-cli и настроить её следующим образом:
Объяснение следующее:
# По умолчанию Redis перестанет принимать записи, если RDB-снимки включены # (по крайней мере одна точка сохранения) и последнее фоновое сохранение провалилось. # Это даст пользователю понять (в жёстком смысле), что данные не сохраняются # правильно на диске, иначе, скорее всего, никто не заметит, и некоторые # Катастрофа случится.
# # Если процесс фонового сохранения снова начнёт работать, Redis начнёт работать # автоматически разрешаю запись снова.
# # Однако, если вы настроили правильный мониторинг сервера Redis # и постоянство, возможно, стоит отключить эту функцию, чтобы Redis # продолжать работать как обычно, даже если возникают проблемы с диском, # разрешения и так далее. Проще говоря: Redis нужно форковать основной процесс, чтобы избежать имитации смерти основного процесса при сохранении данных на жёсткий диск, а затем завершить операцию сохранения данных на жёсткий диск в процессе форка; если основной процесс использует 4 ГБ памяти, требуется дополнительно 4 ГБ, когда подпроцесс форка понадобится, в этот момент памяти недостаточно, форк выходит из строя, и тогда жёсткий диск с сохранением данных тоже выходит из строя. Чтобы просмотреть логи redis, нужно настроить redis.windows.conf следующим образом:
# Укажите имя файла журнала. Также «stdout» можно использовать для форсирования # Redis для входа на стандартный выход. logfile "E:/Redis-x64-3.2.100/redis.txt" Исключения логарифма следующие:
[8984] 14 мая 14:05:09.060 * Сохранение фона начато с помощью pid 8672 [8672] 14 мая 14:05:09.169 # Версия Redis для Windows сохраняет кучную память из файла системного страницирования для совместного использования с форкированным процессом, используемым для операций сохранения. В настоящее время недостаточно непрерывного свободного пространства в системный пейджинг. Вы можете увеличить размер файла системного пейджинга. Иногда перезагрузка достаточно дефрагментирует файл системного пейджинга, чтобы Операция была успешно завершена.
Редис не может продолжать. Выход. [8984] 14 мая 14:05:09.278 # работа вилки не удалась
После анализа выяснилось, что проблема с конфигурацией максимального размера кучи «maxheap» связана с недостатком доступной памяти.
Решение
Откройте конфигурационный файл Redis "redis.windows.conf" и найдите следующий раздел кода:
# Куча Redis должна быть больше значения, указанного максимальной памятью # флаг, так как у кучного аллокатора есть свои собственные требования к памяти и # Фрагментация кучи неизбежна. Если только флаг maxmemory — это # Указано, maxheap будет установлен на 1.5*maxmemory. Если флаг maxheap — # указано вместе с maxmemory, флаг maxheap будет автоматически # увеличивается, если он меньше 1.5*max памяти. # # Maxheap <bytes> Добавление этой настройки — это хорошо,Сервис Redis не запускается!!!!!!!
Значение по умолчанию: maxheap 1024000000≈976.56M
Я не нашёл этот комментарий в файле conf, я нашёл что-то вроде этого:
# Не используйте больше памяти, чем указанное количество байт. # Когда лимит памяти достигнут, Redis попытается удалить ключи # согласно выбранной политике выселения (см. maxmemory-policy).
# # Если Redis не может удалить ключи согласно политике, или если политика # установлен на 'noeviction', Redis начнёт отвечать ошибками в командах #, которые будут использовать больше памяти, например SET, LPUSH и так далее, и продолжают работать # отвечать только на команды для чтения, такие как GET.
# # Эта опция обычно полезна при использовании Redis как кэша LRU или для установки # Жёсткий лимит памяти для экземпляра (с использованием политики 'noeviction').
# # ПРЕДУПРЕЖДЕНИЕ: Если к экземпляру прикреплены слейпы с включённой maxmemory, # размер выходных буферов, необходимых для питания подчинённых, вычитается # от количества использованной памяти, так что проблемы с сетью / ресинхронизации будут # не запускать петлю, в которой убираются ключи, а затем и выход # Buffer of slaves заполнен DEL ключей, которые выведут удаление # дополнительных ключей и так далее, пока база данных полностью не опустошается.
# # Короче говоря... Если к вам прикреплены рабы, рекомендуется установить более низкий # лимит для maxmemory, чтобы в системе оставалась свободная оперативная память для слейва # буферы выхода (но это не обязательно, если политика — 'noeviction').
# # ВНИМАНИЕ: если не установить maxmemory, Redis завершит # исключение вне памяти, если достигнут лимит кучи.
# # ПРИМЕЧАНИЕ: поскольку Redis использует файл системного пейджинга для выделения памяти кучи, # Использование рабочей памяти, отображаемое диспетчером задач Windows или другим # инструменты, такие как ProcessExplorer, не всегда будут точными. Например, правильно # после фонового сохранения файлов RDB или AOF, значение рабочего множества # может значительно упасть. Чтобы проверить правильное количество используемой памяти # через redis-server для хранения данных используйте команду INFO client. ИНФОРМАЦИЯ Команда # показывает только память, используемую для хранения данных Redis, а не лишнюю # памяти, используемой процессом Windows для собственных требований. Th3 дополнительное количество # памяти, не сообщаемой командой INFO, можно вычислить, вычитая # Пиковый рабочий набор сообщается диспетчером задач Windows и used_memory_peak # сообщается командой INFO.
# # maxmemory <bytes> Внимание: если лимит кучи достигнут, отсутствие максимальной памяти приведёт к завершению Redis с исключением вне памяти.
Примечание: из-заRedis использует файлы системного пейджинга для выделения кучной памяти,
Диспетчер задач Windows или другие инструменты, такие как ProcessExplorer, не всегда показывают точное использование памяти рабочих наборов. Проще говоря,Использование памяти, отображаемое диспетчером задач, неточно!!!
Используйте команду info для следующего запроса:
# Память used_memory:2011338768 used_memory_human:1.87G used_memory_rss:2011279992 used_memory_rss_human:1.87G used_memory_peak:2011338768 used_memory_peak_human:1.87G total_system_memory:0 total_system_memory_human:0B used_memory_lua:37888 used_memory_lua_human:37.00 км
maxmemory:0 maxmemory_human:0B maxmemory_policy:noeviction mem_fragmentation_ratio:1.00 mem_allocator:jemalloc-3.6.0
Настройки следующие:
1073741824 байтов = 1G После настройки клиент redis .net добавляет ошибку кэша следующим образом:
Команда OOM не допускается при использовании памяти > 'maxmemory'. # MAXMEMORY POLICY: как Redis выберет, что удалить при maxmemory # достигнуто. Вы можете выбрать одно из пяти видов поведения:
# # volatile-lru -> удалить ключ с помощью набора истечения с использованием алгоритма LRU # allkeys-lru -> удалить любой ключ согласно алгоритму LRU # волатильно-случайный -> удалить случайный ключ с набором срока действия. # allkeys-random -> убери случайный ключ, любой ключ # volatile-ttl -> убрать ключ с ближайшим сроком истечения (незначительный TTL) # noeviction -> не истекает вовсе, просто возвращает ошибку при операциях записи
# # Примечание: с любой из вышеуказанных политик Redis выдаст ошибку при записи # операции, когда нет подходящих ключей для выселения.
# # На момент написания эти команды: set setnx setex append # Incr decr rpush lpushx lpushx linsert lset rpoplpush sadd # sinter sinterstore sunion sunionstore sdiff sdiffstore zadd zincrby # zunionstore zinterstore hset hsetnx hmset hincrby incrby decrby # getset mset mset, msetnx exec sort
# # По умолчанию это так:
# # Maxmemory-политика невыселения #MAXMEMORY策略: Когда MAXMEMORY
#到达. Вы можете выбрать один из пяти видов поведения:
#
#volatile LRU-> использует алгоритм LRU для удаления ключей с множествами срока действия
#allkeys LRU-> удалять любой ключ согласно алгоритму LRU
#volatile random — > удалять случайные ключи с просроченными наборами
#allkeys случайных > удалять случайные ключи, произвольные ключи
#volatile TTL-> Удалить ключ с ближайшим сроком действия (Minor TTL)
#noeviction-> вообще не истекает, только возвращает ошибки при записи
#
#注意: Для любой из вышеуказанных стратегий Redis возвращает ошибку при записи
#操作, когда нет подходящего ключа для выселения.
#
#在编写之日, следующие команды: set setnx setex append
#递增递减rpush lpushx lpushx linsert lset rpoplpush sadd
#烧结店sunion sunionstore sdiff sdiffstore zadd zincrby
#zunionstore Zinterstore Hset Hsetnx HMSET Hincrby Incrby Decrby
#getset MSET MSETnx Exec Sorting
#
#默认值为:
#
#maxmemory策略无效 Также нужно настроить следующие конфигурации:
Настройка redis по умолчанию очень консервативна, то есть она не сохраняется после превышения лимита памяти, и политика может быть изменена на алгоритм LRU (наименее используемый алгоритм в последнее время) — новая сохранённая информация заменит старую.
Обзор:
(Конец)
|