如何保证session的一致性session.save

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了如何保证session的一致性session.save相关的知识,希望对你有一定的参考价值。

php的在页面载入时或调用session_start()时从数据源中读取session数据到$_SESSION变量。
当页面执行完毕或调用session_write_close()时把$_SESSION变量写入数据源。

php默认的session.save_handler=files,可以通过文件锁来实现读写同步,保证session数据的一致性,不会产生问题。然而当使用sqlite作为session handler时,由于没有同步机制,会产生bug。如下代码:

test1.php

PHP code?

session_start();
$_SESSION[\'data1\'] = \'data1\';
sleep(10);
session_write_close();

test2.php

PHP code?

session_start();
$_SESSION[\'data2\'] = \'data2\';
session_write_close();

在同一浏览器进程里(保证使用相同的session_id),先访问test1.php,再访问test2.php,会发现data2根本没有写入sqlite数据库中。session.save_handler=memcache还没有测试,估计也有这个问题。如果采用默认的files handler会发现test2.php的请求会被挂起直至test1.php执行完毕,这就是文件锁同步机制造成的。

我想到了两种解决方案:
1、实现互斥锁,保证同一session_id访问session数据是同步的,这样会产生一个阻塞的问题(php默认的session实现也会有这个问题)。
2、写入session数据时进行数据合并,不过这样仍然不能完全保证数据一致性。
参考技术A php的在页面载入时或调用session_start()时从数据源中读取session数据到$_SESSION变量。
当页面执行完毕或调用session_write_close()时把$_SESSION变量写入数据源。

php默认的session.save_handler=files,可以通过文件锁来实现读写同步,保证session数据的一致性,不会产生问题。然而当使用sqlite作为session handler时,由于没有同步机制,会产生bug。如下代码:

test1.php

PHP code?

session_start();
$_SESSION['data1'] = 'data1';
sleep(10);
session_write_close();

test2.php

PHP code?

session_start();
$_SESSION['data2'] = 'data2';
session_write_close();

在同一浏览器进程里(保证使用相同的session_id),先访问test1.php,再访问test2.php,会发现data2根本没有写入sqlite数据库中。session.save_handler=memcache还没有测试,估计也有这个问题。如果采用默认的files handler会发现test2.php的请求会被挂起直至test1.php执行完毕,这就是文件锁同步机制造成的。

我想到了两种解决方案:
1、实现互斥锁,保证同一session_id访问session数据是同步的,这样会产生一个阻塞的问题(php默认的session实现也会有这个问题)。
2、写入session数据时进行数据合并,不过这样仍然不能完全保证数据一致性。
参考技术B 开启事务,在事务内进行处理。 参考技术C 不知道 怎么回答 参考技术D 不知道是什么啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊

分布式部署

 一:分布式架构和部署

1:如何进行分布式部署
2:系统拆分后,模块之间如何相互调用
3:如何进行统一的会话(Session)管理
4:如何实现单点登录
5:如何保证一致性更新
6:如何规划和处理分布式事务
7:如何对重要服务实现HA
二:高并发和Web层的性能优化
1:高并发的处理
2:Nginx的优化,Varnish的配置和优化
3:Web层的缓存和静态化
4:Web层的性能优化,基本原理、各种优化的手段
5:Tomcat集群和MSM
6:如何处理动态、实时内容
三:逻辑层处理和性能优化
1:Redis快速上手
2:缓存规划和Memcashed集群(使用magent)
3:异步规划和集群,以及优化
4:纯内存操作,应对复杂业务逻辑,比如:库存的查询和修改
5:如何处理高并发的业务
四:数据层处理和性能优化
1:大数据量的处理
2:MySQL的分区
3:如何分库
4:如何分表
5:应用MySQL Fabric
五:数据库优化(这个内容太多了,会专门开设另外的课程来讲)
1:MySQL的主从集群和读写分离
2:Galera for MySQL的集群
3:MySQL的HA和负载均衡
4:SQL优化的方法
5:MySQL常见的优化配置
6:NoSQL的应用

1.什么是分布式系统 

通俗点说:就是能把系统进行拆分并部署到多台服务器上的系统。(注意区分分层和集群)
专业点说:分布式软件系统(Distributed Software Systems)是支持分布式处理的软件系统,是在由网络互联的多处理机体系结构上执行任务的系统。常见的有:分布式操作系统、分布式程序设计语言及其编译(解释)系统、分布式文件系统、分布式数据库系统、分布式应用系统等。  

2.为何需要分布式
单台服务器已经无法承受访问压力
大数据处理
高并发访问
高可用性,自动容错
并行、高性能应用
……

3.分布式系统的特点
1):面对高并发、大数据量的处理要求
2):高可扩展性(可伸缩)
3):高性能
4):异构:操作系统、硬件、程序语言等
5):同步、异步操作混杂
6):安全性:授权认证、SSO单点登录、Oauth等
7):透明性,如:访问透明、位置透明、并发透明、故障透明、伸缩透明等

4.分布式系统的缺点
1):相互调用不便
2):网络通信的可靠性
3):网络传输数据的安全问题
4):系统开发更复杂
5):测试困难 

5.什么是分布式部署
简单点说:就是把程序或数据,分散部署到多台物理服务器上,但他们组合起来,形成一个整体对外提供服务。 

6.分布式架构部署的演变 

1.1台服务器的最简部署 

技术分享图片

比如我们在自己的电脑上跑一个项目!web服务器和数据库服务器都是在同一台物理机器上!

2.分离Web服务器和数据库服务器 

技术分享图片

 

3.水平增加Web服务器,加入Varnish(请求很多,一台web服务器不够了) 
在一台服务器上起多台web服务器,或者增加硬件

技术分享图片

 

4.加入分布式的文件系统 
系统有大量的图片,文件等

技术分享图片

 

5.加入缓存服务(有大量的读取数据库中数据的情况) 

技术分享图片

 

6.MySql数据库的主从集群、读写分离 

技术分享图片

 

7.继续水平增加Web服务器,加入Nginx 

技术分享图片

 

8.按业务进行缓存分离,缓存集群 

技术分享图片

 

9.加入消息系统,进行异步处理

10.对重要的节点进行HA集群,或者是双机热备,以保障可用性 
分布式部署给开发带来的问题 
分布式部署会带来很多问题,有很多在开发期间就要考虑到,比如:
1:各个拆分开的模块间如何相互调用
2:单点登录
3:会话的统一管理
4:一致性更新
5:分布式事务
6:关键服务的可用性保障



































































以上是关于如何保证session的一致性session.save的主要内容,如果未能解决你的问题,请参考以下文章

程序员应该如何设计更优雅的Token认证方式?

分布式部署

聊聊 Kafka:Kafka 如何保证一致性

如何保证两端时间一致性

MySQL metadata lock

如何保证solr跟数据库的数据一致性