动手使用Go+Redis实现连续签到 | 豆包MarsCode AI 刷题

38 阅读2分钟

Redis前期准备

下载安装redis(略)

打开redis server端

image.png 项目目录下安装redis依赖,这里指定v8版本

go get github.com/go-redis/redis/v8

image.png

进行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,
})

代码截图

image.png

主程序逻辑

回到项目根目录编写main.go文件

调用 context.Background()方法获取空白上下文,给Redis提供上下文追踪

使用Scanln()函数获取参数 账户id

image.png

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前缀

image.png

调用 RDB.Incr(ctx, key)

对账户所属签到key值+1

设置操作成功后更新该key过期时间

打印签到天数

打印距离下次签到截止的时间

image.png

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(获取剩余过期时间)的使用。 理解在何种情况下使用持久化存储和临时存储。