Використовуючи 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 # і persistence, можливо, варто вимкнути цю функцію, щоб Redis це зробив # продовжувати працювати як зазвичай навіть якщо виникають проблеми з диском, # дозволи і так далі. Простіше кажучи: Redis потрібно форкувати основний процес, щоб уникнути імітації смерті основного процесу при збереженні даних на жорсткий диск, а потім завершити операцію збереження даних на жорсткий диск у процесі форку, якщо основний процес використовує 4GB пам'яті, потрібно додатково 4GB, коли потрібен підпроцес, у цей момент пам'яті недостатньо, форк виходить з ладу, і тоді жорсткий диск для збереження даних також виходить з ладу. Щоб переглянути журнали 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
Я не знайшов цього коментаря у файлі конференції, я знайшов щось подібне:
# Не використовуйте більше пам'яті, ніж зазначена кількість байтів. # Коли ліміт пам'яті досягнуто, 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, значення робочого набору # може суттєво впасти. Щоб перевірити правильну кількість використаної пам'яті # by redis-server для збереження даних використовуйте команду INFO client. ІНФО команда # показує лише пам'ять, що використовується для зберігання даних Redis, а не додаткову # пам'ять, яку використовує процеси Windows для власних вимог. Th3 додаткова кількість # пам'яті, не зареєстрованої командою INFO, можна обчислити, віднімаючи # Піковий робочий набір повідомляється диспетчером завдань Windows та used_memory_peak # повідомляється командуванням INFO.
# # макспам'ять <bytes> Попередження: якщо ліміт купи досягнуто, невстановлення maxmemory призведе до завершення Redis через виключення out-of-memory.
Примітка: ЧерезRedis використовує файли системної сторінки для виділення пам'яті купи,
Windows Task Manager або інші інструменти, як-от 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.00K
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 -> видалити ключ за допомогою набора expire за допомогою алгоритму LRU # allkeys-lru -> видалити будь-який ключ згідно з алгоритмом LRU # волатильно-випадковий -> видалити випадковий ключ із набором терміну дії # allkeys-random -> прибрати випадковий ключ, будь-який ключ # волатильно-ttl -> видалити ключ з найближчим терміном дії (незначний TTL) # noeviction -> взагалі не закінчується, просто повертає помилку при операціях запису
# # Примітка: з будь-якою з наведених вище політик Redis поверне помилку при записі # операції, коли немає відповідних ключів для виселення.
# # На момент написання ці команди: set setnx setex append # інкр декр рштш лшшіс рпуш лшісх лвстав лсет рпоплшот садд # сінтер-сінтерстор 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 випадковий — > видаляє випадкові ключі з простроченими наборами
#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 mset-Exec Sorting
#
#默认值为:
#
#maxmemory策略无效 Вам також потрібно налаштувати такі конфігурації:
Стандартне налаштування redis дуже консервативне, тобто воно не зберігається після перевищення ліміту пам'яті, і політику можна змінити на алгоритм LRU (найрідше використовуваний алгоритм останнім часом) — нова збережена інформація замінить стару.
Огляд:
(Кінець)
|