尚医通-数据字典添加缓存-配置nginx(十五)

news2024/11/24 10:39:25

目录:

(1)后台系统 数据字典-添加缓存

(2)后台系统配置nginx


(1)后台系统 数据字典-添加缓存

  • Spring Cache + Redis 缓存数据

Spring Cache 是一个非常优秀的缓存组件。自Spring 3.1起,提供了类似于@Transactional注解事务的注解Cache支持,且提供了Cache抽象,方便切换各种底层Cache(如:redis)

使用Spring Cache的好处:

    1,提供基本的Cache抽象,方便切换各种底层Cache;

    2,通过注解Cache可以实现类似于事务一样,缓存逻辑透明的应用到我们的业务代码上,且只需要更少的代码就可以完成;

    3,提供事务回滚时也自动回滚缓存;

    4,支持比较复杂的缓存逻辑;

因为缓存也是公共使用,所有的service模块都有可能使用缓存,所以我们把依赖与部分配置加在service-util模块,这样其他service模块都可以使用了

在service_util下:的pom文件下加入redis依赖:

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
    <parent>
        <artifactId>common</artifactId>
        <groupId>com.atguigu</groupId>
        <version>0.0.1-SNAPSHOT</version>
    </parent>
    <modelVersion>4.0.0</modelVersion>

    <artifactId>service_util</artifactId>

    <dependencies>
        <dependency>
            <groupId>com.atguigu</groupId>
            <artifactId>common_util</artifactId>
            <version>0.0.1-SNAPSHOT</version>
        </dependency>


        <!-- redis -->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-data-redis</artifactId>
        </dependency>

        <!-- spring2.X集成redis所需common-pool2-->
        <dependency>
            <groupId>org.apache.commons</groupId>
            <artifactId>commons-pool2</artifactId>
            <version>2.6.0</version>
        </dependency>

    </dependencies>

</project>

 创建配置类:RedisConfig:

package com.atguigu.yygh.common.config;

import com.fasterxml.jackson.annotation.JsonAutoDetect;
import com.fasterxml.jackson.annotation.PropertyAccessor;
import com.fasterxml.jackson.databind.ObjectMapper;
import org.springframework.cache.CacheManager;
import org.springframework.cache.annotation.EnableCaching;
import org.springframework.cache.interceptor.KeyGenerator;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.data.redis.cache.RedisCacheConfiguration;
import org.springframework.data.redis.cache.RedisCacheManager;
import org.springframework.data.redis.connection.RedisConnectionFactory;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.data.redis.serializer.Jackson2JsonRedisSerializer;
import org.springframework.data.redis.serializer.RedisSerializationContext;
import org.springframework.data.redis.serializer.RedisSerializer;
import org.springframework.data.redis.serializer.StringRedisSerializer;

import java.lang.reflect.Method;
import java.time.Duration;

@Configuration
@EnableCaching  //表示开启缓存注解
public class RedisConfig {
    /**
     * 自定义key规则
     * @return
     */
    @Bean
    public KeyGenerator keyGenerator() {
        return new KeyGenerator() {
            @Override
            public Object generate(Object target, Method method, Object... params) {
                StringBuilder sb = new StringBuilder();
                sb.append(target.getClass().getName());
                sb.append(method.getName());
                for (Object obj : params) {
                    sb.append(obj.toString());
                }
                return sb.toString();
            }
        };
    }

    /**
     * 设置RedisTemplate规则
     * @param redisConnectionFactory
     * @return
     */
    @Bean
    public RedisTemplate<Object, Object> redisTemplate(RedisConnectionFactory redisConnectionFactory) {
        RedisTemplate<Object, Object> redisTemplate = new RedisTemplate<>();
        redisTemplate.setConnectionFactory(redisConnectionFactory);
        Jackson2JsonRedisSerializer jackson2JsonRedisSerializer = new Jackson2JsonRedisSerializer(Object.class);

        //解决查询缓存转换异常的问题
        ObjectMapper om = new ObjectMapper();
         // 指定要序列化的域,field,get和set,以及修饰符范围,ANY是都有包括private和public
        om.setVisibility(PropertyAccessor.ALL, JsonAutoDetect.Visibility.ANY);
       // 指定序列化输入的类型,类必须是非final修饰的,final修饰的类,比如String,Integer等会跑出异常
        om.enableDefaultTyping(ObjectMapper.DefaultTyping.NON_FINAL);
        jackson2JsonRedisSerializer.setObjectMapper(om);

        //序列号key value
        redisTemplate.setKeySerializer(new StringRedisSerializer());
        redisTemplate.setValueSerializer(jackson2JsonRedisSerializer);
        redisTemplate.setHashKeySerializer(new StringRedisSerializer());
        redisTemplate.setHashValueSerializer(jackson2JsonRedisSerializer);

        redisTemplate.afterPropertiesSet();
        return redisTemplate;
    }

