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는 메인 프로세스가 하드 디스크에 데이터를 저장할 때 메인 프로세스가 죽는 척하는 것을 방지하기 위해 포크해야 하며, 포크 프로세스에서 하드 디스크에 데이터를 저장하는 작업을 완료해야 합니다. 메인 프로세스가 4GB의 메모리를 사용한다면, 포크 서브프로세스가 필요할 때 추가로 4GB가 필요합니다. 이 시점에는 메모리가 부족하면 포크가 실패하고, 데이터 저장 하드 디스크도 실패합니다. redis 로그를 보려면 redis.windows.conf를 다음과 같이 설정해야 합니다:
# 로그 파일 이름을 지정하세요. 또한 'stdout'는 강제로 사용할 수 있습니다 # Redis가 표준 출력에 로그를 올려줘. logfile "E:/Redis-x64-3.2.100/redis.txt" 로그 예외는 다음과 같습니다:
[8984] 5월 14일 14:05:09.060 * pid 8672가 백그라운드 저장 시작 [8672] 5월 14일 14:05:09.169 # Windows 버전의 Redis는 시스템 페이징 파일에서 힙 메모리를 예약합니다 지속 연산에 사용되는 포크 프로세스와 공유하기 위해 사용됩니다. 현재 연속된 자유 공간이 충분하지 않습니다. 시스템 페이징 파일. 시스템 페이징 파일의 크기를 늘릴 수 있습니다. 때때로 재부팅으로 시스템 페이징 파일이 충분히 조각 모음되어 이 작전은 성공적으로 완료되어야 합니다.
Redis는 계속할 수 없습니다. 나가고 있어. [8984] 5월 14일 14:05:09.278 # 포크 작업 실패
분석 결과, 최대 힙 크기의 '맥스힙' 구성 문제는 사용 가능한 메모리 부족 때문임이 밝혀졌습니다.
용액
Redis의 구성 파일 "redis.windows.conf"를 열어 다음 코드 섹션을 찾아보세요:
# Redis 힙은 maxmemory에서 지정한 값보다 커야 합니다 # 플래그, 힙 할당기는 자체 메모리 요구사항을 가지고 있고 # 더미의 파편화는 불가피하다. 만약 maxmemory 플래그가 # 지정됨, 맥스힙은 1.5*맥스메모리로 설정됩니다. 만약 맥스힙 플래그가 #와 함께 maxmemory가 지정되면, maxheap 플래그는 자동으로 적용됩니다 # 증가하면 1.5*최대 메모리보다 작습니다. # # 맥스힙 <bytes> 이 설정을 추가하는 것도 좋습니다,Redis 서비스가 시작되지 않음!!!!!!!
기본 값은 maxheap 1024000000≈976.56M입니다
이 댓글은 컨퍼런스 파일에서 찾지 못했고, 이런 식으로 찾았습니다:
# 지정된 바이트 수 이상의 메모리를 사용하지 마세요. # 메모리 한도에 도달하면 레디스가 키를 제거하려고 시도할 거야 # 선택한 퇴거 정책에 따라 (maxmemory-policy 참조).
# # 레디스가 정책을 따라 키를 제거할 수 없거나, 정책이 # 'noeviction'으로 설정하면 Redis가 명령에 오류를 입력하기 시작합니다 #는 SET, LPUSH 등 더 많은 메모리를 사용하며, 계속됩니다 # 읽기 전용 명령어인 GET에 응답하기 위해.
# # 이 옵션은 보통 Redis를 LRU 캐시로 사용하거나 설정할 때 유용합니다 # 인스턴스에 대한 하드 메모리 제한('noeviction' 정책 사용 포함).
# # 경고: 만약 최대 기억이 켜진 인스턴스에 노예가 연결되어 있다면, # 노예들에게 먹이를 공급하는 데 필요한 출력 완충 용량을 빼는 값 # 사용 메모리 수에서 네트워크 문제/재동기화가 발생할 수 있도록 # 키가 퇴거되는 루프를 트리거하지 않고, 그 결과 출력이 # 노예 버퍼가 DEL로 가득 차 있고, 퇴거된 키들이 삭제를 촉발합니다 #의 더 많은 키들, 이런 식으로 데이터베이스가 완전히 비워질 때까지 계속됩니다.
# # 요컨대... 노예가 붙어 있다면 하부 설정을 권장합니다 # 슬레이브용 시스템에 빈 RAM이 있도록 maxmemory에 대한 제한 # 출력 버퍼(하지만 정책이 'noeviction'이라면 필요하지 않음).
# # 경고: maxmemory를 설정하지 않으면 Redis가 다음과 같이 종료됩니다. # 힙 한도에 도달하면 메모리 초과 예외가 발생합니다.
# # 참고: Redis는 시스템 페이징 파일을 사용해 힙 메모리를 할당하므로, # Windows 작업 관리자나 다른 작업에서 표시되는 워킹 셋 메모리 사용량 # ProcessExplorer와 같은 도구들은 항상 정확하지 않을 수 있습니다. 예를 들어, 오른쪽입니다 # RDB 또는 AOF 파일의 백그라운드 저장 후, 작업 집합 값 #는 상당히 떨어질 수 있습니다. 올바른 메모리 사용량을 확인하기 위해 # Redis-server에서 데이터를 저장하려면 INFO 클라이언트 명령어를 사용하세요. 정보 # 명령어는 redis 데이터를 저장하는 데 사용되는 메모리만 보여주며, 추가 데이터는 표시하지 않습니다 # Windows 프로세스가 자체 요구사항을 위해 사용하는 메모리. Th3 추가 금액 INFO 명령어로 보고되지 않은 #의 메모리는 다음을 빼고 계산할 수 있습니다. # Windows 작업 관리자와 used_memory_peak에서 보고한 피크 작업 세트 # INFO 명령부가 보고했습니다.
# # 맥스메모리 <bytes> 경고: 힙 한도에 도달하면 maxmemory를 설정하지 않으면 Redis가 메모리 초과 예외로 종료됩니다.
참고:Redis는 시스템 페이징 파일을 사용해 힙 메모리를 할당합니다,
Windows 작업 관리자나 프로세스 탐색기 같은 다른 도구들은 항상 정확한 워크셋 메모리 사용량을 보여주지 않습니다. 간단히 말해,작업 관리자에서 표시되는 메모리 사용량은 정확하지 않습니다!!!
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: 퇴거 금지 mem_fragmentation_ratio:1:00 mem_allocator:jemalloc-3.6.0
배경은 다음과 같습니다:
1073741824 바이트 = 1G 설정 후 redis .net 클라이언트는 다음과 같이 캐시 오류를 추가합니다:
'maxmemory' 메모리 사용 시 OOM 명령어는 허용되지 않음> 있습니다. # MAXMEMORY 정책: Redis가 maxmemory에서 제거할 항목을 선택하는 방법 # 도달했다. 다섯 가지 행동 중 선택할 수 있습니다:
# # volatile-lru -> 만료 설정이 된 키를 LRU 알고리즘으로 제거 # allkeys-lru -> LRU 알고리즘에 따라 어떤 키든 제거 # volatile-random -> 만료 세트가 있는 무작위 키를 제거하세요 # allkeys-random -> 무작위 키를 제거하세요, 아무 키 # volatile-ttl -> 만료 시점에 가장 가까운 키를 제거하세요 (마이너 TTL) # noeviction -> 만료되지 않고 쓰기 작업에 오류가 발생하면 됩니다
# # 참고: 위의 정책 중 어느 경우든 Redis는 쓰기 시 오류를 반환합니다 # 퇴거에 적합한 키가 없을 때 운영.
# # 작성 시점에 이 명령들은 다음과 같습니다: set setnx setex append(추가) # incr decr rpush lpush lpush rpushx lpushx linsert lset rpoplpush sadd # 소너 신터스토어 수니언 유니언스토프 SDIFF 스디프스토어 자드 진크비 # Zunionstore zinterstore hset hsetnx hmset hincrby incrby decrby # getset mset msetnx exec sort
# # 기본값은 다음과 같습니다:
# # 맥스메모리-정책 노퇴거 #MAXMEMORY策略: 맥스메모리가 있을 때
#到达. 다섯 가지 행동 중에서 선택할 수 있습니다:
#
#volatile LRU->는 만료 세트가 있는 키를 제거하는 LRU 알고리즘을 사용합니다
#allkeys LRU-> LRU 알고리즘에 따라 어떤 키든 삭제합니다
#volatile 랜덤 - 만료된 세트로 랜덤 키를 제거>
#allkeys 무작위 > 삭제 키 및 임의 키
#volatile TTL-> 만료 시점이 가장 가까운 키를 삭제하기(마이너 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 정렬
#
#默认值为:
#
#maxmemory策略无效 또한 다음과 같은 구성을 설정해야 합니다:
기본 레디스 설정은 매우 보수적이며, 메모리 한도를 초과하면 저장되지 않고, 정책을 LRU 알고리즘(최근에 가장 많이 사용되지 않은 알고리즘)으로 변경할 수 있습니다. 새로 저장된 정보가 기존 정보를 대체합니다.
복습:
(끝)
|