spring-boot整合redis及基本操作

项目源码

github发布的项目

CentOS上下载redis

1.使用docker命令在docker hub上下载redis,不写版本号默认时最新版

docker pull redis

2.使用命令运行redis,其中-d代表后台运行 ,-p指定端口映射,–name 对redis重命名,后面的数字代表镜像id

docker run -d -p 6379:6379 --name myredis  235592615444

3.这时候redis已经正式启动下一步正式开始编码,为了更加直观的展示效果,我使用了可视化的客户端展示数据即Redis Desktop Manager

Spring-boot关于缓存操作的部分注解

1.@Cacheable标注的方法执行之前先检测缓存中有没有这个数据,默认按照参数的值作为key去查询缓存,如果没有就运行方法并将结果放入缓存(可看源码)
2.@CachePut:即调用方法又更新缓存(常见于update)
1.运行时机:先调用方法,再放入缓存。不同于@Cacheable
注意:使用@CachePut要注意cache中的key,如果更新的key和之前的key不一样,查询后的值不是修改 后的值。
3.@CacheEvict:缓存清除
属性:
allEntries=true 删除指定缓存中的所有数据
beforeInvocation = false: 缓存的清除是否是再方法前执行。
默认是在方法后执行。。常用于删除操作(具体根据业务逻辑进行编写)。
4.@Caching() 里面有cacheable,put等数组,可以都进行配置(复杂的缓存规则)
5.@CacheConfig() 配置全局公共cache属性
具体操作可见以下链接

在这里插入图片描述

IDEA编写操作redis代码

1.使用spring-boot初始化向导选择web模块和spring-data-redis模块进行建立

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

2.我们只需要在application.properties中配置redis运行的主机ip地址

spring.redis.host=192.168.1.103

3.首先看spring-boot源码中为我们关于redis配置了哪些内容,如下图所示帮我们配置了RedisTemplate和StringRedisTemplate对不同类型的数据进行操作
在这里插入图片描述4.既然帮我们自动指定好了RedisTemplate,那我们先拿来用一下

@SpringBootTest
class RedisApplicationTests {
    @Autowired
    RedisTemplate redisTemplate;
    Student student=new Student(1,"zhangsan");
    @Test
    void contextLoads() {
        //转为json (1) 自己将对象转为json
        redisTemplate.opsForValue().set("student",student);
    }
}
使用上面的代码我们发现存储在Redis Desktop Manager中的数据变成了下面这个样子
\xAC\xED\x00\x05sr\x00\x1Etop.zbawq.redis.mapper.Student\x84\xB3\xE6\xFF\xF7-\xFD'\x02\x00\x02L\x00\x02idt\x00\x13Ljava/lang/Integer;
L\x00\x04namet\x00\x12Ljava/lang/String;xpsr\x00\x11java.lang.Integer
\x12\xE2\xA0\xA4\xF7\x81\x878\x02\x00\x01I\x00\x05valuexr\x00\x10java.lang.Number
\x86\xAC\x95\x1D\x0B\x94\xE0\x8B\x02\x00\x00xp\x00\x00\x00\x01t\x00\x08zhangsan

原因是spring-boot帮我们配置的RedisTemplate中使用的是enableDefaultSerializer
,而enableDefaultSerializer就是JdkSerializationRedisSerializer即jdk的序列化工具,而我们可以修改自动配置是序列化改为Jackson2JsonRedisSerializer,代码如下

@Bean
public RedisTemplate<Object, Object> MyRedisTemplate(RedisConnectionFactory redisConnectionFactory)
        throws UnknownHostException {
    RedisTemplate<Object, Object> template = new RedisTemplate<>();
    template.setConnectionFactory(redisConnectionFactory) ;
    Jackson2JsonRedisSerializer<Object> studentJackson2JsonRedisSerializer = new Jackson2JsonRedisSerializer<Object>(Object.class);
    template.setDefaultSerializer(studentJackson2JsonRedisSerializer);
    return template;
}

在spring-boot2.0之后对部分代码做了修改 RedisCacheManager不在由RedisTemplate构成,所以使用注解的方式并且是json格式必须重新方法,源码如下

@Bean
RedisCacheManager cacheManager(CacheProperties cacheProperties, CacheManagerCustomizers cacheManagerCustomizers,
      ObjectProvider<org.springframework.data.redis.cache.RedisCacheConfiguration> redisCacheConfiguration,
      ObjectProvider<RedisCacheManagerBuilderCustomizer> redisCacheManagerBuilderCustomizers,
      RedisConnectionFactory redisConnectionFactory, ResourceLoader resourceLoader) {
   RedisCacheManagerBuilder builder = RedisCacheManager.builder(redisConnectionFactory).cacheDefaults(
         determineConfiguration(cacheProperties, redisCacheConfiguration, resourceLoader.getClassLoader()));
   List<String> cacheNames = cacheProperties.getCacheNames();
   if (!cacheNames.isEmpty()) {
      builder.initialCacheNames(new LinkedHashSet<>(cacheNames));
   }
   redisCacheManagerBuilderCustomizers.orderedStream().forEach((customizer) -> customizer.customize(builder));
   return cacheManagerCustomizers.customize(builder.build());
}

我们只需要为容器中注入属于自己的CacheManager,自动配置的CacheManager就不会生效了,即下面这段代码。

@Bean
public RedisCacheManager cacheManager(RedisConnectionFactory redisConnectionFactory) {
    //初始化一个RedisCacheWriter
    RedisCacheWriter redisCacheWriter = RedisCacheWriter.nonLockingRedisCacheWriter(redisConnectionFactory);

    //设置CacheManager的值序列化方式为json序列化
    RedisSerializer<Object> jsonSerializer = new GenericJackson2JsonRedisSerializer();
    RedisSerializationContext.SerializationPair<Object> pair = RedisSerializationContext.SerializationPair
            .fromSerializer(jsonSerializer);
    RedisCacheConfiguration defaultCacheConfig=RedisCacheConfiguration.defaultCacheConfig()
            .serializeValuesWith(pair);

    //设置默认超过期时间是30秒
    defaultCacheConfig.entryTtl(Duration.ofSeconds(30));
    //初始化RedisCacheManager
    return new RedisCacheManager(redisCacheWriter, defaultCacheConfig);
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值