赞
踩
让我们一起支持群主维护simple-admin 社群吧!!!
不能加入星球的朋友记得来点个Star!!
https://github.com/suyuan32/simple-admin-core
go-zero 本身整合了个redis框架
优势:在svc中注册后,全局直接调用
,且整合了redis分布式锁
https://github.com/zeromicro/go-zero/core/stores/redis
推荐使用 v9版本
优势:使用更加灵活
,可以控制返回值
https://github.com/redis/go-redis
官方文档:
https://redis.uptrace.dev/guide/go-redis.html#connecting-to-redis-server
这里面简单介绍一下2个框架如何整合redis的
这里simple-admin 框架
整合了redis官方v9版本
且github地址:https://github.com/suyuan32/simple-admin-common
go-zero的使用的是自己整合的redis
github.com/zeromicro/go-zero/core/stores/cache
package config import ( "github.com/suyuan32/simple-admin-common/config" "github.com/zeromicro/go-zero/rest" "github.com/zeromicro/go-zero/core/stores/cache" ) type Config struct { rest.RestConf // simple-admin RedisConf config.RedisConf // go-zero Cache cache.CacheConf }
svc/service_context.go (根据生成习惯也能是:servicecontext.go)
package svc import ( "github.com/zeromicro/go-zero/core/stores/redis" "redis1 "github.com/redis/go-redis/v9" ) type ServiceContext struct { Redis redis1.UniversalClient Config config.Config RedisCache *redis.Redis } func NewServiceContext(c config.Config) *ServiceContext { // 初始化 cache,其中 WithLimit 可以指定最大缓存的数量 cCache, err := collection.NewCache(time.Minute, collection.WithLimit(10000)) if err != nil { panic(err) } rds := c.RedisConf.MustNewUniversalRedis() redisCache := c.Cache[0].NewRedis() return &ServiceContext{ Config: c, CCache: cCache, RedisCache: redisCache, Redis: rds } }
总结:
- TTL 键不存在: time.Duration(-2):
- TTL 键不存在 、 键没有设置过期时间:time.Duration(-1)
package main import ( "context" "fmt" "github.com/redis/go-redis/v9" "time" ) func main() { // 连接到 Redis 服务器 client := redis.NewClient(&redis.Options{ Addr: "localhost:6379", // Redis 服务器地址 Password: "", // 密码 DB: 0, // 使用默认数据库 }) // 使用完毕后关闭连接 defer client.Close() // 设置上下文和键名 ctx := context.Background() key := "example_key" client.Set(ctx, key, "123", time.Second*1) // 获取键的 TTL ttl, _ := client.TTL(ctx, key).Result() fmt.Println(ttl) // 处理返回值 if ttl == time.Duration(-2) { fmt.Println("键不存在") } else if ttl == time.Duration(-1) { fmt.Println("键没有设置过期时间") } else { fmt.Printf("键的 TTL 为: %v\n", ttl) } }
总结:
- 键存在: 1
- 键不存在:0
下面代码实现了一个场景:设置键的过期时间为当天的 24 点整
package main import ( "context" "fmt" "time" "github.com/redis/go-redis/v9" ) func main() { // 连接到 Redis 服务器 client := redis.NewClient(&redis.Options{ Addr: "localhost:6379", // Redis 服务器地址 Password: "", // 密码 DB: 0, // 使用默认数据库 }) // 使用完毕后关闭连接 defer client.Close() // 设置上下文和键名 ctx := context.Background() key := "example_key" // 检查键是否存在 exists := client.Exists(ctx, key).Val() if exists == 1 { fmt.Println("键存在") } else { fmt.Println("键不存在") } // 设置键的过期时间为当天的 24 点整 now := time.Now() expireTime := time.Date(now.Year(), now.Month(), now.Day(), 23, 59, 59, 0, now.Location()) duration := expireTime.Sub(now) err := client.Expire(ctx, key, duration).Err() if err != nil { fmt.Printf("设置过期时间失败: %v\n", err) } else { fmt.Println("设置过期时间成功") } }
如果
键
不存在,则Expire
方法不会产生任何效果
因为无法设置不存在的键的过期时间。在这种情况下,你可以选择先确保键存在,然后再设置过期时间,或者直接忽略不存在的键。
package main import ( "context" "fmt" "time" "github.com/redis/go-redis/v9" ) func main() { // 创建 Redis 客户端连接 client := redis.NewClient(&redis.Options{ Addr: "localhost:6379", // Redis 服务器地址 Password: "", // 密码 DB: 0, // 使用默认数据库 }) // 使用完毕后关闭连接 defer client.Close() // 设置键值对 err := client.Set(context.Background(), "mykey", "myvalue", 0).Err() if err != nil { panic(err) } // 设置过期时间为10秒 expireDuration := 10 * time.Second // 设置过期时间 err = client.Expire(context.Background(), "mykey", expireDuration).Err() if err != nil { panic(err) } fmt.Println("成功设置键的过期时间为 10 秒") }
EXPIRE 和 TTL 是 Redis 中两个不同的命令,它们用于处理键的过期时间,但在用法和行为上有一些区别。
EXPIRE:
EXPIRE 命令用于将键的过期时间设置为指定的秒数。它接受两个参数:键和秒数。键在指定的秒数后会过期。如果键已经设置了过期时间,那么这个过期时间会被覆盖。
示例使用:EXPIRE key seconds
TTL:
TTL 命令用于获取键的剩余过期时间(Time To Live)。它返回键的剩余生存时间,以秒为单位。如果键没有设置过期时间,或者键不存在,TTL 命令会返回 -1;如果键存在但没有剩余过期时间,TTL 命令会返回 -2。
示例使用:TTL key
区别总结
:
在实际使用中,如果你需要设置键的过期时间,你会使用 EXPIRE 命令;如果你需要获取键的剩余过期时间,你会使用 TTL 命令
。
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。