Redis前期准备
下载安装redis(略)
打开redis server端
项目目录下安装redis依赖,这里指定v8版本
go get github.com/go-redis/redis/v8
进行Redis连接
新建文件夹common
定义包名为 successive_checkin
在文件夹下新建redis_client.go文件
定义变量 RDB *redis.Client 方便同胞名下其他函数使用RDB变量进行redis操作
调用redis.NewClient( )方法与redis进行连接
redis.Options{ }传入redis相关配置参数
RDB = redis.NewClient(&redis.Options{
Addr: "localhost:6379",
Password: "",
DB: 0,
})
代码截图
主程序逻辑
回到项目根目录编写main.go文件
调用 context.Background()方法获取空白上下文,给Redis提供上下文追踪
使用Scanln()函数获取参数 账户id
func main() {
ctx := context.Background()
var id string
fmt.Println("请选择输入你的账户id:")
fmt.Scanln(&id)
fmt.Printf("账户:%s 于%s进行签到\n", id, time.Now().Format("2006-01-02"))
successivecheckin.Run(ctx, id)
}
successivecheckin.Run( )
定义key前缀
调用 RDB.Incr(ctx, key)
对账户所属签到key值+1
设置操作成功后更新该key过期时间
打印签到天数
打印距离下次签到截止的时间
func Run(ctx context.Context, id string) {
key := CHECKIN_PREFIX + id
//redis中不存在该key时设置value为1
err := RDB.Incr(ctx, key).Err()
if err != nil {
fmt.Println(err)
return
} else {
//设置过期时间为后天零点
expireT := beginningOfADay().Add(48 * time.Hour)
err := RDB.ExpireAt(ctx, key, expireT).Err()
if err != nil {
fmt.Println(err)
return
}
fmt.Printf("续签成功,已签到 %s 天\n", getCheckInDays(ctx, id))
fmt.Printf("距离下次签到截止时间还有 %v", getNextCheckDeadline(ctx, id))
}
}
beginningOfADay( )函数逻辑编写
获取当前时间
截取当天日期
使用格式化函数time.Date( )函数返回当天0点的时间
func beginningOfADay() time.Time {
now := time.Now()
y, m, d := now.Date()
return time.Date(y, m, d, 0, 0, 0, 0, now.Location())
}
getCheckInDays( )函数逻辑编写
使用 RDB.Get(ctx, key)方法得到key的value值 返回该value
func getCheckInDays(ctx context.Context, id string) string {
key := CHECKIN_PREFIX + id
return RDB.Get(ctx, key).Val()
}
getNextCheckDeadline( )函数逻辑编写
使用
RDB.TTL(ctx, key). 方法得到key的value值
返回该value即还有多久过期
func getNextCheckDeadline(ctx context.Context, id string) time.Duration {
key := CHECKIN_PREFIX + id
return RDB.TTL(ctx, key).Val()
}
这期redis的视频做的非常不错,大家一定要去看看,里面的业务场景也很贴近现实。 通过跟着这期视频的实践 你能学习到
如何安装和启动Redis服务器。
如何在Go语言项目中集成Redis客户端库,并建立与Redis服务器的连接。
基本的Redis命令,如Incr
(自增)、Get
(获取值)、ExpireAt
(设置过期时间)和TTL
(获取剩余过期时间)的使用。
理解在何种情况下使用持久化存储和临时存储。