Usando StackExchange.Redis para manipular la caché redis, el error es el siguiente:
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.
Solución temporal, modificar el archivo redis.windows.conf,El servicio Redis necesita reiniciarse, establezca de la siguiente manera:
Si no quieres reiniciar el servicio Redis, puedes usar el comando redis-cli para configurarlo de la siguiente manera:
La explicación es la siguiente:
# Por defecto, Redis dejará de aceptar escrituras si se activan las instantáneas RDB # (al menos un punto de guardado) y la última partida en segundo plano falló. # Esto hará que el usuario sea consciente (de forma dura) de que los datos no persisten # en disco correctamente, si no, lo más probable es que nadie se dé cuenta y algunos # El desastre ocurrirá.
# # Si el proceso de guardado en segundo plano vuelve a funcionar, Redis lo hará # permitir automáticamente escrituras de nuevo.
# # Sin embargo, si has configurado tu monitorización adecuada del servidor Redis # y persistencia, quizá quieras desactivar esta función para que Redis # seguir funcionando como siempre aunque haya problemas con el disco, # permisos, y demás. En pocas palabras: Redis necesita bifurcar un proceso principal para evitar que este finja la muerte al guardar datos en el disco duro, y luego completar la operación de guardar datos en el disco duro en el proceso de la bifurcación; si el proceso principal usa 4GB de memoria, se necesitan 4GB adicionales cuando se necesita el subproceso de la bifurcación; en ese momento la memoria no es suficiente, la bifurcación falla, y luego también falla el disco duro de guardado de datos. Para ver los registros de Redis, necesitas configurar redis.windows.conf de la siguiente manera:
# Especifica el nombre del archivo de registro. Además, 'stdout' puede usarse para forzar # Redis para registrar la salida estándar. archivo de registro "E:/Redis-x64-3.2.100/redis.txt" Las excepciones en logarítmica son las siguientes:
[8984] 14 de mayo 14:05:09.060 * Guardado en segundo plano iniciado por pid 8672 [8672] 14 de mayo 14:05:09.169 # La versión de Windows de Redis reserva memoria heap del archivo de paginación del sistema para compartir con el proceso bifurcado utilizado para operaciones de persistencia. En este momento no hay suficiente espacio libre contiguo disponible en el Archivo de paginación del sistema. Puedes aumentar el tamaño del archivo de paginación del sistema. A veces, un reinicio desfragmenta el archivo de paginación del sistema lo suficiente para esta operación se completó con éxito.
Redis no puede continuar. Saliendo. [8984] 14 de mayo 14:05:09.278 # operación de bifurcación fallida
Tras el análisis, se comprobó que el problema con la configuración de tamaño máximo del heap "maxheap" se debía a la memoria disponible insuficiente.
Solución
Abre el archivo de configuración de Redis "redis.windows.conf" y encuentra la siguiente sección de código:
# El heap de Redis debe ser mayor que el valor especificado por maxmemory # flag, ya que el asignador de heap tiene sus propios requisitos de memoria y # La fragmentación del montón es inevitable. Si solo la bandera maxmemory es # especificado, maxheap se pondrá en 1,5*maxmemory. Si la bandera de maxheap es # especificado junto con maxmemory, la bandera maxheap será automáticamente # aumentado si es menor que 1,5*maxmemory. # # Maxheap <bytes> Añadir este ajuste es bueno,El servicio Redis no arranca!!!!!!!
El valor por defecto es: maxheap 1024000000≈976,56M
No encontré este comentario en el archivo de conferencia, encontré algo así:
# No uses más memoria de la cantidad de bytes especificada. # Cuando se alcance el límite de memoria, Redis intentará eliminar las teclas # Según la política de desahucio seleccionada (véase maxmemory-policy).
# # Si Redis no puede quitar las llaves según la política, o si la política es # configurado en 'noeviction', Redis empezará a responder con errores a los comandos # que consumiría más memoria, como SET, LPUSH, etc., y continuará # para responder a comandos de solo lectura como GET.
# # Esta opción suele ser útil al usar Redis como caché LRU, o para establecer # Un límite de memoria dura para una instancia (usando la política de 'noeviction').
# # ADVERTENCIA: Si tienes esclavos adjuntos a una instancia con maxmemory activado, # Se resta el tamaño de los buffers de salida necesarios para alimentar a los esclavos # del recuento de memoria utilizada, de modo que los problemas de red / resincronizaciones # no activar un bucle donde se expulsan las teclas y, a su vez, la salida # el búfer de esclavos está lleno con DELs de claves expulsadas que desencadenan la eliminación # de más claves, y así sucesivamente hasta que la base de datos se vacía por completo.
# # En resumen... Si tienes esclavos adjuntos, se sugiere poner un lower # límite para maxmemory para que haya algo de RAM libre en el sistema para el esclavo # búferes de salida (pero esto no es necesario si la política es 'noeviction').
# # ADVERTENCIA: no configurar maxmemory hará que Redis termine con un # Excepción fuera de memoria si se alcanza el límite del heap.
# # NOTA: dado que Redis utiliza el archivo de paginación del sistema para asignar la memoria heap, # el uso de memoria del conjunto de trabajo mostrado por el Administrador de tareas de Windows o por otros # herramientas como ProcessExplorer no siempre serán precisas. Por ejemplo, derecha # tras una partida en segundo plano de los archivos RDB o AOF, el valor del conjunto de trabajo # puede caer significativamente. Para comprobar la cantidad correcta de memoria utilizada # por el servidor redis-server para almacenar los datos, usar el comando cliente INFO. La INFORMACIÓN # Comando muestra solo la memoria utilizada para almacenar los datos de Redis, no el extra # memoria utilizada por el proceso de Windows para sus propios requisitos. Th3 cantidad extra # de memoria no reportada por el comando INFO se puede calcular restando el # Conjunto de trabajo de pico reportado por el Administrador de tareas de Windows y el used_memory_peak # reportado por el comando INFO.
# # maxmemory <bytes> Advertencia: Si se alcanza el límite del heap, no configurar maxmemory hará que Redis termine con una excepción por falta de memoria.
Nota: Debido aRedis utiliza archivos de paginación del sistema para asignar memoria heap,
El Administrador de tareas de Windows u otras herramientas como el Explorador de Procesos no siempre muestran un uso preciso de la memoria del conjunto de trabajos. En términos sencillos,El uso de memoria mostrado por el Administrador de tareas no es preciso!!!
Utiliza el comando info para consultar de la siguiente manera:
# Memoria 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:noevition mem_fragmentation_ratio:1.00 mem_allocator:jemalloc-3.6.0
La configuración es la siguiente:
1073741824 bytes = 1G Tras la configuración, el cliente .net de redis añade un error de caché de la siguiente manera:
El comando OOM no está permitido cuando se usa memoria > 'maxmemory'. # POLÍTICA MAXMEMORY: cómo Redis seleccionará qué eliminar cuando maxmemory # se ha alcanzado. Puedes elegir entre cinco comportamientos:
# # volatile-lru -> eliminar la clave con un conjunto de expiración usando un algoritmo LRU # allkeys-lru -> eliminar cualquier clave según el algoritmo LRU # Volátil-aleatorio -> elimina una clave aleatoria con un conjunto de expiración # todas las claves-aleatorias -> eliminar una tecla aleatoria, cualquier clave # volatile-ttl -> quitar la clave con el tiempo de caducidad más cercano (TTL menor) # Noeviction -> no expiran en absoluto, solo devolven un error en las operaciones de escritura
# # Nota: con cualquiera de las políticas anteriores, Redis devolverá un error al escribir # Operaciones, cuando no hay llaves adecuadas para el desalojo.
# # En la fecha de redacción estos comandos son: set setnx setex append # incr decr rpush lpush rpushx lpushx linsert lset rpoplpush sadd # Sinter sinterstore sunión sunionstore sdiff sdiff sdiffstore zadd zincrby # zunionstore zinterstore hset hsetnx hmset hincrby incrby decrby # getset mset msetnx exec sort
# # El valor por defecto es:
# # política de noebisalucto de maxmemory #MAXMEMORY策略: Cuando MAXMEMORY
#到达. Puedes elegir entre cinco comportamientos:
#
#volatile LRU-> utiliza el algoritmo LRU para eliminar claves con conjuntos de caducidad
#allkeys LRU-> eliminar cualquier clave según el algoritmo LRU
#volatile aleatorio - > eliminar claves aleatorias con conjuntos caducados
#allkeys > aleatorio borrar claves aleatorias, claves arbitrarias
#volatile TTL-> Eliminar la clave con la hora de caducidad más cercana (TTL menor)
#noeviction-> no caduca en absoluto, solo devuelve errores en la operación de escritura
#
#注意: Para cualquiera de las estrategias anteriores, Redis devuelve un error al escribir
#操作, cuando no hay una llave adecuada para el desahucio.
#
#在编写之日, estos comandos son: set setnx setex append
#递增递减rpush lpushx lpushx linsert lset rpoplpush sadd
#烧结店sunion sunionstore sdiff sdiffstore zadd zincrby
#zunionstore Zinterstore Hset Hset, HMSET Hincrby Incrby Decrby
#getset mset mset, ordenación ejecutiva
#
#默认值为:
#
#maxmemory策略无效 También necesitas configurar las siguientes configuraciones:
La configuración predeterminada de redis es muy conservadora, es decir, no se almacena después de superar el límite de memoria, y la política puede cambiarse al algoritmo LRU (el menos utilizado recientemente): la información almacenada reemplazará a la antigua.
Revisión:
(Fin)
|