spring-boot | 整合Redis缓存数据

来源:互联网 发布:如何更换域名dns 编辑:程序博客网 时间:2024/06/05 09:33

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@EnableCachingpublic 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)@SpringBootTestpublic 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中.控制台成功打印出张三。



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



数据缓存

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

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

编写测试类并进行测试

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



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


注意

缓存注解

缓存注解
缓存注解

条件缓存

条件缓存
条件缓存

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

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

(完)


参考文章

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

原创粉丝点击