videoplayer/worker/redis.go

349 lines
8.7 KiB
Go
Raw Normal View History

package worker
import (
"fmt"
"strconv"
"time"
"videoplayer/proto"
)
import (
"context"
"encoding/json"
"github.com/go-redis/redis/v8"
)
var redisClient *redis.Client // Redis 客户端, 用于连接 Redis 服务器
2024-08-02 10:30:41 +08:00
func InitRedis() error {
ctx := context.Background()
2024-09-22 13:59:33 +08:00
if proto.Config.REDIS_User_PW == false {
// 连接redis
redisClient = redis.NewClient(&redis.Options{
Addr: proto.Config.REDIS_ADDR, // Redis 服务器地址
DB: proto.Config.REDIS_DB, // 使用的数据库编号
})
} else {
// 连接redis
redisClient = redis.NewClient(&redis.Options{
Addr: proto.Config.REDIS_ADDR, // Redis 服务器地址
Password: proto.Config.REDIS_PASSWORD, // 如果 Redis 设置了密码
DB: proto.Config.REDIS_DB, // 使用的数据库编号
})
}
// 验证 Redis 客户端是否可以正常工作
_, err := redisClient.Ping(ctx).Result()
if err != nil {
fmt.Println("Error connecting to Redis: %v", err)
}
2024-08-02 10:30:41 +08:00
return err
}
func CloseRedis() {
// 关闭 Redis 客户端
if err := redisClient.Close(); err != nil {
fmt.Println("Error closing Redis client: %v", err)
}
}
func IsContainKey(key string) bool {
ctx := context.Background()
val, err := redisClient.Exists(ctx, key).Result() // 检查键是否存在, 如果存在则返回 1, 否则返回 0
if err != nil {
fmt.Println("Error getting key: %v", err)
return false
}
if val == 0 {
return false
}
return true
}
// 设置redis
func SetRedis(key string, value string) bool {
ctx := context.Background()
// 设置键值对, 0 表示不设置过期时间, 如果需要设置过期时间, 可以设置为 time.Second * 10 等
err := redisClient.Set(ctx, key, value, time.Minute*30).Err()
if err != nil {
fmt.Println("Error setting key: %v", err)
return false
}
return true
}
// 设置hash
2024-06-11 18:38:41 +08:00
func SetHashWithTime(key string, id int, name, email string, duration time.Duration) bool {
//捕获错误,如果错误返回
ctx := context.Background() // 创建一个上下文
2024-05-31 15:24:33 +08:00
fields := map[string]interface{}{
"id": strconv.Itoa(id),
"name": name,
"email": email,
}
// 设置哈希表的字段值, 0 表示不设置过期时间, 如果需要设置过期时间, 可以设置为 time.Second * 10 等
2024-05-31 15:24:33 +08:00
err := redisClient.HSet(ctx, key, fields).Err()
if err != nil {
fmt.Println("Error setting key: %v", err)
return false
}
2024-05-31 15:24:33 +08:00
err = redisClient.Expire(ctx, key, time.Hour*10).Err()
if err != nil {
fmt.Println("Error setting key: %v", err)
return false
}
return true
}
2024-06-11 18:38:41 +08:00
// 设置redis hash设置过期时间
func SetHash(key string, data map[string]interface{}) bool {
ctx := context.Background()
err := redisClient.HSet(ctx, key, data).Err()
if err != nil {
2024-06-11 18:38:41 +08:00
fmt.Println("%v :Error setting hash: %v", key, err)
return false
}
err = redisClient.Expire(ctx, key, time.Minute*30).Err()
2024-06-11 18:38:41 +08:00
if err != nil {
fmt.Println("%v :Error setting expire: %v", key, err)
return false
}
return true
}
func SetHashWithField(key string, field string, value string) bool {
ctx := context.Background()
err := redisClient.HSet(ctx, key, field, value).Err()
if err != nil {
fmt.Println("Error setting key: %v", err)
return false
}
return true
}
func GetHash(key string, field string) string {
ctx := context.Background()
val, err := redisClient.HGet(ctx, key, field).Result()
if err != nil {
fmt.Println("Error getting hash: %v", err)
return ""
}
return val
}
func GetHashAll(key string) map[string]string {
ctx := context.Background()
val, err := redisClient.HGetAll(ctx, key).Result()
if err != nil {
fmt.Println("Error getting hash: %v", err)
return nil
}
2024-06-11 18:38:41 +08:00
return val
}
// 设置redis
func SetRedisWithExpire(key string, value string, expire time.Duration) bool { // 设置键值对, 0 表示不设置过期时间, 如果需要设置过期时间, 可以设置为 time.Second * 10 等
ctx := context.Background()
// 设置键值对, 0 表示不设置过期时间, 如果需要设置过期时间, 可以设置为 time.Second * 10 等
err := redisClient.Set(ctx, key, value, expire).Err()
if err != nil {
fmt.Println("Error setting key: %v", err)
return false
}
return true
}
// 获取redis
func GetRedis(key string) string {
ctx := context.Background()
val, err := redisClient.Get(ctx, key).Result() // 从 Redis 读取键值, 如果键不存在则返回空字符串, 如果出现错误则返回错误
if err != nil {
2024-06-25 16:32:38 +08:00
fmt.Println(key, " Error getting key: %v", err)
return ""
}
return val
}
2024-06-24 17:58:22 +08:00
// pop redis list from right,as stack
func PopRedisList(key string) string {
ctx := context.Background()
2024-06-24 17:58:22 +08:00
val, err := redisClient.RPop(ctx, key).Result() // 从 Redis 读取键值, 如果键不存在则返回空字符串, 如果出现错误则返回错误
if err != nil {
2024-06-25 16:32:38 +08:00
fmt.Println(key, " Error reading from Redis: %v", err)
2024-06-24 17:58:22 +08:00
return ""
}
return val
}
// pop redis list from left,as queue
func PopRedisListLeft(key string) string {
ctx := context.Background()
val, err := redisClient.LPop(ctx, key).Result() // 从 Redis 读取键值, 如果键不存在则返回空字符串, 如果出现错误则返回错误
if err != nil {
return ""
}
return val
}
func DelRedis(key string) {
ctx := context.Background()
err := redisClient.Del(ctx, key).Err()
if err != nil {
fmt.Println("Error deleting key: %v", err)
}
}
// push redis list from right
2024-06-24 17:58:22 +08:00
func PushRedisList(key string, value string) bool {
ctx := context.Background()
err := redisClient.RPush(ctx, key, value).Err()
if err != nil {
fmt.Println("Error setting key: %v", err)
2024-06-24 17:58:22 +08:00
return false
}
2024-06-24 17:58:22 +08:00
return true
}
func PushRedisListWithExpire(key string, value string, expire time.Duration) bool {
ctx := context.Background()
err := redisClient.RPush(ctx, key, value).Err()
if err != nil {
fmt.Println("Error setting key: %v", err)
return false
}
err = redisClient.Expire(ctx, key, expire).Err()
if err != nil {
fmt.Println("Error setting key: %v", err)
return false
}
return true
}
// delete redis key
func delRedis(key string) {
ctx := context.Background()
err := redisClient.Del(ctx, key).Err()
if err != nil {
fmt.Println("Error setting key: %v", err)
}
}
// User 用户,用于存入 Redis hash
type RUser struct {
ID int `json:"id"`
Name string `json:"name"`
Age int `json:"age"`
Email string `json:"email"`
}
func (u *RUser) toJSONString() string {
// 将User对象编码为JSON字符串
userJSON, err := json.Marshal(u)
if err != nil {
fmt.Println("Failed to marshal user: %v", err)
}
return string(userJSON)
}
// put hash to redis
func hSetRedis(key string, field string, value string) {
ctx := context.Background()
err := redisClient.HSet(ctx, key, field, value).Err()
if err != nil {
fmt.Println("Error setting key: %v", err)
}
}
// get hash from redis
func hGetRedis(key string, field string) string {
ctx := context.Background()
val, err := redisClient.HGet(ctx, key, field).Result()
if err != nil {
fmt.Println("Error getting key: %v", err)
}
return val
}
// 设置set有过期时间
func SetRedisSet(key string, values []string, expire time.Duration) bool {
ctx := context.Background()
err := redisClient.SAdd(ctx, key, values).Err()
if err != nil {
fmt.Println("Error setting key: %v", err)
return false
}
err = redisClient.Expire(ctx, key, expire).Err()
if err != nil {
fmt.Println("Error setting key: %v", err)
return false
}
return true
}
// 设置set,添加元素
func SetRedisSetAdd(key string, value string) bool {
ctx := context.Background()
err := redisClient.SAdd(ctx, key, value).Err()
if err != nil {
fmt.Println("Error setting key: %v", err)
return false
}
return true
}
// 设置set,删除元素
func SetRedisSetRemove(key string, value string) bool {
ctx := context.Background()
err := redisClient.SRem(ctx, key, value).Err()
if err != nil {
fmt.Println("Error setting key: %v", err)
return false
}
return true
}
// 查看set是否包含元素
func IsContainSet(key string, value string) bool {
ctx := context.Background()
val, err := redisClient.SIsMember(ctx, key, value).Result()
if err != nil {
fmt.Println("Error getting key: %v", err)
return false
}
return val
}
// 查看set的所有元素
func GetRedisSetMembers(key string) []string {
ctx := context.Background()
val, err := redisClient.SMembers(ctx, key).Result()
if err != nil {
fmt.Println("Error getting key: %v", err)
return nil
}
return val
}
// BITMAP
func SetRedisBitmap(key string, offset int64, value int) bool {
ctx := context.Background()
err := redisClient.SetBit(ctx, key, offset, value).Err()
if err != nil {
fmt.Println("Error setting key: %v", err)
return false
}
return true
}
// BITMAP获取
func GetRedisBitmap(key string, offset int64) int {
ctx := context.Background()
val, err := redisClient.GetBit(ctx, key, offset).Result()
if err != nil {
fmt.Println("Error getting key: %v", err)
return 0
}
return int(val)
}