Menggunakan StackExchange.Redis untuk memanipulasi cache redis, kesalahannya adalah sebagai berikut:
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.
Solusi sementara, memodifikasi file redis.windows.conf,Layanan Redis perlu dimulai ulang, atur sebagai berikut:
Jika Anda tidak ingin memulai ulang layanan Redis, Anda dapat menggunakan perintah redis-cli untuk mengaturnya sebagai berikut:
Penjelasannya adalah sebagai berikut:
# Secara default Redis akan berhenti menerima penulisan jika rekam jepret RDB diaktifkan # (setidaknya satu titik penyimpanan) dan penyimpanan latar belakang terbaru gagal. # Ini akan membuat pengguna sadar (dengan cara yang sulit) bahwa data tidak bertahan # pada disk dengan benar, jika tidak, kemungkinan besar tidak ada yang akan memperhatikan dan beberapa # bencana akan terjadi.
# # Jika proses penyimpanan latar belakang akan mulai bekerja lagi, Redis akan # secara otomatis mengizinkan penulisan lagi.
# # Namun, jika Anda telah menyiapkan pemantauan server Redis yang tepat # dan persistensi, Anda mungkin ingin menonaktifkan fitur ini sehingga Redis akan # terus bekerja seperti biasa bahkan jika ada masalah dengan disk, # izin, dan sebagainya. Sederhananya: Redis perlu melakukan fork pada proses utama agar proses utama tidak memalsukan kematian saat menyimpan data ke hard disk, dan kemudian menyelesaikan operasi penyimpanan data ke hard disk dalam proses fork, jika proses utama menggunakan memori 4GB, diperlukan tambahan 4GB ketika sub-proses fork dibutuhkan, saat ini memori tidak cukup, fork gagal, dan kemudian hard disk penyimpanan data juga gagal. Untuk melihat log redis, Anda perlu mengonfigurasi redis.windows.conf sebagai berikut:
# Tentukan nama file log. Juga 'stdout' dapat digunakan untuk memaksa # Redis untuk masuk ke output standar. file log "E:/Redis-x64-3.2.100/redis.txt" Pengecualian log adalah sebagai berikut:
[8984] 14 Mei 14:05:09.060 * Penyimpanan latar belakang dimulai oleh pid 8672 [8672] 14 Mei 14:05:09.169 # Redis versi Windows mencadangkan memori tumpukan dari file paging sistem untuk berbagi dengan proses bercabang yang digunakan untuk operasi persistensi. Saat ini tidak ada cukup ruang kosong yang berdekatan yang tersedia di file paging sistem. Anda dapat meningkatkan ukuran file paging sistem. Terkadang reboot akan mendefragmentasi file paging sistem cukup untuk operasi ini berhasil diselesaikan.
Redis tidak bisa melanjutkan. Keluar. [8984] 14 Mei 14:05:09.278 # operasi garpu gagal
Setelah analisis, ternyata masalah dengan konfigurasi "maxheap" ukuran tumpukan maksimum disebabkan oleh memori yang tersedia tidak mencukupi.
Larutan
Buka file konfigurasi Redis "redis.windows.conf" dan temukan bagian kode berikut:
# Tumpukan Redis harus lebih besar dari nilai yang ditentukan oleh maxmemory #, karena alokasi tumpukan memiliki persyaratan memorinya sendiri dan # Fragmentasi tumpukan tidak dapat dihindari. Jika hanya bendera maxmemory # ditentukan, maxheap akan diatur pada 1.5*maxmemory. Jika bendera maxheap adalah # ditentukan bersama dengan maxmemory, bendera maxheap akan secara otomatis # meningkat jika lebih kecil dari 1.5*maxmemory. # # maxheap <bytes> Menambahkan pengaturan ini bagus,Layanan Redis gagal dimulai!!!!!!!
Nilai defaultnya adalah: maxheap 1024000000≈976.56M
Saya tidak menemukan komentar ini di file conf, saya menemukan sesuatu seperti ini:
# Jangan gunakan memori lebih dari jumlah byte yang ditentukan. # Ketika batas memori tercapai, Redis akan mencoba menghapus tombol # sesuai dengan kebijakan penggusuran yang dipilih (lihat maxmemory-policy).
# # Jika Redis tidak dapat menghapus kunci sesuai dengan kebijakan, atau jika kebijakannya # diatur ke 'noeviction', Redis akan mulai membalas dengan kesalahan ke perintah # yang akan menggunakan lebih banyak memori, seperti SET, LPUSH, dan sebagainya, dan akan terus berlanjut # untuk membalas perintah baca-saja seperti GET.
# # Opsi ini biasanya berguna saat menggunakan Redis sebagai cache LRU, atau untuk mengatur # batas memori keras untuk instans (menggunakan kebijakan 'noeviction').
# # PERINGATAN: Jika Anda memiliki slave yang terpasang ke instance dengan maxmemory aktif, # ukuran buffer keluaran yang diperlukan untuk memberi makan budak dikurangi # dari jumlah memori yang digunakan, sehingga masalah jaringan / sinkronisasi ulang akan # tidak memicu loop di mana tombol dikeluarkan, dan pada gilirannya output # buffer slave penuh dengan DEL kunci yang diusir yang memicu penghapusan # lebih banyak kunci, dan seterusnya sampai database benar-benar dikosongkan.
# # Singkatnya... Jika Anda memiliki budak yang terpasang, disarankan agar Anda menetapkan yang lebih rendah # batas untuk maxmemory sehingga ada beberapa RAM gratis pada sistem untuk slave # buffer output (tetapi ini tidak diperlukan jika kebijakannya adalah 'noeviction').
# # PERINGATAN: tidak mengatur maxmemory akan menyebabkan Redis berakhir dengan # Pengecualian kehabisan memori jika batas tumpukan tercapai.
# # CATATAN: karena Redis menggunakan file paging sistem untuk mengalokasikan memori tumpukan, # penggunaan memori Working Set yang ditunjukkan oleh Windows Task Manager atau oleh lainnya # alat seperti ProcessExplorer tidak akan selalu akurat. Misalnya, benar # setelah penyimpanan latar belakang file RDB atau AOF, nilai set kerja # mungkin turun secara signifikan. Untuk memeriksa jumlah memori yang benar yang digunakan # oleh redis-server untuk menyimpan data, gunakan perintah klien INFO. INFORMASI # hanya menunjukkan memori yang digunakan untuk menyimpan data redis, bukan tambahan # memori yang digunakan oleh proses Windows untuk kebutuhannya sendiri. Jumlah tambahan Th3 # memori yang tidak dilaporkan oleh perintah INFO dapat dihitung dengan mengurangi # Puncak Working Set yang dilaporkan oleh Windows Task Manager dan used_memory_peak # dilaporkan oleh perintah INFO.
# # maxmemory <bytes> Peringatan: Jika batas tumpukan tercapai, tidak mengatur maxmemory akan menyebabkan Redis berakhir dengan pengecualian kehabisan memori.
Catatan: KarenaRedis menggunakan file paging sistem untuk mengalokasikan memori tumpukan,
Windows Task Manager atau alat lain seperti ProcessExplorer tidak selalu menampilkan penggunaan memori workset yang akurat. Secara sederhana,Penggunaan memori yang ditampilkan oleh Task Manager tidak akurat!!!
Gunakan perintah info untuk mengkueri sebagai berikut:
# Memori 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: penggusuran mem_fragmentation_ratio:1.00 mem_allocator: jemalloc-3.6.0
Pengaturannya adalah sebagai berikut:
1073741824 byte = 1G Setelah pengaturan, klien .net redis menambahkan kesalahan cache sebagai berikut:
Perintah OOM tidak diizinkan saat menggunakan memori > 'maxmemory'. # KEBIJAKAN MAXMEMORY: bagaimana Redis akan memilih apa yang akan dihapus saat maxmemory # tercapai. Anda dapat memilih di antara lima perilaku:
# # volatile-lru -> hapus kunci dengan set kedaluwarsa menggunakan algoritma LRU # allkeys-lru -> hapus kunci apa pun sesuai dengan algoritma LRU # volatile-random -> menghapus kunci acak dengan set kedaluwarsa # allkeys-random -> hapus kunci acak, kunci apa pun # volatile-ttl -> lepaskan kunci dengan waktu kedaluwarsa terdekat (TTL minor) # noeviction -> tidak kedaluwarsa sama sekali, cukup mengembalikan kesalahan pada operasi tulis
# # Catatan: dengan salah satu kebijakan di atas, Redis akan mengembalikan kesalahan saat menulis # operasi, ketika tidak ada kunci yang cocok untuk penggusuran.
# # Pada tanggal penulisan perintah ini adalah: set setnx setex append # Incr Decr Rpush Lpush RpushX Lpushx Linsert Lset RpoplPush Sadd # sinter sinterstore sunion sunionstore sdiff sdiff sdiff zadd zincrby # zunionstore zinterstore hset hsetnx hmset hincrby incrby decrby # getset mset msetnx exec sortir
# # Defaultnya adalah:
# # penggusuran kebijakan maxmemory- #MAXMEMORY策略: Saat MAXMEMORY
#到达. Anda dapat memilih dari lima perilaku:
#
#volatile LRU-> menggunakan algoritma LRU untuk menghapus kunci dengan set kedaluwarsa
#allkeys LRU-> menghapus kunci apa pun sesuai dengan algoritma LRU
#volatile acak - > menghapus kunci acak dengan set kedaluwarsa
#allkeys > acak menghapus kunci acak, kunci arbitrer
#volatile TTL-> Hapus kunci dengan waktu kedaluwarsa terdekat (TTL Minor)
#noeviction-> tidak kedaluwarsa sama sekali, hanya mengembalikan kesalahan operasi tulis
#
#注意: Untuk salah satu strategi di atas, Redis mengembalikan kesalahan saat menulis
#操作, ketika tidak ada kunci yang cocok untuk penggusuran.
#
#在编写之日, perintah ini adalah: atur 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 penyortiran eksekutif mset msetnx
#
#默认值为:
#
#maxmemory策略无效 Anda juga perlu menyiapkan konfigurasi berikut:
Pengaturan redis default sangat konservatif, yaitu tidak disimpan setelah batas memori terlampaui, dan kebijakan dapat diubah menjadi algoritma LRU (algoritma yang paling jarang digunakan baru-baru ini) - informasi yang baru disimpan akan menggantikan informasi lama.
Resensi:
(Akhir)
|