提交 35ddd4f6 编写于 作者: dong.an's avatar dong.an

刷新用户缓存工具

上级 0ff0fbb1
流水线 #12859 已失败 于阶段
in 0 second
...@@ -6,9 +6,9 @@ import com.pica.cloud.foundation.entity.PicaResponse; ...@@ -6,9 +6,9 @@ import com.pica.cloud.foundation.entity.PicaResponse;
import io.swagger.annotations.Api; import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation; import io.swagger.annotations.ApiOperation;
import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.*;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController; import java.util.Map;
/** /**
* @author andong * @author andong
...@@ -29,4 +29,18 @@ public class AccountStatusController extends AccountBaseController { ...@@ -29,4 +29,18 @@ public class AccountStatusController extends AccountBaseController {
Account account = accountService.getById(doctorId); Account account = accountService.getById(doctorId);
return PicaResponse.toResponse(account); return PicaResponse.toResponse(account);
} }
@ApiOperation("获取用户缓存")
@GetMapping("/cache")
public PicaResponse<Map<String, String>> getCache(@RequestParam("id") long id) {
return PicaResponse.toResponse(accountService.getCache(id));
}
@ApiOperation("刷新用户缓存")
@GetMapping("/cache/refresh")
public PicaResponse refreshCache(@RequestParam("id") long id) {
new Thread(() -> accountService.refreshCache(id)).start();
return PicaResponse.toResponse();
}
} }
...@@ -4,6 +4,9 @@ import com.pica.cloud.account.account.server.entity.Account; ...@@ -4,6 +4,9 @@ import com.pica.cloud.account.account.server.entity.Account;
import org.apache.ibatis.annotations.Mapper; import org.apache.ibatis.annotations.Mapper;
import org.apache.ibatis.annotations.Param; import org.apache.ibatis.annotations.Param;
import java.util.List;
import java.util.Map;
/** /**
* 账号Mapper * 账号Mapper
* @author andong * @author andong
...@@ -26,4 +29,6 @@ public interface AccountMapper { ...@@ -26,4 +29,6 @@ public interface AccountMapper {
//根据微信unionid获取账号 //根据微信unionid获取账号
Account getByUnionid(@Param("unionid") String unionid); Account getByUnionid(@Param("unionid") String unionid);
List<Map<String, Object>> getHospitalInfoByPage(@Param("id") Long id, @Param("offset") int offset, @Param("size") int size);
} }
package com.pica.cloud.account.account.server.service; package com.pica.cloud.account.account.server.service;
import com.pica.cloud.account.account.server.entity.Account; import com.pica.cloud.account.account.server.entity.Account;
import java.util.Map;
/** /**
* @author andong * @author andong
...@@ -23,4 +24,8 @@ public interface AccountService { ...@@ -23,4 +24,8 @@ public interface AccountService {
//更新账号信息 //更新账号信息
void updateAccountById(Account account); void updateAccountById(Account account);
Map<String, String> getCache(long id);
void refreshCache(long id);
} }
...@@ -3,11 +3,20 @@ package com.pica.cloud.account.account.server.service.impl; ...@@ -3,11 +3,20 @@ package com.pica.cloud.account.account.server.service.impl;
import com.pica.cloud.account.account.server.entity.Account; import com.pica.cloud.account.account.server.entity.Account;
import com.pica.cloud.account.account.server.mapper.AccountMapper; import com.pica.cloud.account.account.server.mapper.AccountMapper;
import com.pica.cloud.account.account.server.service.AccountService; import com.pica.cloud.account.account.server.service.AccountService;
import com.pica.cloud.foundation.redis.ICacheClient;
import com.pica.cloud.foundation.utils.utils.EncryptCreateUtil; import com.pica.cloud.foundation.utils.utils.EncryptCreateUtil;
import org.apache.commons.collections.CollectionUtils;
import org.apache.commons.lang3.StringUtils;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.stereotype.Service; import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional; import org.springframework.transaction.annotation.Transactional;
import java.util.Date; import java.util.Date;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
/** /**
* @author andong * @author andong
...@@ -16,8 +25,14 @@ import java.util.Date; ...@@ -16,8 +25,14 @@ import java.util.Date;
@Service @Service
public class AccountServiceImpl implements AccountService { public class AccountServiceImpl implements AccountService {
private static final String KEY_PREFIX = "token-doctor-";
private static Logger logger = LoggerFactory.getLogger(AccountServiceImpl.class);
@Autowired @Autowired
private AccountMapper accountMapper; private AccountMapper accountMapper;
@Autowired
@Qualifier("cacheMigrateClient")
private ICacheClient cacheClient;
//根据ID获取账号 //根据ID获取账号
@Override @Override
...@@ -59,4 +74,68 @@ public class AccountServiceImpl implements AccountService { ...@@ -59,4 +74,68 @@ public class AccountServiceImpl implements AccountService {
public void updateAccountById(Account account) { public void updateAccountById(Account account) {
accountMapper.updateByIdSelective(account); accountMapper.updateByIdSelective(account);
} }
@Override
public Map<String, String> getCache(long id) {
String key = KEY_PREFIX + id;
Map<String, String> map = new HashMap();
map.put("id", cacheClient.hget(key, "id"));
map.put("hospital_id", cacheClient.hget(key, "hospital_id"));
map.put("hospital", cacheClient.hget(key, "hospital"));
return map;
}
@Override
public void refreshCache(long id) {
int offset = 0;
final int size = 2000;
if (id >= 0) { //刷新单个医生缓存信息
List<Map<String, Object>> list = accountMapper.getHospitalInfoByPage(id, offset, size);
if (CollectionUtils.isNotEmpty(list)) {
Map<String, Object> doctorMap = list.get(0);
this.refresh(doctorMap);
}
} else { //刷新全部医生缓存信息
int errorCount = 0; //异常次数
List<Map<String, Object>> list = accountMapper.getHospitalInfoByPage(null, offset, size);
while (CollectionUtils.isNotEmpty(list)) {
for (Map<String, Object> doctorMap : list) {
int result = this.refresh(doctorMap);
errorCount += result;
}
if (errorCount >= 10000) {
break; //错误次数超过一定数量停止任务
}
logger.info("更新用户缓存信息已完成数量:{}", offset + list.size());
offset += size;
list = accountMapper.getHospitalInfoByPage(null, offset, size);
}
logger.info("更新用户缓存信息全部完成!");
}
}
//更新缓存中hospital_id,hospital信息
//成功返回0,失败返回1
private int refresh(Map<String, Object> doctorMap) {
String doctorId = doctorMap.get("id").toString();
String hospitalId = doctorMap.get("hospital_id") == null ? StringUtils.EMPTY : doctorMap.get("hospital_id").toString();
String hospital = doctorMap.get("hospital") == null ? StringUtils.EMPTY : doctorMap.get("hospital").toString();
String key = KEY_PREFIX + doctorId;
try {
String cacheId = cacheClient.hget(key, "id");
if (StringUtils.isBlank(cacheId)) {
return 0; //未找到用户缓存数据,不做更新
}
cacheClient.hset(key, "hospital_id", StringUtils.isEmpty(hospitalId) ? "0" : hospitalId);
cacheClient.hset(key, "hospital", hospital);
return 0;
} catch (Exception ex) {
return 1;
}
}
} }
...@@ -301,4 +301,14 @@ ...@@ -301,4 +301,14 @@
limit 1 limit 1
</select> </select>
<select id="getHospitalInfoByPage" resultType="map">
select id, hospital_id, hospital
from p_doctor
where delete_flag = 1
<if test="id != null">
and id = #{id}
</if>
limit #{offset}, #{size}
</select>
</mapper> </mapper>
\ No newline at end of file
Markdown 格式
0% or
您添加了 0 到此讨论。请谨慎行事。
先完成此消息的编辑!
想要评论请 注册