不用Redis,力软创新开辟新空间(力软不使用redis)
——基于MySQL的分布式session
近年来随着Web互联网技术的快速发展,网站的用户量不断增长,传统的单机结构难以支撑大流量的用户访问,因此有必要将系统架构改为分布式。 在分布式系统中, session管理就成为一个极其重要的环节,其完整性、安全性、可靠性很大程度上影响了系统的正确性。在市面上,Redis 通常被用来做分布式session的存储,而我们的创新不仅仅在做这一块,更是流水线式的开发,开辟了新的空间。
我们基于MySQL搭建了一个分布式session平台,该平台主要实现了:将用户的session分片放到多个MySQL数据库表中,这样存储的容量就大大提升了,多个MySQL可以通过不同的分表策略进行水平拆表,有效提高存储性能; 就算某台服务器宕机,session管理服务器也能自动负责,宕机后用户会话也不会无故隐失。
下面通过一段示例代码展示了一下session平台的实现过程:
// 首先定义一个Session类
class Session{
public $sessionId; public $data; // 可以用于存储用户的会话数据
public $expire; // 会话的有效期}
// 主要包含以下功能:
// 创建一个session实例public static function create($userId)
{ $sessionId = generateId(); // 生成sessionId
$session = new Session($userId,$sessionId); $session->expire = time()+ 60*60*24;//设置过期时间
return $session;}
// 保存session实例public static function save($sessionId)
{ $key = self::genKey($sessionId); // 生成key
$data = self::encode($session); // 编码session值 $hashKey = self::genHashKey($key);// 计算hashKey
//将编码后的session值添加到数据库 $db->add($hashKey,$key,$data);
}
// 获取session实例public static function get($sessionId)
{ $key = self::genKey($sessionId); // 生成key
$hashKey = self::genHashKey($key);// 计算hashKey // 从数据库中获取session值
$data = $db->get($hashKey,$key); $session = self::decode($data); // 解码session值
return $session;}
基于MySQL的分布式session在性能上面也有很优异的表现,它的写入性能和读取性能和Redis都有很大的提升,因为MySQL具有优良的索引结构,可以使性能更好。
此外, 我们还提供了其它一些优化,比如让用户自定义session失效时间,用户动态更改session,session管理异步化等,通过一定的重构,可以使得用户体验得到极大的提升。
通过上面的介绍,我们可以看到,力软创新不仅仅只是研发Redis在分布式session管理中的技术,还深入研究分析和结合MySQL,开发出基于MySQL的分布式session的技术,大大的提高了系统的安全性和稳定性,让用户使用更安全、更便捷。
相关文章