Teknologian jakaminen

Viestijonojen käyttöönotto Rediksen avulla: Listan, Pub/Sub:n ja Streamin harjoittaminen

2024-07-12

한어Русский языкEnglishFrançaisIndonesianSanskrit日本語DeutschPortuguêsΕλληνικάespañolItalianoSuomalainenLatina


Yhteenveto

Redis on korkean suorituskyvyn avainarvojen tallennusjärjestelmä, ja sen useat tietorakenteet tekevät siitä ihanteellisen valinnan viestijonojen toteuttamiseen. Tässä artikkelissa tutkitaan, kuinka Redisin List-, Pub/Sub- ja Stream-tietorakenteita voidaan käyttää tehokkaan viestijonojärjestelmän toteuttamiseen.

1. Viestijonon peruskäsitteet

Viestijono on sovellusten välisen viestinnän mekanismi, jonka avulla sovellukset voivat lähettää ja vastaanottaa viestejä asynkronisesti. Sitä käytetään hajautetuissa järjestelmissä palvelukomponenttien erottamiseen ja järjestelmän skaalautuvuuden ja luotettavuuden parantamiseen.

2. Rediksen edut viestijonona

  • korkea suorituskyky: Redis on muistiin perustuva toiminto, jolla on erittäin nopea luku- ja kirjoitusnopeus.
  • Erilaisia ​​tietorakenteita: Tukee erilaisia ​​tietorakenteita, kuten List, Set, Pub/Sub jne., jotka sopivat erilaisiin käyttöskenaarioihin.
  • Sitkeys: Tue tietojen pysyvyyttä ja varmista, että viestit eivät katoa.
  • Atomioperaatiot: Tukee tapahtumia ja atomioperaatioita viestijonon toimintojen johdonmukaisuuden varmistamiseksi.

3. Käytä Listaa viestijonon toteuttamiseen

Lista on yksi Rediksen perustietorakenteista ja sitä voidaan käyttää yksinkertaisena viestijonona.

3.1 Perustoiminnot

  • tuottaja:käyttääLPUSHKomento lisää viestin luettelon päähän.
  • kuluttaja:käyttääBRPOPKomento estää viestin luettelon lopusta.

3.2 Toteutusesimerkki

// 生产者
jedis.lpush("queue", "message");

// 消费者
String message = jedis.brpop(0, "queue");
  • 1
  • 2
  • 3
  • 4
  • 5

4. Käytä Pub/Sub-toimintoa julkaisu/tilausmallin toteuttamiseen

Pub/Sub on viestien julkaisu- ja tilausmalli, jonka avulla viestit voidaan toimittaa yhdestä moneen.

4.1 Perustoiminnot

  • kuuluttaja:käyttääPUBLISHKomento julkaisee viestit määritetylle kanavalle.
  • tilaaja:käyttääSUBSCRIBEKomento tilata kanava ja vastaanottaa viestejä.

4.2 Toteutusesimerkki

// 发布者
jedis.publish("channel", "message");

// 订阅者
jedis.subscribe(new JedisPubSub() {
    @Override
    public void onMessage(String channel, String message) {
        System.out.println("Received: " + message);
    }
}, "channel");
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10

5. Käytä Streamia viestijonon toteuttamiseen

Stream on Redis 5.0:ssa käyttöön otettu uusi pysyvä tietorakenne, joka on erityisesti suunniteltu viestijono- ja lokitoimintoihin.

5.1 Perustoiminnot

  • tuottaja:käyttääXADDKomento lisää viestin streamiin.
  • kuluttaja:käyttääXREADKomento lukee viestit Streamista.

5.2 Toteutusesimerkki

// 生产者
String messageId = jedis.xadd("stream", StreamEntry.entry("field1", "value1"));

// 消费者
List<Map.Entry<String, String>> messages = jedis.xread(StreamsXReadParams.STREAMS.entry("stream", messageId));
  • 1
  • 2
  • 3
  • 4
  • 5

