“ 在昨天我们讲解了如何在Linux上部署Redis,那么今天我们来看一看Spring Boot如何集成Redis。”
安装Redis是我们学习它的第一步,当我们安装好之后就要开始学习如何在项目中去使用它。
01
—
Spring Boot集成
首先是导入依赖:
<!--redis数据库-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-redis</artifactId>
</dependency>
加载成功后我们首先去测试一下:
@Autowired
private RedisTemplate redisTemplate;
@Test
public void set() {
Object x = redisTemplate.opsForValue().get("studyJava");
System.out.println(x);
}
上面studyJava是我们上节安装后通过redis-cli存储的一个key,但是测试发现会报错。
报错为连接失败,但是服务器内部是可以进行访问,这也就是不能外网访问。遇到这种情况,要么就是防火墙,要么就是redis的配置文件。在我的服务器上,我并没有开启防火墙,那么肯定是配置文件有问题来。
在redis的目录下面,有一个redis.conf配置文件,这里面我们需要修改两个东西:
1.将protected-mode yes改为protected-mode no。也就是关闭保护模式
2.将bind 127.0.0.1 注释掉。
但是我建议在正式环境上将他们开启。防止被黑。在今天早上我就发现,我的redis出现了问题:
疑似被黑了,我的处理方式:首先要将这些key清除掉(使用flushall命令)。然后将redis改成密码连接,设置密码访问认证,可通过修改redis.conf配置文件中的"requirepass" 设置复杂密码 (需要重启Redis服务才能生效)。
加密后Spring Boot的配置文件该如何写呢?
#redis
spring.redis.host=服务器外网地址
spring.redis.port=6379
spring.redis.password=个人设置的密码
#最大连接数
spring.redis.jedis.pool.max-active= 8
spring.redis.jedis.pool.max-wait=-1
spring.redis.jedis.pool.max-idle=8
spring.redis.jedis.pool.min-idle=0
spring.redis.timeout=10000
好了说完这些,我们来看一下实际的效果吧。
02
—
获取Redis数据
在单元测试中,虽然跑通了,但是获取的key对应的value总是为null。
我们来服务器中看一下
明明是有值的,为什么我的项目中获取不到呢?很简单,我们通过项目set一个值进去,然后看看效果
你没看错,我们set进去是这样的key,这是什么问题呢?这是因为RedisTemplate默认采用的是String的序列化策略,保存的key和value都是采用此策略序列化保存的
那如果你不能接受这种方式,那么如何处理呢?其实很简单,更改序列化,在启动类加入下面的代码。
@Bean
public RedisTemplate<Object, Object> redisTemplate(RedisConnectionFactory redisConnectionFactory) {
RedisTemplate<Object, Object> redisTemplate = new RedisTemplate<>();
redisTemplate.setConnectionFactory(redisConnectionFactory);
// 使用Jackson2JsonRedisSerialize 替换默认序列化
Jackson2JsonRedisSerializer jackson2JsonRedisSerializer = new Jackson2JsonRedisSerializer(Object.class);
ObjectMapper objectMapper = new ObjectMapper();
objectMapper.setVisibility(PropertyAccessor.ALL, JsonAutoDetect.Visibility.ANY);
objectMapper.enableDefaultTyping(ObjectMapper.DefaultTyping.NON_FINAL);
jackson2JsonRedisSerializer.setObjectMapper(objectMapper);
// 设置value的序列化规则和 key的序列化规则
redisTemplate.setValueSerializer(jackson2JsonRedisSerializer);
redisTemplate.setKeySerializer(new StringRedisSerializer());
redisTemplate.afterPropertiesSet();
return redisTemplate;
}
这样便解决了序列化的问题。
到目前为止,我们已经成功的将Redis集成到我们的项目中了,那么通过这篇文章我们能够收获到什么呢?
1.为什么项目不能连接到Redis服务器
2.不开启保护策略有什么危害
3.如何预防redis被攻击
4.RedisTemplate的序列化对我们直接操作Redis有什么影响
跟小伙伴们分享一下这个周末的推送安排,大家可以重点关注自己喜欢的文章:
九月15号周六:Linux部署Redis(单机版)
九月16号周日:Spring Boot集成Redis
那么今天小程序更新的题库是什么呢?
今天小程序更新的题目是:
1.预防Redis服务器被攻击的措施有哪些
2.为什么redis需要把所有数据放到内存中?
3.Redis是单进程单线程的?
4.Redis中一个字符串类型的值能存储最大容量是多少?
5.Redis的同步机制了解么?