1.引言
随着互联网的快速发展和用户量的不断增加,应用程序的性能和响应时间成为了开发者需要关注和优化的重要方面。而缓存技术是一种提高应用性能的常见方法之一,而Redis作为一个高性能的内存数据库,被广泛应用于各种规模的应用中。本文将介绍如何使用Spring Boot与Redis集成,充分发挥Redis的优势,优化应用性能。
2.redis是什么
Redis(Remote Dictionary Server)是一款功能丰富、高性能且易于使用开源的内存数据库,它以键值对的形式存储数据,并提供了丰富的数据结构与功能。
3.redis的用途
- 缓存:Redis可以用作缓存存储,将热门数据存储在内存中,以提高读取速度和减轻数据库负载。
- 会话管理:可以使用Redis存储和管理用户会话,以实现无状态的Web应用程序。
- 消息队列:Redis提供了发布/订阅功能,可用于构建实时通信、事件处理和消息队列系统。
- 计数器/排行榜:通过Redis的原子操作,可以轻松地实现计数和排行榜功能。
- 数据结构缓存:Redis支持多种数据结构(如String、List、Set、Hash等)。
4.redis的优缺点
- 优点:
- 高性能:Redis的内存存储和单线程模型使其具有出色的性能。
- 简单易用:Redis的命令简单且易于理解,使用起来非常方便。
- 多种数据结构:Redis支持多种数据结构,提供更多操作选项。
- 缺点:
- 内存限制:由于Redis将数据存储在内存中,受限于服务器的内存大小。
- 数据库文件较大:持久化时,Redis将数据写入硬盘,可能导致数据库文件较大。
5.在烛火博客中我们如何使用
- 验证码:使用Redis的String数据结构,存储验证码信息,用于登陆时的验证。
- 用户信息: 使用Redis的String数据结构,存储用户的基本信息,用户用户请求权限校验。
- 文章阅读量统计:使用Redis的计数器功能,每次有人阅读文章时,增加文章的阅读数量。
- 最新文章列表:使用Redis的列表数据结构,将最新的文章信息存储在列表中,以便显示在首页。
- 最热文章列表: 使用Redis的列表数据结构,将最热的文章信息存储在列表中,以加快读取速度。
6.引入redis
6.1. 引入依赖
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-redis</artifactId>
</dependency>
6.2. 配置redis链接信息
以下配置信息都是默认配置,如果无变动则可以不进行设置
redis:
# redis服务器的主机地址 默认是localhost
host: localhost
# redis服务器的端口号 默认是 6379
port: 6379
# 连接超时时间 设置连接到redis服务器的超时时间 单位(毫秒)
timeout: 2000
# 连接的redis数据库索引,默认为0
database: 0
# 连接redis数据库的密码,如果没有则不需要设置
# password:
lettuce:
pool:
# 连接池最大连接数量 默认为8
max-active: 8
# 连接池最大空闲连接数量 默认为8
max-idle: 8
# 连接池最小空闲连接数量 默认为0
min-idle: 0
# 连接池最大等待时间 单位(毫秒) 默认为 -1 无限等待
max-wait: -1
6.3. 测试验证
6.3.1.创建测试内容
首先新定义一个控制层RedisDemoController并实现一个方法setRedisKey,用于测试缓存的信息
@PostMapping(value = "setRedisKey")
public RespJson setRedisKey(@RequestBody Map<String,Object> map){
String redisKey = map.get("key").toString();
String redisValue = map.get("value").toString();
redisTemplate.opsForValue().set(redisKey,redisValue);
return RespJson.success();
}
6.3.2.通过postman进行测试
6.3.3. 查看缓存
6.3.4. 问题解释
通过redis可视化可以看到我们在存入到redis的内容产生了乱码问题,那产生这个问题的原因使用了不恰当的序列化方式导致,因为RedisTemplate里面没有设置序列化方式,因此当我们没有进行自定义序列化配置的时候,Redis使用的是java默认自带的序列化机制,但是Java默认的序列化存在一些限制和兼容性问题,它适用于java项目,对于其他语言项目并不能很好的兼容。
为此我们如果想解决这个问题需要对RedisTemplate进行自定义序列化方式。
6.4. 配置RedisTemplate序列化
首先我们创建一个redis的配置文件 RedisConfiguration,用于对redis相关内容进行配置,例如定义Redis连接工厂、缓存管理器、缓存键生成器和缓存序列化等等。
6.4.1. 创建RedisConfiguration
@Configuration
public class RedisConfiguration {
/**
* @ConditionalOnClass(RedisOperations.class) 这个注解表示只有当 RedisOperations 类存在于类路径上时才会
* 创建该 Bean。这意味着只有当 Redis 相关的类库已经引入时,才会创建这个 RedisTemplate Bean
*/
@Bean("redisTemplate")
@ConditionalOnClass(RedisOperations.class)
public RedisTemplate<String,Object> redisTemplate(RedisConnectionFactory redisConnectionFactory){
RedisTemplate<String,Object> template = new RedisTemplate<String,Object>();
//设置 RedisTemplate 的连接工厂,用于创建与 Redis 的连接
template.setConnectionFactory(redisConnectionFactory);
// Redis 使用基于 Jackson 库的 JSON 序列化器,将 Java 对象序列化为 JSON 字符串,并在 Redis 存储中使用
Jackson2JsonRedisSerializer<Object> jackson2JsonRedisSerializer = new Jackson2JsonRedisSerializer<Object>(Object.class);
//Jackson 库的核心类,用于执行对象与 JSON 之间的序列化和反序列化操作
ObjectMapper om = new ObjectMapper();
//设置 ObjectMapper 对象的默认的属性访问级别和可见性,使得在进行序列化和反序列化时可以访问对象的所有属性
om.setVisibility(PropertyAccessor.ALL, JsonAutoDetect.Visibility.ANY);
//设置 ObjectMapper 对象支持多态类型的序列化和反序列化,即可以序列化和反序列化类型的具体实例
om.enableDefaultTyping(ObjectMapper.DefaultTyping.NON_FINAL);
jackson2JsonRedisSerializer.setObjectMapper(om);
//Redis 默认提供的字符串序列化器,将字符串序列化为字节数组
StringRedisSerializer stringRedisSerializer = new StringRedisSerializer();
// key采用String的序列化方式
template.setKeySerializer(stringRedisSerializer);
// hash的key也采用String的序列化方式
template.setHashKeySerializer(stringRedisSerializer);
// value序列化方式采用jackson
template.setValueSerializer(jackson2JsonRedisSerializer);
// hash的value序列化方式采用jackson
template.setHashValueSerializer(jackson2JsonRedisSerializer);
//在所有属性设置完成后,调用此方法来初始化 RedisTemplate
template.afterPropertiesSet();
return template;
}
}
6.4.2. 验证测试
重新调用方法后查看redis可视化工具可以发现,我们对于key.value已经可以正常的显示出来了,不会出现乱码
7.总结
我们在这个章节主要简要的介绍了redis的相关概念,并进行简单案例实现。对于在整个博客中要运用到的地方我们会在后面的章节当涉及到的时候依次实现。