美文网首页
Cache缓存与redis序列化

Cache缓存与redis序列化

作者: V_da2a | 来源:发表于2018-09-18 00:42 被阅读0次

    一般都是在凌晨写东西 比较乱 算是个记录 简单粗暴
    环境数据配置搭建
    依赖缓存

          <!--redis -->
            <dependency>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-starter-redis</artifactId>
                <version>RELEASE</version>
            </dependency>
      <!--redis end -->
    <!--SpringCache -->
            <dependency>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-starter-cache</artifactId>
            </dependency>
            <!--SpringCache -->
    

    现在yml文件里面配置redis 方便缓存

     spring:
        datasource:
          redis:
           database: 0
            host: 127.0.0.1
            port: 6379
            password: 123456
            pool.max-idle: 8
            pool.min-idle: 0
            pool.max-active: 8
            pool.max-wait: 1
            timeout: 5000
    

    数据操作框架先拿jpa来写demo

    jpa:
        database: mysql
        show-sql: true
        hibernate:
          ddl-auto: update
          #####  jpa默认方式
          naming:
            implicit-strategy: org.springframework.boot.orm.jpa.hibernate.SpringImplicitNamingStrategy
        properties:
          hibernate:
            dialect: org.hibernate.dialect.MySQL5Dialect
    

    数据库配置

    spring:
      datasource:
        url: jdbc:mysql://localhost:3306/house?useUnicode=true&characterEncoding=utf-8&allowMultiQueries=true&useSSL=false
        username: root
        password: 123456
        driver-class-name: com.mysql.jdbc.Driver
    

    1.springCache 注解申明式缓存
    1.1 开启注解
    //在启动类上申明 缓存注解启动
    @EnableCaching

    //判断当前方法缓存中是否有数据 没有则添加进缓存中
    @Cacheable

    @Cacheable(value = "house",key = "#house.id")
        @Override
        public House findOneHouse(House house) {
            House one = iHouseDao.findOne(house.getId());
    
            return one;
        }
    

    //将数据添加进缓存中去
    @CachePut

    @CachePut(value = "house",key = "#house.id")
        @Override
        public House saveHouse(House house) {
            House save = iHouseDao.save(house);
            return  save;
        }
    

    //删除缓存
    @CacheEvict

     @CacheEvict(value = "house")
        @Override
        public void deltedHouse(House house) {
            iHouseDao.delete(house);
        }
    

    //这个注解就是为了使用多个@CachePut, @CacheEvict或者是多个@Cacheable在同一个方法上,因为多个缓存中的条件表达式可能是不一样的.例子
    @Cacheing(evict={@CacheEvict("primary"), @Cacheable(value = "house",key = "#house.id")})

    模拟请求一个接口 提前写好的


    image.png

    第一次请求


    image.png
    有sql查询
    第二次
    image.png image.png

    缓存成功
    打开redis 发现redis中保存了一条数据


    image.png

    其他几个就先不弄了 打瞌睡了

    注解的方式虽然方便 但是不能指定缓存过期时间
    2018年9月27日00:03:11 继续
    Ehcache
    使用时 添加jar包

    <!--Ehcache start -->
            <dependency>
                <groupId>net.sf.ehcache</groupId>
                <artifactId>ehcache</artifactId>
            </dependency>
            <!-- Ehcache end-->
    

    application.yml中指定cache Type

    #缓存配置  type如果切换成redis 将自动向redis 设置key值 则不需要config
      cache:
        type: ehcache
        jcache:
          config: ehcache.xml
    

    加入Ehcache文件

    <?xml version="1.0" encoding="UTF-8" ?>
    <ehcache>
        <!-- 缓存名称   与Cacheable name 对应 -->
        <cache name="house"
               maxElementsInMemory="1000"
               eternal="false"
               maxElementsLocalHeap="0"
               timeToIdleSeconds="200"
        ></cache>
    
    
        <!-- eternal:true表示对象永不过期,此时会忽略timeToIdleSeconds和timeToLiveSeconds属性,默认为false -->
        <!-- maxEntriesLocalHeap:堆内存中最大缓存对象数,0没有限制 -->
        <!-- timeToIdleSeconds: 设定允许对象处于空闲状态的最长时间,以秒为单位。当对象自从最近一次被访问后,
        如果处于空闲状态的时间超过了timeToIdleSeconds属性值,这个对象就会过期,EHCache将把它从缓存中清空。
        只有当eternal属性为false,该属性才有效。如果该属性值为0,则表示对象可以无限期地处于空闲状态 -->
    </ehcache>
    

    序列化

    /**
     * redis序列化配置
     * @param connectionFactory  jedis连接工厂
     * @return
     */
    @Bean
    public RedisTemplate redisTemplate(JedisConnectionFactory connectionFactory) {
        RedisTemplate redisTemplate = new RedisTemplate();
        redisTemplate.setConnectionFactory(connectionFactory);
        // 使用Jackson2JsonRedisSerialize 替换默认序列化
        Jackson2JsonRedisSerializer jackson2JsonRedisSerializer = new Jackson2JsonRedisSerializer(Object.class);
        ObjectMapper objectMapper = new ObjectMapper();
        objectMapper.setVisibility(PropertyAccessor.ALL, JsonAutoDetect.Visibility.ANY);
        objectMapper.enableDefaultTyping(ObjectMapper.DefaultTyping.NON_FINAL);
        jackson2JsonRedisSerializer.setObjectMapper(objectMapper);
        // 设置value的序列化规则和 key的序列化规则
        redisTemplate.setValueSerializer(jackson2JsonRedisSerializer);
        redisTemplate.setHashValueSerializer(jackson2JsonRedisSerializer);
        redisTemplate.setKeySerializer(new StringRedisSerializer());
        redisTemplate.setHashKeySerializer(redisTemplate.getKeySerializer());
        redisTemplate.afterPropertiesSet();
        return redisTemplate;
    }
    
    image.png

    完事

    相关文章

      网友评论

          本文标题:Cache缓存与redis序列化

          本文链接:https://www.haomeiwen.com/subject/ddojnftx.html