Redis是一种开源的NoSQL内存数据库,用于高性能的数据存储和访问。Redis支持多种数据类型,包括字符串、哈希、列表、集合和有序集合,并且支持分布式存储和操作。Redis的特点包括快速、高可用和易扩展等,适用于各种应用场景。
1、引入依赖
创建好的springboot工程,是引入了springboot的依赖的,继承springboot的子项目,其中Ruoyi使用的就是springboot工程的版本,直接将配置放置在了父工程的依赖管理中,我们直接使用下面的依赖:
详细参见父级pom.xml
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-redis</artifactId>
</dependency>
具体位置也可以通过idea开发工具进行搜索获取
2、配置redis
引入依赖完成了,但是需要使用redis,我们需要先有一个redis,如果没有的话,可以看看docker快速启动一个redis,这里假设已经有了redis,springboot提供了许多中间件的自动装配功能,引入了上面的依赖,redis的自动装配就会被扫描,然而初始化redis连接的条件是要配置了redis的连接,我们可以在工程的: application.yml中配置我们的redis连接:
# Spring配置
spring:
# 资源信息
messages:
# 国际化资源文件路径
basename: i18n/messages
profiles:
active: druid
# 文件上传
servlet:
multipart:
# 单个文件大小
max-file-size: 10MB
# 设置总上传的文件大小
max-request-size: 20MB
# 服务模块
devtools:
restart:
# 热部署开关
enabled: true
# redis 配置
redis:
# 地址
host: localhost
# 端口,默认为6379
port: 6379
# 数据库索引
database: 0
# 密码
password:
# 连接超时时间
timeout: 10s
lettuce:
pool:
# 连接池中的最小空闲连接
min-idle: 0
# 连接池中的最大空闲连接
max-idle: 8
# 连接池的最大数据库连接数
max-active: 8
# #连接池最大阻塞等待时间(使用负值表示没有限制)
max-wait: -1ms
这样,SpringBoot将会自动配置redis,注入相关bean,我们就可以使用@CacheConfig,@Cacheable,@CachePut,@CacheEvict了。
其中redis在部署的时候可以设置密码,也可以不设置密码,如果不设置密码,password为空,
timeout:请求redis超时时间。如果连接10秒后,redis都没有反应,则系统报超时异常信息,有可能影响Ruoyi启动不了应用程序。
Lettuce 是一个可伸缩线程安全的 Redis 客户端。多个线程可以共享同一个 RedisConnection。它利用优秀 netty NIO 框架来高效地管理多个连接。
示例代码:
RedisClient client = new RedisClient("localhost")
RedisConnection<String, String> connection = client.connect()
String value = connection.get("key")
pool:连接池模式,ruoyi启动时候,会创建一些连接存放在内存,如果需要的时候,从连接池获取,而不需要每次都重新创建与redis的连接。因为每次重新与reids建立连接都需要消耗性能和时间,从而影响效率。
max-active:当前已经连接redis的最大连接数。
3、redis初始化配置
redis初始化封装在ruoyi-framework模块里面,详细包路径如下
package com.ruoyi.framework.config;
@Configuration是Spring的注解,不是SpringBoot的!早在Spring框架的时候就有使用,但是由于那个时候配置文件还是比较流行,因此@Configuration注解并没有太盛行,甚至很多人就认为它是SpringBoot的注解。
@Configuration注解的作用:声明一个类为配置类,用于取代bean.xml配置文件注册bean对象。
spring 通过该注解扫描该类并执行
/**
* redis配置
*
* @author ruoyi
*/
@Configuration
@EnableCaching
public class RedisConfig extends CachingConfigurerSupport
{
@Bean
@SuppressWarnings(value = { "unchecked", "rawtypes" })
public RedisTemplate<Object, Object> redisTemplate(RedisConnectionFactory connectionFactory)
{
RedisTemplate<Object, Object> template = new RedisTemplate<>();
template.setConnectionFactory(connectionFactory);
FastJson2JsonRedisSerializer serializer = new FastJson2JsonRedisSerializer(Object.class);
// 使用StringRedisSerializer来序列化和反序列化redis的key值
template.setKeySerializer(new StringRedisSerializer());
template.setValueSerializer(serializer);
// Hash的key也采用StringRedisSerializer的序列化方式
template.setHashKeySerializer(new StringRedisSerializer());
template.setHashValueSerializer(serializer);
template.afterPropertiesSet();
return template;
}
@Bean
public DefaultRedisScript<Long> limitScript()
{
DefaultRedisScript<Long> redisScript = new DefaultRedisScript<>();
redisScript.setScriptText(limitScriptText());
redisScript.setResultType(Long.class);
return redisScript;
}
/**
* 限流脚本
*/
private String limitScriptText()
{
return "local key = KEYS[1]\n" +
"local count = tonumber(ARGV[1])\n" +
"local time = tonumber(ARGV[2])\n" +
"local current = redis.call('get', key);\n" +
"if current and tonumber(current) > count then\n" +
" return tonumber(current);\n" +
"end\n" +
"current = redis.call('incr', key)\n" +
"if tonumber(current) == 1 then\n" +
" redis.call('expire', key, time)\n" +
"end\n" +
"return tonumber(current);";
}
}
如下代码片段表示创建RedisTemplate实例。connectionFactory是从sprig 注入,connectionFactory已经读取配置文件,并创建redis连接池
RedisTemplate<Object, Object> template = new RedisTemplate<>();
template.setConnectionFactory(connectionFactory);
如下逻辑代码,
1、创建一个FastJson2JsonRedisSerializer,json格式的序列化对象。
2、redis的key使用String格式的序列化,value使用json格式的序列化。
3、设置hash的key也是用上面的模式进行定义
FastJson2JsonRedisSerializer serializer = new FastJson2JsonRedisSerializer(Object.class);
// 使用StringRedisSerializer来序列化和反序列化redis的key值
template.setKeySerializer(new StringRedisSerializer());
template.setValueSerializer(serializer);
// Hash的key也采用StringRedisSerializer的序列化方式
template.setHashKeySerializer(new StringRedisSerializer());
template.setHashValueSerializer(serializer);
limitScript设置限制访问脚步,当大规模访问redis,由于redis部署的服务器性能不足,可能导致redis挂,所以可以设置限制访问redis的请求数。
未来计划
1、ruoyi非分离版本拆解
2、ruoyi-vue-pro:讲解工作流
3、ruoyi-vue-pro:支付模块,电商模块
4、基于ruoyi-vue-pro项目开发
5、JEECG低代码开发平台
请关注我,本星球会持续推出更多的开源项目代码解析,如有更好的意见请留言回复或者私信。