    /**
     * 设置CacheManager缓存规则
     * @param factory
     * @return
     */
    @Bean
    public CacheManager cacheManager(RedisConnectionFactory factory) {
        RedisSerializer<String> redisSerializer = new StringRedisSerializer();
        Jackson2JsonRedisSerializer jackson2JsonRedisSerializer = new Jackson2JsonRedisSerializer(Object.class);

        //解决查询缓存转换异常的问题
        ObjectMapper om = new ObjectMapper();
        om.setVisibility(PropertyAccessor.ALL, JsonAutoDetect.Visibility.ANY);
        om.enableDefaultTyping(ObjectMapper.DefaultTyping.NON_FINAL);
        jackson2JsonRedisSerializer.setObjectMapper(om);

        // 配置序列化(解决乱码的问题),过期时间600秒
        RedisCacheConfiguration config = RedisCacheConfiguration.defaultCacheConfig()
                .entryTtl(Duration.ofSeconds(600))
                .serializeKeysWith(RedisSerializationContext.SerializationPair.fromSerializer(redisSerializer))
                .serializeValuesWith(RedisSerializationContext.SerializationPair.fromSerializer(jackson2JsonRedisSerializer))
                .disableCachingNullValues();

        RedisCacheManager cacheManager = RedisCacheManager.builder(factory)
                .cacheDefaults(config)
                .build();
        return cacheManager;
    }

}

运行虚拟机: 

进入redis安转目录进行启动: 

redis-server redis.conf & 

 

 启动客户端:redis-cli

 

查看redis中的数据 :keys *

在配置文件中加入Redis的连接配置:

2.1 常用缓存标签

2.1.2 缓存@Cacheable

根据方法对其返回结果进行缓存,下次请求时,如果缓存存在,则直接读取缓存数据返回;如果缓存不存在,则执行方法,并把返回的结果存入缓存中。一般用在查询方法上。

2.1.2 缓存@CachePut

使用该注解标志的方法,每次都会执行,并将结果存入指定的缓存中。其他方法可以直接从响应的缓存中读取缓存数据,而不需要再去查询数据库。一般用在新增方法上。

2.1.3 缓存@CacheEvict

使用该注解标志的方法,会清空指定的缓存。一般用在更新或者删除方法上

在DictServiceImpl的方法上加缓存注解 

查询方法上加缓存注解:

 //根据数据id查询子数据列表
    @Cacheable(value = "dict",keyGenerator = "keyGenerator")  //缓存注解
    @Override
    public List<Dict> findChlidData(Long id) {
        QueryWrapper<Dict> wrapper=new QueryWrapper<>();
        wrapper.eq("parent_id",id);
        List<Dict> dictList = baseMapper.selectList(wrapper);
        //向dictList集合中的每个Dict对象设置hasChildren属性
        for (Dict dict:dictList){
            Long dictId = dict.getId();
            boolean ischild = this.isChildren(dictId);//调用下面方法获取是否有子节点
            dict.setHasChildren(ischild);//设置属性
        }
        return dictList;
    }

 新增方法上加缓存注解“”

//导入数据字典
    @CacheEvict(value = "dict", allEntries=true)   //缓存注解
    @Override
    public void importDictData(MultipartFile file) {
        try {
            EasyExcel.read(file.getInputStream(),DictEeVo.class,new DictListener(baseMapper)).sheet().doRead();

        } catch (IOException e) {
            e.printStackTrace();
        }
    }

连接可能报错,需要修改redis的配置文件:

前端访问:

 在次查看Redis里面的keys:

发现多了dict....的key 

(2)后台系统配置nginx

service_cmn模块使用的端口号 8202 而service_hosp模块使用的端口号是8201,前面我们只是把

dev.env.js中先改为了8202:

但是8201的端口就不能访问了,如何解决呢?

使用nginx解决多端口访问操作 

由于我们后端有很多服务模块,每个模块都有对应的访问路径与端口,为了提供统一的api接口,所以使用nginx作为反向代理服务器;

反向代理,其实客户端对代理是无感知的,因为客户端不需要任何配置就可以访问,我们只需要将请求发送到反向代理服务器,由反向代理服务器去选择目标服务器获取数据后,在返回给客户端,此时反向代理服务器和目标服务器对外就是一个服务器,暴露的是代理服务器地址,隐藏了真实服务器IP地址

 先使用Windows的nginx,后面会是使用别的技术

 

修改配置文件:

