用于缓存一些固定名称的小组件

news2024/12/26 23:01:15

项目中,用于缓存姓名、地名、单位名称等一些较固定名称的id-name小组件。用于减少一些表的关连操作和冗余字段。优化代码结构。扩展也方便,写不同的枚举就行了。
具体用法:

{
	NameCacheUser.USER.getName(userId);
	NameCacheUser.ACCOUNT.getName(accountId);
	NameCacheUser.OFFICE.getName(officeId);
}
public enum NameCacheUser implements NameCacheBee {
    USER(userId -> {
        UserMapper userMapper = ZYSpringUtils.getBean(UserMapper.class);
        User user = userMapper.selectById(userId);
        return null != user ? user.getUserName() : null;
    }),
    ACCOUNT(accountId -> {
        UserAccountMapper userMapper = ZYSpringUtils.getBean(UserAccountMapper.class);
        UserAccount user = userMapper.selectById(accountId);
        return null != user ? user.getUserName() : null;
    }),
    OFFICE(officeId -> {
        OfficeMapper officeMapper = ZYSpringUtils.getBean(OfficeMapper.class);
        Office office = officeMapper.selectById(officeId);
        return null != office ? office.getName() : null;
    });

    private Function<String, String> nameFunction;

    NameCacheUser(Function<String, String> nameFunction) {
        this.nameFunction = nameFunction;
    }

    @Override
    public String prefix() {
        return this.name().toLowerCase();
    }

    @Override
    public Function<String, String> nameFunction() {
        return this.nameFunction;
    }
}
public interface NameCacheBee {

    String prefix();

    Function<String, String> nameFunction();

    default void flush(String businessId, String name) {
        NameCache.flush(businessId, name, prefix(), nameFunction());
    }

    default String getName(String key) {
        return NameCache.getName(key, prefix(), nameFunction());
    }

    default  void remove( String key){
      NameCache.remove(prefix(), key);
    }

    default   void remove(List<String> keys){
        NameCache.remove(prefix(), keys);
    }
}
@Component
public class NameCache {

    public final static String CONSTANT_NAME_CACHE = "constant_name_cache_";

    private static RedisTemplate<String, String> redisTemplate;

    public static void remove(String prefix,String key){
        if(ZYStrUtils.isNotNull(key)){
            remove(prefix,Collections.singletonList(key));
        }
    }

    public static void remove(String prefix,List<String> keys){
        if(ZYListUtils.isEmptyList(keys)){
            return;
        }
        String hashKey = toHashKey(prefix);

        Object[] keyObjs=new Object[]{keys.size()};
        for (int i=0;i<keyObjs.length;i++){
            keyObjs[i]=keys.get(i);
        }
        redisTemplate.opsForHash().delete(hashKey,keyObjs);
    }

    public static String getName(String key, String prefix, Function<String, String> support) {
        if (ZYStrUtils.isAnyNull(key, support)) {
            return "";
        }
        String hashKey = toHashKey(prefix);

        Object value = redisTemplate.opsForHash().get(hashKey, key);
        if (ZYStrUtils.isNotNull(value)) {
            return String.valueOf(value);
        }
        String name = support.apply(key);
        if (ZYStrUtils.isNotNull(name)) {
            redisTemplate.opsForHash().put(hashKey, key, name);
            return name;
        }
        return "";
    }

    public static void flush(String key, String name, String prefix, Function<String, String> support) {
        String hashKey = toHashKey(prefix);
        if (ZYStrUtils.isNotNull(name)) {
            redisTemplate.opsForHash().put(hashKey, key, name);
        } else {
            String findName = support.apply(key);
            if (ZYStrUtils.isNotNull(findName)) {
                redisTemplate.opsForHash().put(hashKey, key, findName);
            }
        }
    }

    @StringRedisTemplate
    public void setRedisTemplate(RedisTemplate<String, String> redisTemplate) {
        NameCache.redisTemplate = redisTemplate;
    }

    private static String toHashKey(String prefix) {
        return ZYRedisUtils.wrapperKey(CONSTANT_NAME_CACHE + prefix).toLowerCase();
    }

}

