Redis [Golang]

Introduction

Run Redis server in docker

Создаём два тома, для редис конфига и бэкапов

docker volume create redisVol
docker volume create redisCFG

Оригинал redis.conf можно скачать отсюда (в ссылке необходимо поменять версию redis, если он у вас отличается от моего 4.0.11)
Включим аутентификацию в redis, в конфиг добавим строчку requirepass SOMESTRONGPASSWORD (вместо SOMESTRONGPASSWORD у вас должен быть указан свой пароль, у себя в качестве примера(!!!ТОЛЬКО В КАЧЕСВТЕ ПРИМЕРА!!!) буду использовать не секьюрный пароль 12345).
Соответственно далее смотрим, где у нас расположен том redisCFG командой
docker volume inspect redisCFG и туда копируем конфиг редиса.
Выбор ip адреса для redis контейнера оставляю на ваш выбор, либо создайте отдельную сеть например так

docker network create \
--subnet=172.18.0.0/24 \
lazercat

либо гляньте текущую конфигурацию сети bridge и исходя из занятых ip на данный момент выберите свободный

docker network inspect bridge

Запускамем redis в контейнере

docker container run \
-h redisSrv \
--restart=always \
--name redisSrv \
--ip 172.17.0.10 \ 
-d \
-v redisVol:/data \
-v redisCFG:/usr/local/etc/redis/ \
redis redis-server /usr/local/etc/redis/redis.conf

Проверяем, что redis успешно стартанул и у нас есть к нему доступ

docker container exec -it redisSrv redis-cli -a 12345
127.0.0.1:6379> 

либо ставим redis-cli для вашей ОС и проверяем

redis-cli -h 172.17.0.10 -a 12345
172.17.0.10:6379>

Connect to Redis with GO

Redis Go clients
heroku.com recommend
package redis

Для работы с Redis в GO будем использовать пакет redigo.
Устанавливаем

go get github.com/gomodule/redigo/redis

Импортируем

import (
	"github.com/gomodule/redigo/redis"
)

Соединение можно создать с помощью фун-ий Dial,DialWithTimeout,NewConn или DialURL. В примере ниже используем Dial и DialURL (закоменчен)

package main

import (
	"log"

	"github.com/gomodule/redigo/redis"
)

//const redisurl = "redis://:12345@172.17.0.3:6379/1"

func main() {
    args := []redis.DialOption{
        redis.DialDatabase(1), //select db 1
        redis.DialPassword("12345"), //set the password
   }
    c, err := redis.Dial("tcp", "172.17.0.10:6379", args...)
    
    //c, err := redis.DialURL(redisurl)
    if err != nil {
        log.Fatalln(err)
    }
    defer c.Close()
}

CRUD with GO and Redis

Для выполнения redis команд используется Do метод.

String

Redis string commands
Общий и самый используемый тип данных в программировании и приложениях. Так же является фундаментальным типом в redis в котором все ключи являются строками.

set

set KEY VALUE — выставить значение ключа (если ключ уже существует, то перезаписывает его)

res, err := redisConn.Do("set", "mykey", "value")
if err != nil {
    log.Fatalln(err)
}
fmt.Println(res)
res, err := redisConn.Do("set", "mykey", "value", "ex", 100)
if err != nil {
    log.Fatalln(err)
}
fmt.Println(res)

setex

setex KEY SECONDS VALUE — добавить ключ и его время жизни — через которые ключ удалится автоматически

res, err := redisConn.Do("setex", "mykey", 100, "value")
if err != nil {
    log.Fatalln(err)
}
fmt.Println(res)

get

get KEY — получить значение ключа
Т.к. redigo не сериализует данные автоматически, то необходимо дополнительно использовать фун-ии для приведение типов.

res, err := redis.String(redisConn.Do("get", "mykey"))
if err != nil {
    log.Fatalln(err)
}
fmt.Println(res)

del

Команда del удаляет ключ и его значение любого типа, не только string.

res, err := redisConn.Do("del", "mykey")
if err != nil {
    log.Fatalln(err)
}
fmt.Println(res)

append

append KEY VALUE — добавляет значение в конец строки. Если ключа не существует, то создается пустой ключ и затем добавляется значение.

res, err := redisConn.Do("append", "mykey", 9999)
if err != nil {
    log.Fatalln(err)
}
fmt.Println(res)

mset

mset KEY VALUE KEY VALUE KEY VALUE KEY VALUE etc ... — добавить сразу несколько ключей

res, err := redisConn.Do("mset", "mykey1", 10, "mykey2", 20, "mykey3", "test")
if err != nil {
    log.Fatalln(err)
}
fmt.Println(res)

mget

