背景:redis
最近业务很少,公司的老哥开始review个人代码。受到了一顿教育(实际上是由于我前段时间搞了个bug.....)数据库
场景:app
须要写一个利用redis自增获得id并保存到数据库的功能。ide
很简单,在AppConfigManager类里面代码以下:编码
/**
* 从redis里面获得自增的Id
* @return
*/
public Integer getId(){
Long longId =redis.incr(CacheUtil.getIdKey());
return longId != null ? longId.intValue() : null;
}
固然前面在系统启动的时候须要一行:spa
redis.set(CacheUtil.getIdKey(), AppConfigRepository.getMaxAppId());get
那么问题来了:当我在数据库里面保存id的时候,若是重复了该怎么处理?
(固然通常是不会重复的,只有在手动修改数据的时候会有触发重复的可能。)
个人 * 新增规 * 利用redis的incr实现appId的自 * @param query
* @return
*/
@Override
public AppConfig saveWXAppConfig(AppConfigQuery query) {
if(wxAppConfigRepository.getByAppId(appConfig.getAppId())!= null){
log.error("appId 重复! appId! appConfig:{}", appConfig);
redis.set(CacheUtil.getIdKey(), wxAppConfigRepository.getMaxAppId());
appConfig.setAppId(appConfigManager.getAppId());
}
return wxAppConfigRepository.saveWXAppConfig(appConfig);
);
}
注意红色的部分:这里我先将redis里面的值更新到最大值,而后在去AppConfigManager类里面getId()一次,那么,此时获得的就是最新的不会重复的id了。
这里师兄说:链路太长,代码可读性太差。
当时个人心里全是问号❓❓❓❓❓❓
就两行代码会致使可读性变差?虽然我也知道这样可读性的确不好,可是为了保证代码的可复用。我选择这样写。
经师兄纠正:复用代码的优先级是低于可读性的!!!
后改正以下:
/**
* 新增规则:
* 利用redis的incr实现appId的自增
* @param query
* @return
*/
@Override
public AppConfig saveWXAppConfig(WXAppConfigQuery query) {
AppConfig appConfig = convertToAppConfig(query);
if(wxAppConfigRepository.getByAppId(appConfig.getAppId())!= null){
log.error("appId 重复! appId! appConfig:{}", appConfig);
appConfig = resetAppId(appConfig);
}
return wxAppConfigRepository.saveWXAppConfig(appConfig);
}
/**
* 在redis里面设置新的appId,
* 利用getAppId方法,返回自增的appID
* @param appConfig
* @return
*/
private AppConfig resetAppId(AppConfig appConfig) {
String appIdKey = CacheUtil.getAppIdKey();
redis.set(appIdKey, wxAppConfigRepository.getMaxAppId());
appConfig.setAppId(appConfigManager.getAppId());
return appConfig;
}
意义:大型的项目,是须要几我的团队协做完成的,而且,会经历几代的迭代,高质量和规范的代码这时候就显得尤其重要了。
虽然,只是一个编码习惯上的小问题,可是仍是在项目空闲的时候去尽可能纠正这些问题,否则,当一个需求跑过来的时候,如何去