在缓存中的效果:
![在这里插入图片描述](https://img-blog.csdnimg.cn/direct/868531a473f241e4bf9d7d83bfb551c3.png

在这里插入图片描述
在这里插入图片描述

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

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

相关文章

GAN:WGAN前作

WGAN前作&#xff1a;有原则的方法来训练GANs 论文&#xff1a;https://arxiv.org/abs/1701.04862 发表&#xff1a;ICLR 2017 本文是wgan三部曲的第一部。文中并没有引入新的算法&#xff0c;而是标是朝着完全理解生成对抗网络的训练动态过程迈进理论性的一步。 文中基本是…

Django 模板引擎 (四)

一、Django模板引擎 一个强大的工具&#xff0c;用于在HTML页面中嵌入动态内容。它使用一种被称为Django模板语言&#xff08;Django Template Language&#xff09;的简单而强大的语法来处理模板。该模板语言使用”{% %}”进行标记&#xff0c;用于执行各种操作。 二、Django…

高效率:使用DBeaver连接spark-sql

提高运行效率一般采取底层使用spark引擎替换成hive引擎的方式提高效率&#xff0c;但替换引擎配置较为复杂考虑到兼容版本且容易出错&#xff0c;所以本篇将介绍使用DBeaver直接连接spark-sql快速操作hive数据库。 在spark目录下运行以下命令&#xff0c;创建一个SparkThirdSe…

TA、TB、TC油封各自用途

在机械系统应用中&#xff0c;油封在防止润滑剂从机器和轴承间隙泄漏方面发挥着至关重要的作用。在各种类型的油封中&#xff0c;常用的是TA、TB、TC密封件。本文将深入探讨这三种密封件各自的用途。 TA、TB和TC密封件都是油封的类型&#xff0c;但它们的设计和应用有所不同。…

java设计模式学习之【对象池模式】

文章目录 引言对象池模式简介定义与用途实现方式 使用场景优势与劣势对象池模式在Spring中的应用JDBC对象池示例代码地址小结 引言 对象池模式在资源管理和性能优化方面发挥着重要作用。这种模式通过重复使用已经初始化的对象&#xff0c;而不是频繁创建和销毁&#xff0c;减少…

计算机体系结构----流水线技术(三)

本文仅供学习&#xff0c;不作任何商业用途&#xff0c;严禁转载。绝大部分资料来自----计算机系统结构教程(第二版)张晨曦等 计算机体系结构----流水线技术&#xff08;三&#xff09; 3.1 流水线的基本概念3.1.1 什么是流水线3.1.2 流水线的分类1. 部件级流水线、处理机级流…

图解系列--HTTPS,认证

确保 Web 安全的HTTPS 1.HTTP 的缺点 1.1.通信使用明文可能会被窃听 加密处理防止被窃听 加密的对象可以有这么几个。 (1).通信的加密 HTTP 协议中没有加密机制&#xff0c;但可以通过和 SSL&#xff08;Secure Socket Layer&#xff0c;安全套接层&#xff09;或TLS&#xff…

搭建JMeter分布式压测环境轻松应对

引言 您想要提高您的应用程序的性能吗&#xff1f;想要确保它在高负载下仍然能够正常工作吗&#xff1f;那么&#xff0c;您一定需要一个可靠的性能测试工具来帮助您完成这个任务。 JMeter是一个广泛使用的性能测试工具&#xff0c;但是如果您的测试需求变得更加复杂和庞大&a…

数据结构与算法编程题35

用按层次顺序遍历二叉树的方法&#xff0c;统计树中具有度为1的结点数目。 #define _CRT_SECURE_NO_WARNINGS#include <iostream> using namespace std;typedef char ElemType; #define ERROR 0 #define OK 1 #define Maxsize 100 #define STR_SIZE 1024typedef struct B…

Google Chrome访问出现 NET::ERR_CERT_INVALID

Google Chrome访问出现 NET::ERR_CERT_INVALID然后访问不了当前网站&#xff0c;这个是由于证书失效了&#xff0c;临时解决方式是&#xff1a; 第一种方案&#xff1a; 在Chrome提示“您的连接不是私密连接”页面的空白区域点击一下&#xff0c;然后输入“thisisunsafe”(页…

[CustomMessages] section

[CustomMessages] section用来定义自定义的一些{cm:}常量. 一个定义和使用的例子。 [CustomMessages] CreateDesktopIconCreate a &desktop icon[Tasks] Name: desktopicon; Description: "{cm:CreateDesktopIcon}"CustomMessages是支持带参数的&#xff0c;从…

「Verilog学习笔记」状态机-重叠序列检测

专栏前言 本专栏的内容主要是记录本人学习Verilog过程中的一些知识点&#xff0c;刷题网站用的是牛客网 读入数据移位寄存&#xff0c;寄存后的数据与序列数做对比&#xff0c;相等则flag为1&#xff0c;不等则为0 timescale 1ns/1nsmodule sequence_test2(input wire clk ,in…

Ascend C 算子开发遇到的问题及解决方法

摘要&#xff1a;在学习Ascend C算子开发进阶课程的时候&#xff0c;进行Ascend C自定义算子工程、算子调用等实验&#xff0c;在开发环境中遇到了一些问题&#xff0c;在这里记录一下。 首先如果在启智社区CANN版本为6.3 &#xff0c;要进行Ascend C算子开发&#xff0c;需要…

TA-Lib学习研究笔记——Volume Indicators (四)

TA-Lib学习研究笔记——Volume Indicators &#xff08;四&#xff09; 1.AD Chaikin A/D Line 量价指标 函数名&#xff1a;AD 名称&#xff1a;Chaikin A/D Line 累积/派发线&#xff08;Accumulation/Distribution Line&#xff09; 简介&#xff1a;Marc Chaikin提出的一…

C++ 学习之匿名名字空间的使用细节

匿名命名空间&#xff08;anonymous namespace&#xff09;是C中的一种特殊命名空间&#xff0c;它没有显式的名称。匿名命名空间可以用来定义仅在当前文件中可见的全局变量、函数和类。 由于没有名字&#xff0c;所以相当于直接引入&#xff0c;但是没有引入定义 如果发生冲…

Influx集群解决方案(Influx Proxy篇)

InFluxDB 集群搭建 本次搭建使用influx proxy 介绍 github地址:https://github.com/chengshiwen/influx-proxy/ Influx Proxy 是一个基于高可用、一致性哈希的 InfluxDB 集群代理服务&#xff0c;实现了 InfluxDB 高可用集群的部署方案&#xff0c; 具有动态扩/缩容、故障恢复…

JRT和检验共用的打印层实现

之前对接的打印和导出是C#实现的&#xff0c;如果要完全Java化就需要用Java把打印元素绘制协议用Java实现&#xff0c;这次介绍实现主体搭建&#xff0c;最终使JRT达到完全信创和跨平台目标。到这篇后&#xff0c;所有的Java难题都解决完毕&#xff0c;几天到几周之内就可以把打…

Echarts大屏可视化_04 横向柱状图模块的引入和开发

模块的引入 1.寻找官方示例引入 ECharts官方实例入口 2.引入示例 ECharts 示例 可从这里直接进入 标题、提示信息、图例都不需要所以直接删掉 <div class"column"><div class"panel bar2"><h2>柱状图-技能掌握</h2><div cla…

项目动态 | 十一月重点上线项目集锦

武清联创商会 【应用场景】商协会资源对接服务平台&#xff1b; 【核心功能】 l 利用资源对接系统&#xff0c;用户可在平台内发布自己的人脉信息、个性化标签&#xff0c;通过对接获得收益&#xff0c;实现人脉增值&#xff1b; l 利用信息发布系统&#xff0c;用户可直观…

UEFI与ESKII源代码分析

这是一本未出版的电子书&#xff0c;是UEFI BIOS从业者的非常重要的参考书籍。需要的朋友可以联系我。