全部产品
Search
文档中心

Tair (Redis® OSS-Compatible):Kesalahan umum

更新时间:Dec 16, 2025

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 close dipanggil 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.

Catatan

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.

Catatan

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.

Catatan

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.

Catatan

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.

Catatan

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.

Catatan

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.

Penting

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

Kemungkinan penyebab: Key yang terlibat dalam skrip Lua tidak berada di slot yang sama. Kesalahan ini umum terjadi pada instans kluster.

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 -l
  • Pemblokiran 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 more

    at redis.clients.jedis.Connection.connect(Connection.java:158) menunjukkan bahwa Jedis mencoba membuat koneksi socket dan memanggil fungsi connect, 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.

Catatan

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.

    Catatan

    Secara 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.

Catatan

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.