nginx.conf:添加访问规则:

server {
        listen       9001;
        server_name  localhost;

	location ~ /hosp/ {           
	    proxy_pass http://localhost:8201;
	}
	location ~ /cmn/ {           
	    proxy_pass http://localhost:8202;
	}
}

 加到nginx.conf中去:

放到http的后面:

 

 输入cmd打开

 输入:nginx.exe进行启动:

如果运行报错是80端口号占用,可以再次修改nginx的配置文件把端口号改为81 ,再启动成功

nginx.conf: 

 

 前端需要修改为9001:

 重新运行项目:

启动后端的两个模块

 把service_hosp模块和service_cmn模块都启动:

 医院设置模块就可以访问了:

访问的是9001,然后再去访问8201端口: 

 数据字典模块:

它访问的是9001,根据访问路径转发到8202端口中去 

 

说明:

  1. 后续我们会使用Spring Cloud Gateway网关,将替代nginx网关

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

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

相关文章

CSDN第19次竞赛题解与总结

2022/12/28 19:00 CSDN第19次竞赛火热进行。 本场竞赛由「电子工业出版社 & CSDN」联合主办。 《Python机器学习算法与实战》 本书基于Python语言&#xff0c;结合实际的数据集&#xff0c;介绍如何使用机器学习与深度学习算法&#xff0c;对数据进行实战分析&#xff0c;在…

MySQL 启动日志报错:Starting MySQL. ERROR! The server quit without updating PID file

一 问题描述 1.1 问题描述 1.首先通过切换到mysql数据库所属用户&#xff1a; hd-mysql [rootlocalhost local]# su hd-mysql 2.启动mysql&#xff0c;报错 [hd-mysqllocalhost data]$ service mysql start Starting MySQL. ERROR! The server quit without updating PID…

50+Vue经典面试题源码级详解,你值得收藏!(一天更新一题,持续更新!!!)

Vue经典面试题源码级详解1、Vue组件之间通信方式有哪些&#xff1f;分析&#xff1a;思路分析&#xff1a;回答范例&#xff1a;1. 组件通信常用方式有以下8种&#xff1a;2、根据组件之间关系讨论组件通信最为清晰有效2、v-if 和 v-for哪个优先级更高分析&#xff1a;思路分析…

学习C语言笔记:数据和C

C Primer Plus &#xff08;第6版&#xff09;中文版第3章 学习内容&#xff1a; 1.关键字——int、short、long、unsigned、char、float、double、_Bool、_Complex、_Imaginary; 2.运算符——sizeof(); 3.函数——scanf(); 4.整数类型和浮点数类型的区别; 5.如何书写整型和浮点…

STL简介

目录 什么是STL STL的版本 STL的六大组件 如何学习STL STL的缺陷 结束语 什么是STL STL(standard template libaray-标准模板库)&#xff1a;是C标准库的重要组成部分&#xff0c;不仅是一个可复用的组件库&#xff0c;而且是一个包罗数据结构与算法的软件框架 STL的版本…

公司来了个卷王,我愿称之为王中王,让人崩溃

前几天我们公司一下子也来了几个新人&#xff0c;这些年前人是真能熬啊&#xff0c;本来我们几个老油子都是每天稍微加会班就打算走了&#xff0c;这几个新人一直不走&#xff0c;搞得我们也不好走。 2023年春招就要开始了&#xff0c;最近内卷严重&#xff0c;各种跳槽裁员&a…

从TikTok功能优化,抓住直播带货机遇

从今年流出的各类消息总结&#xff0c;TikTok的发展势头愈发迅猛&#xff0c;无论是布局东南亚各个站点&#xff0c;还是在其下载量的激增&#xff0c;都迸发出了前所未有的劲头&#xff0c;其对本身的优化也一直在进行。那么今年&#xff0c;TikTok都进行了哪些功能优化呢&…

p5.js 使用npm安装p5.js后如何使用?

本文简介 点赞 关注 收藏 学会了 在 《p5.js 光速入门》 中都是使用 CDN 的方式去使用 p5.js 的&#xff0c;不太符合当下的开发习惯。 不管是使用 Vue 还是 React&#xff0c;我们日常项目大部分应该都是使用脚手架的方式进行开发了&#xff0c;按照 《p5.js 光速入门》 …

互联网营销的基础方法

推广目的 1.让目标消费群在最短的时间内认知新产品的功能、效果,缩短新产品推广期的时间长度,尽快进入成长期,创造效益。 2.使目标消费群产生试用的欲 望,并逐步将其培育成品牌忠诚者。 3.提高品牌知名度和美誉度。 4.提高现场售点的产品的销量。 5.巩固通路经销商的客…

