代码重构

上一章节末尾 我们增加了一个删除缓存的代码以供增加和修改任务时调用, 但是这个写法不太好. 不仅代码逻辑上不够清晰, 再调用时也会每次都需要新建一个新的ListTaskLogic对象, 对性能有一定消耗. 因此我新建了一个cache_logic.go文件专门用于操作缓存.

删除 list 缓存的代码做部分修改如下:

// DeleteListCache 删除 list 缓存
func DeleteListCache(r *redis.Redis, uid int64) {
	prefix := "cache:gtodolist:task:list:"
	listKey := fmt.Sprintf("%s%v:*", prefix, uid)
	keys, _ := r.Keys(listKey)

	for _, key := range keys {
		_, _ = r.Del(key)
	}
}

调用语句如下:

DeleteListCache(l.svcCtx.RedisClient, in.Uid)

删除任务

代码框架已经生成好, 直接填写逻辑代码即可

api 层代码, 依旧是直接调用 rpc 即可:

func (l *TaskDeleteLogic) TaskDelete(req *types.DeleteReq) (resp *types.DeleteResp, err error) {
	deleteResp, err := l.svcCtx.TaskRpcClient.DeleteTask(l.ctx, &pb.DeleteReq{
		Uid: ctxdata.GetUidFromCtx(l.ctx),
		Id:  req.Id,
	})
	if err != nil {
		return &types.DeleteResp{
			Status:  int(vo.ErrServerCommonError.GetErrCode()),
			Message: err.Error(),
			Error:   err.Error(),
		}, nil
	}

	resp = &types.DeleteResp{}
	_ = copier.Copy(resp, deleteResp)
	return resp, err
}

rpc 层代码, 先校验任务 id 是否合法, 然后删除 list 缓存和数据库内数据

func (l *DeleteTaskLogic) DeleteTask(in *pb.DeleteReq) (*pb.DeleteResp, error) {
	tid, err := strconv.ParseInt(in.Id, 10, 64)
	if err != nil {
		return nil, errors.Wrap(err, "转换任务id失败, 请传入合法id")
	}

	DeleteListCache(l.svcCtx.RedisClient, in.Uid)

	err = l.svcCtx.TaskModel.Delete(l.ctx, nil, tid)
	if err != nil && err != gormc.ErrNotFound {
		return nil, errors.Wrap(err, "删除任务失败")
	}

	return &pb.DeleteResp{
		Status:  vo.Ok,
		Message: "删除成功",
	}, nil
}

代码测试无误后至此手把手教你 gozero 从开发到部署系列 就全部完结啦