Redis 介绍

本质上,Redis 是 Key Value 类型的内存数据库,可以支持 String、List、Set、Sorted Set、Hash 等多种类型的数据结构。
Redis 把整个数据全加载内存中进行操作,通过异步操作,定期把数据库 flush 到硬盘上保存。因为是内存操作,所以 Redis 的性能非常出色,每秒处理 10 万次以上的读写操作。

Redis替代文件缓存Session

PHP 默认使用文件储存 Session,效率比较低,Redis 对高并发的支持很好,所以可以使用 Redis 替代文件储存 Session。
更改配置文件 php.ini配置文件的 session.save_hanlder 选项设置为user,否则 session_set_save_hanger 不会生效

PHP 的 session_set_save_handler 函数的作用与使用方法。

  1. open 当 Session 打开时调用此函数,接收两个参数,第一个参数是保持 Session 的路径,第的个参数是 Session 的名字
  2. close 当 Session 操作完成时调用此函数,不接收参数
  3. read 以 SessionID 作为参数,通过 SessionID 从数据储存中取得数据,并且返回此数据,如果数据为空,可以返回一个空的字符串。此函数在调用 session_start之前出发。
  4. destroy 当调用 session_destroy 函数触发 destroy 函数。 只有一个参数 sessionID
  5. gc 当 PHP 执行 Session 垃圾回收机制触发。

编写一个 Session 管理类。代码如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
<?php
class SessionManager
{
private $redis;
private $sessionSavePath;
private $sessionName;
private $sessionExpireTime = 30;

public function __construct()
{
$this->redis = new Redis();
$this->redis->connect('127.0.0.1',6379);
$retval = session_set_save_handler(
array($this,"open"),
array($this,"close"),
array($this,"read"),
array($this,"write"),
array($this,"destroy"),
array($this,"gc"),
);

session_start();
}

public function open($path,$name)
{
return true;
}

public function close()
{
return true;
}

public function read($id)
{
$value = $this->redis->get($id);
if($value){
return $value;
}else{
return '';
}
}

public function write($id,$data)
{
if($this->redis->set($id,$data)){
$this->redis->expire($id,$this->sessionExpireTime);
return true;
}
return false;
}

public function destroy($id)
{
if($this-redis->delete($id)){
return true;
}
return false;
}
}

$handler = new MySessionHandler();
session_set_save_handler(SessionManager, true);
session_start();

参考文档

  1. PHP 核心技术与最佳实践 page 671
  2. PHP官方手册