ARM64内存虚拟化分析(1)基础知识

1 两级转换 1.1 什么是stage2转换 Stage2转换允许hypervisor控制虚拟机VM中内存视图。它允许hypervisor控制一个虚拟机可以访问哪块内存映射的系统资源&#xff0c;以及这些资源应该出现在虚拟机地址空间的哪个位置。 这种控制内存访问的能力对于隔离是非常重要的。Stage2转换…

【C语言 全局 整形变量 布尔变量 数组变量 指针变量 结构体位域变量 枚举变量被其他.C文件相互访问】

【C语言 全局-> 整形变量 布尔变量 数组变量 指针变量 结构体位域变量 枚举变量被其他.C文件相互访问】【0】UI设计【1】项目概述【2】mainwindow.h头文件解析【3】头文件源码【4】mianwindow.c源文件解析【5】源文件源码【6】main文件解析源码【7】编译-链接-运行结果学完这…

对Java中String类的解释

文章目录一、String 的常用方法1.字符串的构造以及字符串常量池2.String 类中对象的比较3.字符串查找4.转化5.字符串替换6.字符串拆分7.字符串截取二、StringBuilder 和 StringBuffer1.引入两者的原因2.相关修改操作的介绍一、String 的常用方法 首先&#xff0c;在介绍 Strin…

[年终总结] 2023,希望一切都能够好起来

0. 引言 2022年&#xff0c;依旧是一个特殊的年份&#xff0c;从前年开始&#xff0c;我就开始撰写年终总结&#xff0c;感兴趣的大家可以看一看2020年终总结和2021年年终总结。 一年比一年过的快速&#xff0c;我也感觉到一年比一年过的更加珍惜。曾经以为自己尚且年轻&…

linux /dev/mapper/rhel-root分区扩容

命令查看linux内存占用情况 /dev/mapper/rhel-root分区已满&#xff0c;主要是东西太多&#xff0c;改善了也删了&#xff0c;但是还是不够用。在扩容之前在首先针对虚拟机硬盘进行扩展 接下来就是在linux上操作了 1、输入fdisk -l 这里显示我已经有了三个分区&#xff0c;sd…

ArcGIS基础实验操作100例--实验9线要素的延伸与裁剪

本实验专栏来自于汤国安教授《地理信息系统基础实验操作100例》一书 实验平台&#xff1a;ArcGIS 10.6 实验数据&#xff1a;请访问实验1&#xff08;传送门&#xff09; 基础编辑篇--实验9 线要素的延伸与裁剪 目录 一、实验背景 二、实验数据 三、实验步骤 &#xff08;…

qinglong-青龙面板部署

背景 之前服务器部署过 jd自动签到、刷豆的脚本&#xff0c;感觉还可以&#xff0c;薅羊毛每天1-2米左右&#xff0c;能把服务器成本薅回来&#xff0c;不过缺点不好管理&#xff0c;后面很久没人维护就凉了。最近了解到青龙面板能够很方便的维护这种脚本。所以部署了一下。 …

SQL学习笔记-聚合函数部分

鉴于自己最近在做后端开发的工作时&#xff0c;发现自己的SQL能力实在太差&#xff0c;开始学习SQL语句基础&#xff0c;学习过程中在本博客进行笔记记录&#xff0c;课程参考&#xff1a;SQL课程 聚合函数是一系列SQL内置的方法&#xff0c;能够完成一些非常使用的功能&#…

java输入语句怎么写

壹哥在前面给大家讲过&#xff0c;Java中给咱们提供了有三个标准的“流”&#xff0c;他们被统称为standard streams。除了负责输出的流之外&#xff0c;还有一个负责输入的标准流&#xff0c;Java中对应的API是System.in。 与标准输出相比&#xff0c;标准输入则复杂的多。尤…

OpenHarmony#深入浅出学习eTs/ArkUI#(一)模拟器/真机环境搭建

本项目的Gitee仓地址&#xff1a;深入浅出eTs学习: 带大家深入浅出学习eTs (gitee.com) &#xff08;之前有些意外&#xff0c;数据丢失了&#xff0c;现在重新发&#xff0c;且不参与任何活动&#xff0c;在第一篇说明一下&#xff0c;之后就不再说明了&#xff09; 一、下载…

2022 年 11 种最佳移动自动化测试工具

移动应用程序开发正在以前所未有的速度增长&#xff0c;并且相应地需要使用正确的移动测试策略执行彻底的测试。这些策略主要涉及使用各种移动自动化测试工具。 移动测试工具可帮助企业自动化其应用程序测试&#xff0c;并减少额外的成本、时间和人为错误的机会。我们生活在一个…