Using Redis to store php session

本文介绍了如何在Windows和CentOS环境下配置PHP使用Redis作为会话存储的方式,解决了多服务器负载均衡时会话同步的问题。

Using Redis to store php session


默认情况下,php将会将session信息存储在文件系统上,在单机情况下没有问题,但是当系统负载增大,或者在对系统可用性要求很高的场景下,当台机器不仅处理能力跟不上,而且当机器故障时整个系统就处于不可用状态了。所以多机器负载均衡就非常有必要了。
但是问题来了,假设现在系统有两台应用服务器serverA,serverB,用户X现在已经登录了,而登录状态众所周知是存储在应用服务器的session中的,如果用户X的登录请求是serverA响应的,那么其登录状态是存储在serverA上的,当用户X的下一个请求被转发给serverB时,serverB是会认为用户X尚未登录,因为他没有存储用户X的session信息。
当然你可以将负载均衡设置为,将相同IP的访问请求均转发给同一个服务器,但是这种方案并不完美,可以设想这样一种情形,应用服务器serverA进程死掉了,那么在serverA上登录的所有用户就无法正常访问服务了。
所以只有能够在多台应用服务器之间共享存储session才能够解决这一问题,而现有的常见的解决方案就使用memcache,redis来存储session。

windows下配置php+redis

1. 安装redis服务器

下载地址  Redis.msi
如果下载的非安装版,则需要通过命令行来启动,redis服务,而且命令行窗口不可以关闭,否则服务会关闭

redis-server.exe redis.conf

如果选择的是msi安装版,安装后会在windows服务中看到redis服务,默认是自动启动的,命令行去到安装目录,运行redis-cli.exe可以通过命令行来操作redis的读写。 

keys *  //列出所有的键。
get "phpredis_session:xxxxxxxxxxxxx" //获取指定键的值
flushdb //清除所有的键值对。

redis.conf文件中可以配置redis-server的相关参数。

2. 安装php_redis扩展
2.1. 通过phpinfo()查看php编译脚本。

Alt

2.2. 下载与编译脚本一致的php_redis扩展

一定要一致,否则无法使用
下载地址php_redis extension
Alt
ts(thread safe), nts(thread not safe).

2.3. 将下载的php_redis.dll放在php扩展目录中(ext).
3. 配置php.ini添加扩展
extension=php_redis.dll

 

4. 重启apache服务,查看phpinfo()出现redis块表示成功。

Alt

5 设置php.ini的session存储模式
session.save_handler = redis
 
session.save_path=“tcp://127.0.0.1:6379”;

 

如果有多台redis服务器可以设置为:
session.save_path=“tcp://10.10.0.1:6379?weight=4,tcp://10.10.0.2:6379?weight=6”

6 测试

测试php代码

