每天执行动作加一统计操作的优化逻辑

开发中遇到很多业务是要求用户每天完成某个动作加一统计操作,我看到同时都是记录时间,那时间去做比较,记录上次动作时间,用现在的时间和上一次的时间作比较看是不是同一天,还有做的更麻烦,比较的代码一大堆,我也有这个业务,在本子上画来画去,突然发现,总有一个时间凌晨要比较,(也有把啷个时间戳转化为格式化时间,然后截取日期,对比的,也很麻烦,代码也是一大堆。)于是我想既然是每天的动作,为什么不直接在保存的时候就保存动作天的凌晨时间戳?下一动作时间,我去上一次的记录时间是否等于本次动作天的凌晨时间戳,如果相等,就不执行加一操作,如果不相等,那么就可以判断,这个不是同一天的动作,执行加一操作。于是我就用代码实现了这个思路,靠谱。

不过有一个事情需要考虑和注意的,那就是时区的问题,如果业务涉及到不同国家,就要去相对应的国家时区的凌晨,否则就会有bug。

go语言实现思路如下:

1、根据不同国家获取对应时区的凌晨:

//获取对应时区的零点时间戳
func GetAfterSomeDateZeroClockStamp(country string, dateNub int) (zeroStamp int) {
	af := time.Now().AddDate(0, 0, dateNub)
	stamp := time.Date(af.Year(), af.Month(), af.Day(), 0, 0, 0, 0, GetTimeLocation(country)).Unix()
	return int(stamp)
}

2、保存这个时间戳+统计次数到redis,每次比较时间逻辑再判断是否加一:

	//ckxRemarks:
	key := act_new_user_encourage.GetRedisKeyActNewUPersonalTasks(req.Story.Uid)
	var bytes []byte
	bytes, err = redis_common.HGet(redis_common.RedisDBName, key, act_new_user_encourage.TaskModel.T_STORY)
	if err == nil {
		str := string(bytes)
		slen := len(str)
		t1, t2 := str[:slen-1], str[slen-1:]
		zeroStamp := util.GetAfterSomeDateZeroClockStamp(0, "")
		if t1 != strconv.Itoa(zeroStamp) {
			atoi, _ := strconv.Atoi(t2)
			v := fmt.Sprintf("%d%d",zeroStamp , (atoi + 1))
			err = redis_common.HSet(redis_common.RedisDBName, key, act_new_user_encourage.TaskModel.T_STORY, v)
			if err != nil {
				xlog.LevelLogfn(xlog.ERROR, "[doEventGroupMsg] HIncrBy T_CHAT err:%s", err.Error())
			}
		}
	}

3、查询次数的时候只需要截取保存参数最后一位即可:

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值