Rumah  >  Artikel  >  pembangunan bahagian belakang  >  Cara menggunakan redis untuk melaksanakan baris gilir kelewatan di Golang.

Cara menggunakan redis untuk melaksanakan baris gilir kelewatan di Golang.

PHPz
PHPzasal
2023-06-20 09:37:521598semak imbas

Cara menggunakan Redis untuk melaksanakan baris gilir kelewatan dalam Golang

Baris gilir kelewatan ialah kaedah pemprosesan mesej yang sangat praktikal Ia melambatkan mesej untuk tempoh masa sebelum memproses penjadualan tugas dan tugasan berjadual . Dalam pembangunan sebenar, Redis ialah pangkalan data cache yang sangat biasa digunakan Ia menyediakan fungsi yang serupa dengan baris gilir mesej, jadi kami boleh menggunakan Redis untuk melaksanakan baris gilir kelewatan. Artikel ini akan memperkenalkan cara melaksanakan baris gilir kelewatan menggunakan Golang dan Redis.

  1. ZSET of Redis

Redis menyediakan struktur data set diisih (set tersusun), yang boleh kita gunakan untuk melaksanakan baris gilir kelewatan. Dalam set diisih, setiap elemen mempunyai atribut skor, yang digunakan untuk menunjukkan berat elemen. Isih set menyimpan elemen dalam susunan skor yang menaik Elemen dengan skor yang sama akan diisih mengikut ahlinya. Kita boleh merangkum setiap tugas ke dalam elemen dan menggunakan masa yang diperlukan untuk melaksanakan tugas sebagai skor elemen.

  1. Pelaksanaan Gilir Kelewatan

Secara khusus, kita boleh menggunakan arahan ZADD Redis untuk menambah tugasan pada baris gilir kelewatan. Contohnya:

//添加任务到延迟队列
func AddTaskToDelayQueue(taskId string, delayTime int64) error {
    _, err := redisClient.ZAdd("DelayedQueue", redis.Z{
        Score:  float64(time.Now().Unix() + delayTime),
        Member: taskId,
    }).Result()
    if err != nil {
        return err
    }
    return nil
}

Dalam kod di atas, kami menggunakan arahan ZADD Redis untuk menambah tugasan pada set diisih bernama "DelayedQueue". Antaranya, delayTime menunjukkan masa tugas itu perlu ditangguhkan, dan Skor ialah masa semasa ditambah dengan masa tunda, iaitu cap masa apabila tugas itu perlu dilaksanakan.

Dalam senario perniagaan sebenar, kita boleh mendapatkan elemen dengan skor terkecil dalam baris gilir kelewatan sebelum pelaksanaan tugas, iaitu tugas terbaharu yang perlu dilaksanakan:

//获取延迟任务队列中最近需要执行的任务id
func GetNextTaskFromDelayQueue() (string, error) {
    now := time.Now().Unix()
    items, err := redisClient.ZRangeByScore("DelayedQueue", redis.ZRangeBy{
        Min:    "-inf",
        Max:    strconv.FormatInt(now, 10),
        Offset: 0,
        Count:  1,
    }).Result()
    if err != nil {
        return "", err
    }
    if len(items) == 0 {
        return "", nil
    }
    return items[0], nil
}

Dalam kod di atas, kami menggunakan perintah ZRangeByScore Redis mendapatkan elemen dalam baris gilir kelewatan yang skornya kurang daripada atau sama dengan cap masa semasa, dan kemudian mengambil elemen pertama dalam senarai sebagai tugas seterusnya untuk dilaksanakan.

  1. Memproses selepas pelaksanaan tugas

Selepas kami mendapat tugasan yang perlu dilaksanakan daripada baris gilir kelewatan, kami boleh mengalihkan tugasan daripada senarai yang akan dilaksanakan ke senarai yang dilaksanakan, supaya kita boleh mengira pelaksanaan tugas.

//将已经执行的任务移除
func RemoveTaskFromDelayQueue(taskId string) error {
    _, err := redisClient.ZRem("DelayedQueue", taskId).Result()
    if err != nil {
        return err
    }
    return nil
}
  1. Contoh kod lengkap

Kami menyepadukan kod di atas bersama-sama dan menambah beberapa pengendalian ralat dan maklumat log untuk mendapatkan contoh kod lengkap:

package delayqueue

import (
    "strconv"
    "time"

    "github.com/go-redis/redis"
)

var redisClient *redis.Client

//初始化redis连接
func InitRedis(redisAddr string, redisPassword string) error {
    redisClient = redis.NewClient(&redis.Options{
        Addr:     redisAddr,
        Password: redisPassword,
        DB:       0,
    })

    _, err := redisClient.Ping().Result()
    if err != nil {
        return err
    }
    return nil
}

//添加任务到延迟队列
func AddTaskToDelayQueue(taskId string, delayTime int64) error {
    _, err := redisClient.ZAdd("DelayedQueue", redis.Z{
        Score:  float64(time.Now().Unix() + delayTime),
        Member: taskId,
    }).Result()
    if err != nil {
        return err
    }
    return nil
}

//获取延迟任务队列中最近需要执行的任务id
func GetNextTaskFromDelayQueue() (string, error) {
    now := time.Now().Unix()
    items, err := redisClient.ZRangeByScore("DelayedQueue", redis.ZRangeBy{
        Min:    "-inf",
        Max:    strconv.FormatInt(now, 10),
        Offset: 0,
        Count:  1,
    }).Result()
    if err != nil {
        return "", err
    }
    if len(items) == 0 {
        return "", nil
    }
    return items[0], nil
}

//将已经执行的任务移除
func RemoveTaskFromDelayQueue(taskId string) error {
    _, err := redisClient.ZRem("DelayedQueue", taskId).Result()
    if err != nil {
        return err
    }
    return nil
}
  1. Ringkasan

Artikel ini memperkenalkan cara menggunakan Golang dan Redis untuk melaksanakan baris gilir kelewatan. Dengan menggunakan struktur data ZSET, kami boleh melaksanakan baris gilir kelewatan dengan mudah, yang sangat praktikal dalam pembangunan sebenar. Selain melengahkan baris gilir, Redis juga menyediakan banyak struktur dan fungsi data lain, yang patut diterokai dan digunakan.

Atas ialah kandungan terperinci Cara menggunakan redis untuk melaksanakan baris gilir kelewatan di Golang.. 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