Redis

引入data-redis-starter

<dependency>
   <groupId>org.springframework.boot</groupId>
   <artifactId>spring-boot-starter-data-redis</artifactId>
   <exclusions>
       <!-- 排除lettuce依赖 -->
       <exclusion>
           <groupId>io.lettuce</groupId>
           <artifactId>lettuce-core</artifactId>
       </exclusion></exclusions>
</dependency>
<dependency>
   <!-- 使用jedis客户端 -->
   <groupId>redis.clients</groupId>
   <artifactId>jedis</artifactId>
</dependency>

lettuce客户端会产生堆外内存溢出:OutOfDirectMemoryError(堆外内存溢出)

  1. SpringBoot 2.0以后 默认使用lettuce作为操作redis的客户端,它使用netty进行网络通信。lettuce的bug导致netty堆外内存溢出 -Xmx100m netty。如果没有指定堆外内存,默认使用-Xmx100m

    可以通过-Dio.netty.maxDirectMemory进行设置(调大堆外内存)

    解决方案:不能只是调大堆外内存

    • 升级lettuce客户端

    • 切换使用jedis

  2. lettuce和jedis是操作redis的底层客户端,spring进行了再次封装redisTemplate;

  3. 所以不管底层用的是lettuce还是jedis我们直接使用redisTemplate即可操作redis;

简单配置redis的host、port等信息

spring:
redis:
  host: 192.168.101.100
  port: 6379
  1. 使用SpringBoot自动配置好的StringRedisTemplate来操作redis

Redisson

<!--    以后使用redisson作为所有分布式锁,分布式对象等功能框架    -->
<dependency>
   <groupId>org.redisson</groupId>
   <artifactId>redisson</artifactId>
   <version>3.12.0</version>
</dependency>
/**
* 配置Redisson操作客户端
*/
@Configuration
public class MyRedissonConfig {

   /**
    * 所有对Redisson的使用都是通过 RedissonClient对象
    **/
   @Bean(destroyMethod="shutdown")
   public RedissonClient redisson() throws IOException {
       // 1.创建配置
       //Redis url should start with redis:// or rediss:// (for SSL connection)
       Config config = new Config();
       // 使用单节点模式,指定redis服务器地址
       config.useSingleServer().setAddress("redis://192.168.101.100:6379");
       // 2.根据Config创建出RedissonClient实例
       return Redisson.create(config);
  }
}

