Rumah  >  Artikel  >  pangkalan data  >  Menggunakan Redis untuk melaksanakan kunci yang diedarkan di Jawa

Menggunakan Redis untuk melaksanakan kunci yang diedarkan di Jawa

WBOY
WBOYasal
2023-05-11 10:52:415335semak imbas

Dengan perkembangan teknologi Internet, sistem yang diedarkan telah menjadi topik penting, dan kunci yang diedarkan juga merupakan salah satu teknologi penting. Dalam sistem yang diedarkan, ketertiban dan keselamatan akses kepada sumber yang dikongsi oleh berbilang proses atau benang boleh dijamin dengan menggunakan kunci yang diedarkan. Di Jawa, terdapat banyak penyelesaian untuk melaksanakan kunci teragih, antaranya penyelesaian kunci teragih Redis adalah salah satu kaedah yang lebih biasa digunakan.

Redis ialah pangkalan data dalam memori berprestasi tinggi, berterusan, dengan sokongan struktur data yang baik dan ciri-ciri teragih. Mod kelompok Redis boleh mengembangkan prestasi sistem dengan mudah, dan pada masa yang sama, fungsi kunci yang diedarkan juga boleh direalisasikan melalui mekanisme langganan berdasarkan PUB/SUB. Di bawah ini kami akan memperkenalkan cara menggunakan Redis untuk melaksanakan kunci teragih.

1. Idea reka bentuk kunci Redis

Untuk melaksanakan kunci dalam sistem teragih, syarat berikut perlu dipenuhi:

1 boleh digunakan pada masa yang sama Pelanggan memegang kunci.

2. Reentrant: Pelanggan yang sama boleh memperoleh kunci beberapa kali dan perlu melepaskan kunci dengan bilangan kali yang sama.

3. Tidak menyekat: Jika percubaan untuk mendapatkan kunci gagal, ia akan kembali serta-merta dan tidak akan menyekat urutan pelanggan.

4. Toleransi kerosakan: Kunci harus dilepaskan secara automatik selepas tamat tempoh atau tamat tempoh, supaya tidak menyebabkan kebuntuan dan masalah lain.

Berdasarkan syarat di atas, kami boleh mereka bentuk pelan pelaksanaan kunci Redis berikut:

1 Gunakan arahan SETNX untuk cuba menetapkan nilai kunci itu bermakna kunci telah berjaya diperoleh, jika tidak ia bermakna Gagal memperoleh kunci.

2. Gunakan arahan GET untuk mendapatkan nilai kunci dan tentukan sama ada klien semasa memegang kunci Jika klien memegang kunci, tambahkan 1 pada nilai kunci kunci akan dikembalikan.

3. Gunakan arahan DEL untuk melepaskan kunci.

4. Gunakan masa tamat tempoh untuk mengelakkan kebuntuan Masa tamat tempoh kunci harus lebih besar daripada masa pemprosesan perniagaan, biasanya beberapa saat hingga beberapa minit.

2. Kod Java untuk melaksanakan kunci teragih

Berikut ialah contoh kod Java menggunakan Redis untuk melaksanakan kunci teragih:

import redis.clients.jedis.Jedis;
import redis.clients.jedis.JedisPool;
import redis.clients.jedis.JedisPoolConfig;

public class RedisLock {

    private static JedisPool jedisPool = null;

    static {
        JedisPoolConfig jedisPoolConfig = new JedisPoolConfig();
        jedisPool = new JedisPool(jedisPoolConfig, "localhost", 6379);
    }

    /**
     * 获取锁
     * @param key 锁的key值
     * @param expireTime 锁的过期时间
     * @return 获取锁的结果
     */
    public static boolean tryLock(String key, int expireTime) {

        Jedis jedis = jedisPool.getResource();

        //尝试获取锁
        Long result = jedis.setnx(key, "1");

        if (result == 1) {
            //设置过期时间
            jedis.expire(key, expireTime);
            jedis.close();
            return true;
        } else {
            jedis.close();
            return false;
        }
    }

    /**
     * 释放锁
     * @param key 锁的key值
     */
    public static void releaseLock(String key) {
        Jedis jedis = jedisPool.getResource();
        jedis.del(key);
        jedis.close();
    }
}

Contoh menggunakan kunci teragih

Berikut ialah contoh kod Java menggunakan kunci yang diedarkan.

public class ConcurrentTest {

    private static int count = 0;

    public static void main(String[] args) throws InterruptedException {

        ExecutorService executorService = Executors.newFixedThreadPool(10);

        for(int i=0; i<100000; i++){

            executorService.execute(() -> {

                String key = "lock_key";

                boolean result = RedisLock.tryLock(key, 2);

                if(result){

                    try {
                        count ++; //操作共享资源

                        System.out.println(Thread.currentThread().getName() + "操作成功,count=" + count);

                        Thread.sleep(100);

                    } catch (Exception e) {
                        e.printStackTrace();
                    }finally{
                        RedisLock.releaseLock(key); //释放锁
                    }
                }

            });
        }

        executorService.shutdown();
    }
}

4. Ringkasan

Dalam sistem yang diedarkan, peranan kunci adalah sangat penting. Penggunaan kunci yang munasabah dan berkesan dapat memastikan keselamatan dan kecekapan sistem. Kunci teragih Redis adalah kaedah yang agak biasa Melalui prestasi tinggi dan ciri teragih Redis, fungsi kunci teragih boleh direalisasikan dengan mudah. Pembangun boleh memutuskan sama ada untuk menggunakan kunci yang diedarkan Redis berdasarkan keperluan perniagaan dan keperluan prestasi sistem.

Atas ialah kandungan terperinci Menggunakan Redis untuk melaksanakan kunci yang diedarkan di Jawa. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

Kenyataan:
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn