ZSET存储数据过程

108 阅读3分钟

上班用到了缓存,缓存进行处理数据可以保证数据不会丢失,且不占用过大内存,全是干货,自己整理。有问题下面留言,欢迎大佬指点!

前提:若依框架,将数据字典进行存储

Controller层:

@RestController  
@RequestMapping("demo")  
@RequiredArgsConstructor  
public class DemoController {  
  
private final DemoService demoService;  
  
@RequestMapping("/list")  
public Rest getList(){  
return RestUtil.success(demoService.query());  
}  
  
@RequestMapping("/add")  
public Rest add(@RequestBody @Valid DemoDTO dto){  
return demoService.add(dto);  
}  
  
@RequestMapping("/update")  
public Rest update(@RequestBody @Valid DemoDTO dto){  
return demoService.update(dto);  
}  
  
@RequestMapping("/get/{id}")  
public Rest getById(@PathVariable String id){  
return demoService.getById(id);  
}  
  
}

service层

@Service  
@RequiredArgsConstructor  
public class DemoSeviceImpl implements demoService {  
  
  // 导入数据字典
private final SysDataDictDetailService sysDataDictDetailService;  
  // 导入缓存
private final RedisCache redisCache;  
  
@Override  
public List<DemoVO> query() {  
// 初始化共享预约资料列表  
ArrayList<DemoVO> demoList = new ArrayList<>();  
// 从数据字典中选择共享预约资料的详细信息  
List<Map<String, String>> mapList = sysDataDictDetailService.selectDetailByCode("data");  
// 如果获取的数据为空,抛出异常  
if (ObjectUtils.isEmpty(mapList)) {  
throw new RuntimeException("在数据字典中没有获取到共享预约资料管理数据!");  
}  
// 遍历获取的数据,构建并添加到共享预约资料列表中  
for (Map<String, String> map : mapList) {  
// 解析数据中的代码和名称  
String code = map.get("code");  
String name = map.get("name");  
// 使用解析的代码和名称构建共享预约资料对象,并添加到列表中  
DemoVO demo1 = DemoVO.builder().code(code).name(name).build();  
demoList.add(demo1);  
}  
// 返回构建的共享预约资料列表  
return demoList;  
}
  
/**  
* 通过指定的DTO将一组代码添加到Redis缓存中  
* 此方法覆盖了基类中的同名方法,用于处理分享预约信息的添加操作  
* 它使用了Redis缓存来存储与特定标识符相关的一组代码  
*  
* @param dto 包含了要添加到缓存中的代码集合以及相关联的标识符的信息对象  
* @return 返回一个表示操作成功的Rest对象  
*/  
@Override  
public Rest add(DemoDTO dto) {  
String key = ConstantRedis.DEMOCACHE + dto.getMcid();  
redisCache.setCacheSet(key, dto.getCodeSet());  
return RestUtil.success();  
}  
  
  
/**  
* 更新缓存信息  
* <p>  
* 此方法主要用于更新缓存信息它首先从Redis缓存中删除旧的代码对象,  
* 然后将新的代码集合重新缓存回去这样确保了信息的准确性和实时性  
* </p>  
*  
* @param dto 包含修改信息的数据传输对象,包括ID(id)和代码集合(codeSet)  
* @return 返回一个表示操作成功的Rest对象  
*/  
@Override  
public Rest update(DemoDTO dto) {  
String key = ConstantRedis.DEMOCACHE + dto.getId();  
// 从Redis缓存中删除指定的对象,以便后续重新缓存最新的代码集合  
redisCache.deleteObject(key);  
// 将新的代码集合缓存到Redis中,关联的ID作为键  
redisCache.setCacheSet(key, dto.getCodeSet());  
// 操作成功,返回成功消息  
return RestUtil.success();  
}  
  
/**  
* 根据编号获取预约资料编码列表  
*  
* @param id 编号  
* @return 预约资料编码列表  
*/  
@Override  
public Rest getById(String id) {  
HashSet<String> codeSet = new HashSet<>();  
String key = ConstantRedis.DEMOCACHE + id;  
Set<Object> cacheSet = redisCache.getCacheSet(key);  
if (ObjectUtils.isEmpty(cacheSet)) {  
return RestUtil.warning("当前用户未指定填写预约资料信息,请先配置!");  
}  
for (Object code : cacheSet) {  
codeSet.add(code + "");  
}  
return RestUtil.success(codeSet);  
}  
  
}

数据字典实现层

/**  
* 批量完成字典详情更新  
*  
* @param entityList 字典详情集合  
* @return 添加结果  
*/  
@Override  
@Transactional(  
rollbackFor = {Exception.class}  
)  
@CacheEvict(allEntries = true)  
public void saveBatch(List<SysDataDictDetail> entityList) {  
// 完成字典详情批增  
super.saveBatch(entityList);  
}  
  
/**  
* 批量完成字典详情更新  
*  
* @param entityList 字典详情集合  
* @return 更新结果  
*/  
@Override  
@Transactional(  
rollbackFor = {Exception.class}  
)  
@CacheEvict(allEntries = true)  
public void updateBatch(List<SysDataDictDetail> entityList) {  
if (!ObjectUtils.isEmpty(entityList) && entityList.size() > 0) {  
// 获取数据字典主键ID  
Long sysDataDictId = entityList.get(0).getSysDataDictId();  
// 首先删除数据字典外键  
QueryWrapper deleteWrapper = new QueryWrapper();  
deleteWrapper.eq("sys_data_dict_id", sysDataDictId);  
baseMapper.delete(deleteWrapper);  
// 最终完成字典详情批增  
super.saveBatch(entityList);  
}  
}  
  
@Override  
@Cacheable  
public List<SysDataDictDetail> selectSysDataDictDetailByDictId(Long dictId) {  
QueryWrapper<SysDataDictDetail> wrapper = new QueryWrapper<>();  
wrapper.eq("sys_data_dict_id", dictId);  
return baseMapper.selectList(wrapper);  
}  
  
/**  
* 根据数据字典编码查询详情列表  
*  
* @param dictCode 数据字典编码  
* @return 数据字典详情列表  
*/  
@Override  
@Cacheable  
public List<Map<String, String>> selectDetailByCode(String dictCode) {  
return baseMapper.selectDetailByCode(dictCode);  
}  
  
  
/**  
* 根据数据字典编码查询详情列表  
*  
* @param dictCode 数据字典编码  
* @return 数据字典详情列表  
*/  
@Override  
@Cacheable  
public String selectNameByDCode(String dictCode, String detailCode) {  
return baseMapper.selectNameByDCode(dictCode, detailCode);  
}

数据字典

public interface SysDataDictDetailDao extends BaseMapper<SysDataDictDetail> {  
  
@Select(" select b.detail_code as code, b.detail_name as name from sys_data_dict a, sys_data_dict_detail b " +  
" where a.id = b.sys_data_dict_id and a.is_delete = 0 and b.is_delete = 0 and a.dict_code = #{code} " +  
" order by b.detail_sort ")  
List<Map<String, String>> selectDetailByCode(@Param("code") String dictCode);  
  
@Select(" select b.detail_name as name from sys_data_dict a, sys_data_dict_detail b" +  
" where a.id = b.sys_data_dict_id and a.is_delete = 0 and b.is_delete = 0 and a.dict_code = #{dictCode} and b.detail_code = #{detailCode}" +  
" order by b.detail_sort")  
String selectNameByDCode(@Param("dictCode") String dictCode, @Param("detailCode") String detailCode);  
}

全是代码,满满干货