SpringCache

  1. 引入依赖 spring-boot-starter-cache、spring-boot-starter-data-redis

    <!-- 再加上上文的Redis依赖 -->
    <dependency>
       <groupId>org.springframework.boot</groupId>
       <artifactId>spring-boot-starter-cache</artifactId>
    </dependency>
  2. 配置类

    @EnableConfigurationProperties(CacheProperties.class) // 开启属性配置的绑定功能
    @Configuration
    @EnableCaching // 开启缓存功能
    public class MyCacheConfig {

       @Bean
       RedisCacheConfiguration redisCacheConfiguration(CacheProperties cacheProperties){
           RedisCacheConfiguration config = RedisCacheConfiguration.defaultCacheConfig();
           // key的序列化
           config = config.serializeKeysWith(RedisSerializationContext.SerializationPair.fromSerializer(new StringRedisSerializer()));
           // value的序列化
           config = config.serializeValuesWith(RedisSerializationContext.SerializationPair.fromSerializer(new GenericJackson2JsonRedisSerializer()));
           CacheProperties.Redis redisProperties = cacheProperties.getRedis();
           // 将配置文件中的所有配置都生效
           if (redisProperties.getTimeToLive() != null) {
               config = config.entryTtl(redisProperties.getTimeToLive());
          }
           if (redisProperties.getKeyPrefix() != null) {
               config = config.prefixKeysWith(redisProperties.getKeyPrefix());
          }
           if (!redisProperties.isCacheNullValues()) {
               config = config.disableCachingNullValues();
          }
           if (!redisProperties.isUseKeyPrefix()) {
               config = config.disableKeyPrefix();
          }
           return config;
      }
    }
  3. 配置文件

    # 配置使用redis作为缓存
    spring.cache.type=redis
    # 过期时间:毫秒
    spring.cache.redis.time-to-live=3600000
    # 缓存前缀,如果指定了前缀就用我们指定的前缀,若没有就默认使用缓存的名字作为前缀 缓存的名字:@Cacheable(value = {"category"})
    #spring.cache.redis.key-prefix=CACHE_
    # 是否使用缓存前缀
    spring.cache.redis.use-key-prefix=true
    # 是否缓存空值,防止缓存穿透
    spring.cache.redis.cache-null-values=true
  4. 使用缓存

    • @Cacheable: Triggers cache population. 触发将数据保存到缓存的操作

      @Cacheable可以标记在一个方法上,也可以标记在一个类上。当标记在一个方法上时表示该方法是支持缓存的,当标记在一个类上时则表示该类所有的方法都是支持缓存的。对于一个支持缓存的方法,Spring会在其被调用后将其返回值缓存起来,以保证下次利用同样的参数来执行该方法时可以直接从缓存中获取结果,而不需要再次执行该方法。@Cacheable可以指定三个属性,value、key和condition。

    • @CacheEvict: Triggers cache eviction. 触发将数据从缓存删除

      @CacheEvict是用来标注在需要清除缓存元素的方法或类上的。当标记在一个类上时表示其中所有的方法的执行都会触发缓存的清除操作。@CacheEvict可以指定的属性有value、key、condition、allEntries和beforeInvocation。其中value、key和condition的语义与@Cacheable对应的属性类似。即value表示清除操作是发生在哪些Cache上的(对应Cache的名称);key表示需要清除的是哪个key,如未指定则会使用默认策略生成的key;condition表示清除操作发生的条件。

    • @CachePut: Updates the cache without interfering with the method execution.以不影响方法执行的方式更新缓存

      在支持Spring Cache的环境下,对于使用@Cacheable标注的方法,Spring在每次执行前都会检查Cache中是否存在相同key的缓存元素,如果存在就不再执行该方法,而是直接从缓存中获取结果进行返回,否则才会执行并将返回结果存入指定的缓存中。@CachePut也可以声明一个方法支持缓存功能。与@Cacheable不同的是使用@CachePut标注的方法在执行前不会去检查缓存中是否存在之前执行过的结果,而是每次都会执行该方法,并将执行结果以键值对的形式存入指定的缓存中。

    • @Caching: Regroups multiple cache operations to be applied on a method. 组合多个缓存操作

      @Caching注解可以让我们在一个方法或者类上同时指定多个Spring Cache相关的注解。其拥有三个属性:cacheable、put和evict,分别用于指定@Cacheable、@CachePut和@CacheEvict。

    • @CacheConfig: Shares some common cache-related settings at class-level. 在类级别共享缓存的相同配置

      @CacheConfig用在类上,将公共缓存内容写在该注解中,方法中这些属性即可不用再写了

    • 开启缓存功能 @EnableCaching

    • 只需要使用注解就能完成缓存操作

  5. 代码

    @Cacheable(value = {"category"},key = "#root.method.name",sync = true) //sync = true 很重要(加锁,解决击穿)
    @Override
    public List<CategoryEntity> getLevel1Categorys() {
       System.out.println("getLevel1Categorys....");
       List<CategoryEntity> categoryEntities = baseMapper.selectList(new QueryWrapper<CategoryEntity>().eq("parent_cid", 0));
       return categoryEntities;
    }

    @Cacheable(value = "category",key = "#root.methodName")
    @Override
    public Map<String, List<Catelog2Vo>> getCatalogJson() {
       dosomething();
    }

    @CacheEvict(value = "category",allEntries = true) // 指定删除某个分区下的所有数据
    @Transactional
    @Override
    public void updateCascade(CategoryEntity category) {
       this.updateById(category); //先更新自己
       categoryBrandRelationService.updateCategory(category.getCatId(), category.getName());
       // 同时修改缓存中的数据【双写模式】
       // 删除缓存中的数据,等待下一次主动查询进行更新【失效模式】
    }

    @Caching(cacheable = @Cacheable("users"), evict = { @CacheEvict("cache2"),
    @CacheEvict(value = "cache3", allEntries = true) })
    public User find(Integer id) {
    return null;
    }
    @CacheConfig(value="emp")
    public class EmployeeService{
    @Cacheable(key="#user.id")
    public User find(User user) {
      return null;
      }
      @Cacheable(key = "#root.args[0]")
      public User getUserById(Integer id){
      User user=userMapper.getUserById(id);
    return user;
      }
    }

    @Cacheable({"category"})

    代表当前方法的结果需要缓存。如果缓存中有,方法不用调用,如果缓存中没有,会调用方法,最后将方法中的结果放入缓存。 每一个需要缓存的数据我们都来指定要放到哪个名字的缓存,这里是放在“category”分区【缓存的分区(按照业务类型分)】

