目录
1 需求
很多的项目都使用了redis缓存,若依是咋使用这个redis的?若依项目哪几个文件涉及到了redis缓存?
2 项目集成redis
我们首先看页面,页面上面是有一个模块直接操作redis
从页面上面就可以看到,关于缓存的部分,现在我们先不看页面对缓存做了什么操作,我们先看后端是咋集成这个redis的;
2.1 项目咋集成redis
若依项目是在集成redis的?
首先就是一个项目,加入redis的依赖
这个依赖是在公共模块里面引入的,第一步在项目里面引入了redis的依赖,第二步就是写配置类了
这个配置类是写在了framework模块里面,因为这个模块在pom文件里面将common模块引入了,所以可以使用redis依赖
我们看下这个配置类咋写
2.2 redis的配置类
@Configuration
@EnableCaching
自己随便写一个类,上面加上这两个注解,那么就变成了redis的配置类了
@EnableCaching 的作用是开启注解缓存,就是使用注解的形式进行缓存;
/**
* redis配置
* RedisTemplate 的重写
* @author jing
*
* CachingConfigurerSupport 这个也可以不继承,因为当前项目没有使用到
*/
@Configuration
@EnableCaching
public class RedisConfig extends CachingConfigurerSupport
{
@Bean
@SuppressWarnings(value = {
"unchecked", "rawtypes" })
public RedisTemplate<Object, Object> redisTemplate(RedisConnectionFactory connectionFactory)
{
// 创建 RedisTemplate 对象,对这个对象进行里面内容的修改,然后改成自己的,之后缓存使用自己
// 的RedisTemplate 对象
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()
{
// 使用redis执行lua执行
DefaultRedisScript<Long> redisScript = new DefaultRedisScript<>();
redisScript.setScriptText(limitScriptText());
// 设置一下返回值类型 为Long
// 因为删除判断的时候,返回的0,给其封装为数据类型。如果不封装那么默认返回String 类型,
// 那么返回字符串与0 会有发生错误。
redisScript.setResultType(Long.class);
// 第一个要是script 脚本 ,第二个需要判断的key,第三个就是key所对应的值。
// redisTemplate.execute(redisScript, Arrays.asList(locKey), uuid);
return redisScript;
}
/**
* 限流脚本
// 定义lua 脚本
*/
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"