枚举+链对缓存实现以读取为主的请求接口

一、需求背景

      需要给一份问卷进行授权,授权的角色固定为4类,分别是: 农户、企业、金融机构、政府用户,这4类角色定义在字典里面,并且很少改动。这4类角色下面,可能有多个角色,这些角色通过字典的key关联到上述4个类型中的一个;
      在新增、编辑问卷的时候,需要把这4类所有的角色都展示出来,供管理员选择。

二、需求分析

      由于涉及到的数据很少改动,且主要以查询为主,于是第一想法就是通过 枚举+链对实现,具体实现如下:

三、实现过程

1. 枚举类

import lombok.Getter;
import lombok.Setter;import java.util.*;
import java.util.concurrent.ConcurrentHashMap;
import java.util.function.Consumer;
import java.util.stream.Stream;import static com.xxx.xxx.utils.StreamUtil.forEachIfPresent;/*** Author:   wxz* Date:     2023.11.29 10:35* Description: 问卷调查授权枚举*/
public enum PaperAuthorRoleEnum {ANONYMITY("un-limit", "不限", Collections.singletonList("")),AGRICULTURAL("member", "农户",Collections.singletonList("member")),ENTERPRISE("enterprises", "企业", Collections.singletonList("agricultural-enterprises")),FINANCIAL_INSTITUTION("finance", "金融机构",FinanceRoleKeys()),GOVERNMENT_USERS("government", "政府用户", GovernmentRoleKeys()),;/*** 角色类型*/@Getterprivate final String type;/*** 角色类型名称*/@Getterprivate final String typeName;/*** 角色id集合*/@Getterprivate final List<String> roleKeys;/*** 角色列表*/@Getterprivate final List<PaperRole> paperRoleList;/*** 角色缓存数据*/private static Map<String, SysRole> roleCache = new ConcurrentHashMap<>();PaperAuthorRoleEnum(String type, String typeName, List<String> roleKeys) {this.type = type;this.typeName = typeName;this.roleKeys = roleKeys;this.paperRoleList = getRolesFromCache(roleKeys);}/*** 根据角色类型查找枚举* @param type 角色类型* @return 类型枚举*/public static PaperAuthorRoleEnum of(String type) {if (type == null) {return null;}PaperAuthorRoleEnum[] values = PaperAuthorRoleEnum.values();for (PaperAuthorRoleEnum a : values) {if (a.type.equals(type)) {return a;}}return null;}/*** 金融机构角色keys*/private static List<String> FinanceRoleKeys() {List<String> list = new ArrayList<>();//银行机构有5个等级for (int i = 1; i < 5; i++) {list.add("bank_level_" + i);}return list;}/*** 政府角色keys*/private static List<String> GovernmentRoleKeys() {return new ArrayList<>(Arrays.asList("collector","government","government-role"));}/*** 获取所有枚举的keys* @return*/private List<String> getAllRolKeys() {List<String> roleKeys = new ArrayList<>();roleKeys.addAll(Collections.singletonList("member"));roleKeys.addAll(Collections.singletonList("agricultural-enterprises"));roleKeys.addAll(FinanceRoleKeys());roleKeys.addAll(GovernmentRoleKeys());return roleKeys;}/*** 从缓存中获取角色列表* @param roleKeys* @return*/private  List<PaperRole> getRolesFromCache(List<String> roleKeys) {List<PaperRole> paperRoles = new ArrayList<>();Set<String> notExitKeys = new HashSet<>();boolean sign = (roleCache == null);//如果已经存在缓存里面,则优先从缓存里面获取if (sign) {notExitKeys.addAll(getAllRolKeys());roleCache = new ConcurrentHashMap<>();} else {roleKeys.forEach(key -> {if (!roleCache.containsKey(key)) {notExitKeys.add(key);} else {PaperRole paperRole =new PaperRole().setRoleId(roleCache.get(key).getRoleId()).setRoleName(roleCache.get(key).getRoleName());paperRoles.add(paperRole);}});}//不存在于缓存的数据,重新从数据库里面查询出来,放在缓存里面if (notExitKeys.size() > 0) {Optional<List<SysRole>> sysRoles =Optional.ofNullable(SpringUtils.getBean(SysRoleMapper.class).selectListByRoleKeys(new ArrayList<>(notExitKeys)));// forEachIfPresent()方法参考:  https://blog.csdn.net/qq_37844454/article/details/134964619forEachIfPresent(sysRoles,item->{roleCache.put(item.getRoleKey(), item);PaperRole paperRole = new PaperRole().setRoleId(item.getRoleId()).setRoleName(item.getRoleName());paperRoles.add(paperRole);});}return paperRoles;}/*** 获取所有的枚举*/public static PaperAuthorRoleEnum[] getValues() {return new PaperAuthorRoleEnum[]{AGRICULTURAL, ENTERPRISE, FINANCIAL_INSTITUTION, GOVERNMENT_USERS};}
}

2. 控制器调用