默认行为 1)如果缓存中有,方法不调用 2)key默认自动生成:缓存的名字 category::SimpleKey [] (自动生成的key) 3)缓存的value的值,默认使用jdk序列化机制,将序列化后的数据存到redis 4)默认ttl时间:-1 永不过期

自定义

1)value是我们设置的缓存中的分区名字。 2)指定生成的缓存使用的key : key属性指定,接收一个spEL spEL详细语法参照文档 3)指定缓存的数据的存活时间 配置文件中修改ttl 4)将数据存为json数据

mybatisplus

  1. 依赖

    <dependency>
    <groupId>com.baomidou</groupId>
    <artifactId>mybatis-plus-boot-starter</artifactId>
    <version>3.2.0</version>
    </dependency>
  2. 配置

    spring:
    datasource:
    username: root
    password: root
    url: jdbc:mysql://192.168.101.100:3306/gulimall_pms?useUnicode=true&characterEncoding=UTF8
    mybatis-plus:
    mapper-locations: classpath:/mapper/**/*.xml
    #设置实体类的自增主键
    global-config:
    db-config:
    id-type: auto
    #逻辑删除
    logic-delete-value: 1
    logic-not-delete-value: 2
  3. @MapperScan注解

    实体类字段上加上逻辑删除注解@TableLogic

  4.  

SpringBoot中的一些组件的更多相关文章

  1. springboot中的mybatis是如果使用pagehelper的

    springboot中使用其他组件都是基于自动配置的AutoConfiguration配置累的,pagehelper插件也是一样的,通过PageHelperAutoConfiguration的,这个类 ...

  2. SpringBoot中异步请求和异步调用(看这一篇就够了)

    原创不易,如需转载,请注明出处https://www.cnblogs.com/baixianlong/p/10661591.html,否则将追究法律责任!!! 一.SpringBoot中异步请求的使用 ...

  3. springboot 中使用Druid 数据源提供数据库监控

    一.springboot 中注册 Servlet/Filter/Listener 的方式有两种,1 通过代码注册 ServletRegistrationBean. FilterRegistration ...

  4. SpringBoot中实现依赖注入功能

    本文转载自:https://blog.csdn.net/linzhiqiang0316/article/details/52639888 今天给大家介绍一下SpringBoot中是如何实现依赖注入的功 ...

  5. SpringBoot中使用LoadTimeWeaving技术实现AOP功能

    目录 1. 关于LoadTimeWeaving 1.1 LTW与不同的切面织入时机 1.2 JDK实现LTW的原理 1.3 如何在Spring中实现LTW 2. Springboot中使用LTW实现A ...

  6. SpringBoot中通过SpringBootServletInitializer如何实现容器初始化

    相关文章 <Servlet3.0之四:动态注册和Servlet容器初始化> <SpringBoot中通过SpringBootServletInitializer如何实现组件加载> ...

  7. SpringBoot(七) SpringBoot中的缓存机制

    随着时间的积累,应用的使用用户不断增加,数据规模也越来越大,往往数据库查询操作会成为影响用户使用体验的瓶颈,此时使用缓存往往是解决这一问题非常好的手段之一.Spring 3开始提供了强大的基于注解的缓 ...

  8. SpringBoot学习笔记(10)-----SpringBoot中使用Redis/Mongodb和缓存Ehcache缓存和redis缓存

    1. 使用Redis 在使用redis之前,首先要保证安装或有redis的服务器,接下就是引入redis依赖. pom.xml文件如下 <dependency> <groupId&g ...

  9. Spring生态研习【五】:Springboot中bean的条件注入

    在springboot中,开发的确变的简单了很多,但是,开发者现在希望开发傻瓜式的方便搞定项目中的各种奇怪的需求最好了,不用烧脑,本来程序猿的生活就是枯燥的,不要再给自己添加更多的烦恼. 今天,就为了 ...

  10. SpringBoot中的@ConfigurationProperties

    有什么用 该注解的作用类似于@Value,即为组件中的属性进行赋值. 怎么用 首先是建立一个springboot的工程,不再赘述. 首先我们建立一个Person类和一个Dog类. package co ...