$redis = new Redis();  
$redis->connect(“127.0.0.1","6379");  //php客户端设置的ip及端口  
//存储一个 值  
$redis->set("say","Hello World");  
echo $redis->get("say");     //应输出Hello World  
  
//存储多个值  
$array = array('first_key'=>'first_val',  
          'second_key'=>'second_val',  
          'third_key'=>'third_val');  
$array_get = array('first_key','second_key','third_key');  
$redis->mset($array);  
var_dump($redis->mget($array_get));  

 命令行查看结果

redis-cli.exe
 
keys * 

CentOS下配置php+redis

1. 安装redis服务器

下载redis-server代码并安装

mkdir /tmp/redis
cd /tmp/redis
wget http://download.redis.io/releases/redis-2.8.8.tar.gz
tar xzf redis-*
cd redis-*
 
make
sudo make install clean
 
##copy configure file
mkdir /etc/redis
cp redis.conf /etc/redis/redis.conf

 配置文件示例

#start as a daemon in background
daemonize yes
#set port, by default is 6379
port 6379
#set ip on which daemon will be listening for connections
bind 127.0.0.1
#where to dump database
dir /var/opt

 

检查服务安装位置:

whereis redis-server
#redis-server: /usr/local/bin/redis-serve

 设置redis-server跟随系统启动

 

vi /etc/rc.local
#在exit 0之前插入如下命令
/usr/local/bin/redis-server /etc/redis/redis.conf
#开启服务
redis-server /etc/redis/redis.conf
#连接服务
redis-cli

 

2. 安装php_redis扩展

下载php-redis扩展并安装

 

cd /tmp
wget https://github.com/nicolasff/phpredis/zipball/master -O phpredis.zip
unzip phpredis.zip
cd phpredis-*
phpize
./configure
make && make install

 

3. 配置php.ini

插入redis配置

session.save_handler = redis
session.save_path = "tcp://10.44.64.8:6379"
extension=redis.so

 设置完成。

转载于:https://www.cnblogs.com/philzhou/p/using-redis-to-store-php-session.html

<think>首先,用户的问题是:“我想查找与Spring框架中使用Redis会话管理相关的资料 请问Spring Redis session management configuration”。这翻译成英文是:“I want to find information related to using Redis session management in the Spring framework. Please explain Spring Redis session management configuration.” 根据系统级指令: - 所有行内数学表达式必须使用$...$格式,但这里没有数学内容,所以不需要。 - 独立公式必须使用$$...$$格式并单独成段,但问题不涉及数学公式。 - LaTeX语法正确:确保任何公式都正确。 - 使用中文回答:整个响应必须用中文。 - 生成相关问题:在回答结束时,生成相关问题。 - 回答中引用的段落末尾自然地添加引用标识,例如[^1]。 用户可见层指令: - 回答结构清晰,帮助用户逐步解决问题。 - 尽量保证回答真实可靠。 - 参考站内引用:有多个引用,我需要整合这些信息。 提供的引用: - [^1]: Redisson 提供的 Spring Session 结合的配置和依赖。 - [^2]: Spring Redis Session 存储结构及获取。 - [^3]: Springboot 开发 -- Redis实现分布式Session。 - [^4]: springboot+springsession+redis+zuul实现网关session共享以及zuul的动态配置。 - [^5]: Spring Security +Spring Session Redis+JJWT。 用户的问题是关于Spring Redis session management configuration的,所以我需要专注于配置部分。 结构化回答: 1. **介绍**:简要解释Spring SessionRedis在会话管理中的作用。 2. **配置步骤**:逐步指导如何配置Spring Boot应用使用Redis进行会话管理。 3. **关键组件**:解释涉及的类如`SessionRepositoryFilter`、`RedisHttpSessionConfiguration`。 4. **示例代码**:提供代码片段,使用`$$...$$`格式如果独立。 5. **存储结构**:讨论Redis中会话数据的存储方式。 6. **常见整合**:如与Spring Security或Zuul的整合。 7. **相关问题**:在结束时生成相关问题。 确保回答真实可靠:基于引用和一般知识。 最终输出格式: - 用中文。 - 结束时添加相关问题。 - 引用标识:在引用内容后添加[^n]。 回答大纲: 1. **引言**:解释为什么使用Redis会话管理。 2. **基本配置**: - 添加依赖。 - 配置属性。 - 启用Spring Session。 3. **存储结构**:描述Redis中的键值结构。 4. **高级配置**: - 与Spring Security整合。 - 使用Zuul网关。 5. **示例代码**:提供配置类或属性文件示例。 6. **相关问题**。 生成相关问题: - 基于主题,如优化、性能、错误处理。</think>### Spring Redis Session Management 配置指南 在分布式系统中,使用 Redis 进行会话管理是解决会话共享问题的常见方案。Spring Session 提供了一个抽象层,允许将会话数据存储在外部存储(如 Redis)中,从而实现跨服务器的会话共享。核心原理是 Spring Session 替换了 Servlet 容器的 `HttpSession` 实现,通过 `SessionRepositoryFilter` 拦截请求,将数据持久化到 Redis[^3]。下面我将逐步介绍如何配置 Spring Boot 应用使用 Redis 进行会话管理。 #### 1. **添加依赖** 首先,在 `pom.xml` 文件中添加必要的依赖。Spring SessionRedis 的整合需要 `spring-session-data-redis` 和 Redis 客户端库(如 Lettuce 或 Jedis)。推荐使用 Redisson 作为高级客户端,以简化配置[^1]。 ```xml <dependencies> <!-- Spring Session Redis --> <dependency> <groupId>org.springframework.session</groupId> <artifactId>spring-session-data-redis</artifactId> <version>2.7.0</version> <!-- 使用最新版本 --> </dependency> <!-- Spring Boot Starter Data Redis --> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-data-redis</artifactId> </dependency> <!-- Redisson for advanced features (可选) --> <dependency> <groupId>org.redisson</groupId> <artifactId>redisson-spring-boot-starter</artifactId> <version>3.17.0</version> </dependency> </dependencies> ``` 如果使用 Spring Security,还需添加安全依赖[^5]: ```xml <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-security</artifactId> </dependency> ``` #### 2. **配置 Redis 连接属性** 在 `application.properties` 或 `application.yml` 文件中,设置 Redis 服务器的连接参数。Spring Boot 会自动检测这些属性并创建 `RedisConnectionFactory` 实例。 ```properties # 配置 Redis 主机和端口 spring.redis.host=localhost spring.redis.port=6379 # 可选:设置数据库索引和密码 spring.redis.database=0 spring.redis.password=your_password # 启用 Spring Session 存储类型 spring.session.store-type=redis # 设置会话超时时间(默认 30 分钟) server.servlet.session.timeout=1800 ``` #### 3. **启用 Spring Session** 创建一个配置类来启用 Spring Session。使用 `@EnableRedisHttpSession` 注解自动配置会话存储。这会注册 `RedisHttpSessionConfiguration`,该配置类负责设置 `SessionRepositoryFilter` 和 Redis 操作[^3]。 ```java import org.springframework.context.annotation.Configuration; import org.springframework.session.data.redis.config.annotation.web.http.EnableRedisHttpSession; @Configuration @EnableRedisHttpSession // 启用 Redis 存储会话 public class SessionConfig { // 可选:自定义会话序列化方式或超时设置 } ``` 如果需要自定义 Redis 序列化器(例如使用 JSON 格式),可以添加以下 Bean: ```java @Bean public RedisSerializer<Object> springSessionDefaultRedisSerializer() { return new GenericJackson2JsonRedisSerializer(); // 使用 JSON 序列化 } ``` #### 4. **会话存储结构** 在 Redis 中,会话数据以键值对形式存储。键的格式通常为 `spring:session:sessions:<session-id>`,值包括会话属性和元数据。例如: - `session-id` 存储会话 ID。 - 属性如 `sessionAttr:key` 存储用户数据。 这种结构支持高效查询和过期机制,确保分布式环境下的数据一致性[^2]。 #### 5. **整合 Spring Security** 如果应用涉及认证,Spring Session 可以与 Spring Security 无缝整合。会话中的认证信息(如 JWT)会存储在 Redis 中。配置时,Spring Security 会自动使用 Spring Session 的 `HttpSession` 实现[^5]。 ```java import org.springframework.security.config.annotation.web.builders.HttpSecurity; import org.springframework.security.config.annotation.web.configuration.EnableWebSecurity; import org.springframework.security.config.annotation.web.configuration.WebSecurityConfigurerAdapter; @EnableWebSecurity public class SecurityConfig extends WebSecurityConfigurerAdapter { @Override protected void configure(HttpSecurity http) throws Exception { http .authorizeRequests() .anyRequest().authenticated() .and() .formLogin(); // 会话管理:使用 Redis 存储认证信息 } } ``` #### 6. **网关整合(可选)** 在微服务架构中,可以使用 Zuul 网关实现会话共享。配置 Zuul 路由时,确保所有服务使用相同的 Redis 会话存储[^4]。 ```java import org.springframework.cloud.netflix.zuul.EnableZuulProxy; import org.springframework.context.annotation.Configuration; @Configuration @EnableZuulProxy public class ZuulConfig { // Zuul 自动转发会话,无需额外代码 } ``` #### 常见问题与优化 - **性能问题**:Redis 是内存存储,读写速度快,但需监控内存使用。设置合理的会话超时以减少资源占用[^3]。 - **安全性**:避免在会话中存储敏感数据;使用 HTTPS 和 Redis 密码保护[^5]。 - **错误处理**:如果会话无法保存,检查 Redis 连接或序列化配置。 通过以上步骤,Spring Boot 应用即可实现分布式会话管理。更多细节可参考官方文档或示例代码库[^1][^3]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值