Rumah > pangkalan data > Redis > teks badan

Bagaimana untuk melaksanakan fungsi ketekalan cache yang diedarkan melalui Redis

王林
Lepaskan: 2023-07-30 08:00:48
asal
1239 orang telah melayarinya

Cara melaksanakan fungsi ketekalan cache teragih melalui Redis

Pengenalan
Dalam sistem teragih, caching adalah salah satu strategi biasa untuk meningkatkan prestasi dan mengurangkan beban pangkalan data. Sebagai pangkalan data cache berprestasi tinggi, Redis boleh menyokong cache teragih dengan baik. Walau bagaimanapun, terdapat masalah penting dengan cache yang diedarkan, iaitu konsistensi cache. Dalam persekitaran teragih, apabila berbilang nod mengendalikan cache pada masa yang sama, ketidakkonsistenan data boleh berlaku dengan mudah. Artikel ini akan memperkenalkan cara menggunakan Redis untuk melaksanakan fungsi ketekalan cache teragih.

1. Analisis Isu Konsistensi Cache Redis
Dalam persekitaran yang diedarkan, isu konsistensi cache disebabkan terutamanya oleh dua aspek berikut:

  1. Ketidakkonsistenan data yang disebabkan oleh operasi baca dan tulis serentak: Apabila berbilang pelanggan membaca dan menulis data daripada pangkalan data pada masa yang sama Baca data yang sama dalam Redis dan cache data dalam Redis. Apabila pelanggan mengubah suai data dalam pangkalan data dan mengemas kininya kepada Redis, pelanggan lain membaca data cache lama, menyebabkan cache tidak konsisten dengan data pangkalan data.
  2. Ketidakkonsistenan data yang disebabkan oleh kegagalan cache: Apabila pelanggan memadamkan atau mengubah suai data dalam pangkalan data dan mengemas kininya kepada Redis, data yang dicache sebelum ini masih wujud dalam Redis nod lain, menyebabkan cache nod lain tidak konsisten dengan pangkalan data Data tidak konsisten.

2. Kunci edaran Redis mencapai ketekalan cache
Untuk menyelesaikan masalah ketekalan cache, kita boleh menggunakan mekanisme kunci teragih Redis. Kunci yang diedarkan boleh memastikan bahawa hanya satu utas boleh melaksanakan blok kod terkunci dalam persekitaran serentak, dengan itu memastikan keatomisan cache dibaca dan dikemas kini. Berikut ialah contoh kod menggunakan kunci teragih Redis:

import redis.clients.jedis.Jedis; 

public class RedisDistributedLock {

    private static final String LOCK_KEY = "distributed_lock";
    private static final int LOCK_EXPIRE = 30000;
    private static final int TIMEOUT = 5000;

    private static boolean tryGetLock(Jedis jedis, String lockKey, String requestId, int expireTime) {
        String result = jedis.set(lockKey, requestId, "NX", "PX", expireTime);
        return "OK".equals(result);
    }

    private static boolean tryReleaseLock(Jedis jedis, String lockKey, String requestId) {
        String script = "if redis.call('get', KEYS[1]) == ARGV[1] then return redis.call('del', KEYS[1]) else return 0 end";
        Object result = jedis.eval(script, Collections.singletonList(lockKey), Collections.singletonList(requestId));
        return 1L == (Long) result;
    }

    public static void main(String[] args) {
        Jedis jedis = new Jedis("localhost");

        String requestId = UUID.randomUUID().toString();
        boolean lockAcquired = tryGetLock(jedis, LOCK_KEY, requestId, LOCK_EXPIRE);

        try {
            if (lockAcquired) {
                // 此处执行缓存更新操作
                // ...
            }

            // 其他业务代码
            // ...
        } finally {
            if (lockAcquired) {
                tryReleaseLock(jedis, LOCK_KEY, requestId);
            }
        }

        jedis.close();
    }
}
Salin selepas log masuk

