数据字典存入redis缓存设计

今天由于我们后台管理里面没有数据字典管理,于是就被要求开发一个出来,研究了一下数据字典是怎么使用的。项目用的是ssm+vue

配置redis

首先由于要读redis,所以配置文件要先配置redis,以下是application.yml文件

spring:
  profiles:
    active: dev
  cache:
    redis:
      use-key-prefix: true
      key-prefix: "ipas:"

这里active意为使用后缀为dev的配置文件(实际上就是开发环境配置,还有测试环境和生产环境)
数据字典存入redis缓存设计_第1张图片
然后就是cache引入redis缓存,设定他的前缀
我们再看到被引入的后缀为dev的配置文件。里面配置了redis的地址

spring:
 redis:
    host: 存放的是地址
    port: 6379
    database: 15
    password: 密码
    timeout: 10000

然后我们可以在用redis客户端工具连接下redis看看对应的redis库,第15个库(database:15)
数据字典存入redis缓存设计_第2张图片
这里主要讲的是redis,数据库的配置以及其他配置就不贴了

数据库表结构

然后我们看数据库的表结构
首先是字典目录表
数据字典存入redis缓存设计_第3张图片
值得注意的是DICT_TYPE_CODE这个字段,他表示的是字典目录的编码,比如名称为年级的,DICT_TYPE_CODE叫做GRADE
然后我们还需要字典的值,这个值放在另一个表里面,有一个DICT_VALUE字段存字典值,
还有一个DICT_TYPE_CODE字段和字典目录的DICT_TYPE_CODE进行关联数据字典存入redis缓存设计_第4张图片

接口设计

明白了基本表结构之后就轮到接口的设计,此处写的是查询的接口
此处使用Cacheable注解,可以让有缓存的时候走redis缓存

@Service("dictEntryService")
public class DictEntryServiceImpl extends BaseServiceImpl<DictEntryMapper,DictEntry> implements DictEntryService {

    @Autowired
    private DictEntryMapper dictEntryMapper;

    @Override
    @Cacheable(value = "dict", key = "#dictTypeCode")
    public List<DictEntry> listDictEntry(String dictTypeCode){
        Map<String, Object> map = MapUtil.newHashMap();
        map.put("dictTypeCode", dictTypeCode);
        Page page = new Page<>();
        page.setSize(Integer.MAX_VALUE);
        List<OrderItem> orderItems = CollectionUtil.newArrayList();
        OrderItem orderItem = new OrderItem();
        orderItem.setColumn("SORT_NO");
        orderItem.setAsc(true);
        orderItems.add(orderItem);
        page.setOrders(orderItems);
        IPage<DictEntry> entries = super.pageByMap(page, map);
        return entries.getRecords();
    }
}

和redis里的字典存放位置是一样的,注意空文件夹也是一个冒号
数据字典存入redis缓存设计_第5张图片
查询接口就设计完毕了

但是在模块里修改数据字典的时候,还需要删除redis缓存,所以这边要写一个刷redis缓存的接口
比如下图是字段目录里的数据,此处编辑了字典目录里的DICT_TYPE_CODE值,或者是直接删除掉该字典目录,要重新刷redis
数据字典存入redis缓存设计_第6张图片
还有下图,增删改字典选项的值,都要重新刷redis
数据字典存入redis缓存设计_第7张图片
此处直接贴代码,env和redisKeyPrefix都可以在配置文件里看到

/**
* @Description: 用于刷字典缓存
* @Author: 
* @Date: 2022-7-21
*/
@Component
public class DictCacheUtil {
   @Value("${spring.profiles.active}")
   private  String env;


   @Value("${spring.cache.redis.key-prefix}")
   private String redisKeyPrefix;

   @Autowired
   private RedisTemplate redisTemplate;

   @Autowired
   private DictTypeService dictTypeService;

   @Autowired
   private DictEntryService dictEntryService;

    @Autowired
    private static DictEntryService dictEntryService2;





    /**
    * @Description: 刷单个redis的dict
    * @Param: 子字典的id(不是父字典)
    * @return:
    * @Author: 
    * @Date: 2022-7-21
    */
   public void refreshCacheByEntryId(@NotNull String entryId){
       boolean b = false;
//       if( this.env.equals("dev") ){
       // 这边统统刷redis
           DictEntry entry = dictEntryService.getByEntityId(entryId);
           if(entry != null && entry.getDictTypeCode() != null && !"".equals(entry.getDictTypeCode())){
               this.refreshCacheByDictTypeCode(entry.getDictTypeCode());
           }
//       }
       // 远程环境刷缓存map
       // 开发和测试环境用同一个库,所以改了开发环境的测试环境也要刷map
//       DictUtils.initMap();
   }

    /**
     * @Description: 根据dictTypeCode刷redis的dict
     * @Param: 字典的dictTypeCode
     * @return:
     * @Author: 
     * @Date: 2022-8-16
     */
    public void refreshCacheByDictTypeCode(@NotNull String dictTypeCode){
        boolean b = false;
//       if( this.env.equals("dev") ){
        // 这边统统刷redis

        if(dictTypeCode != null && !"".equals(dictTypeCode)){
            StringBuilder builder = new StringBuilder();
            // 开发环境删redis
            String key = builder.append(this.redisKeyPrefix).append("dict::").append(dictTypeCode).toString();
            b = redisTemplate.delete( key);
        }
//       }
        // 远程环境刷缓存map
        // 开发和测试环境用同一个库,所以改了开发环境的测试环境也要刷map
//       DictUtils.initMap();
    }
}

你可能感兴趣的:(redis,mysql,springboot)