在分布式系统中,session的共享是不得不处理的事情,幸好springboot框架给我们集成了这个功能,它对应业务应用层完全是透明的,就是所谓的开箱即用,使我们用的毫无知觉。
maven依赖,
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-redis</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.session</groupId>
<artifactId>spring-session-data-redis</artifactId>
</dependency>
在pom文件中只要引入了redis session插件,然后配上redis连接信息
redis连接信息配置:
spring:
redis:
host: 148.70.153.63
port: 6379
password: redis&%%$42
maxIdle: 20
minIdle: 10
maxTotal: 100
database: 2
busiDb: 9
boeDb: 2
eximportDb: 5
session:
store-type: redis
cache:
type: redis
测试验证:
通过访问不同机器上的同一个服务。验证分布式session
@RestController
public class SessionController {
@RequestMapping("/getSessionId")
public String getSessionId(HttpServletRequest request) {
String sessionId = request.getSession().getId();
return sessionId;
}
}
还可以设置session的过期时间
需要通过在启动类添加注解@EnableRedisHttpSession
来指定Session过期时间。
如:
@SpringBootApplication
@EnableRedisHttpSession(maxInactiveIntervalInSeconds = 3600)
public class TestApplication {
public static void main(String[] args) {
SpringApplication.run(TestApplication .class, args);
}
}
Redis详解
Redis(Remote Dictionary Server)是一个开源的、基于内存的键值对存储系统,提供了丰富的数据类型和操作,用于构建高性能、高可用的应用。以下是关于Redis的详解。
一、Redis的基本概念
- 数据类型:Redis支持多种数据类型,包括字符串、哈希表、列表、集合和有序集合。这些数据类型使得Redis可以用于多种应用场景,如缓存、消息队列、排行榜等。
- 键值对:Redis以键值对的形式存储数据,每个键对应一个唯一的数据值。键是字符串类型,值可以是不同数据类型的实例,如字符串、哈希表、列表等。
- 持久化:Redis支持将数据持久化到磁盘中,以便在系统重启或故障时恢复数据。持久化可以通过RDB(Redis DataBase)和AOF(Append Only File)两种方式实现。
- 事务:Redis支持事务功能,通过MULTI、EXEC和DISCARD命令来执行事务。事务可以确保多个命令的原子性执行,并且可以通过watch命令实现乐观锁机制。
- 发布/订阅模式:Redis支持发布/订阅模式,允许开发者实现实时消息系统、实时排行榜等功能。通过使用Pub/Sub命令,可以将消息发布到指定的频道,并由订阅该频道的客户端接收。
二、Redis的安装与配置
- 安装:Redis可以通过源码编译安装或者使用包管理器进行安装。常见的安装方式包括在Linux上使用apt-get或yum命令安装,在Windows上使用MSI安装程序安装等。
- 配置:Redis的配置文件通常位于redis.conf,其中包含了各种参数的配置选项,如端口号、日志文件路径、密码等。开发者可以根据实际需求进行配置调整。
三、Redis的应用场景
- 缓存:Redis作为内存数据库,可以作为缓存系统使用,提高应用的性能和响应速度。通过合理设置缓存过期时间和缓存策略,可以实现高效的缓存更新和替换机制。
- 消息队列:Redis的列表数据类型可以作为消息队列使用,实现异步消息处理和分布式系统中的消息传递。通过使用LPUSH和RPOP命令,可以实现消息的生产者和消费者模式。
- 排行榜:Redis的有序集合数据类型可以用于实现排行榜功能,如游戏排名、热门商品等。通过ZADD命令添加分数,ZRANGEBYSCORE和ZREVRANGEBYSCORE命令获取排名结果。
- 会话管理:Redis可以作为会话管理系统,存储用户会话数据,提高系统安全性和可靠性。通过将用户会话数据存储在Redis中,可以实现会话劫持保护和跨节点会话同步等功能。
- 分布式锁:Redis的原子性操作和事务功能可以用于实现分布式锁机制,确保多个节点之间的操作一致性和安全性。通过SETNX命令实现分布式锁的加锁操作,并通过定时任务或监听机制实现锁的自动释放和重试机制。
四、Redis的性能优化
- 内存优化:合理配置Redis的内存大小和数据存储方式,避免过高的内存占用和频繁的磁盘I/O操作。根据实际需求调整键值对的存储方式和数据结构的使用。
- 连接池:使用连接池可以减少创建和销毁连接的开销,提高系统的并发处理能力。合理配置连接池的大小和连接超时时间等参数。
- 异步处理:对于非实时要求的操作,可以采用异步处理方式,提高系统的响应速度和吞吐量。例如使用Redis的发布/订阅模式实现异步消息处理。
- 缓存策略:根据实际需求选择合适的缓存策略,如LRU(Least Recently Used)策略或TTL(Time To Live)策略等。通过合理设置缓存过期时间和缓存替换机制,提高缓存利用率和性能。
- 压缩数据:对于存储的数据进行压缩处理,可以减少内存占用和提高网络传输效率。Redis支持对字符串类型的数据进行压缩存储。
- 持久化优化:根据实际需求选择合适的持久化方式(RDB或AOF),并调整相关参数如持久化频率和同步策略等,以平衡数据安全性和性能。
- 多线程处理:在一些高并发场景下,可以考虑使用多线程处理来提高系统的吞吐量。但需要注意的是,Redis本身是单线程模型,多线程处理主要应用于客户端或代理层的优化。
- 监控与调优:定期监控Redis的性能指标如CPU使用率、内存占用、QPS等,并根据实际情况进行调整和优化。同时可以借助第三方工具如Redis Exporter、Prometheus等来实现更全面的监控和告警功能。
- 安全与防护:确保Redis的安全性,采取措施如密码验证