zoukankan      html  css  js  c++  java
  • Mybatis一级缓存和二级缓存区别

    1、MyBatis系统中默认定义了两级缓存:一级缓存二级缓存

      • 默认情况下,只有一级缓存开启。(SqlSession级别的缓存,也称为本地缓存,基于一次会话,会话关闭一级缓存中的数据被保存到二级缓存中)

      • 二级缓存需要手动开启和配置,他是基于namespace级别的缓存。

      • 为了提高扩展性,MyBatis定义了缓存接口Cache。我们可以通过实现Cache接口来自定义二级缓存(第三方缓存比如ehcache)

    2、一级缓存也叫本地缓存:

    • 与数据库同一次会话期间查询到的数据会放在本地缓存中。

    • 以后如果需要获取相同的数据,直接从缓存中拿,没必须再去查询数据库;

    • 增删改操作可能会对当前数据产生影响

    3、二级缓存

    • 结论:
      • 只要开启了二级缓存,我们在同一个Mapper中的查询,可以在二级缓存中拿到数据
      • 查出的数据都会被默认先放在一级缓存中
      • 只有会话提交或者关闭以后,一级缓存中的数据才会转到二级缓存中

    4、缓存原理图

     5、重点:redis可以实现分布式缓存(在我的谷粒学院中有用到)

    项目中的需求:宣传栏中的热门课程或者是热门老师(由于首页数据变化不是很频繁,而且首页访问量相对较大,所以我们有必要把首页数据缓存到redis中,减少数据库压力和提高访问速度。

    引入依赖:

     <!-- spring boot redis缓存引入 -->
            <dependency>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-starter-data-redis</artifactId>
            </dependency>
            <!-- lecttuce 缓存连接池-->
            <dependency>
                <groupId>org.apache.commons</groupId>
                <artifactId>commons-pool2</artifactId>
            </dependency>

    配置config文件

    /**
     * 我们自定义一个 RedisTemplate,设置序列化器,这样我们可以很方便的操作实例对象。
     * 否则redis自动使用对象的jdk序列化
     */
    /**
     * @author lj on 2021/2/10.
     * @version 1.0
     */
    @EnableCaching
    @Configuration
    public class RedisConfig {
        @Bean
        public RedisTemplate<String, Serializable> redisTemplate(LettuceConnectionFactory lettuceConnection) {
            RedisTemplate<String, Serializable> redisTemplate = new RedisTemplate<>();
            redisTemplate.setKeySerializer(new StringRedisSerializer());//key序列化方式
            redisTemplate.setValueSerializer(new GenericJackson2JsonRedisSerializer());//value序列化
            redisTemplate.setConnectionFactory(lettuceConnection);
            return redisTemplate;
        }
        @Bean
        public CacheManager cacheManager(LettuceConnectionFactory connectionFactory) {
    
            RedisCacheConfiguration config = RedisCacheConfiguration.defaultCacheConfig()
                    //过期时间600秒
                    .entryTtl(Duration.ofSeconds(600))
                    // 配置序列化
                    .serializeKeysWith(RedisSerializationContext.SerializationPair.fromSerializer(new StringRedisSerializer()))
                    .serializeValuesWith(RedisSerializationContext.SerializationPair.fromSerializer(new GenericJackson2JsonRedisSerializer()))
                    .disableCachingNullValues();
            RedisCacheManager cacheManager = RedisCacheManager.builder(connectionFactory)
                    .cacheDefaults(config)
                    .build();
            return cacheManager;
        }
    }

    实现类代码:

     @Cacheable(value = "xxx", key = "'xxx'"):标注在方法上,对方法返回结果进行缓存。下次请求时,
    //    如果缓存存在,则直接读取缓存数据返回;如果缓存不存在,则执行方法,并把返回的结果存入缓存中。一般用在查询方法上。
        @Cacheable(value = "index",key = "'selectByAdTypeId'")
        @Override
        public List<Ad> selectByAdTypeId(String adTypeId) {
            QueryWrapper<Ad> queryWrapper = new QueryWrapper<>();
            queryWrapper.orderByAsc("sort", "id");
            queryWrapper.eq("type_id", adTypeId);
            return baseMapper.selectList(queryWrapper);
        }

    要注意缓存穿透,详细见redis学习笔记。。。

  • 相关阅读:
    PHP代码审计学习(7)——XSS漏洞
    PHP代码审计学习(6)——命令执行
    PHP代码审计学习(5)——代码执行漏洞
    PHP代码审计学习(4)——SQL漏洞
    PHP代码审计学习(3)——常见的超全局变量
    PHP代码审计学习(2)——php.ini核心配置
    关于Backus-Naur Form巴克斯诺尔范式和扩展巴克斯范式的知识点和相关词语中英文对照
    Python对列表的相关操作(与JAVA对比)
    MergeSort归并排序和利用归并排序计算出数组中的逆序对
    统计字符串中每种字符出现的评率(HashMap中getOrDefault(K, V)方法的使用)
  • 原文地址:https://www.cnblogs.com/ljstudy/p/14462515.html
Copyright © 2011-2022 走看看