Springboot-data-redis结合SpringCache的使用

spring-boot-data-redis 与 Caache的结合使用

一、springboot-data-redis操作redis。

  1. 导入依赖

    <dependency>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-starter-data-redis</artifactId>
            </dependency>
    
  2. 配置 yml

      redis:
        host: xxxxxx
        port: 6379
        password: xxxxx
        database: 0
    
  3. redis序列化配置

    /**
     * redis配置类
     */
    @Configuration
    public class RedisConfig {
    
        @Bean
        public RedisTemplate<Object,Object> redisTemplate(RedisConnectionFactory connectionFactory){
            RedisTemplate<Object,Object> redisTemplate = new RedisTemplate<>();
            redisTemplate.setKeySerializer(new StringRedisSerializer());
            redisTemplate.setHashKeySerializer(new StringRedisSerializer());
            redisTemplate.setConnectionFactory(connectionFactory);
            return redisTemplate;
        }
    
    }
    
    1. 使用RedisTemplate模板操作redis

      @SpringBootTest
      class RjwmApplicationTests {
      
          @Autowired
          private RedisTemplate redisTemplate;
      
          @Test
          void contextLoads() {
          }
      
          /**
           * 操作String类型数据
           */
          @Test
          void TestRedisString(){
              String city =(String) redisTemplate.opsForValue().get("city");
              System.out.println(city);
      
              redisTemplate.opsForValue().set("长沙","长沙民政",10l, TimeUnit.SECONDS);
              Boolean aBoolean = redisTemplate.opsForValue().setIfAbsent("city22", "南京");
              System.out.println(aBoolean);
          }
          /**
           * 操作hash数据
           */
      
          @Test
          public void testHash(){
              //存值
              redisTemplate.opsForHash().put("002","name","小明");
              redisTemplate.opsForHash().put("002","age",18);
              redisTemplate.opsForHash().put("002","address","bj");
              //取值
              String name =(String) redisTemplate.opsForHash().get("002", "name");
              int age =(int) redisTemplate.opsForHash().get("002", "age");
              String address =(String) redisTemplate.opsForHash().get("002", "address");
              System.out.println(name+" "+age+" "+address);
              //获得hash结构中的所有字段
              Set keys = redisTemplate.opsForHash().keys("002");
              for(Object key : keys ){
                  System.out.println(key);
              }
      
              //获得hash结构中的所有值
              List values = redisTemplate.opsForHash().values("002");
              for (Object value : values) {
                  System.out.print(values+" ");
              }
          }
      
          /**
           * 操作list类型数据
           */
          @Test
          public void testList(){
              ListOperations listOperations = redisTemplate.opsForList();
              //存值
              listOperations.leftPush("myList","a");
              listOperations.leftPushAll("myList","b","c","d");
      
              //取值//
             List<String> list   =   listOperations.range("myList",0,-1);
              System.out.println(list.toString());
      
              //获取列表长度
              Long size = listOperations.size("myList");
              for(int ii = 0 ; ii < size ; ii++){
                  //出队列
                  String element = (String)listOperations.rightPop("myList");
                  System.out.println(element);
              }
      
      
      
          }
      
          /**
           * 操作set类型数据
           */
          @Test
          public void testSet(){
              SetOperations setOperations = redisTemplate.opsForSet();
              //存值
              setOperations.add("mySet","a","b","b","c");
              //取值
              Set<String> mySet = setOperations.members("mySet");
              for (String o : mySet) {
                  System.out.println(o);
              }
      
              //删除成员
              setOperations.remove("mySet","a","b");
              Set<String> mySet1 = setOperations.members("mySet");
      
              for (String s : mySet1) {
                  System.out.print(s+" ");
              }
      
          }
      
          //zset可以通过分数排序
          @Test
          public void testZset(){
              ZSetOperations zSetOperations = redisTemplate.opsForZSet();
              // 存值
              zSetOperations.add("myZset","a",10.0);
              zSetOperations.add("myZset","b",9.0);
              zSetOperations.add("myZset","c",8.0);
              zSetOperations.add("myZset","d ",7.0);
              //取值
              Set<String> myZset = zSetOperations.range("myZset", 0, -1);
              System.out.println(myZset.toString());
      
              //修改分数
              zSetOperations.incrementScore("myZset","b",20.0);
              myZset = zSetOperations.range("myZset",0,-1);
              System.out.println(myZset.toString());
      
              //删除成员
              zSetOperations.remove("myZset","a","b");
              myZset = zSetOperations.range("myZset",0,-1);
              System.out.println(myZset.toString());
          }
      
          /**
           * 通用操作
           */
          @Test
          public void testCommon(){
      
              //获取redis中所以的key
              Set keys = redisTemplate.keys("*");
              System.out.println(keys.toString());
              //判断某个key是否存在
              Boolean itcast = redisTemplate.hasKey("itcast");
              System.out.println(itcast);
              //删除指定key
              redisTemplate.delete("myZset");
              keys = redisTemplate.keys("*");
              System.out.println(keys.toString());
      
              //获取指定key对应的value的数据类型
              DataType myList = redisTemplate.type("username1");
              System.out.println(myList.name());
          }
      
      }
      

