func (r *ewalletRepo) Update(ctx context.Context, req *biz.Ewallet) (*biz.Ewallet, error) { // 开启事务 tx, err := r.data.db.Tx(ctx) if err != nil { return nil, biz.ErrRecordAlreadyExists } // 修改 sum, err := tx.Ewallet.Update().SetBalance(req.Balance).SetFrozenAmount(req.Frozen_Amount).Where(ewallet.HasCustomerWith(customer.ID(req.Id))).Save(ctx) if err != nil { _ = tx.Rollback() return nil, v1.ErrorUniversalError(err.Error()) } else if sum != 1 { _ = tx.Rollback() return nil, v1.ErrorUniversalError(err.Error()) } // 查询 result, err := tx.Ewallet.Query().Where(ewallet.HasCustomerWith(customer.ID(req.Id))).Only(ctx) if err != nil { _ = tx.Rollback() return nil, v1.ErrorUniversalError(err.Error()) } cacheKey := r.CacheKey(req.Id) _ = r.data.cache.Del(ctx, cacheKey) err = r.data.setCache(ctx, cacheKey, result) if err != nil { _ = tx.Rollback() return nil, biz.ErrRecordAlreadyExists } // 执行事务 err = tx.Commit() if err != nil { // 事务回滚 _ = tx.Rollback() return nil, biz.ErrRecordAlreadyExists } return r.composes(result, err) } 改成不是直接修改数据库,而是修改缓存 添加到缓存 从底部存 头部取 使用LPOP 移出并获取列表的第一个元素 RPUSH 在列表中添加一个或多个值到列表尾部
时间: 2024-04-19 20:25:46 浏览: 17
func (r *ewalletRepo) Update(ctx context.Context, req *biz.Ewallet) (*biz.Ewallet, error) {
// 从缓存中获取原始数据
cacheKey := r.CacheKey(req.Id)
oldData, err := r.data.cache.Get(ctx, cacheKey)
if err != nil {
return nil, v1.ErrorUniversalError(err.Error())
}
// 修改数据
newData := *oldData
newData.Balance = req.Balance
newData.Frozen_Amount = req.Frozen_Amount
// 将新数据存入缓存
err = r.data.cache.Set(ctx, cacheKey, newData)
if err != nil {
return nil, v1.ErrorUniversalError(err.Error())
}
return &newData, nil
}
相关问题
func (r *ewalletRepo) Update(ctx context.Context, req *biz.Ewallet) (*biz.Ewallet, error) { // 开启事务 tx, err := r.data.db.Tx(ctx) if err != nil { return nil, biz.ErrRecordAlreadyExists } // 修改 sum, err := tx.Ewallet.Update().SetBalance(req.Balance).SetFrozenAmount(req.Frozen_Amount).Where(ewallet.HasCustomerWith(customer.ID(req.Id))).Save(ctx) if err != nil { _ = tx.Rollback() return nil, v1.ErrorUniversalError(err.Error()) } else if sum != 1 { _ = tx.Rollback() return nil, v1.ErrorUniversalError(err.Error()) } // 查询 result, err := tx.Ewallet.Query().Where(ewallet.HasCustomerWith(customer.ID(req.Id))).Only(ctx) if err != nil { _ = tx.Rollback() return nil, v1.ErrorUniversalError(err.Error()) } cacheKey := r.CacheKey(req.Id) _ = r.data.cache.Del(ctx, cacheKey) err = r.data.setCache(ctx, cacheKey, result) if err != nil { _ = tx.Rollback() return nil, biz.ErrRecordAlreadyExists } // 执行事务 err = tx.Commit() if err != nil { // 事务回滚 _ = tx.Rollback() return nil, biz.ErrRecordAlreadyExists } return r.composes(result, err) } 改成不是直接修改数据库,而是修改缓存 添加到缓存 从底部存 头部取 使用LPOP 移出并获取列表的第一个元素 RPUSH 在列表中添加一个或多个值到列表尾部 展示修改后的代码并解释
func (r *ewalletRepo) Update(ctx context.Context, req *biz.Ewallet) (*biz.Ewallet, error) {
// 从缓存中获取原始数据
cacheKey := r.CacheKey(req.Id)
oldData, err := r.data.cache.Get(ctx, cacheKey)
if err != nil {
return nil, v1.ErrorUniversalError(err.Error())
}
// 修改数据
newData := *oldData
newData.Balance = req.Balance
newData.Frozen_Amount = req.Frozen_Amount
// 将新数据添加到缓存的底部
err = r.data.cache.RPush(ctx, cacheKey, newData)
if err != nil {
return nil, v1.ErrorUniversalError(err.Error())
}
// 从缓存的头部取出最新的数据
updatedData, err := r.data.cache.LPop(ctx, cacheKey)
if err != nil {
return nil, v1.ErrorUniversalError(err.Error())
}
return updatedData, nil
}
```
这段修改后的代码将数据库更新操作改为了修改缓存的操作。首先从缓存中获取原始数据,然后根据请求更新数据。接下来将更新后的数据添加到缓存的底部,表示最新的数据在列表的末尾。最后通过 LPop 操作从缓存的头部取出最新的数据并返回。
注意:这段代码只涉及缓存的更新操作,并没有包含事务处理、错误处理等完整的逻辑。请根据实际情况进行相应的完善。
void (*fout)(const char *fmt_msg, ...); /* output functions */
void (*fout)(const char *fmt_msg, ...); 是一个函数指针,指向一个接受一个const char *类型的参数和可变参数的函数。这个函数指针可以用来调用不同的输出函数,这些函数可以接受不同的参数并进行输出操作。\[2\]
函数指针的声明可以使用typedef来使其更易读和理解。例如,可以使用typedef来声明一个名为MyFuncPtrType的函数指针类型,它接受一个int类型的参数和一个char *类型的参数,并返回一个float类型的值。然后可以使用MyFuncPtrType来声明一个函数指针变量my_func_ptr,它可以指向满足这个函数指针类型的函数。\[2\]
在C++中,成员函数指针的语法可能看起来有些奇怪。例如,对于一个类SomeClass的成员函数指针my_memfunc_ptr,可以使用.*或->*运算符来调用指针指向的函数。例如,可以使用(x->*my_memfunc_ptr)(6, "Another Arbitrary Parameter")来调用一个SomeClass对象x的成员函数。\[3\]
总结起来,void (*fout)(const char *fmt_msg, ...)是一个函数指针,可以用来调用接受一个const char *类型的参数和可变参数的函数。在C++中,成员函数指针的语法可能看起来有些奇怪,但可以使用.*或->*运算符来调用指针指向的函数。\[2\]\[3\]
#### 引用[.reference_title]
- *1* *2* *3* [成员函数指针以及C++委托](https://blog.csdn.net/u014161300/article/details/23671103)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^insert_down28v1,239^v3^insert_chatgpt"}} ] [.reference_item]
[ .reference_list ]