如何在SpringBoot项目使用Redis存储session
一、什么是Redis?
redis是一个key-value存储系统。和Memcached类似,它支持存储的value类型相对更多,包括string(字符串)、list(链表)、set(集合)、zset(sorted set --有序集合)和hash(哈希类型)。这些数据类型都支持push/pop、add/remove及取交集并集和差集及更丰富的操作,而且这些操作都是原子性的。在此基础上,redis支持各种不同方式的排序。与memcached一样,为了保证效率,数据都是缓存在内存中。区别的是redis会周期性的把更新的数据写入磁盘或者把修改操作写入追加的记录文件,并且在此基础上实现了master-slave(主从)同步。
二、此次案例使用Redis做什么?
在WEB开发中,服务器可以为每个用户浏览器创建一个会话对象(session对象),一个浏览器独占一个session对象(默认情况下)。服务器会获取保存在session中的信息进行验证等。
由于实际应用场景,连接数量庞大,需要多台服务器。为了实现均衡负载,可能每次访问的不是同一个服务器。此时为了统一session存放,就需要Redis帮忙管理session。
三、阿里云服务器安装Redis
这里找到了一个别人写的教程
centOs安装和配置Redis
四、SpringBoot项目添加yml配置
spring:
cache:
type: REDIS
redis:
host: 你的ip
port: 你的端口
password: 你的密码
database: 0
五、写一个配置类
新建一个RedisConfig类。类的内容如下,这里我配置了默认过期时间为999999秒,设置redis的key为“cacheName:xxxx”形式,更改value值的序列化为json格式。
现在我们可以愉快的在项目中使用redis了。springboot帮我们针对缓存的操作做了封装。我们可以直接使用注解来方便的使用。
package com.kid.config;
import org.springframework.cache.CacheManager;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.data.redis.cache.CacheKeyPrefix;
import org.springframework.data.redis.cache.RedisCacheConfiguration;
import org.springframework.data.redis.cache.RedisCacheManager;
import org.springframework.data.redis.cache.RedisCacheWriter;
import org.springframework.data.redis.connection.RedisConnectionFactory;
import org.springframework.data.redis.serializer.GenericJackson2JsonRedisSerializer;
import org.springframework.data.redis.serializer.RedisSerializationContext;
import org.springframework.data.redis.serializer.RedisSerializer;
import java.time.Duration;
/**
* @ClassName RedisConfig
* @Description TODO
* @Autor T_Antry
* @Date 2020/10/21 13:10
* @Version 1.0
*/
@Configuration
public class RedisConfig {
/**
* 默认超时时间
*/
private static final long DEFAULT_TTL = 999999L;
@Bean
public CacheManager cacheManager(RedisConnectionFactory redisConnectionFactory) {
//初始化一个RedisCacheWriter
RedisCacheWriter redisCacheWriter = RedisCacheWriter.nonLockingRedisCacheWriter(redisConnectionFactory);
//自定义key前缀
CacheKeyPrefix cacheKeyPrefix = new CacheKeyPrefix() {
@Override
public String compute(String cacheName) {
return cacheName+":";
}
};
//设置CacheManager的值序列化方式为json序列化
RedisSerializer<Object> jsonSerializer = new GenericJackson2JsonRedisSerializer();
RedisSerializationContext.SerializationPair<Object> pair = RedisSerializationContext.SerializationPair
.fromSerializer(jsonSerializer);
//生成RedisCacheConfiguration配置
RedisCacheConfiguration defaultCacheConfig = RedisCacheConfiguration.defaultCacheConfig()
.computePrefixWith(cacheKeyPrefix)
.serializeValuesWith(pair);
//设置默认超过期时间是30秒
defaultCacheConfig.entryTtl(Duration.ofSeconds(DEFAULT_TTL));
//初始化RedisCacheManager
return new RedisCacheManager(redisCacheWriter, defaultCacheConfig);
}
}
在启动类上增加@EnableCaching注解,没有增加这个注解的话,缓存将不会生效。
package com.kid;
import org.mybatis.spring.annotation.MapperScan;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.boot.web.servlet.ServletComponentScan;
import org.springframework.cache.annotation.EnableCaching;
// 作用:扫描该包下的所有java类 (扫描器标签)
// 作用:自动加载配置类,我们springboot的配置很多都写成类的形式(fsatjson)
// 作用:到时候打包的时候识别成springboot框架
@SpringBootApplication
@MapperScan("com.kid.mapper")
@ServletComponentScan
@EnableCaching
public class Boot {
public static void main(String[] args) {
SpringApplication.run(Boot.class, args);
}
}