Dalam kod di atas, kami mula-mula mentakrifkan kaedah tryGetLock untuk cuba mendapatkan kunci dan gunakan arahan setnx Redi untuk melaksanakan kunci yang diedarkan . Jika pemerolehan berjaya, operasi kemas kini cache boleh dilakukan. Selepas kemas kini selesai, gunakan kaedah tryReleaseLock untuk melepaskan kunci supaya pelanggan lain boleh memperoleh kunci itu. Keseluruhan transaksi menggunakan blok kod cuba-akhir untuk memastikan kunci dilepaskan. tryGetLock 方法来尝试获取锁,并使用Redi的setnx命令来实现分布式锁。如果获取成功,则可以执行缓存的更新操作。在更新完成后,使用 tryReleaseLock 方法来释放锁,以便其他客户端可以获取到锁。整个事务使用try-finally代码块来确保锁的释放。

三、Redis发布订阅功能实现缓存失效一致性
缓存失效也是导致缓存一致性问题的重要原因之一。为了解决这个问题,Redis提供了发布订阅功能,可以通过发布订阅消息来通知其他节点删除缓存。以下是一个使用Redis发布订阅功能的示例代码:

import redis.clients.jedis.Jedis; 

public class RedisCacheInvalidation {

    private static final String CHANNEL_NAME = "cache_invalidation";

    public static void main(String[] args) {
        Jedis jedis = new Jedis("localhost");

        // 在缓存更新时发布一条消息
        jedis.publish(CHANNEL_NAME, "cache_updated");

        // 其他节点订阅该消息,并在接收到消息时清除本地缓存
        jedis.subscribe(new JedisPubSub() {
            @Override
            public void onMessage(String channel, String message) {
                if (CHANNEL_NAME.equals(channel)) {
                    // 清除本地缓存
                    // ...
                }
            }
        }, CHANNEL_NAME);

        jedis.close();
    }
}
Salin selepas log masuk

在上述代码中,我们通过 jedis.publish 方法发布一条缓存更新消息到指定的频道。其他节点可以通过 jedis.subscribe

3. Fungsi penerbitan dan langgan Redis mencapai konsistensi ketidaksahihan cache

Penolakan cache juga merupakan salah satu sebab penting untuk masalah konsistensi cache. Untuk menyelesaikan masalah ini, Redis menyediakan fungsi terbitkan dan langgan, yang boleh memberitahu nod lain untuk memadamkan cache dengan menerbitkan dan melanggan mesej. Berikut ialah contoh kod menggunakan fungsi terbitkan dan langgan Redis:
rrreee

Dalam kod di atas, kami menerbitkan mesej kemas kini cache ke saluran yang ditentukan melalui kaedah jedis.publish. Nod lain boleh melanggan saluran melalui kaedah jedis.subscribe dan mengosongkan cache setempat apabila menerima mesej.

Kesimpulan
    Redis, sebagai pangkalan data cache berprestasi tinggi, boleh mencapai konsistensi cache yang diedarkan melalui kunci yang diedarkan serta fungsi penerbitan dan langganan. Dengan menggunakan fungsi ini, kami boleh memastikan ketekalan operasi baca dan tulis serentak dan ketidaksahihan cache dalam persekitaran teragih, dengan itu meningkatkan kebolehpercayaan dan prestasi sistem.
  • Rujukan:
  • Tapak web rasmi Redis: https://redis.io/
Prinsip pelaksanaan kunci diedarkan Redis: https://redis.io/topics/distlock🎜🎜Pengenalan kepada fungsi penerbitan dan langganan Redis: https: //redis.io/topics/pubsub🎜🎜

Atas ialah kandungan terperinci Bagaimana untuk melaksanakan fungsi ketekalan cache yang diedarkan melalui Redis. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

Label berkaitan:
sumber:php.cn
Kenyataan Laman Web ini
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
Tutorial Popular
Lagi>
Muat turun terkini
Lagi>
kesan web
Kod sumber laman web
Bahan laman web
Templat hujung hadapan