SpringBoot+Redis实现数据字典的方法
作者:溪源的奇思妙想 发布时间:2022-08-03 14:22:29
前言
我们在日常的开发过程中针对一些字段采用整型的方式去代替某些具体的含义,比如性别0代表男,1代表女。如果只是一些不会变更的转译我们可以采用常量或者枚举类的方式来实现,但是事实上我们也会遇到那种可能需要变更的,显然这种场景下使用枚举类这种方式是不合理的,那么如何动态地去进行转译呢?
正文
数据字典
数据字典(Data dictionary)是一种用户可以访问的记录数据库和应用程序元数据的目录。主动数据字典是指在对数据库或应用程序结构进行修改时,其内容可以由DBMS自动更新的数据字典。被动数据字典是指修改时必须手工更新其内容的数据字典。
我们通常会结合数据库来实现数据字典,但事实上数据字典经常会被使用到,如果频繁地去访问数据库,将会对数据库造成性能压力,事实上我们经常会采用Redis对数据字典进行缓存来提升系统性能。
使用Redis的优势:
1.绝大数的请求操作都是纯粹的内存操作。
2.采用了单线模式,避免了不必要的上下文切换和竞争条件这里的单线程指的是网络请求模块只使用了一个线程(所以不必考虑并发安全性),即一个请求处理所有网络请求,其他模块仍使用了多个线程。
3.采用了动态字符串(SDS),对于字符串会预留一定的空间,避免了字符串在做拼接和截取引起内存重新分配导致性能的损耗。
SpringBoot+Redis实现数据字典
依赖
<!--redis-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-redis</artifactId>
</dependency>
<dependency>
<groupId>redis.clients</groupId>
<artifactId>jedis</artifactId>
<version>2.9.0</version>
</dependency>
<!--lombok-->
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<version>1.18.2</version>
<optional>true</optional>
</dependency>
application.properties:配置类
#redis
spring.redis.host=127.0.0.1
spring.redis.port=6379
字典表:SYS_DICT
SET FOREIGN_KEY_CHECKS=0;
-- ----------------------------
-- Table structure for SYS_DICT
-- ----------------------------
DROP TABLE IF EXISTS `SYS_DICT`;
CREATE TABLE `SYS_DICT` (
`code` varchar(36) NOT NULL COMMENT '主键',
`type_code` varchar(36) DEFAULT NULL COMMENT '类型code',
`name` varchar(50) DEFAULT NULL COMMENT '展示值',
`value` int(20) DEFAULT NULL COMMENT '使用值',
`fixed` int(2) DEFAULT NULL COMMENT 'default 0不固定,固定的话用1',
`creater` varchar(20) DEFAULT NULL COMMENT '新建人',
`create_time` datetime DEFAULT NULL COMMENT '新建时间',
`updater` varchar(20) DEFAULT NULL COMMENT '编辑人',
`update_time` datetime DEFAULT NULL COMMENT '编辑时间',
PRIMARY KEY (`code`),
KEY `sys_type` (`type_code`),
CONSTRAINT `sys_type` FOREIGN KEY (`type_code`) REFERENCES `SYS_DICT_TYPE` (`code`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
-- ----------------------------
-- Records of SYS_DICT
-- ----------------------------
INSERT INTO `SYS_DICT` VALUES ('182d4db6-aa50-11ea-aa1b-00163e08c9ed', '9ed92c7e-aa4f-11ea-aa1b-00163e08c9ed', '男', '0', '1', null, null, null, null);
INSERT INTO `SYS_DICT` VALUES ('222cf983-aa50-11ea-aa1b-00163e08c9ed', '9ed92c7e-aa4f-11ea-aa1b-00163e08c9ed', '女', '1', '1', null, null, null, null);
字典类型表SYS_DICT_TYPE
SET FOREIGN_KEY_CHECKS=0;
-- ----------------------------
-- Table structure for SYS_DICT_TYPE
-- ----------------------------
DROP TABLE IF EXISTS `SYS_DICT_TYPE`;
CREATE TABLE `SYS_DICT_TYPE` (
`code` varchar(36) NOT NULL,
`name` varchar(50) DEFAULT NULL COMMENT '用于展示',
`value` varchar(50) DEFAULT NULL COMMENT '用于前段(建立唯一索引)',
`creater` varchar(20) DEFAULT NULL COMMENT '新建人',
`create_time` datetime DEFAULT NULL COMMENT '新建时间',
`updater` varchar(20) DEFAULT NULL COMMENT '编辑人',
`updater_time` datetime DEFAULT NULL COMMENT '编辑时间',
PRIMARY KEY (`code`),
UNIQUE KEY `key_value` (`value`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
-- ----------------------------
-- Records of SYS_DICT_TYPE
-- ----------------------------
INSERT INTO `SYS_DICT_TYPE` VALUES ('9ed92c7e-aa4f-11ea-aa1b-00163e08c9ed', '性别', 'sex', null, null, null, null);
RedisConfigurtion:Redis配置类,解决Redis数据同步时字符串格式问题
@Configuration
public class RedisConfigurtion {
@Autowired
private RedisTemplate redisTemplate;
@Bean
public RedisTemplate<String, Object> stringSerializerRedisTemplate() {
RedisSerializer<String> stringSerializer = new StringRedisSerializer();
redisTemplate.setKeySerializer(stringSerializer);
redisTemplate.setValueSerializer(stringSerializer);
redisTemplate.setHashKeySerializer(stringSerializer);
redisTemplate.setHashValueSerializer(stringSerializer);
return redisTemplate;
}
}
SpringUtil:用于加载Spring容器
@Component
public class SpringUtil implements ApplicationContextAware {
private static ApplicationContext applicationContext = null;
@Override
public void setApplicationContext(ApplicationContext applicationContext) throws BeansException {
if(SpringUtil.applicationContext == null){
SpringUtil.applicationContext = applicationContext;
}
}
//获取applicationContext
public static ApplicationContext getApplicationContext() {
return applicationContext;
}
//通过name获取 Bean.
public static Object getBean(String name){
return getApplicationContext().getBean(name);
}
//通过class获取Bean.
public static <T> T getBean(Class<T> clazz){
return getApplicationContext().getBean(clazz);
}
//通过name,以及Clazz返回指定的Bean
public static <T> T getBean(String name,Class<T> clazz){
return getApplicationContext().getBean(name, clazz);
}
}
RedisDistUtil:Spring容器不允许普通Pojo调用Service,所以采用以下方式手动通过Spring容器去加载Bean.
public class RedisDistUtil {
private static ApplicationContext context;
/**
* 转化码值
* @param distname
* @param value
* @return
* @throws Exception
*/
public static String transformStr(String distname, int value) {
ApplicationContext context = SpringUtil.getApplicationContext();
ISysDictService iSysDictService =context.getBean(ISysDictService.class);
return iSysDictService.transformStr(distname,value);
}
}
SysDictService
transformStr:从Redis中获取字典值。
refreshCache:用于将数据库数据字典表数据同步到Redis中。
@Transactional
@Service
@Slf4j
public class SysDictService implements ISysDictService {
@Autowired
SysDictPojoMapper sysDictPojoMapper;
@Autowired
RedisTemplate redisTemplate;
/**
* 转化码值
*
* @param distname
* @param value
* @return
* @throws Exception
*/
@Override
public String transformStr(String distname, int value) {
return redisTemplate.opsForValue().get(distname + "_" + value) != null ?
redisTemplate.opsForValue().get(distname + "_" + value).toString() : String.valueOf(value);
}
/**
* 刷新缓存
*/
@Override
public void refreshCache() {
log.info("start 刷新码表缓存");
List<SysDictPojo> sysDictPojoList = sysDictPojoMapper.getall();
long startTime = System.currentTimeMillis();
for (SysDictPojo sysDictPojo : sysDictPojoList) {
redisTemplate.opsForValue().set(sysDictPojo.getTypeCodeValue() + "_" + sysDictPojo.getValue(), sysDictPojo.getName());
}
long endTime = System.currentTimeMillis();
log.info("end 刷新码表缓存,总计:" + sysDictPojoList.size() + "条,用时:" + (endTime - startTime) + "毫秒");
}
}
SysDictPojo:数据字典的实体类
@Setter
@Getter
@ToString
public class SysDictPojo implements Serializable {
private static final long serialVersionUID = 7845051152365224116L;
private String code;
private String typeCode;
private String typeCodeValue;
private String name;
private Integer value;
private Integer fixed;
private String creater;
private Date createTime;
private String updater;
private Date updateTime;
}
getall:查询数据库的所有数据字典值
<select id="getall" resultType="com.luo.dao.entity.SysDictPojo">
select
t1.name,
t1.value,
t2.value typeCodeValue
from SYS_DICT t1
left join SYS_DICT_TYPE t2 on t2.code =t1.type_code
</select>
验证
UserPojoRes :在get方法里进行数据字典值的替换
@Setter
@Getter
@ToString
public class UserPojoRes implements Serializable {
private static final long serialVersionUID = -2145503717390503506L;
/**
* 主键
*/
private String id;
/**
* 姓名
*/
private String name;
/**
* 性别
*/
private int sex;
/**
* 性别展示
*/
private String sexStr;
/**
* 消息
*/
private String msg;
public String getSexStr() {
return RedisDistUtils.transformStr("sex",this.sex);
}
}
访问模拟接口,根据id查询用户信息:
来源:https://blog.csdn.net/weixin_40990818/article/details/106669371
猜你喜欢
- 前沿知识ThreadLocal存储线程变量,使用set方法设置变量,使用get方法获取变量线程隔离的实现是每个Thread类有一个类型为Th
- 前言最近学习java,接触到了回调机制(CallBack)。初识时感觉比较混乱,而且在网上搜索到的相关的讲解,要么一言带过,要么说的比较单纯
- 就我们所知道的,java中有子类和父类,子类由于继承父类而形成,那么父类还有没有父类呢?答案是有了,父类的父类就是object类,一切父类都
- Spring Web MVC是一种基于Java的实现了Web MVC设计模式的请求驱动类型的轻量级Web框架,即使用了MVC架构模式的思想,
- Spring Data Jpa复杂查询总结只是做一个总结所以就不多说废话了实体类@Entity@Table(name = "t_h
- 简单介绍synchronized是Java中的关键字,是一种同步锁。它修饰的对象有以下几种:1. 修饰一个代码块,被修饰的代码块称为同步语句
- 本文实例讲述了Java集合定义与用法。分享给大家供大家参考,具体如下:java集合大体可分为三类,分别是Set、List和Map,它们都继承
- Android的消息机制几乎是面试必问的话题,当然也并不是因为面试,而去学习,更重要的是它在Android的开发中是必不可少的,占着举足轻重
- 本文实例讲述了java生成XML的方法。分享给大家供大家参考,具体如下:下拉框的生成,我是通过javascript读取xml文件生成的。Xm
- 1、右值1.1 简介首先区分一下左右值:左值是指存储在内存中、有明确存储地址(可取地址)的数据;右值是指可以提供数据值的数据(不可取地址)如
- Android Studio 在引用外部依赖时,发现一直无法引用外部依赖。刚开始以为是墙的问题,尝试修改Gradle配置,未解决问题。最终发
- Jenkins是一个开源软件项目,旨在提供一个开放易用的软件平台,使软件的持续集成变成可能Jenkins是基于Java开发的一种持续集成工具
- 1.组装查询条件组装查询其实很简单,可以支持条件的链式编程:查询用户名包含a,年龄在 10 - 20 之间并且邮箱不为空的用户:@Testv
- 前几天在这里分享了手写 sql 分页查询实现分页,现在来看看使用 mybatis 分页插件 pagehepler 来实现分页使用分页插件的原
- Java中有四种权限修饰符publicprotected(default)private同一个类yesyesyesyes同一个包yesyes
- 最近在做项目的时候有用到对两个集合中的元素进行对比求其交集的情况,因为涉及到的数据量比较大,所以在进行求两个集合中元素交集的时候,就应该考虑
- 一、参数管理在编程系统中,为了能写出良好的代码,会根据是各种设计模式、原则、约束等去规范代码,从而提高代码的可读性、复用性、可修改,实际上个
- maven3 安装:安装 Maven 之前要求先确定你的 JDK 已经安装配置完成。Maven是 Apache 下的一个项目,目前最新版本是
- 正则: “.”和"\""."点儿,在正则表达式中表示任意一个字符。"\"在正则表
- 一、问题分析入门案例的内容已经做完了,在入门案例中我们创建过一个SpringMvcConfig的配置类,再回想前面咱们学习Spring的时候