5.3 Käytä Lua-skriptiä ja Redis Streamia tehokkaan viestijonon toteuttamiseen

1. Lua-skriptien edut Redisissä
  • atomisuus: Lua-skriptit suoritetaan Rediksen sisällä, mikä varmistaa toimintojen atomisuuden.
  • esitys: Vähentää verkon edestakaisten matkojen määrää ja parantaa suoritustehokkuutta.
  • joustavuus: Pystyy kirjoittamaan monimutkaista logiikkaa sopeutumaan erilaisiin liiketoiminnan tarpeisiin.
2. Käytä Lua-skriptiä Redis Streamin käyttämiseen
2.1 Perustoiminnot
  • tuottaja:käyttääXADDKomento lisää viestin streamiin.
  • kuluttaja:käyttääXREADKomento lukee viestit Streamista.
  • kuluttajaryhmä:käyttääXREADGROUPKomento toteuttaa kuluttajaryhmän toiminnon.
2.2 Lua-skriptiesimerkki

Seuraavassa on yksinkertainen Lua-skriptiesimerkki tuottajien ja kuluttajien perustoimintojen toteuttamiseen.

-- 生产者脚本
local function produce(streamKey, message)
    local result = redis.call('XADD', streamKey, '*', 'message', message)
    return result
end

-- 消费者脚本
local function consume(streamKey, groupName, consumerName)
    local result = redis.call('XREADGROUP', 'GROUP', groupName, consumerName, 'BLOCK', 5000, 'STREAMS', streamKey, 0)
    return result
end

-- 调用脚本
local streamKey = 'myStream'
local message = 'Hello, Redis Stream!'
local groupName = 'myGroup'
local consumerName = 'myConsumer'

-- 生产消息
local messageId = produce(streamKey, message)

-- 消费消息
local messages = consume(streamKey, groupName, consumerName)
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23

3. Kuluttajaryhmien käyttö

Kuluttajaryhmät ovat Redis Streamin ominaisuus, jonka avulla useat kuluttajaesiintymät voivat koordinoida työtään ja yhdessä kuluttaa viestejä Streamissa.

3.1 Luo kuluttajaryhmä
redis.call('XGROUP', 'CREATE', streamKey, groupName, '$', 'MKSTREAM')
  • 1
3.2 Kuluttajaryhmien lukeminen
redis.call('XREADGROUP', 'GROUP', groupName, consumerName, 'BLOCK', 5000, 'STREAMS', streamKey, '>')
  • 1

4. Yhteenveto

Lua-skriptien ja Redis Streamin käyttäminen viestijonojen toteuttamiseen voi hyödyntää Rediksen korkeaa suorituskykyä ja Lua-skriptien atomiteettia tehokkaan ja luotettavan viestijonojärjestelmän rakentamiseksi. Kuluttajaryhmien ominaisuus parantaa entisestään viestijonojen saatavuutta ja skaalautuvuutta.

5. Varotoimet
  • Varmista, että Lua-skriptit on testattu täysin ennen suorittamista.
  • Kun otetaan huomioon viestin pysyvyys ja turvallisuus, määritä Rediksen pysyvyysstrategia järkevästi.
  • Tuotantoympäristössä seuraa viestijonojen suorituskykyä ja tilaa varmistaaksesi järjestelmän vakaan toiminnan.
6. Viitteet

6. Yhteenveto

Redis tarjoaa useita tapoja toteuttaa viestijonoja, joista jokaisella on soveltuva skenaario. List sopii yksinkertaisiin jonovaatimuksiin, Pub/Sub sopii julkaisu-/tilaustilaan, ja Stream tarjoaa tehokkaampia viestijonotoimintoja, mukaan lukien pysyvyys, kuluttajaryhmät ja muut ominaisuudet.
Lisää kuvan kuvaus tähän

7. Viitteet