二、结合Spring Cache 的使用

  1. 导入依赖

            <dependency>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-starter-cache</artifactId>
            </dependency>
    
    
  2. 配置yml

      redis:
        host: 192.168.3.141
        port: 6379
        password: 115429
        database: 0
      cache:
        redis:
          time-to-live: 1800000 #设置缓存数据过期时间
    
    
    
  3. 注解介绍

    注解
    @EnableCaching开启缓存注解功能
    @Cacheable在方法执行之前spring先查看缓存中是否有数据,如果有数据,则直接返回缓存数据
    @CachePut将方法的返回值放到缓存中
    @CacheEvict将一条或多条数据从缓存中删除

    注意: 在springboot项目中,使用缓存技术只需要在项目中导入相关缓存技术依赖,并在启动类上使用@@EnableCaching开启缓存注解支持即可。

    3.1 @CachePut的使用

       /**
         * CachePut:将方法返回值放入缓存
         * value:缓存的名称,每个缓存名称下面可以有多个key
         * key:缓存的key
         */
        @CachePut(value = "userCache",key = "#user.id")
        @PostMapping
        public User save(User user){
            userService.save(user);
            return user;
        }
    
    

​ 3.2 @CacheEvict的使用

  /**
     * CacheEvict:清理指定缓存
     * value:缓存的名称,每个缓存名称下面可以有多个key
     * key:缓存的key
     */
    //@CacheEvict(value = "userCache",key = "#p0")
    //@CacheEvict(value = "userCache",key = "#root.args[0]")
    @CacheEvict(value = "userCache",key = "#id")
    @DeleteMapping("/{id}")
    public void delete(@PathVariable Long id){
        userService.removeById(id);
    }

 //@CacheEvict(value = "userCache",key = "#p0.id")
    //@CacheEvict(value = "userCache",key = "#user.id")
    //@CacheEvict(value = "userCache",key = "#root.args[0].id")
    @CacheEvict(value = "userCache",key = "#result.id")
    @PutMapping
    public User update(User user){
        userService.updateById(user);
        return user;
    }

3.3 @Cacheable的使用

 /**
     * Cacheable:在方法执行前spring先查看缓存中是否有数据,如果有数据,则直接返回缓存数据;若没有数据,调用方法并将方法返回值放到缓存中
     * value:缓存的名称,每个缓存名称下面可以有多个key
     * key:缓存的key
     * condition:条件,满足条件时才缓存数据
     * unless:满足条件则不缓存
     */
    @Cacheable(value = "userCache",key = "#id",unless = "#result == null")
    @GetMapping("/{id}")
    public User getById(@PathVariable Long id){
        User user = userService.getById(id);
        return user;
    }

    @Cacheable(value = "userCache",key = "#user.id + '_' + #user.name")
    @GetMapping("/list")
    public List<User> list(User user){
        LambdaQueryWrapper<User> queryWrapper = new LambdaQueryWrapper<>();
        queryWrapper.eq(user.getId() != null,User::getId,user.getId());
        queryWrapper.eq(user.getName() != null,User::getName,user.getName());
        List<User> list = userService.list(queryWrapper);
        return list;
    }
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值