JedisPool adalah kumpulan koneksi untuk klien Jedis. Anda dapat mengonfigurasi parameter JedisPool secara tepat untuk meningkatkan performa dan penggunaan sumber daya Redis. Topik ini menjelaskan cara menggunakan JedisPool dan parameter kolam sumber dayanya, serta memberikan pengaturan yang direkomendasikan untuk mengoptimalkan JedisPool.
Menggunakan JedisPool
Jedis 2.9.0 digunakan dalam contoh ini. Contoh kode berikut menunjukkan dependensi Maven:
<dependency>
<groupId>redis.clients</groupId>
<artifactId>jedis</artifactId>
<version>2.9.0</version>
<scope>compile</scope>
</dependency>Jedis mengelola kolam sumber daya dengan menggunakan Apache Commons-pool2. Saat mendefinisikan JedisPool, disarankan untuk memperhatikan parameter GenericObjectPoolConfig dari kolam sumber daya. Contoh kode berikut menunjukkan cara menggunakan parameter ini:
GenericObjectPoolConfig jedisPoolConfig = new GenericObjectPoolConfig();
jedisPoolConfig.setMaxTotal(...);
jedisPoolConfig.setMaxIdle(...);
jedisPoolConfig.setMinIdle(...);
jedisPoolConfig.setMaxWaitMillis(...);
...Contoh berikut menunjukkan cara menginisialisasi JedisPool:
redisHost menentukan alamat IP dari instance. redisPort menentukan port dari instance. redisPassword menentukan kata sandi dari instance. Parameter timeout menentukan batas waktu koneksi dan batas waktu baca/tulis.
JedisPool jedisPool = new JedisPool(jedisPoolConfig, redisHost, redisPort, timeout, redisPassword);
// Jalankan perintah berikut:
Jedis jedis = null;
try {
jedis = jedisPool.getResource();
// Perintah spesifik
jedis.executeCommand()
} catch (Exception e) {
logger.error(e.getMessage(), e);
} finally {
//Dalam mode JedisPool, sumber daya Jedis dikembalikan ke kolam sumber daya.
if (jedis != null)
jedis.close();
}Parameter
Koneksi Jedis adalah sumber daya yang dikelola oleh JedisPool di kolam koneksi. JedisPool adalah kolam koneksi yang aman untuk thread. Ini memungkinkan Anda menjaga semua sumber daya dalam rentang yang dapat dikelola. Dengan mengatur parameter GenericObjectPoolConfig ke nilai yang tepat, Anda dapat meningkatkan performa Redis dan mengurangi konsumsi sumber daya. Dua tabel berikut menjelaskan parameter penting dan memberikan pengaturan yang direkomendasikan.
Tabel 1. Parameter terkait pengaturan sumber daya dan penggunaan sumber daya
Parameter | Deskripsi | Nilai default | Pengaturan yang direkomendasikan |
maxTotal | Jumlah maksimum koneksi dalam kolam. | 8 | Untuk informasi lebih lanjut, lihat Pengaturan yang direkomendasikan. |
maxIdle | Jumlah maksimum koneksi idle dalam kolam. | 8 | Untuk informasi lebih lanjut, lihat Pengaturan yang direkomendasikan. |
minIdle | Jumlah minimum koneksi idle dalam kolam. | 0 | Untuk informasi lebih lanjut, lihat Pengaturan yang direkomendasikan. |
blockWhenExhausted | Menentukan apakah klien harus menunggu saat kolam sumber daya habis. Hanya ketika parameter ini disetel ke true, parameter maxWaitMillis berlaku. | true | Kami sarankan Anda menggunakan nilai default. |
maxWaitMillis | Jumlah maksimum milidetik yang harus ditunggu klien saat tidak ada koneksi yang tersedia. | -1 (menunjukkan bahwa koneksi tidak pernah habis waktu.) | Kami sarankan Anda tidak menggunakan nilai default. |
testOnBorrow | Menentukan apakah akan memvalidasi koneksi dengan menggunakan perintah PING sebelum koneksi dipinjam dari kolam. Koneksi yang tidak valid dihapus dari kolam. | false | Kami sarankan Anda menyetel parameter ini ke false saat beban kerja berat. Ini memungkinkan Anda mengurangi overhead tes ping. |
testOnReturn | Menentukan apakah akan memvalidasi koneksi dengan menggunakan perintah PING sebelum koneksi dikembalikan ke kolam. Koneksi yang tidak valid dihapus dari kolam. | false | Kami sarankan Anda menyetel parameter ini ke false saat beban kerja berat. Ini memungkinkan Anda mengurangi overhead tes ping. |
jmxEnabled | Menentukan apakah akan mengaktifkan pemantauan Java Management Extensions (JMX). | true | Kami sarankan Anda mengaktifkan pemantauan JMX. Perhatikan bahwa Anda juga harus mengaktifkan fitur ini untuk aplikasi Anda. |
Pendeteksian objek Jedis idle dikendalikan oleh kombinasi empat parameter.
Tabel 2. Parameter terkait pendeteksian sumber daya idle
Parameter | Deskripsi | Nilai default | Pengaturan yang direkomendasikan |
testWhileIdle | Menentukan apakah akan memvalidasi koneksi dengan menjalankan perintah PING selama proses pemantauan sumber daya idle. Koneksi yang tidak valid dihapus. | false | true |
timeBetweenEvictionRunsMillis | Siklus pendeteksian sumber daya idle. Unit: milidetik. | -1 (menunjukkan bahwa pendeteksian sumber daya idle dinonaktifkan.) | Kami sarankan Anda menyetel parameter ini ke nilai yang tepat. Anda juga dapat menggunakan konfigurasi default di JedisPoolConfig. |
minEvictableIdleTimeMillis | Waktu idle minimum suatu sumber daya di kolam sumber daya. Unit: milidetik. Saat batas atas tercapai, sumber daya idle dihapus. | 1.800.000 (30 menit) | Nilai default cocok untuk sebagian besar kasus. Anda juga dapat menggunakan konfigurasi di JedisPoolConfig berdasarkan kebutuhan bisnis Anda. |
numTestsPerEvictionRun | Jumlah sumber daya yang dideteksi dalam setiap siklus. | 3 | Anda dapat mengubah nilai berdasarkan koneksi aplikasi Anda. Nilai -1 menentukan bahwa sistem memeriksa semua koneksi untuk sumber daya idle. |
Jedis menyediakan JedisPoolConfig yang menggunakan beberapa konfigurasi GenericObjectPoolConfig untuk pendeteksian sumber daya idle.
public class JedisPoolConfig extends GenericObjectPoolConfig {
public JedisPoolConfig() {
setTestWhileIdle(true);
setMinEvictableIdleTimeMillis(60000);
setTimeBetweenEvictionRunsMillis(30000);
setNumTestsPerEvictionRun(-1);
}
}Anda dapat melihat semua nilai default di org.apache.commons.pool2.impl.BaseObjectPoolConfig.
Pengaturan yang direkomendasikan
maxTotal: Jumlah maksimum koneksi.
Untuk menetapkan nilai yang tepat untuk maxTotal, perhatikan faktor-faktor berikut:
Jumlah koneksi bersamaan yang diharapkan berdasarkan kebutuhan bisnis Anda.
Jumlah waktu yang dikonsumsi oleh klien untuk menjalankan perintah.
Batas sumber daya Redis. Misalnya, jika Anda mengalikan nilai maxTotal dengan jumlah node (instance ECS), hasilnya harus lebih kecil dari jumlah maksimum koneksi yang didukung oleh Redis. Anda dapat melihat jumlah maksimum koneksi di halaman Informasi Instance di konsol ApsaraDB for Redis.
Jumlah sumber daya yang dikonsumsi untuk membuat dan melepaskan koneksi. Jika jumlah koneksi yang dibuat dan dilepaskan untuk permintaan besar, proses yang dijalankan untuk membuat dan melepaskan koneksi terpengaruh secara negatif.
Sebagai contoh, rata-rata waktu yang dikonsumsi untuk menjalankan perintah, atau rata-rata waktu yang diperlukan untuk meminjam atau mengembalikan sumber daya dan menjalankan perintah Jedis dengan overhead jaringan, adalah sekitar 1 ms. Permintaan per detik (QPS) dari sebuah koneksi adalah sekitar 1.000, yang dihitung dengan membagi 1 detik dengan 1 milidetik. QPS yang diharapkan dari instance Redis individu adalah 50.000 (jumlah total QPS dibagi dengan jumlah shard Redis). Ukuran teoretis kolam sumber daya (maxTotal) adalah 50, yang dihitung dengan membagi 50.000 dengan 1.000.
Namun, ini hanya nilai teoretis. Penting juga untuk menyediakan beberapa sumber daya tambahan untuk mengantisipasi permintaan yang tidak terduga. Oleh karena itu, kami sarankan Anda menyetel maxTotal ke nilai yang lebih besar dari perkiraan yang dihitung. Namun, jika nilai parameter maxTotal terlalu besar, koneksi mengonsumsi sejumlah besar sumber daya klien dan server. Untuk server Redis yang memiliki QPS tinggi, jika sejumlah besar perintah diblokir, masalah tersebut tidak dapat diselesaikan meskipun dengan kolam sumber daya yang besar.
maxIdle dan minIdle
maxIdle menunjukkan jumlah maksimum koneksi aktual yang diperlukan oleh beban kerja. maxTotal mencakup jumlah koneksi idle sebagai surplus. Jika nilai maxIdle kecil pada sistem yang sangat terbebani, koneksi new Jedis dibuat untuk melayani permintaan. minIdle menunjukkan jumlah minimum koneksi yang telah dibuat yang harus dipertahankan dalam kolam.
Kolam koneksi mencapai performa terbaiknya ketika nilai maxTotal sama dengan nilai maxIdle. Dengan cara ini, performa tidak terpengaruh oleh penskalaan kolam koneksi. Kami sarankan Anda menyetel parameter maxIdle dan minIdle ke nilai yang sama jika lalu lintas pengguna berfluktuasi. Jika jumlah koneksi bersamaan kecil atau jika nilai maxIdle terlalu besar, sumber daya koneksi terbuang.
Anda dapat mengevaluasi ukuran kolam koneksi yang digunakan oleh setiap node berdasarkan QPS total aktual dan jumlah klien yang dilayani Redis.
Ambil nilai yang tepat berdasarkan data pemantauan
Dalam skenario nyata, metode yang lebih andal adalah mencoba mengambil nilai optimal berdasarkan data pemantauan. Anda dapat menggunakan pemantauan JMX atau alat pemantauan lainnya untuk menemukan nilai yang tepat.
FAQ
Sumber daya tidak mencukupi.
Anda tidak dapat memperoleh sumber daya dari kolam sumber daya dalam kasus berikut:
Timeout:
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 Anda menyetel parameter blockWhenExhausted ke false, waktu yang ditentukan oleh borrowMaxWaitMillis tidak digunakan dan panggilan borrowObject memblokir koneksi hingga koneksi idle tersedia.
redis.clients.jedis.exceptions.JedisConnectionException: Could not get a resource from the pool ... Caused by: java.util.NoSuchElementException: Pool exhausted at org.apache.commons.pool2.impl.GenericObjectPool.borrowObject(GenericObjectPool.java:464)
Penyimpangan ini mungkin bukan disebabkan oleh ukuran kolam yang terbatas. Untuk informasi lebih lanjut, lihat Pengaturan yang direkomendasikan. Untuk memperbaiki masalah ini, kami sarankan Anda memeriksa jaringan, parameter kolam sumber daya, layanan pemantauan kolam sumber daya (pemantauan JMX), kode (misalnya, alasannya adalah jedis.close() tidak dieksekusi), query lambat, dan Sistem Nama Domain (DNS).
Pemuatan Awal JedisPool
Jika Anda menentukan nilai timeout yang kecil, proyek mungkin mengalami timeout setelah dimulai. JedisPool tidak membuat koneksi Jedis di kolam koneksi saat JedisPool mendefinisikan jumlah maksimum sumber daya dan jumlah minimum sumber daya idle. Jika tidak ada koneksi idle yang ada di kolam, koneksi new Jedis dibuat. Koneksi ini dilepaskan ke kolam setelah koneksi digunakan. Namun, proses di mana Anda membuat koneksi dan berulang kali melepaskan koneksi mungkin memakan waktu lama. Oleh karena itu, kami sarankan Anda memuat awal JedisPool dengan jumlah minimum koneksi idle setelah JedisPool didefinisikan. Contoh berikut menunjukkan cara memuat awal JedisPool:
List<Jedis> minIdleJedisList = new ArrayList<Jedis>(jedisPoolConfig.getMinIdle());
for (int i = 0; i < jedisPoolConfig.getMinIdle(); i++) {
Jedis jedis = null;
try {
jedis = pool.getResource();
minIdleJedisList.add(jedis);
jedis.ping();
} catch (Exception e) {
logger.error(e.getMessage(), e);
} finally {
}
}
for (int i = 0; i < jedisPoolConfig.getMinIdle(); i++) {
Jedis jedis = null;
try {
jedis = minIdleJedisList.get(i);
jedis.close();
} catch (Exception e) {
logger.error(e.getMessage(), e);
} finally {
}
}Untuk informasi tentang kesalahan lainnya, lihat Kesalahan umum dan pemecahan masalah.