Install dependencies and environment variable
Replace the values from database connection with yours.
#env file
REDIS_ADDRESS=localhost
REDIS_PORT=6379
REDIS_PASSWORD=123456
REDIS_DB=0
#install on go
go get github.com/redis/go-redis/v9
Manager Redis
Create a file to manage.go This will contain a method to get the connection with redis for instance in other modules and services.
package main
import (
"fmt"
"github.com/redis/go-redis/v9"
"os"
"strconv"
)
const CustomerDb = 0
type RedisManager struct {
Db int
Client *redis.Client
}
func NewRedisClient(customerDb int) (*RedisManager, error) {
address := os.Getenv("REDIS_ADDRESS")
if address == "" {
return nil, fmt.Errorf("REDIS_ADDRESS is not set")
}
password := os.Getenv("REDIS_PASSWORD")
if password == "" {
return nil, fmt.Errorf("REDIS_PASSWORD is not set")
}
port := os.Getenv("REDIS_PORT")
if port == " " {
return nil, fmt.Errorf("REDIS_PORT is not set")
}
db := os.Getenv("REDIS_DB")
if db == "" {
return nil, fmt.Errorf("REDIS_DB is not set")
}
redisDb, err := strconv.Atoi(db)
if err != nil {
return nil, fmt.Errorf("REDIS_DB is not a number")
}
cli := redis.NewClient(&redis.Options{
Addr: fmt.Sprintf("%s:%s", address, port),
Password: password,
DB: redisDb,
})
return &RedisManager{
Client: cli,
Db: customerDb,
}, nil
}
func (rd *RedisManager) SetDb(db int) {
rd.Db = db
}
Create Struct for manage the entity (customer) repository
Create a struct for manage the redis connection and Get all methods to interact with the redis entity (CRUD operations and queries)
With this struct, any time we need to access the entity (customer) data, we can instance and start to use it as a repository pattern.
type CustomerRepo struct {
Cli *RedisManager
Db int
}
func NewCustomerRepo() (*CustomerRepo, error) {
cli, err := NewRedisClient(CustomerDb)
if err != nil {
return nil, err
}
return &CustomerRepo{
Cli: cli,
}, nil
}
Create Struct entity
On Customers entity add the tags for mapped with bun fields.
The redis:"-" make de relation with the fields to save on redis. If you want one file or the struct doenst save just dont add the tag.
type Customer struct {
ID string `redis:"id"`
Name string `redis:"name"`
Email string `redis:"email"`
Phone string `redis:"phone"`
Age int `redis:"age"`
}
CRUD methods
A method example to store, update or get information from the entity.
These methods are used from the CustomersRepo entity.
They received a customer entity with the information and depending on the operation return the result.
Save a new record
func (c *CustomerRepo) Save(customer *Customer) error {
return c.Cli.Client.HSet(context.TODO(), customer.ID, customer).Err()
}
Get a record for ID
func (c *CustomerRepo) Get(id string) (*Customer, error) {
customer := &Customer{}
resMap := c.Cli.Client.HGetAll(context.TODO(), id)
if resMap.Err() != nil {
return nil, resMap.Err()
}
if len(resMap.Val()) == 0 {
return nil, nil
}
err := resMap.Scan(customer)
if err != nil {
return nil, err
}
return customer, nil
}
Update a new record
func (c *CustomerRepo) Update(customer *Customer) error {
return c.Cli.Client.HSet(context.TODO(), customer.ID, customer).Err()
}
Delete a new record
func (c *CustomerRepo) Delete(id string) error {
return c.Cli.Client.Del(context.TODO(), id).Err()
}
Top comments (0)