随机推荐

  1. 如何在 Ubuntu 服务器上安装桌面环境 (GUI)

    先以VNC方式远程登录服务器 执行命令 sudo apt update && sudo apt upgrade # 选择1---使用tasksel安装 sudo apt install ...

  2. 当你用neovim的mason插件管理lsp config,并且配置好bash的bashls后,却没有正常工作的解决方式

    刚开始遇到这个情况我百思不得其解,检查了neovim checkhealth,以为是npm包管理的问题,然后删了下删了下 不但没有解决还把包管理整乱了-- 后来发现是我没仔细看bash-languag ...

  3. Seata原理浅析

    前言 Seata是阿里开源的分布式事务解决方案,本文将详细介绍 Seata 的事务模式.原理以及使用.了解之前需清楚什么是分布式事务. 一.什么是 Seata Seata 是一款开源的分布式事务解决方 ...

  4. 如果win报错无法加载文件 C:\Users\xx\AppData\Roaming\npm\pnpm.ps1,因为在此系统上禁止运行脚本

    点击查看代码 Set-ExecutionPolicy -Scope Process -ExecutionPolicy Bypass

  5. 密码学—重合指数法Python程序

    重合指数(Ic) 计算重合指数就是用来验证在Kasiski测试法中猜测出来的各种密钥长度哪一个才是最接近真实密钥长度的. 计算重合指数步骤 按照Kasiski测试法猜测的密钥长度分组 ↓ 分好组之后将 ...

  6. 移动通信网络中的 GTP 协议

    目录 文章目录 目录 GTP GTP-C 协议(GTP 控制面) GTP-U 协议(GTP 用户面) GTP' 协议(计费传输) GTPv2 Header GTP GTP(GPRS Tunnellin ...

  7. NOIP模拟70

    T1 暴雨 解题思路 \(f_{i,j,k,0/1}\) 表示前 i 个铲平 j 个当前最高的是 k 并且当前是 奇数/偶数 的方案数. 由于只可以铲平 k 块,因此对于同一种 \(i,j\) 而言高 ...

  8. 基于WebSocket的modbus通信(三)- websocket和串口

    WebSocket传递ModbusTCP数据包 错误纠正 上一篇还有个错误,就是客户端写数据时服务端不需要响应,但我的服务端响应了的.我选择改客户端,把写数据时接收到的响应丢弃. PrintBytes ...

  9. itest work(爱测试) 开源一站式接口测试&敏捷测试工作站 9.0.5. Rc4

    (一)itest work 简介 itest work (爱测试)  一站式工作站让测试变得简单.敏捷,"好用.好看,好敏捷" ,是itest wrok 追求的目标.itest w ...

  10. js字符串类型

    <!DOCTYPE html> <html lang="en"> <head>     <meta charset="UTF-8 ...