mget KEY KEY KEY etc... — получить сразу несколько значений ключей

var mykey1 int
var mykey2 int
var mykey3 string

res, err := redis.Values(redisConn.Do("mget", "mykey1", "mykey2", "mykey3"))
if err != nil {
    log.Fatalln(err)
}

_, err = redis.Scan(res, &mykey1, &mykey2, &mykey3)
if err != nil {
    log.Fatalln(err)
}

fmt.Println(mykey1, mykey2, mykey3)

strlen

strlen KEY — вернуть длину значения ключа

res, err := redisConn.Do("strlen", "mykey1")
if err != nil {
    log.Fatalln(err)
}
fmt.Println(res)

List

Redis list commands
Упорядоченный список. Список хранит последовательность объектов и может быть использован, как очередь или стэк.

rpush/lpush

rpush KEY ITEM1 ITEM2 etc... — добавить эл-нты «с правого конца» списка, если список не существует, то он создается.
lpush KEY ITEM1 ITEM2 etc... — добавить эл-нты «с левого конца» списка, если список не существует, то он создается.

res, err := redisConn.Do("rpush", "array1", 1, 2, 3, 4, 5)
if err != nil {
    log.Fatalln(err)
}
fmt.Println(res)
res, err := redisConn.Do("lpush", "array1", 9, 8, 7, 6)
if err != nil {
    log.Fatalln(err)
}
fmt.Println(res)

lrange

lrange KEY 0 -1 — вернуть значения всего списка

res, err := redis.Ints(redisConn.Do("lrange", "array1", 0, -1))
if err != nil {
    log.Fatalln(err)
}
fmt.Println(res)

rpop/lpop

lpop KEY — удалить эл-нт «с левого конца» списка
rpop KEY — удалить эл-нт «с правого конца» списка

res, err := redisConn.Do("rpop", "array1")
if err != nil {
    log.Fatalln(err)
}
fmt.Println(res)
res, err := redisConn.Do("lpop", "array1")
if err != nil {
    log.Fatalln(err)
}
fmt.Println(res)

lindex

lindex KEY INDEX — вернуть значение эл-та по указанному индексу

res, err := redis.Int(redisConn.Do("lindex", "array1", 0))
if err != nil {
    log.Fatalln(err)
}
fmt.Println(res)

lset

lset KEY INDEX ITEM — установиьт значение эл-та в списке по указанному индексу

res, err := redisConn.Do("lset", "array1", 3, 77)
if err != nil {
    log.Fatalln(err)
}
fmt.Println(res)

llen

llen KEY — вернуть длину ключа

res, err := redisConn.Do("llen", "array1")
if err != nil {
    log.Fatalln(err)
}
fmt.Println(res)

Hashes

Redis hash commands
Представляет собой тип данных воссоздающих отношения поле-значение.

hset

hset KEY FILED VALUE — установить значение поля

res, err := redisConn.Do("hset", "p1", "firstname", "Tony")
if err != nil {
    log.Fatalln(err)
}
fmt.Println(res)

hget

hget KEY FIELD — получить значение поля

res, err := redis.String(redisConn.Do("hget", "p1", "firstname"))
if err != nil {
    log.Fatalln(err)
}
fmt.Println(res)

hmset

hmset KEY FILED1 VALUE1 FILED2 VALUE2 etc... — установить несколько значений для нескольких полей сразу

res, err := redisConn.Do("hmset", "p1", "firstname", "Tony", "lastname", "Hawk", "age", 25)
if err != nil {
    log.Fatalln(err)
}
fmt.Println(res)

hmget

hmget KEY FILED1 FILED2 etc... — получить несколько значений полей сразу

type person struct {
    Firstname string `redis:"firstname"`
    Lastname  string `redis:"lastname"`
    Age       int    `redis:"age"`
}
res, err := redis.Values(redisConn.Do("hmget", "p1", "firstname", "lastname", "age"))
if err != nil {
    log.Fatalln(err)
}

p1 := person{}
_, err = redis.Scan(res, &p1.Firstname, &p1.Lastname, &p1.Age)
if err != nil {
    log.Fatalln(err)
}

fmt.Println(p1)

hgetall

hgetall KEY — получить все поля и значения

type person struct {
    Firstname string `redis:"firstname"`
    Lastname  string `redis:"lastname"`
    Age       int    `redis:"age"`
}
res, err := redis.Values(redisConn.Do("hgetall", "p1"))
if err != nil {
    log.Fatalln(err)
}

fmt.Println(res)
p1 := person{}
err = redis.ScanStruct(res, &p1)
if err != nil {
    log.Fatalln(err)
}

fmt.Println(p1)

hkeys

hkeys KEY — получить имена всех полей