    //使用线程安装的链对做缓存,避免读多写少的数据频繁请求数据库private static ConcurrentLinkedQueue<PaperAuthorTypeDTO> dtoQueue = new ConcurrentLinkedQueue<>();@GetMapping(value = "/getRoleList")public AjaxResult getRoleList() {if (CollectionUtils.isEmpty(dtoQueue)) {dtoQueue = new ConcurrentLinkedQueue<>();Arrays.stream(PaperAuthorRoleEnum.getValues()).forEach(anEnum->{dtoQueue.offer(new PaperAuthorTypeDTO().setRoleId(anEnum.getType()).setRoleName(anEnum.getTypeName()));});}return AjaxResult.success(dtoQueue);}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/220528.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

记录 | vscode禁止插件自动更新的方法

shift command p 打开然后输入 > setting.json&#xff0c;选择用户设置 在 settings.json 配置文件中增加一项&#xff1a; "extensions.autoUpdate": false,

ohpm : 无法将“ohpm”项识别为 cmdlet、函数...

这是因为没有在环境变量里配置 Ohpm. 左上角File->Settings,找到Ohpm放的路径 bin目录下&#xff0c;然后复制 此电脑->右键属性->高级系统设置->环境变量->系统变量找到Path,添加刚才复制的那一行 重启 DevEco ,在Terminal输入 ohpm -v ,出现版本号就欧了 如果…

Python中容易被忽视的核心功能

Python是一门富有魅力的编程语言&#xff0c;拥有丰富的功能和库&#xff0c;以及强大的社区支持。然而&#xff0c;有一些核心功能经常被忽视&#xff0c;而它们实际上可以极大地提高代码的质量、可读性和性能。 1. 解析命令行参数的argparse库 很多Python开发者在编写命令行…

开关电源测试之电源漏电流测试方法分享

一、外观检测 检查开关电源外观是否完好&#xff0c;是否有破损、变形、漏油等情况。 二、检测火线和零线的电流 实时测量火线和零线的电流&#xff0c;当两个电流值不相等且都不为零时断开零线&#xff0c;然后测火线的电流。当火线电流不为0时&#xff0c;判断电流为漏电流状…

C语言第四十七弹---猜凶手

使用C语言找到凶手 题目&#xff1a;日本某地发生了一件谋杀案&#xff0c;警察通过排查确定杀人凶手必为4个嫌疑犯的一个。 以下为4个嫌疑犯的供词: A说&#xff1a;不是我。 B说&#xff1a;是C。 C说&#xff1a;是D。 D说&#xff1a;C在胡说 已知3个人说了真话&…

02.尚医通 Mybatis-Plus

1、前期准备 a. 创建数据库 CREATE TABLE USER (id BIGINT(20)NOT NULL COMMENT 主键ID,NAME VARCHAR(30)NULL DEFAULT NULL COMMENT 姓名,age INT(11)NULL DEFAULT NULL COMMENT 年龄,email VARCHAR(50)NULL DEFAULT NULL COMMENT 邮箱,PRIMARY KEY (id) );INSERT INTO user…

振弦采集仪:工程安全监测的“智能助手”

振弦采集仪&#xff1a;工程安全监测的“智能助手” 振弦采集仪是一种用于工程安全监测的设备&#xff0c;它可以被视为工程安全监测的“智能助手”。振弦采集仪通过测量结构物振动的频率和振幅来判断结构物的安全性&#xff0c;并实时监测结构物的变化。 振弦采集仪可以广泛…

番茄病虫害检测系统:融合感受野注意力卷积(RFAConv)改进YOLOv8

1.研究背景与意义 项目参考AAAI Association for the Advancement of Artificial Intelligence 研究背景与意义 番茄是全球重要的蔬菜作物之一&#xff0c;具有广泛的经济和营养价值。然而&#xff0c;番茄病虫害的严重威胁导致了产量和质量的损失。因此&#xff0c;开发一种…

@RequestParam的使用

RequestParam使用 &#xff08;1&#xff09;不加RequestParam前端的参数名需要和后端控制器的变量名保持一致才能生效 &#xff08;2&#xff09;不加RequestParam参数为非必传&#xff0c;加RequestParam写法参数为必传。但RequestParam可以通过RequestParam(required fals…

Hadoop3.x完全分布式环境搭建Zookeeper和Hbase

集群规划 IP地址主机名集群身份192.168.138.100hadoop00主节点192.168.138.101hadoop01从节点192.168.138.102hadoop02从节点 Hadoop完全分布式环境搭建请移步传送门 先在主节点上进行安装和配置&#xff0c;随后分发到各个从节点上。 1. 安装zookeeper 1.1 解压zookeeper并…

spring 笔记三 Spring与Web环境集成

文章目录 Spring与Web环境集成ApplicationContext应用上下文获取方式导入Spring集成web的坐标置ContextLoaderListener监听器通过工具获得应用上下文对象SpringMVC概述SpringMVC快速入门 Spring与Web环境集成 ApplicationContext应用上下文获取方式 应用上下文对象是通过new …

Java-Ali图片上传实现

0.application.yml文件中编写配置 sky:alioss: endpoint: 地域节点(概览查看)access-key-id: 密钥账号access-key-secret: 密钥密码bucket-name: Bucket名称spring:servlet:multipart:max-request-size: 100MB # 最大请求文件大小,默认10MBmax-file-size: 10MB # 单个请求文件…

RFID射频识别技术在鞋业中的应用

RFID射频识别技术在鞋业中的应用 在鞋业制造、入库、出库、货物运输的时候都会遇到一个大问题&#xff0c;货物的管理和盘点&#xff0c;传统的人工盘点不但费时费力&#xff0c;还会有人为统计出错的情况出现。十分不方便货物的管理&#xff0c;对货物的出入库和运输造成不少…

2021-2023年历年地震数据,shp矢量数据,含时间、位置、类型、震级等信息

基本信息. 数据名称: 历年地震数据 数据格式: Shp 数据时间: 2021-2023年 数据几何类型: 点 数据坐标系: WGS84坐标系 数据来源&#xff1a;网络公开数据 数据字段&#xff1a; 序号字段名称字段说明1dzlx地震类型2zj震级3zysd震源深度&#xff08;米&#xff09;…

MidJourney笔记(7)-Seeds

我相信很多人在使用MidJourney的时候,都会遇到一个问题,就是如何保持生成图像的一致性,或者相对一致性,差异性不是很大。此时,我们就需要引入一个seed值,类似给这个提示词生成的图片做一个id标识。 那这个seed值怎么使用? 其实,在我们每次生成的图片,都有有一个seed值…

2006年全国水土流失防治区数据,shp/excel格式,多字段,包含防治区名称、类型、编码、二级编码等

基本信息. 数据名称: 全国水土流失防治区数据 数据格式: Shp、Excel 数据时间: 2006年 数据几何类型: 面 数据坐标系: WGS84坐标系 数据来源&#xff1a;网络公开数据 数据字段&#xff1a; 序号字段名称字段说明1city_dm城市代码2city城市名称3mc防治区名称4bhlx…

Linux系统中部署minio服务、开启反向代理、二级域名SSL加固

链接: B站1小时-配置指导视频: 一、创建minio 文件目录(/project/minio) 二、下载Minio wget https://dl.min.io/server/minio/release/linux-amd64/minio 三、在minio目录中-创建日志文件 四、对minio(可以理解为windows系统中的.exe可执行文件) 进行授权 chmod 777 min…

保姆级 Keras 实现 YOLO v3 三

保姆级 Keras 实现 YOLO v3 三 一. 分配 anchor box二. 正负样本匹配规则三. 为每一个 anchor box 打标签3.1 anchor box 长什么样?3.2 每一个 anchor box 标签需要填充的信息有哪些?3.3 ( Δ x , Δ y , Δ w , Δ h ) (\Delta x, \Delta y, \Delta w, \Delta h) (Δx,Δy,…

WebDriverException: Message: unknown error: cannot find Chrome binary解决方法

python3-conda 【直接手动运行chromedriver.exe&#xff0c;保证和chrome的版本好一致】 附上&#xff0c;直接代码写死就可以解决报错误问题&#xff1a; from selenium import webdriver from selenium.webdriver.chrome.options import Options options Options() option…

DC-DC变换集成电路B34063——工作电压范围宽,静态电流小

B34063为一单片DC-DC变换集成电路&#xff0c;内含温度补偿的参考电压源(1.25V)、比较器、能有效限制电流及控制工作周期的振荡器,驱动器及大电流输出开关管等&#xff0c;外配少量元件&#xff0c;就能组成升压、降压及电压反转型DC-DC变换器。 主要特点&#xff1a; ● 工作…