SpringBoot缓存-整合Redis

版权声明:本文为博主原创文章,欢迎转载,但请注明作者及文章出处,博文有什么不正之处欢迎指正。 https://blog.csdn.net/try_try_try/article/details/80682442

现在我们都知道SpringBoot整合的套路了吧,开箱即用,所以我们基本引入依赖,稍作配置就可以使用了。
下面我们简单的来看下SpringBoot和Redis的整合。

1.引入依赖

<dependency>
     <groupId>org.springframework.boot</groupId>
     <artifactId>spring-boot-starter-data-redis</artifactId>
</dependency>

2.配置主机

spring:
  redis: 
    host: 192.168.10.173 

3.测试使用

@RunWith(SpringRunner.class)
@SpringBootTest
public class SpringbootCacheExamApplicationTests {

    @Autowired
    EmployeeMapper employeeMapper;

    @Autowired
    StringRedisTemplate stringRedisTemplate;  //操作k-v都是字符串的

    @Autowired
    RedisTemplate<Object,Object> redisTemplate;  //操作k-v都是对象的

    @Test
    public void test1(){//常用操作
        stringRedisTemplate.opsForValue().append("msg","hello");
        String msg = stringRedisTemplate.opsForValue().get("msg");
        System.out.println(msg);

        stringRedisTemplate.opsForValue().set("test", "100",60*10,TimeUnit.SECONDS);
        stringRedisTemplate.boundValueOps("test").increment(-1);//val做-1操作 
        stringRedisTemplate.boundValueOps("test").increment(1);//val做+1操作 
        stringRedisTemplate.opsForValue().get("test");//根据key获取缓存中的val 
        stringRedisTemplate.getExpire("test");//根据key获取过期时间 
        stringRedisTemplate.getExpire("test",TimeUnit.SECONDS);//根据key获取过期时间并换算成指定单位
        String str = stringRedisTemplate.opsForValue().get("test")+"___"+stringRedisTemplate.getExpire("test")+"___"+stringRedisTemplate.getExpire("test",TimeUnit.SECONDS);
        System.out.println("test1: "+str);
        stringRedisTemplate.delete("test");//根据key删除缓存 
        System.out.println("test2: "+stringRedisTemplate.opsForValue().get("test"));

        System.out.println(stringRedisTemplate.hasKey("546545"));//检查key是否存在,返回boolean值 
        System.out.println(stringRedisTemplate.hasKey("msg"));


         stringRedisTemplate.opsForList().rightPush("testlist","1");
         stringRedisTemplate.opsForList().rightPush("testlist","2");
         stringRedisTemplate.opsForList().rightPush("testlist", "A");
         stringRedisTemplate.opsForList().rightPush("testlist", "B");
         // leftPush依次由左边添加
         stringRedisTemplate.opsForList().leftPush("testlist", "0");
        stringRedisTemplate.opsForList().leftPush("testlist222", "0");

        stringRedisTemplate.opsForSet().add("myset", "1","2","3");//向指定key中存放set集合  
        stringRedisTemplate.expire("myset",1000,TimeUnit.MILLISECONDS);//设置过期时间 
        System.out.println(stringRedisTemplate.opsForSet().isMember("myset", "1"));//根据key查看集合中是否存在指定数据 
        System.out.println(stringRedisTemplate.opsForSet().members("myset"));//根据key获取set集合 

        stringRedisTemplate.opsForHash().put("user:123456", "id","1");
        stringRedisTemplate.opsForHash().put("user:123456", "name", "产品部");

        stringRedisTemplate.opsForHash().put("user:1", "id","2");
        stringRedisTemplate.opsForHash().put("user:1", "name", "技术部");

        List<Object> keys = new ArrayList<Object>();
        keys.add("name");
        keys.add("id");
        System.out.println(stringRedisTemplate.opsForHash().multiGet("user:1",keys));
    }

    //测试redisTemplate保存对象
    @Test
    public void test2(){
        Employee emp = employeeMapper.getEmpById(1);
        //如果保存对象,默认使用jdk序列化机制,序列化后的数据保存到redis中
        //执行此句报错org.springframework.data.redis.serializer.SerializationException: Cannot serialize;`
        redisTemplate.opsForValue().set("emp111",emp);
        //解决办法: Employee实现序列化接口

        //我们习惯存json格式,有两种实现方式   
        //(1)将对象转为json
        //(2)自定义redisTemplate序列化规则;
    }

3-1. 自定义redisTemplate序列化规则

@Configuration
public class RedisConfig {

    // 自定义缓存key生成策略

    @Bean
    public KeyGenerator keyGenerator() {

    @Bean
    public RedisTemplate<Object, Object> redisTemplate(
            RedisConnectionFactory factory) {

        RedisTemplate<Object, Object> template = new RedisTemplate<Object, Object>();
        template.setConnectionFactory(factory);

        template.setKeySerializer(new StringRedisSerializer());

        Jackson2JsonRedisSerializer<Object> jackson2JsonRedisSerializer = new Jackson2JsonRedisSerializer<Object>(Object.class);        
        ObjectMapper objectMapper = new ObjectMapper();
        objectMapper.setVisibility(PropertyAccessor.ALL, JsonAutoDetect.Visibility.ANY);
        objectMapper.enableDefaultTyping(ObjectMapper.DefaultTyping.NON_FINAL);
        jackson2JsonRedisSerializer.setObjectMapper(objectMapper);
        template.setValueSerializer(jackson2JsonRedisSerializer);
        template.afterPropertiesSet();

        return template;

    }
}

3-2 .执行结果
这里写图片描述

4.测试缓存

4-1.缓存原理

      我们之前用的是默认的缓存管理器:ConcurrentMapCacheManager,然后ConcurrentMapCacheManager会帮我们创建出缓存组件ConcurrentMapCache,ConcurrentMapCache来实现具体的CURD,给缓存中存取数据。那么我们加入了Redis以后会有什么变化呢?
这里写图片描述
我们可以看到此时我们的容器中保存的是 RedisCacheManager【默认是开启的SimpleCacheConfiguration】,然后RedisCacheManager 帮我们创建 RedisCache 来作为缓存组件;RedisCache来操作数据。

4-2 缓存测试
测试方法同上一篇博客:https://blog.csdn.net/try_try_try/article/details/80666185

1.我们访问http://localhost:8080/emp/1来查询1号员工,控制台打印SQL,我们的Redis中已经缓存了1号员工的数据.
这里写图片描述
我们可以看到key=1,如果有多个对象就不太好区分了,我们可以通过自定义缓存管理器类设置一些所需要的规则。

@Primary  //将某个缓存管理器作为默认的
    @Bean
    public RedisCacheManager myCacheManager(RedisTemplate<Object, Object> myRedisTemplate){
        RedisCacheManager cacheManager = new RedisCacheManager(myRedisTemplate);
        //使用前缀,默认会将CacheName作为key的前缀
        cacheManager.setUsePrefix(true);
        cacheManager.setDefaultExpiration(1800);

        return cacheManager;
    }

2.再次查询1号员工,控制台无输出。

猜你喜欢

转载自blog.csdn.net/try_try_try/article/details/80682442