• 集成Redis缓存


    一、简介

    1、场景
    由于首页数据变化不是很频繁,而且首页访问量相对较大,所以我们有必要把首页数据缓存到redis中,减少数据库压力和提高访问速度。
    2、RedisTemplate
    Jedis是Redis官方推荐的面向Java的操作Redis的客户端,而RedisTemplate是Spring Data Redis中对Jedis api的高度封装。

    Spring Data Redis是spring大家族的一部分,提供了在srping应用中通过简单的配置访问redis服务,对reids底层开发包(Jedis, JRedis, and RJC)进行了高度封装,RedisTemplate提供了redis各种操作、异常处理及序列化功能,支持发布订阅,并对spring cache进行了实现。

    二、引入redis

    1、项目中集成redis
    common父模块中添加redis依赖,Spring Boot 2.0以上默认通过commons-pool2连接池连接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>
    

    2、添加redis连接配置
    application.yml 中添加如下配置

    spring: 
      redis:
        host: 192.168.100.100
        port: 6379
        database: 0
        password: 123456 #默认为空
        lettuce:
          pool:
            max-active: 20  #最大连接数,负值表示没有限制,默认8
            max-wait: -1    #最大阻塞等待时间,负值表示没限制,默认-1
            max-idle: 8     #最大空闲连接,默认8
            min-idle: 0     #最小空闲连接,默认0
    

    3、配置Redis
    添加RedisConfig

    /**
     * 我们自定义一个 RedisTemplate,设置序列化器,这样我们可以很方便的操作实例对象。
     * 否则redis自动使用Java自带的jdk序列化(前提是实体类实现了Serializable),而Java自带的序列化有一定的安全性问题,因此这里封装一个序列化的配置类。
     */
    @Configuration
    public class RedisConfig {
    
        @Bean
        public RedisTemplate<String, Serializable> redisTemplate(LettuceConnectionFactory connectionFactory) {
            RedisTemplate<String, Serializable> redisTemplate = new RedisTemplate<>();
            redisTemplate.setKeySerializer(new StringRedisSerializer());//key序列化方式
            redisTemplate.setValueSerializer(new GenericJackson2JsonRedisSerializer());//value序列化
            redisTemplate.setConnectionFactory(connectionFactory);
            
            return redisTemplate;
        }
    }
    

    三、测试redisTemplate

    1、测试redis数据存储
    ApiAdController中添加下面的方法进行测试。

    @Autowired
    private RedisTemplate redisTemplate;
    
    @PostMapping("save-test")
    public R saveAd(@RequestBody Ad ad){
        //redisTemplate.opsForValue().set("ad1", ad);
        redisTemplate.opsForValue().set("index::ad", ad);
        return R.ok();
    }
    
    @GetMapping("get-test/{key}")
    public R getAd(@PathVariable String key){
        Ad ad = (Ad)redisTemplate.opsForValue().get(key);
        return R.ok().data("ad", ad);
    }
    
    @DeleteMapping("remove-test/{key}")
    public R removeAd(@PathVariable String key){
        Boolean delete = redisTemplate.delete(key);
        System.out.println(delete);//是否删除成功
        Boolean hasKey = redisTemplate.hasKey(key);
        System.out.println(hasKey);//key是否存在
        return R.ok();
    }
    

    2、常用方法
    redisTemplate提供了以下几种存储数据的方法

    redisTemplate.opsForValue(); //操作字符串
    redisTemplate.opsForHash(); //操作hash
    redisTemplate.opsForList(); //操作list
    redisTemplate.opsForSet(); //操作set
    redisTemplate.opsForZSet(); //操作有序set
    

    四、使用缓存注解

    1、修改Redis配置类
    在配置类RedisConfig上添加注解
    @EnableCaching
    在配置类RedisConfig中添加bean配置

    @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;
    }
    

    2、添加缓存注解
    @Cacheable(value = "xxx", key = "'xxx'"):标注在方法上,对方法返回结果进行缓存。下次请求时,如果缓存存在,则直接读取缓存数据返回;如果缓存不存在,则执行方法,并把返回的结果存入缓存中。一般用在查询方法上。
    service_cms:AdServiceImpl

    @Cacheable(value = "index", key = "'selectByAdTypeId'")
    @Override
    public List<Ad> selectByAdTypeId(String adTypeId) {
    

    service_edu:CourseServiceImpl

    @Cacheable(value = "index", key = "'selectHotCourse'")
    @Override
    public List<Course> selectHotCourse() {
    

    service_edu:TeacherServiceImpl

    @Cacheable(value = "index", key = "'selectHotTeacher'")
    @Override
    public List<Teacher> selectHotTeacher() {
    
  • 相关阅读:
    ndk的注意事项
    git
    centos 7 linux x64
    linuxGame:文明5汉化
    pycharm something
    linux soft
    jsfl脚本设置导出AS链接名遇到的奇怪问题
    jsfl调整笔刷的笔触和颜色
    [转]FINDSTR正则表达式小结
    [转]关于SVN的操作批处理示例
  • 原文地址:https://www.cnblogs.com/smalldong/p/13875613.html
Copyright © 2020-2023  润新知