res, err := redis.Strings(redisConn.Do("hkeys", "p1"))
if err != nil {
    log.Fatalln(err)
}
fmt.Println(res)

hdel

hdel KEY FILED — удалить одно поле

res, err := redisConn.Do("hdel", "p1", "age")
if err != nil {
    log.Fatalln(err)
}

fmt.Println(res)

hexists

hexists KEY FILED — проверка существования поля, возвращает 0 или 1 соответственно

	res, err := redisConn.Do("hexists", "p1", "age")
	if err != nil {
		log.Fatalln(err)
	}

	fmt.Println(res)
res, err := redisConn.Do("hexists", "p1", "firstname")
if err != nil {
    log.Fatalln(err)
}

fmt.Println(res)

Sets

Redis set commands
Мн-во уникальных и не упорядоченных объектов

sadd

sadd KEY ITEM1 ITEM2 ITEM3 etc... — создать мн-во

res, err := redisConn.Do("sadd", "cars", "toyota", "nissan", "suzuki", "toyota", "lexus", "infiniti")
if err != nil {
    log.Fatalln(err)
}

fmt.Println(res)

smembers

smembers KEY — показать всё мн-во

res, err := redis.Strings(redisConn.Do("smembers", "cars"))
if err != nil {
    log.Fatalln(err)
}

fmt.Println(res)

scard

scard KEY — показать кол-во эл-ов в мн-ве

res, err := redisConn.Do("scard", "cars")
if err != nil {
    log.Fatalln(err)
}
fmt.Println(res)

sismember

sismember KEY ITEM — проверка принадлежности указанного эл-та указанному мн-ву, возвращает 0 или 1 соответственно

res, err := redisConn.Do("sismember", "cars", "toyota")
if err != nil {
    log.Fatalln(err)
}
fmt.Println(res)
res, err := redisConn.Do("sismember", "cars", "honda")
if err != nil {
    log.Fatalln(err)
}

fmt.Println(res)

srem

srem KEY ITEM1 ITEM2 ITEM3 etc… — удалить эл-ты из мн-ва

res, err := redisConn.Do("srem", "cars", "nissan")
if err != nil {
    log.Fatalln(err)
}

fmt.Println(res)

Sorted sets

https://redis.io/commands#sorted_set
Мн-во уникальных и упорядоченных объектов,сортиурет от меньшего к большему

zadd

zadd KEY SCORE1 ITEM1 SCORE2 ITEM2 SCORE3 ITEM3 etc... — создать мн-во,добавить один эл-нт мн-ва или обновить вес эл-та, если уже существует

res, err := redisConn.Do("zadd", "cars", 100, "toyota", 90, "nissan", 80, "suzuki")
if err != nil {
    log.Fatalln(err)
}

fmt.Println(res)

zrange

zrange KEY 0 -1 — показать всё мно-во

res, err := redis.Strings(redisConn.Do("zrange", "cars", 0, -1))
if err != nil {
    log.Fatalln(err)
}

fmt.Println(res)

zrange KEY 0 -1 withscores — показать всё мн-во с весами значений

res, err := redis.StringMap(redisConn.Do("zrange", "cars", 0, -1, "withscores"))
if err != nil {
    log.Fatalln(err)
}

fmt.Println(res)

zrevrange

zrevrange KEY 0 -1 withscores — показать всё мн-во сортированного в обратном порядке с весами значений

res, err := redis.StringMap(redisConn.Do("zrevrange", "cars", 0, -1, "withscores"))
if err != nil {
    log.Fatalln(err)
}

fmt.Println(res)

zcount

zcount KEY SCORE1 SCORE2 etc... — показать кол-во объектов с рейтингами между score1 и score2

res, err := redis.Int(redisConn.Do("zcount", "cars", 81, 99))
if err != nil {
    log.Fatalln(err)
}

fmt.Println(res)

zrank

zrank KEY ITEM — показать индекс эл-та в мн-ве

res, err := redis.Int(redisConn.Do("zrank", "cars", "toyota"))
if err != nil {
    log.Fatalln(err)
}

fmt.Println(res)

zincrby

zincrby KEY INCREMENT ITEM — увеличить вес эл-та на указанное число

res, err := redis.Int(redisConn.Do("zincrby", "cars", 100, "toyota"))
if err != nil {
    log.Fatalln(err)
}

fmt.Println(res)

zscore

zscore KEY ITEM — показать вес эл-та

res, err := redis.Int(redisConn.Do("zscore", "cars", "toyota"))
if err != nil {
    log.Fatalln(err)
}

fmt.Println(res)

Добавить комментарий

Ваш e-mail не будет опубликован. Обязательные поля помечены *