Topik ini menjelaskan kesalahan umum dan solusinya saat Anda mengakses Tair (Kompatibel dengan Redis OSS).
Ikhtisar kesalahan
Klasifikasi | Kesalahan |
Exception Redis umum | |
redis-cli | |
Exception modus proxy umum | |
Skrip Lua dan transaksi | |
Klien Jedis | |
Klien Lettuce | |
Klien Redisson | |
Klien Spring Data Redis | |
Klien StackExchange.Redis | |
Klien Predis | |
Klien phpredis | |
Klien Go-redis | |
Klien node-redis |
Exception Redis umum
ERR illegal address
Kemungkinan penyebab: Alamat IP klien Anda belum ditambahkan ke daftar putih instans Tair.
Solusi: Tambahkan alamat IP klien Anda ke daftar putih instans Tair. Untuk informasi selengkapnya, lihat Lakukan diagnostik koneksi.
ERR sentinel compatibility mode is disabled
Kemungkinan penyebab: Mode kompatibel Sentinel tidak diaktifkan untuk instans Tair.
Solusi: Aktifkan mode kompatibel Sentinel untuk instans tersebut di Konsol. Untuk informasi selengkapnya, lihat Aktifkan mode kompatibel Sentinel.
ERR max number of clients reached
Kemungkinan penyebab: Jumlah maksimum koneksi ke instans Tair telah tercapai.
Solusi:
Periksa apakah terjadi kebocoran koneksi pada klien. Misalnya, pastikan fungsi
closedipanggil setelah penggunaan JedisPool pada klien Jedis.Periksa apakah sesi koneksi saat ini berjalan sebagaimana mestinya. Untuk informasi selengkapnya, lihat Kelola sesi instans. Anda dapat menghentikan sesi atau meningkatkan konfigurasi instans untuk menambah jumlah maksimum koneksi ke instans.
NOAUTH Authentication required
Kemungkinan penyebab: Autentikasi berbasis kata sandi dikonfigurasi untuk instans Tair, tetapi klien tidak menyediakan kata sandi atau memberikan kata sandi yang salah.
Solusi: Gunakan username dan kata sandi yang benar untuk mengakses instans. Untuk informasi selengkapnya, lihat Metode logon untuk instans.
Jika Anda menggunakan klien Lettuce versi 6.4.0.RELEASE hingga 6.4.1.RELEASE, kesalahan ini dapat terjadi meskipun Anda memberikan kata sandi yang benar. Masalah ini muncul ketika Lettuce menambahkan dukungan untuk `CLIENT SETINFO` dan telah diperbaiki di versi 6.4.2.RELEASE. Untuk informasi selengkapnya, lihat redis/lettuce#3035.
Jika Anda mengalami masalah ini, Anda dapat secara manual mengalihkan protokol ke RESP2 atau memperbarui klien ke Lettuce 6.4.2.RELEASE atau yang lebih baru. Jika Anda menggunakan klien Spring Data Redis, kami merekomendasikan penggunaan Spring Data Redis 3.4.2 atau yang lebih baru.
WRONGPASS invalid username-password pair
Kemungkinan penyebab: Kata sandi tidak valid.
Solusi: Gunakan username dan kata sandi akun yang benar untuk menghubungkan ke instans. Untuk informasi selengkapnya, lihat Hubungkan ke instans.
Jika mode kompatibel Sentinel diaktifkan untuk instans, rujuk topik Gunakan mode kompatibel Sentinel untuk menghubungkan ke instans.
ERR invalid password
Kemungkinan penyebab: Kata sandi tidak valid.
Solusi: Gunakan username dan kata sandi akun yang benar untuk menghubungkan ke instans. Untuk informasi selengkapnya, lihat Hubungkan ke instans.
Jika kesalahan ini dilaporkan di Data Management (DMS), kemungkinan penyebabnya adalah kata sandi yang disimpan oleh DMS saat logon terakhir tidak cocok dengan kata sandi instans saat ini. Di instance list DMS, temukan instans tersebut dan pilih More > Edit di kolom Actions. Kemudian, masukkan kata sandi baru di bidang Database Password dan coba lagi.
Connection reset by peer
Kemungkinan penyebab: Koneksi ditutup karena exception pada buffer klien.
Solusi: Periksa kode sisi aplikasi atau sesuaikan ukuran buffer klien. Untuk informasi selengkapnya, lihat bagian Unexpected end of stream.
UnknownHostException
Atau, kesalahan failed to connect: xxx.redis.rds.aliyuncs.com could not be resolved terjadi.
Kemungkinan penyebab: Klien tidak dapat melakukan resolusi nama domain instans Tair.
Solusi: Konfigurasikan server DNS dengan benar. Untuk informasi selengkapnya, lihat Bagaimana cara memecahkan masalah koneksi yang disebabkan oleh kegagalan resolusi DNS?
OOM command not allowed when used memory > 'maxmemory'
Kemungkinan penyebab: Memori maksimum yang dikonfigurasi untuk instans Tair telah tercapai.
Jika instans Tair menggunakan arsitektur kluster, penggunaan memori pada shard data tertentu mungkin melebihi memori maksimum yang dikonfigurasi untuk shard tersebut.
Solusi:
Jika penggunaan memori instans mencapai 100%, kami merekomendasikan agar Anda meningkatkan konfigurasi instans. Untuk informasi selengkapnya, lihat Ubah konfigurasi instans.
Jika penggunaan memori pada satu shard data mencapai 100%, kemungkinan terdapat large key di dalam instans. Anda dapat menggunakan fitur analisis key offline atau diagnostik instans untuk mengidentifikasi penyebabnya.
WRONGTYPE Operation against a key holding the wrong kind of value
Kemungkinan penyebab: Perintah digunakan secara tidak tepat. Misalnya, perintah HASH dieksekusi pada tipe data String.
Solusi: Perbaiki kode atau perintah yang salah. Untuk informasi selengkapnya, lihat Redis Commands.
ERR unknown command 'xxx'
Kemungkinan penyebab: Instans saat ini tidak mendukung perintah ini.
Solusi: Periksa dukungan perintah untuk versi instans saat ini. Untuk informasi selengkapnya, lihat Dukungan dan Batasan Perintah Tair (Edisi Perusahaan), Dukungan dan Batasan Perintah Redis Edisi Open-Source, dan Batasan Perintah untuk Instans Arsitektur Kluster dan Splitting Baca/Tulis.
Versi minor terbaru menyediakan lebih banyak fitur dan layanan yang stabil. Kami merekomendasikan agar Anda memperbarui instans ke versi minor terbaru. Untuk informasi selengkapnya, lihat Perbarui versi minor dan versi proxy.
ERR command 'xxx' not support for your account
Kemungkinan penyebab: Perintah tertentu dari Tair dinonaktifkan di Alibaba Cloud, atau perintah-perintah tersebut ditentukan oleh #no_loose_disabled-commands. Untuk informasi selengkapnya, lihat Perintah yang didukung oleh Redis Edisi Open-Source dan Nonaktifkan perintah berisiko tinggi.
Solusi: Hapus perintah yang ingin Anda jalankan dari daftar perintah yang dinonaktifkan yang ditentukan oleh #no_loose_disabled-commands.
NOPERM this user has no permissions to run the 'xxx'
Kemungkinan penyebab: Perintah tertentu dari Tair dinonaktifkan di Alibaba Cloud, atau perintah-perintah tersebut ditentukan oleh #no_loose_disabled-commands. Untuk informasi selengkapnya, lihat Perintah yang didukung oleh Redis Edisi Open-Source dan Nonaktifkan perintah berisiko tinggi.
Solusi: Hapus perintah yang ingin Anda jalankan dari daftar perintah yang dinonaktifkan yang ditentukan oleh #no_loose_disabled-commands.
ERR FLUSHDB is not allowed in migrating mode
Kemungkinan penyebab: Saat jumlah shard data sedang berubah untuk instans kluster Tair cloud-native, perintah FLUSHDB dan FLUSHALL dinonaktifkan.
Solusi: Tunggu hingga proses perubahan selesai untuk instans kluster Tair cloud-native. Untuk informasi selengkapnya, lihat Sesuaikan jumlah shard untuk instans.
CROSSSLOT Keys in request don't hash to the same slot
Kemungkinan penyebab: Perintah yang melibatkan beberapa key lintas slot, seperti DEL, MSET, dan MGET, tidak didukung untuk instans kluster Tair dalam mode koneksi langsung.
Solusi:
Sebelum menjalankan perintah yang melibatkan beberapa key, gunakan perintah CLUSTER KEYSLOT untuk memastikan bahwa semua key berada di slot yang sama.
Ubah nama key dan terapkan hash tags untuk memastikan key yang terlibat dialokasikan di slot yang sama. Namun, penting untuk mencegah kesenjangan data saat menggunakan hash tags.
Ubah instans menjadi instans kluster dalam mode proxy yang mendukung perintah yang melibatkan beberapa key lintas slot, seperti DEL, MGET, dan MSET. Untuk informasi selengkapnya, lihat Fitur node proxy.
ERR READONLY you can't write against a read only instance
Kemungkinan penyebab: Selama proses alih bencana master-replika, perubahan konfigurasi, atau pembaruan versi minor untuk instans Tair, terjadi koneksi transient dan instans tetap read-only hingga 30 detik.
Solusi: Tunggu hingga instans pulih. Tidak diperlukan operasi manual. Rancang mekanisme penanganan ulang koneksi dan exception untuk aplikasi Anda. Untuk informasi selengkapnya, lihat Ubah konfigurasi instans.
Failed to connect to any host resolved for DNS name
Kemungkinan penyebab: Daftar putih tidak dikonfigurasi dengan benar.
Solusi: Tambahkan alamat IP klien ke daftar putih instans. Untuk informasi selengkapnya, lihat Konfigurasikan daftar putih alamat IP.
Untuk akses jaringan publik, tambahkan alamat IP egress ke daftar putih. Kunjungi https://cip.cc/ untuk mendapatkan alamat IP egress.
Exception redis-cli
Exception modus proxy umum
ERR client ip is not in whitelist
Kemungkinan penyebab: Alamat IP klien Anda belum ditambahkan ke daftar putih instans Tair.
Solusi: Tambahkan alamat IP klien Anda ke daftar putih instans Tair. Untuk informasi selengkapnya, lihat Lakukan diagnostik koneksi.
NOWRITE You can't write against a non-write redis
Atau, kesalahan NOREAD You can't read against a non-read redis terjadi.
Kemungkinan penyebab: Instans Anda memiliki pembayaran tertunda atau telah kedaluwarsa. Instans berada dalam status Locked.
Solusi: Tambahkan dana ke akun Anda atau perpanjang instans. Untuk informasi selengkapnya, lihat Kedaluwarsa dan pembayaran tertunda.
ERR syntax error
Kemungkinan penyebab: Sintaks perintah salah. Misalnya, perintah yang memerlukan empat parameter hanya diberikan tiga.
Solusi: Periksa apakah format perintah sudah benar. Untuk informasi selengkapnya, lihat Redis Commands.
ERR no such db node
Kemungkinan penyebab: Saat Anda menjalankan perintah internal Tair, parameter db node yang ditentukan tidak valid.
Solusi: Tentukan parameter db node dengan benar. Nilai db node harus kurang dari jumlah shard data dalam instans. Untuk informasi selengkapnya, lihat Perintah internal untuk instans dalam mode proxy.
ERR 'xxx' command keys must in same slot
Kemungkinan penyebab: Transaksi atau skrip yang dieksekusi pada instans kluster Tair berisi key yang berada di slot berbeda.
Solusi: Ubah transaksi atau skrip tersebut. Anda dapat menggunakan perintah CLUSTER KEYSLOT untuk menanyakan slot tempat key yang diminta disimpan.
Instans kluster Tair menggunakan algoritma Cyclic Redundancy Check (CRC) untuk mendistribusikan key secara merata di berbagai slot. Jika Anda ingin menyimpan key di slot yang sama, Anda dapat menggunakan hash tags. Namun, hal ini dapat menyebabkan kesenjangan data. Lakukan dengan hati-hati.
ERR for redis cluster, eval/evalsha number of keys can't be negative or zero
Kemungkinan penyebab: Tidak ada key yang ditentukan atau parameter numkeys diatur ke nilai kurang dari atau sama dengan 0 untuk perintah EVAL dan EVALSHA.
Solusi: Saat menggunakan perintah EVAL dan EVALSHA, Anda harus menentukan setidaknya satu key dan mengatur parameter numkeys ke nilai lebih besar dari 0. Untuk informasi selengkapnya, lihat Penggunaan skrip Lua.
ERR request refused, too many pending request, now count xxx, beyond threshold xxx
Kemungkinan penyebab: Permintaan tertunda menumpuk di backend Tair karena klien menggunakan pipeline yang tidak valid.
Solusi: Kurangi jumlah permintaan yang dipipelined.
ERR redis temporary failure
Kemungkinan penyebab: Saat Anda menghubungkan ke node instans Tair, terjadi kesalahan timeout karena fluktuasi jaringan, koneksi berlebihan, alih bencana master-replika, atau kueri lambat yang sedang berlangsung.
Solusi: Tunggu hingga instans pulih. Tidak diperlukan operasi manual. Rancang mekanisme penanganan ulang koneksi dan exception untuk aplikasi Anda.
ERR redis temporary failure (ErrorCode 7002)
Kemungkinan penyebab: Saat Anda menghubungkan ke node instans Tair, terjadi kesalahan timeout karena perubahan konfigurasi instans atau alih bencana master-replika yang sedang berlangsung.
Solusi: Tunggu hingga instans pulih. Tidak diperlukan operasi manual. Rancang mekanisme penanganan ulang koneksi dan exception untuk aplikasi Anda.
Skrip Lua dan transaksi
NOSCRIPT No matching script. Please use EVAL.
Kemungkinan penyebab: Saat Anda menjalankan perintah EVALSHA, skrip yang sesuai dengan nilai SHA1 belum di-cache ke instans Tair.
Solusi: Jalankan perintah EVAL atau SCRIPT LOAD untuk meng-cache skrip yang diperlukan ke instans Tair dan coba lagi. Untuk informasi selengkapnya, lihat Tangani kesalahan NOSCRIPT.
BUSY Redis is busy running a script. You can only call SCRIPT KILL or SHUTDOWN NOSAVE.
Kemungkinan penyebab: Skrip Lua mengalami timeout.
Solusi: Jalankan perintah SCRIPT KILL untuk menghentikan eksekusi skrip atau tunggu hingga eksekusi selesai. Untuk informasi selengkapnya, lihat Tangani timeout skrip Lua.
ERR command eval not support for normal user
Kemungkinan penyebab: Perintah terkait EVAL tidak dapat dijalankan.
Solusi: Perbarui instans Anda ke versi minor terbaru. Untuk informasi selengkapnya, lihat Perbarui versi minor instans.
ERR eval/evalsha command keys must be in same slot
Solusi: Ubah skrip Lua tersebut. Anda dapat menanyakan slot tempat key berada dengan menjalankan perintah CLUSTER KEYSLOT. Untuk informasi selengkapnya, lihat Batasan skrip Lua pada instans kluster.
ERR bad lua script for redis cluster, all the keys that the script uses should be passed using the KEYS array
Kemungkinan penyebab: Kesalahan ini mungkin disebabkan oleh batasan node proxy pada skrip Lua.
Solusi: Tentukan semua key dalam array. Contoh: EVAL "return redis.call('mget', KEYS[1], KEYS[2])" 2 foo {foo}bar. Key tidak dapat diganti dengan variabel Lua. Untuk informasi selengkapnya, lihat Batasan skrip Lua pada instans kluster.
EXECABORT Transaction discarded because of previous errors
Kemungkinan penyebab: Perintah yang Anda jalankan dalam transaksi memiliki kesalahan sintaks atau kesalahan lainnya.
Solusi: Periksa logika kode Anda dan perbaiki kesalahan sintaks pada perintah tersebut.
UNKILLABLE Sorry the script already executed write commands against the dataset.
Kemungkinan penyebab: Operasi tulis yang terlibat dalam skrip Lua saat ini telah dilakukan. Dalam kasus ini, perintah SCRIPT KILL tidak dapat dijalankan.
Solusi: Temukan instans di Konsol dan klik Restart di kolom Actions. Untuk informasi selengkapnya, lihat Restart instans.
UNKILLABLE The busy script was sent by a master instance in the context of replication and cannot be killed.
Kemungkinan penyebab: Skrip Lua saat ini diteruskan oleh node master ke node replika yang sesuai. Dalam kasus ini, perintah SCRIPT KILL tidak dapat dijalankan.
Solusi: Temukan instans di Konsol dan klik Restart di kolom Actions. Untuk informasi selengkapnya, lihat Restart instans.
NOTBUSY No scripts in execution right now.
Kemungkinan penyebab: Tidak ada skrip Lua yang sedang dieksekusi.
Solusi: Tidak diperlukan operasi manual. Jangan menjalankan perintah SCRIPT KILL.
Klien Jedis
Could not get a resource from the pool
Kemungkinan penyebab: Koneksi Jedis tidak dapat dipinjam dari JedisPool.
Saat parameter blockWhenExhausted diatur ke true, yang merupakan nilai default, klien menunggu beberapa milidetik yang ditentukan oleh parameter maxWaitMillis jika tidak ada koneksi yang tersedia dari JedisPool. Jika klien masih tidak dapat memperoleh koneksi Jedis yang tersedia setelah menunggu lama, exception berikut dilemparkan:
redis.clients.jedis.exceptions.JedisConnectionException: Could not get a resource from the pool ... Caused by: java.util.NoSuchElementException: Timeout waiting for idle object at org.apache.commons.pool2.impl.GenericObjectPool.borrowObject(GenericObjectPool.java:449)Saat parameter blockWhenExhausted diatur ke false, exception berikut dilemparkan jika tidak ada koneksi yang tersedia dari JedisPool:
redis.clients.jedis.exceptions.JedisConnectionException: Could not get a resource from the pool ... Caused by: java.util.NoSuchElementException: Timeout waiting for idle object at org.apache.commons.pool2.impl.GenericObjectPool.borrowObject(GenericObjectPool.java:449)
Solusi: Pertimbangkan aspek-aspek berikut untuk memecahkan masalah ini:
Kebocoran koneksi
Secara default, maxTotal diatur ke 8. Kode berikut menunjukkan bahwa klien Jedis meminjam koneksi dari JedisPool sebanyak delapan kali tetapi tidak mengembalikan koneksi tersebut. Inilah sebabnya klien Jedis tidak dapat menjalankan perintah
jedisPool.getResource().ping()pada percobaan kesembilan untuk mendapatkan koneksi lain dari JedisPool.GenericObjectPoolConfig poolConfig = new GenericObjectPoolConfig(); JedisPool jedisPool = new JedisPool(poolConfig, "127.0.0.1", 6379); // Klien meminjam koneksi dari JedisPool sebanyak delapan kali, tetapi tidak mengembalikan koneksi tersebut. for (int i = 0; i < 8; i++) { Jedis jedis = null; try { jedis = jedisPool.getResource(); jedis.ping(); } catch (Exception e) { logger.error(e.getMessage(), e); } } jedisPool.getResource().ping();Kode yang direkomendasikan:
Jedis jedis = null; try { jedis = jedisPool.getResource(); // Perintah yang ingin Anda jalankan. jedis.executeCommand() } catch (Exception e) { // Jika perintah melibatkan key, kami merekomendasikan agar Anda mengonfigurasi untuk menampilkan key di log kesalahan. Dengan cara ini, Anda dapat menggunakan key untuk mengidentifikasi shard data tempat masalah terjadi. logger.error(e.getMessage(), e); } finally { // Klien tidak menutup koneksi yang dipinjam. Sebaliknya, klien mengembalikan koneksi ke JedisPool. if (jedis != null) jedis.close(); }Nilai kecil untuk parameter maxTotal
Saat sistem memiliki sejumlah besar operasi yang diproses secara konkuren, nilai kecil untuk parameter maxTotal dapat menyebabkan exception. Misalnya, rata-rata waktu eksekusi perintah sekitar 1 ms. Ini dihitung menggunakan rumus berikut:
Waktu yang dibutuhkan untuk meminjam atau mengembalikan resource+ Waktu yang dibutuhkan Jedis untuk menjalankan perintah + Latensi jaringan. Jumlah permintaan per detik (QPS) per koneksi sekitar 1.000, dan total QPS yang diharapkan adalah 50.000. Secara teori, Anda memerlukan nilai maxTotal sebesar 50 untuk mencapai QPS yang diharapkan sebesar 50.000. Nilai maxTotal diperoleh dengan membagi 50.000 dengan 1.000.Dalam kasus ini, Anda dapat menjalankan perintah berikut di klien Anda untuk mendapatkan jumlah koneksi klien. Anda dapat menyesuaikan nilai maxTotal berdasarkan nilai yang diperoleh.
netstat -an | grep 6379 | grep EST | wc -lPemblokiran koneksi
Saat koneksi ke instans Tair diblokir karena alasan seperti kueri lambat, semua koneksi menunggu dalam periode timeout yang ditentukan. Dalam kasus ini, saat sejumlah besar operasi diproses secara konkuren, kesalahan timeout dapat dilaporkan. Untuk informasi selengkapnya, lihat java.net.SocketTimeoutException: connect timed out.
Koneksi ditolak
Saat Anda mencoba mendapatkan koneksi dari JedisPool dan tidak ada koneksi yang tersedia, Jedis mencoba membuat koneksi Jedis. Namun, upaya koneksi ditolak dan exception dilemparkan. Contoh:
redis.clients.jedis.exceptions.JedisConnectionException: Could not get a resource from the pool at redis.clients.util.Pool.getResource(Pool.java:50) at redis.clients.jedis.JedisPool.getResource(JedisPool.java:99) at TestAdmin.main(TestAdmin.java:14) Caused by: redis.clients.jedis.exceptions.JedisConnectionException: java.net.ConnectException: Connection refused at redis.clients.jedis.Connection.connect(Connection.java:164) at redis.clients.jedis.BinaryClient.connect(BinaryClient.java:80) at redis.clients.jedis.BinaryJedis.connect(BinaryJedis.java:1676) at redis.clients.jedis.JedisFactory.makeObject(JedisFactory.java:87) at org.apache.commons.pool2.impl.GenericObjectPool.create(GenericObjectPool.java:861) at org.apache.commons.pool2.impl.GenericObjectPool.borrowObject(GenericObjectPool.java:435) at org.apache.commons.pool2.impl.GenericObjectPool.borrowObject(GenericObjectPool.java:363) at redis.clients.util.Pool.getResource(Pool.java:48) ... 2 more Caused by: java.net.ConnectException: Connection refused at java.net.PlainSocketImpl.socketConnect(Native Method) at java.net.AbstractPlainSocketImpl.doConnect(AbstractPlainSocketImpl.java:339) at java.net.AbstractPlainSocketImpl.connectToAddress(AbstractPlainSocketImpl.java:200) at java.net.AbstractPlainSocketImpl.connect(AbstractPlainSocketImpl.java:182) at java.net.SocksSocketImpl.connect(SocksSocketImpl.java:392) at java.net.Socket.connect(Socket.java:579) at redis.clients.jedis.Connection.connect(Connection.java:158) ... 9 moreat redis.clients.jedis.Connection.connect(Connection.java:158)menunjukkan bahwa Jedis mencoba membuat koneksi socket dan memanggil fungsiconnect, tetapi upaya koneksi ditolak. Kode sumber Jedis:socket.setSoLinger(true, 0); 158: socket.connect(new InetSocketAddress(host, port), connectionTimeout);Umumnya, untuk mengatasi masalah ini, Anda harus memeriksa apakah konfigurasi nama domain instans Tair sudah benar dan memeriksa koneksi jaringan dalam periode waktu yang sesuai.
java.net.SocketTimeoutException: connect timed out
Kemungkinan penyebab: Koneksi antara klien Anda dan instans Tair mengalami timeout.
Solusi: Rujuk topik Bagaimana cara memecahkan masalah koneksi di Tair?.
java.net.SocketTimeoutException: Read timed out
Kemungkinan penyebab: Panggilan API Jedis mengalami timeout karena koneksi jaringan tidak stabil, periode timeout baca/tulis yang singkat, kueri lambat, atau pemblokiran koneksi.
Solusi: Tingkatkan periode timeout atau lakukan diagnostik instans untuk memeriksa apakah terjadi masalah performa atau exception pada titik waktu yang sesuai.
Jika kesalahan ini terjadi di DMS, endpoint VPC atau port instans mungkin telah diubah. Di daftar database instance DMS, klik kanan instans tujuan, pilih Edit Instance, lalu atur Entry Method ke Connection String Address. Masukkan endpoint instans yang telah diubah di kotak teks Connection String Address dan coba lagi.
No reachable node in cluster
Kemungkinan penyebab: JedisCluster tidak dapat diakses.
Solusi: Saat pertama kali klien Anda menghubungkan ke instans Tair, periksa apakah alamat IP klien telah ditambahkan ke daftar putih instans Tair. Jika ini bukan pertama kalinya Anda menghubungkan ke instans Tair, lakukan diagnostik instans untuk mengidentifikasi penyebabnya.
Caused by: java.lang.NumberFormatException: For input string: "6379@13028"
Kemungkinan penyebab: ClusterNodeInformationParser diperkenalkan di Jedis 2.8.0 dan versi sebelumnya untuk menguraikan output cluster slots. Namun, Redis open source telah mengubah tipe output tersebut. Inilah sebabnya kesalahan NumberFormatException dilaporkan.
Solusi: Perbarui klien Jedis Anda ke versi 2.9.0 atau yang lebih baru.
No more cluster attempts left
Kemungkinan penyebab: Panggilan API mengalami timeout dan lima upaya pengulangan juga gagal. Secara default, setelah panggilan API mengalami timeout, JedisCluster mencoba mengulang lima kali.
Solusi: Tingkatkan periode timeout atau lakukan diagnostik instans.
Unexpected end of stream
Kemungkinan penyebab: Terjadi exception pada buffer klien Jedis. Anda dapat mempertimbangkan aspek-aspek berikut untuk memecahkan masalah ini:
Beberapa thread berbagi satu koneksi
Umumnya, satu thread menggunakan satu koneksi Jedis. Kode berikut menunjukkan bahwa dua thread berbagi satu koneksi Jedis:
new Thread(new Runnable() { public void run() { for (int i = 0; i < 100; i++) { jedis.get("hello"); } } }).start(); new Thread(new Runnable() { public void run() { for (int i = 0; i < 100; i++) { jedis.hget("haskey", "f"); } } }).start();Untuk mencegah masalah ini dan memastikan keamanan thread, Anda dapat menggunakan JedisPool untuk mengelola koneksi Jedis.
Koneksi idle dalam waktu lama
Server menutup koneksi yang idle dalam waktu lama. Tanyakan pengaturan timeout instans dan pengaturan terkait JedisPool untuk menentukan apakah perlu memeriksa dan membersihkan koneksi idle dalam waktu lama secara berkala.
CatatanSecara default, Tair tidak menutup koneksi idle dalam waktu lama. Jika Anda mengubah nilai parameter timeout, kesalahan ini mungkin dilaporkan. Untuk informasi selengkapnya, lihat Tentukan periode timeout untuk koneksi klien idle.
Solusi: Periksa apakah beberapa thread berbagi kode Jedis atau apakah server menutup koneksi idle dalam waktu lama.
java.lang.Long cannot be cast to java.util.List
Kemungkinan penyebab: Kesalahan ini dilaporkan jika koneksi Jedis yang sama digunakan bersama oleh beberapa thread. Hal ini karena Jedis sendiri tidak aman untuk thread dan tidak boleh digunakan secara konkuren di beberapa thread.
Solusi: Gunakan satu koneksi Jedis dalam satu thread. Untuk itu, Anda dapat menggunakan JedisPool.
Broken pipe (Write failed)
Kemungkinan penyebab: Setelah terjadi kesalahan timeout pada klien Jedis dalam mode koneksi tunggal dan klien menutup socket, Anda terus menulis data ke instans.
Solusi: Gunakan satu koneksi Jedis dalam satu thread. Untuk itu, Anda dapat menggunakan JedisPool.
No way to dispatch this command to Redis Cluster because keys have different slots
Kemungkinan penyebab: JedisCluster melakukan operasi pada key yang berada di slot berbeda.
Solusi: Ubah key dengan menggunakan hash tags.
Anda juga dapat menggunakan mode proxy untuk menonaktifkan batasan arsitektur kluster.
Klien Lettuce
Connection to xxx not allowed. This Partition is not known in the cluster view.
Kemungkinan penyebab: Secara default, validateClusterNodeMembership diatur ke true dan refreshOption diatur ke null untuk klien Lettuce. Setelah alamat routing instans Tair berubah, tabel rute tidak diperbarui karena refreshOption diatur ke null. Dalam kasus ini, kesalahan dilaporkan untuk validateClusterNodeMembership.
Solusi: Tentukan parameter refreshOption dan atur parameter validateClusterNodeMembership ke false. Untuk informasi selengkapnya, lihat Lettuce.
io.lettuce.core.RedisConnectionException: Unable to connect xxx
Kemungkinan penyebab: Koneksi antara klien Anda dan instans Tair mengalami timeout.
Solusi: Rujuk topik Bagaimana cara memecahkan masalah koneksi di Tair?.
java.nio.channels.UnresolvedAddressException
Kemungkinan penyebab: Kesalahan ini kemungkinan besar disebabkan oleh versi Netty.
Solusi: Periksa dependensi Netty dan pilih versi yang lebih tinggi. Untuk informasi selengkapnya, lihat spring-projects/spring-boot#14307.
ERR Unknown sentinel subcommand 'master'
Kemungkinan penyebab: Dalam mode Sentinel master-replika, klien Lettuce mengirim perintah Sentinel master/slave ke instans Tair. Namun, instans dalam mode kompatibel Sentinel hanya mendukung perintah Sentinel get-master-addr-by-name.
Solusi: Ubah kode Anda untuk beralih ke mode non-Sentinel. Tair menggunakan komponen ketersediaan tinggi internal. Anda tidak perlu menggunakan mode kompatibel Sentinel.
Beberapa versi instans tidak mendukung protokol RESP3 dan melaporkan kesalahan "unknown command"
Kemungkinan penyebab: Redis 6.0 dan yang lebih baru mendukung protokol RESP3. Anda dapat menjalankan perintah HELLO untuk mengalihkan koneksi ke versi protokol RESP yang diinginkan. Namun, beberapa instans versi sebelumnya tidak mendukung perintah HELLO, sehingga menyebabkan masalah kompatibilitas.
Solusi: Anda dapat mengonfigurasi program Anda untuk menggunakan protokol RESP2 untuk mengakses instans Tair. Contoh:
client.setOptions(ClientOptions.builder()
.protocolVersion(ProtocolVersion.RESP2)
.build());Contoh saat Spring Data Redis dengan Lettuce digunakan sebagai klien Redis:
LettuceClientConfiguration lettuceClientConfiguration = LettuceClientConfiguration.builder().
clientOptions(ClientOptions.builder().protocolVersion(ProtocolVersion.RESP2).build()).build();
return new LettuceConnectionFactory(redisClusterConfiguration, lettuceClientConfiguration);Klien Redisson
org.redisson.client.RedisConnectionException: Unable to connect to Redis server xxx
Kemungkinan penyebab: Koneksi antara klien Anda dan instans Tair mengalami timeout.
Solusi: Rujuk topik Bagaimana cara memecahkan masalah koneksi di Tair?.
No enum constant org.redisson.cluster.ClusterNodeInfo.Flag.NOFAILOVER
Kemungkinan penyebab: Bug pada versi awal Redisson. Untuk informasi selengkapnya, lihat redisson/redisson#2399.
Solusi: Perbarui klien Redisson Anda ke versi 3.11.6 atau yang lebih baru.
Klien Spring Data Redis
NOPERM this user has no permissions to run the 'config|get' command
Kemungkinan penyebab: Versi instans Anda ditampilkan sebagai Redis 7.0 di halaman Informasi Instans. Perintah CONFIG dinonaktifkan di instans Tair (Kompatibel dengan Redis OSS) yang menjalankan Redis 7.0.
Saat aplikasi dimulai, Spring Data Redis mengeksekusi perintah CONFIG SET untuk mengatur parameter notify-keyspace-events secara dinamis guna mengaktifkan fitur KeyspaceEventMessageListener. Karena perintah CONFIG GET/SET dinonaktifkan, terjadi kesalahan saat startup.
Solusi: Atur keyspaceNotificationsConfigParameter ke string kosong untuk mengatasi masalah ini. Untuk kode lengkapnya, lihat SpringRedisTest.zip. Untuk informasi selengkapnya, lihat Spring Data Redis.
@EnableRedisRepositories(enableKeyspaceEvents = RedisKeyValueAdapter.EnableKeyspaceEvents.ON_STARTUP, keyspaceNotificationsConfigParameter = "")Juga, jika Anda mendengarkan KeyExpirationListener, Anda perlu mengatur keyspaceNotificationsConfigParameter ke string kosong di konstruktor.
public RedisKeyExpirationListener(RedisMessageListenerContainer redisMessageListenerContainer) {
super(redisMessageListenerContainer);
setKeyspaceNotificationsConfigParameter(""); // Penting
}Klien StackExchange.Redis
Multiple databases are not supported on this server; cannot switch to database
Kemungkinan penyebab: Perintah SELECT tidak didukung untuk instans kluster.
Solusi: Atur parameter cluster_compat_enable ke 0 untuk menonaktifkan kompatibilitas dengan sintaks Redis Cluster open source. Kemudian, restart klien Anda dan coba lagi. Untuk informasi selengkapnya, lihat Konfigurasikan parameter instans.
Klien Predis
Error while reading line from the server.
Kemungkinan penyebab: Permintaan baca mengalami timeout. Mungkin sedang berlangsung kueri lambat.
Solusi: Tingkatkan periode timeout atau atur read_write_timeout ke 0 atau -1. Untuk informasi selengkapnya, lihat Pertanyaan Predis.
Klien phpredis
Cannot assign requested address
Kemungkinan penyebab: Klien menghubungkan ke instans Tair melalui koneksi singkat.
Solusi: Ganti metode koneksi connect dengan pconnect, atau ubah parameter kernel tcp_max_tw_buckets pada Instance ECS tempat klien berada. Untuk informasi selengkapnya, lihat Kesalahan "Cannot assign requested address".
redis protocol error, got ' ' as reply type byte
Kemungkinan penyebab: Bug pada versi awal phpredis. Untuk informasi selengkapnya, lihat phpredis/phpredis#1585.
Solusi: Tingkatkan phpredis ke versi terbaru.
php_network_getaddresses: getaddrinfo failed: Temporary failure in name resolution
Solusi: Konfigurasikan server DNS dengan benar. Untuk informasi selengkapnya, lihat Bagaimana cara memecahkan masalah koneksi yang disebabkan oleh kegagalan resolusi DNS?
Kemungkinan penyebab: Klien tidak dapat melakukan resolusi nama domain instans Tair.
Klien Go-redis
panic: got 4 elements in cluster info address, expected 2 or 3
Kemungkinan penyebab: Versi Redis Anda adalah 7.0 atau yang lebih baru, tetapi Anda tidak menggunakan versi klien Go-redis yang kompatibel. Untuk informasi selengkapnya, lihat redis/go-redis#2085.
Solusi: Gunakan go-redis 9.0 atau yang lebih baru.
Klien node-redis
Perintah SCAN masuk ke loop tak terbatas atau mengembalikan data kosong
Kemungkinan penyebab: Nilai cursor yang dikembalikan oleh perintah SCAN mungkin melebihi bilangan bulat aman maksimum JavaScript, Number.MAX_SAFE_INTEGER. Hal ini menyebabkan cursor tidak akurat dan menyebabkan loop tak terbatas. Untuk informasi selengkapnya, lihat redis/node-redis#2561.
Solusi: Perbarui klien node-redis Anda ke versi 5.0.0 atau yang lebih baru.