开发者社区> huasc> 正文

spring-boot | 整合Redis缓存数据

简介: spring boot 整合redis非常简单,首先创建spring boot的Maven项目,然后在pom.xml文件中引入redis的依赖。 引入redis的依赖 org.springframework.boot spring-boot-starter-data-redis 添加redis的配置文件 在application.properties里面设置redis的配置文件,spring boot会自动加载redis的配置文件,非常方便。
+关注继续查看

spring boot 整合redis非常简单,首先创建spring boot的Maven项目,然后在pom.xml文件中引入redis的依赖。

引入redis的依赖

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

添加redis的配置文件

在application.properties里面设置redis的配置文件,spring boot会自动加载redis的配置文件,非常方便。

#redsi配置
# Redis数据库索引(默认为0) 
spring.redis.database=2 
# Redis服务器地址 
spring.redis.host=localhost
# Redis服务器连接端口 
spring.redis.port=6379 
# Redis服务器连接密码(默认为空) 
spring.redis.password= 123456
#连接池最大连接数(使用负值表示没有限制)
spring.redis.pool.max-active=8 
# 连接池最大阻塞等待时间(使用负值表示没有限制) 
spring.redis.pool.max-wait=-1 
# 连接池中的最大空闲连接 
spring.redis.pool.max-idle=8 
# 连接池中的最小空闲连接 
spring.redis.pool.min-idle=0 
# 连接超时时间(毫秒) 
spring.redis.timeout=0

缓存的的配置

@Configuration
@EnableCaching
public class CacheConfig extends CachingConfigurerSupport {
    
    @Value("${spring.redis.host}")
    private String host;
    
    @Value("${spring.redis.port}")
    private int port;
    
    @Value("${spring.redis.timeout}")
    private int timeout;
    
    @Value("${spring.redis.database}")
    private int database;
    
    @Value("${spring.redis.password}")
    private String password;
    /**
     * 键的生成策略
     * @return
     */
    @Bean
    public KeyGenerator wiselyKeyGenerator() {
        return new KeyGenerator() {
            @Override
            public Object generate(Object target, Method method, Object... params) {
                StringBuilder sb = new StringBuilder();
                sb.append(target.getClass().getName());
                sb.append(method.getName());
                for (Object obj : params) {
                    sb.append(obj.toString());
                }
                return sb.toString();
            }
        };
    }

    @Bean
    public JedisConnectionFactory redisConnectionFactory() {
        JedisConnectionFactory factory = new JedisConnectionFactory();
        factory.setHostName(host);
        factory.setPort(port);
        factory.setTimeout(timeout);
        factory.setPassword(password);
        factory.setDatabase(database);
        return factory;
    }

    /**
     * 配置CacheManager 管理cache
     * @param redisTemplate
     * @return
     */
    @Bean
    public CacheManager cacheManager(RedisTemplate redisTemplate) {
        RedisCacheManager cacheManager = new RedisCacheManager(redisTemplate); 
        cacheManager.setDefaultExpiration(60*60); // 设置key-value超时时间
        return cacheManager;
    }

    
    
    @Bean
       public RedisTemplate<Object, Object> redisTemplate(RedisConnectionFactory connectionFactory) {
          RedisTemplate<Object, Object> template = new RedisTemplate<>();
          template.setConnectionFactory(connectionFactory);

          //使用Jackson2JsonRedisSerializer来序列化和反序列化redis的value值
          Jackson2JsonRedisSerializer serializer = new Jackson2JsonRedisSerializer(Object.class);

          ObjectMapper mapper = new ObjectMapper();
          mapper.setVisibility(PropertyAccessor.ALL, JsonAutoDetect.Visibility.ANY);
          mapper.enableDefaultTyping(ObjectMapper.DefaultTyping.NON_FINAL);
          serializer.setObjectMapper(mapper);

          template.setValueSerializer(serializer);
          //使用StringRedisSerializer来序列化和反序列化redis的key值
          template.setKeySerializer(new StringRedisSerializer());
          template.afterPropertiesSet();
          return template;
       }
}

单元测试


@RunWith(SpringRunner.class)
@SpringBootTest
public class RedisTest {
    
    
     @Autowired
     private RedisTemplate<Object, Object> redisTemplate;
     
