tgoop.com/golangprofi/591
Last Update:
👣 Высокопроизводительное кэширование с помощью Redis и Go
Go - отличный язык для создания высокопроизводительных веб-приложений, а высокопроизводительные веб-приложения часто требуют централизованного кэширования.
Стандартом де-факто для централизованного кэширования является Redis, но, популярные сегодня библиотеки Go не поддерживают потоковую передачу данных, эффективных с точки зрения памяти.
Вместо этого они предлагают []byte API,
с которыми вы взаимодействуете следующим образом:// В этом коде используется https://github.com/redis/go-redis, но те же
// ограничения действуют для Rueidis и Redigo.
func redisHandler(w http.ResponseWriter, r *http.Request) {
ctx := context.Background()
// Extract key from RequestURI
key := strings.TrimLeft(r.RequestURI, "/")
// Get the value from Redis as a byte slice
val, err := rdb.Get(ctx, key).Bytes()
if err == redis.Nil {
http.Error(w, "Key not found in Redis", http.StatusNotFound)
return
} else if err != nil {
http.Error(w, err.Error(), http.StatusInternalServerError)
return
}
_, err = w.Write(val)
if err != nil {
http.Error(w, err.Error(), http.StatusInternalServerError)
}
}
Этот паттерн работает хорошо, если вы кэшируете небольшие объекты, но если вы кэшируете объекты размером более 1 кб, []byte-ориентированные API работют не так хорошо.
В протоколе Redis нет ничего такого, что мешало бы создать потоковый API. Поэтому пердставляем redjet, библиотеку Redis, ориентированную на производительность.
С помощью redjet вы можете написать приведенный выше код следующим образом:func redisHandler(w http.ResponseWriter, r *http.Request) {
ctx := context.Background()
// Извлечение ключа из RequestURI
key := strings.TrimLeft(r.RequestURI, "/")
// Передаем значение непосредственно из Redis в ответ.
_, err := rdb.Command("GET", key).WriteTo(w)
if err != nil {
http.Error(w, err.Error(), http.StatusInternalServerError)
}
}
Код стал проще и эффективнее.go get github.com/coder/redjet@latest
▪️Github
▪️Читать дальше
▪️Бенчмарки
@golangprofi
BY Golang Юниор

Share with your friend now:
tgoop.com/golangprofi/591