Rumah > pangkalan data > Redis > Cara menggunakan kaedah penerbitan dan langgan redis untuk melaksanakan sistem pemesejan yang mudah

Cara menggunakan kaedah penerbitan dan langgan redis untuk melaksanakan sistem pemesejan yang mudah

WBOY
Lepaskan: 2023-05-26 20:52:31
ke hadapan
1342 orang telah melayarinya

I. Penggunaan asas

1. Konfigurasi

Kami menggunakan SpringBoot 2.2.1.RELEASE untuk membina persekitaran projek dan menambah pergantungan redis secara langsung dalam pom.xml

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-data-redis</artifactId>
</dependency>
Salin selepas log masuk

Jika Redis kami ialah konfigurasi lalai, jadi anda tidak perlu menambah sebarang konfigurasi tambahan; anda juga boleh mengkonfigurasinya secara langsung dalam konfigurasi application.yml, seperti berikut

spring:
  redis:
    host: 127.0.0.1
    port: 6379
    password:
Salin selepas log masuk

2 Gunakan postur terbitkan/langganan

redis, terutamanya Hanya gunakan dua arahan publish/subscribe; Agak mudah untuk menggunakan mod terbitkan dan langgan dalam SpringBoot Dengan bantuan RedisTemplate, ia boleh direalisasikan dengan mudah

a. Penerbitan mesej

@Service
public class PubSubBean {
    @Autowired
    private StringRedisTemplate redisTemplate;

    public void publish(String key, String value) {
        redisTemplate.execute(new RedisCallback<Object>() {
            @Override
            public Object doInRedis(RedisConnection redisConnection) throws DataAccessException {
                redisConnection.publish(key.getBytes(), value.getBytes());
                return null;
            }
        });
    }
}
Salin selepas log masuk

b. Mesej langganan

Langganan mesej di sini, sila ambil perhatian bahawa kami menggunakan org.springframework.data.redis.connection.MessageListener untuk melaksanakan logik penggunaan

public void subscribe(MessageListener messageListener, String key) {
    redisTemplate.execute(new RedisCallback<Object>() {
        @Override
        public Object doInRedis(RedisConnection redisConnection) throws DataAccessException {
            redisConnection.subscribe(messageListener, key.getBytes());
            return null;
        }
    });
}
Salin selepas log masuk

c 🎜>Tulis kes ujian mudah untuk mengesahkan penerbitan dan langgan di atas, mari kita fahami postur penggunaan

ini; kami membuat projek WEB mudah yang menyediakan dua antara muka rehat

@RestController
@RequestMapping(path = "rest")
public class DemoRest {
    @Autowired
    private PubSubBean pubSubBean;

    // 发布消息
    @GetMapping(path = "pub")
    public String pubTest(String key, String value) {
        pubSubBean.publish(key, value);
        return "over";
    }

    // 新增消费者
    @GetMapping(path = "sub")
    public String subscribe(String key, String uuid) {
        pubSubBean.subscribe(new MessageListener() {
            @Override
            public void onMessage(Message message, byte[] bytes) {
                System.out.println(uuid + " ==> msg:" + message);
            }
        }, key);
        return "over";
    }
}
Salin selepas log masuk
MessageListener Kami dahulu. buat dua pengguna, dan kemudian apabila menghantar mesej, kedua-duanya menerimanya ; Tambah pengguna lain, dan apabila menghantar mesej, ketiga-tiganya boleh menerimanya

3 Arahan dan senario aplikasi

Terbit dan langgan Redis hanya sesuai untuk senario yang agak mudah Ia juga boleh dilihat daripada arahan di atas bahawa ia adalah model terbitan dan langgan yang mudah, menyokong 1 hingga N, dan mesej yang dihantar hanya boleh diperolehi oleh pengguna dalam talian (seperti. bagi yang tak online, boleh dikatakan kesian ) Dan untuk redis, habis sekali mesej di tolak keluar Penekanan:

Hanya pengguna dalam talian boleh menerima mesej

  • Pengguna hanya boleh mendapat mesej sekali

  • Masalah seterusnya datang, Dalam senario apakah redis boleh menerbitkan dan melanggan digunakan?

Ketidaksahihan cache berasaskan memori

Menggunakan reids + memori sebagai cache sekunder boleh dikatakan sebagai kaedah yang agak biasa Dengan bantuan cache berasaskan memori, ia boleh berkesan Meningkatkan beban sistem, tetapi masalahnya juga jelas Ketidaksahihan data cache dalam memori adalah masalah, terutamanya apabila aplikasi digunakan pada berbilang pelayan Jika saya ingin membatalkan cache memori tertentu semua pelayan di pada masa yang sama, menggunakan redis publish/subscribe ialah pilihan yang lebih baik

Muat semula konfigurasi SpringCloud Config

Rakan yang menggunakan SpringCloud Config sebagai pusat konfigurasi mungkin sering menghadapi masalah ini, penyegaran dinamik selepas pengubahsuaian konfigurasi adalah masalah (sudah tentu, sokongan rasmi adalah untuk menyegerakkan melalui bas melalui mq, dan ia juga boleh disegarkan semula secara paksa melalui pentadbir but spring) Dengan bantuan redis publish/subscribe , ia juga merupakan alternatif yang baik untuk mencapai penyegaran dinamik konfigurasi (kemudian demo pelaksanaan khusus diberikan. Jika anda berminat, sila teruskan mengikuti Blog Yihuihui)

langganan tidak sah kunci redis

Apabila kami menggunakan redis untuk caching, kami biasanya Masa tamat tempoh akan ditetapkan, yang tidak didayakan secara lalai Kami juga boleh melanggan acara pembatalan cache melalui langganUbah suai konfigurasi dan dayakan acara pembatalan kunci

notify-keyspace-events Ex
Salin selepas log masuk

Selepas memulakan semula redis, langgan acara tidak sah

subscribe __keyevent@0__:expired
Salin selepas log masuk

Atas ialah kandungan terperinci Cara menggunakan kaedah penerbitan dan langgan redis untuk melaksanakan sistem pemesejan yang mudah. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

Label berkaitan:
sumber:yisu.com
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