利用redis的原子性和string类型数据的incr函数,实现一个简易的ID生成服务,封装为函数。
// 生成唯一ID
func generateID() (id int64, err error) {
rdb := getRedisConn()
// 定义一个短网址的,用来保证唯一的key
key := "dwzid"
exists, err := rdb.Exists(ctx, key).Result()
if err != nil {
return 0, err
}
if exists == 0 {
// Key does not exist 设置string类型键值
err = rdb.Set(ctx, key, "10000000000000000", 0).Err()
if err != nil {
return 0, err
}
// 获取并打印出刚才设置的值
valstr, err := rdb.Get(ctx, key).Result()
if err != nil {
return 0, err
}
id, err = strconv.ParseInt(valstr, 10, 64)
if err != nil {
return 0, err
}
return id, nil
}
// Key exists 使用INCR命令
id, err = rdb.Incr(ctx, key).Result()
if err != nil {
return 0, err
}
return id, nil
}
封装redis连接器
// 获取Redis连接
func getRedisConn() *redis.Client {
rdb := redis.NewClient(&redis.Options{
Addr: "127.0.0.1:6379", // Redis地址
Password: "", // Redis密码,如果没有则为空字符串
DB: 0, // 使用默认DB
})
return rdb
}