博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
spring-boot | 整合Redis缓存数据
阅读量:5820 次
发布时间:2019-06-18

本文共 5009 字,大约阅读时间需要 16 分钟。

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的配置文件,非常方便。

#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
redisTemplate(RedisConnectionFactory connectionFactory) { RedisTemplate
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
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
searchById(City id) { System.out.println("没有执行缓存"); return cityDao.select(id); }

编写测试类并进行测试

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

1240

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

1240

注意

缓存注解

缓存注解
缓存注解

条件缓存

条件缓存
条件缓存

@Cacheable

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

@CacheEvict

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

(完)


参考文章

转载地址:http://emzdx.baihongyu.com/

你可能感兴趣的文章
java springcloud版b2b2c社交电商spring cloud分布式微服务(十五)Springboot整合RabbitMQ...
查看>>
d3 v4实现饼状图,折线标注
查看>>
微软的云策略
查看>>
Valid Parentheses
查看>>
AIX 配置vncserver
查看>>
windows下Python 3.x图形图像处理库PIL的安装
查看>>
【IL】IL生成exe的方法
查看>>
SettingsNotePad++
查看>>
没有JS的前端:体积更小、速度更快!
查看>>
数据指标/表现度量系统(Performance Measurement System)综述
查看>>
GitHub宣布推出Electron 1.0和Devtron,并将提供无限制的私有代码库
查看>>
论模式在领域驱动设计中的重要性
查看>>
有关GitHub仓库分支的几个问题
查看>>
云原生的浪潮下,为什么运维人员适合学习Go语言?
查看>>
EAServer 6.1 .NET Client Support
查看>>
锐捷交换机密码恢复(1)
查看>>
Method Swizzling对Method的要求
查看>>
佛祖保佑,永不宕机
查看>>
四、配置开机自动启动Nginx + PHP【LNMP安装 】
查看>>
Linux 目录结构及内容详解
查看>>