    @Test
    public void RedisTests(){
        
        try {
            redisTemplate.opsForValue().set("name", "张三");
            Object object = redisTemplate.opsForValue().get("name");
            System.out.println(object);
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}

测试结果如下,name已经被成功存储到redis中.控制台成功打印出张三。

1240

再通过redis客户端查看,发现数据已经被存储。到这里,spring boot结合reids已经整合完毕。


1240

数据缓存

对应实体类,因为之前我们已经进行过序列化配置,所以这里无需再实现序列化接口。

@Table(name = "city")
public class City implements Serializable{
    private static final long serialVersionUID = 1L;
    @Id
    private String id;
    private String name;
    private String state;

    public String getId() {
        return id;
    }

    public void setId(String id) {
        this.id = id;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public String getState() {
        return state;
    }

    public void setState(String state) {
        this.state = state;
    }
}

利用注解的方式进行缓存

/**
     * @Cacheable 
     * 应用到读取数据的方法上,先从缓存中读取,如果没有再从DB获取数据,然后把数据添加到缓存中
     * unless 表示条件表达式成立的话不放入缓存
     */
    @Override
    @Cacheable(value = "city" , keyGenerator = "wiselyKeyGenerator")
    public List<City> searchById(City id) {
        System.out.println("没有执行缓存");
        return cityDao.select(id);
    }

编写测试类并进行测试

发现第一次查询的是数据库,第二次直接从缓存中读取的数据。

1240

再通过redis客户端发现数据已经被成功存储.

1240

注意

缓存注解

缓存注解
缓存注解

条件缓存

条件缓存
条件缓存

@Cacheable
应用到读取数据的方法上,先从缓存中读取,如果没有再从DB获取数据,然后把数据添加到缓存中 。
unless 表示条件表达式成立的话不放入缓存。
主要参数:

@CacheEvict
应用到删除数据的方法上,调用方法时会从缓存中删除对应key的数据。
@CachePut
应用到写数据的方法上,如新增/修改方法,调用方法时会自动把相应的数据放入缓存。

(完)


参考文章

Spring Boot with Redis
Spring思维导图,让Spring不再难懂(cache篇)

版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。

相关文章
Redis、缓存数据、简单逻辑
Redis、缓存数据、简单逻辑
18 0
【测试开发】知识点-项目中使用 Spring Cache + Redis 缓存数据
【测试开发】知识点-项目中使用 Spring Cache + Redis 缓存数据
120 0
Redis随项目启动或CRUD进行缓存数据
Redis随项目启动或CRUD进行缓存数据
221 0
Spring-Boot实战|分布式缓存-JPA的二级缓存-Redis
以JPA为ORM框架的微服务,默认是二级缓存是关闭的。因为在分布式集群架构下,本地的二级缓存必然会带来多个微服务实例缓存不一致问题。将二级缓存移交给第三方中间件可以很好的解决缓存不一致问题。而Redis一款高性能的K-V存储中间件,在保证缓存一致性的同时,还能提供高性能,高可用的特性。本篇文章就是基于开源框架Hibernate-Redis,将Redis作为为JPA的二级缓存实现
4122 0
spring-boot整合redis和lettuce
Lettuce和Jedis的都是连接Redis Server的客户端程序。Jedis在实现上是直连redis server,多线程环境下非线程安全,除非使用连接池,为每个Jedis实例增加物理连接。Lettuce基于Netty的连接实例(StatefulRedisConnection),可以在多个线程间并发访问,且线程安全,满足多线程环境下的并发访问,同时它是可伸缩的设计,一个连接实例不够的情况也可以按需增加连接实例。
3385 0
spring-boot项目整合redis
Redis 是完全开源免费的,遵守BSD协议,是一个高性能的key-value数据库。 Redis 与其他 key - value 缓存产品有以下三个特点: Redis支持数据的持久化,可以将内存中的数据保存在磁盘中,重启的时候可以再次加载进行使用。
1518 0
spring-boot集成redis实现缓存功能
一、本次案例 我们假设用户信息(user)和产品信息(product)需要缓存,缓存数据都加上user和product作为key前缀,采用用户的id和产品的id作为key的后缀。用户缓存时间为30分钟,产品信息缓存时间为10分钟。
17693 0
spring-boot和redis的缓存使用
1.运行环境 开发工具:intellij idea JDK版本:1.8 项目管理工具:Maven 4.0.0 2.Maven Plugin管理 pom.xml配置代码: 1 2 5 4.
1025 0
spring-boot 速成(12) - 如何注入多个redis StringRedisTemplate
默认情况下,spring-boot的redis自动配置,只能注册一个StringRedisTemplate实例,如果希望注入多个,比如:1个读写database 0,1个读写database 1 ...
4841 0
+关注
huasc
专注于java spring spring boot spring cloud docker 领域的研究
文章
问答
视频
文章排行榜
最热
最新
相关电子书
更多
Redis&MongoDB的同步、迁移以及混合云场景构建
立即下载
低代码开发师(初级)实战教程
立即下载
阿里巴巴DevOps 最佳实践手册
立即下载