我的环境:win7 64位 + phpstudy php5.6 + CI3.x
如果您想让CI支持redis缓存,需要在服务器上进行下列步骤。
需要下载的东西:redis windows安装包 PHP5.6 redis的dll扩展
redis windows安装包:我下载的是 64位 Redis-x64-3.2.100.msi ,如果32位的操作系统请下载32位。https://github.com/MicrosoftArchive/redis/releases
如果想设置连接密码什么的,可以参看:https://blog.csdn.net/hwjcmozw/article/details/77940852
用记事本或者Notepad++打开redis.windows.conf并找到“# requirepass foobared”这一行,在这一行下面增加一行“requirepass 你的密码”
cmd命令转入Redis的安装目录,并输入redis-server redis.windows.conf
PHP5.6 redis的dll扩展:https://pecl.php.net/package/redis/2.2.7/windows 【其他版本:https://pecl.php.net/package/redis】
关键点:NTS X86[可以打开Phpinfo()来查看一下,因为很多套件的Php都是32位的]
服务器php.ini修改:将下载的文件解压,然后将 php_redis.dll 放到php的ext目录,并且修改php.ini 增加extension = php_redis.dll
重启 web服务器【是物理重启,不是重启web套件】,然后用phpinfo()函数看一下phpinfo中redis扩展是否启用。
CI如何使用redis?
1、在Application/config 目录下新建redis.php文件,内容大致如下:
<?php
defined('BASEPATH') OR exit('No direct script access allowed');
$config['socket_type'] = 'tcp'; //`tcp` or `unix`
$config['socket'] = '/var/run/redis.sock'; // in case of `unix` socket type
$config['host'] = '127.0.0.1';
$config['password'] = NULL;
$config['port'] = 6379;
$config['timeout'] = 0; //redis过期时间,秒,0为永不过期
1
2
3
4
5
6
7
8
9
10
<?php
defined('BASEPATH')ORexit('No direct script access allowed');
$config['socket_type']='tcp';//`tcp` or `unix`
$config['socket']='/var/run/redis.sock';// in case of `unix` socket type
$config['host']='127.0.0.1';
$config['password']=NULL;
$config['port']=6379;
$config['timeout']=0;//redis过期时间,秒,0为永不过期
2、程序中的应用:
//加载redis驱动
$this->load->driver('cache');
//然后直接使用方法
例如:$this->cache->redis->is_supported(); //是否支持redis
$this->cache->redis->save('key','value'); //保存redis键值
相应的方法链接:http://codeigniter.org.cn/user_guide/libraries/caching.html#redis
3、自行扩展CI的redis类
在实际的应用中,CI的缓存方法太少,不能发挥redis的效率。所以需要对CI的redis库进行重写。本来以为直接扩展extends CI_Cache_redis类可以,经过测试,发现不行。
于是重写了CI的redis类。
方法:
A、在Appliction/libraries 下新建类文件 CI_Cache_redis.php
B、复制\system\libraries\Cache\drivers\Cache_redis.php的内容到CI_Cache_redis.php
示例:新增redis方法到新建的类里:
/**
* Redis Lrange 返回列表中指定区间内的元素,区间以偏移量 START 和 END 指定。
* 其中 0 表示列表的第一个元素, 1 表示列表的第二个元素,以此类推。
* 你也可以使用负数下标,以 -1 表示列表的最后一个元素, -2 表示列表的倒数第二个元素,以此类推。
* @param string $key
* @param int $start
* @param int $end
* @return array
*/
public function lrange($key = '',$start = 0,$end = -1)
{
return $this->_redis->lRange($key,$start,$end);
}
C、可以参考redis的命令,进行扩展。 这个方法可以参看CI的文档:http://codeigniter.org.cn/user_guide/general/creating_libraries.html 中有关 使用你自己的类库替换原生类库 部分
D、使用自己替换的原生类库进行操作示例:
$this->load->library('CI_Cache_redis');
if($this->cache->redis->is_supported()) {
$this->redis = new CI_Cache_redis();
}
$this->redis->clean();// 清除数据库
$new = array(
'第一' => 'one',
'第二' => 'two'
);
$new1 = array(
'第3' => 'one',
'第4' => 'two'
);
$this->redis->rpush('a1',json_encode($new,JSON_UNESCAPED_UNICODE));
$this->redis->rpush('a1',json_encode($new1,JSON_UNESCAPED_UNICODE));
var_dump($this->redis->lrange('a1'));// 返回list中a1的所有值
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
//加载redis驱动
$this->load->driver('cache');
//然后直接使用方法
例如:$this->cache->redis->is_supported();//是否支持redis
$this->cache->redis->save('key','value');//保存redis键值
相应的方法链接:http://codeigniter.org.cn/user_guide/libraries/caching.html#redis
3、自行扩展CI的redis类
在实际的应用中,CI的缓存方法太少,不能发挥redis的效率。所以需要对CI的redis库进行重写。本来以为直接扩展extendsCI_Cache_redis类可以,经过测试,发现不行。
于是重写了CI的redis类。
方法:
A、在Appliction/libraries下新建类文件CI_Cache_redis.php
B、复制\system\libraries\Cache\drivers\Cache_redis.php的内容到CI_Cache_redis.php
示例:新增redis方法到新建的类里:
/**
* Redis Lrange 返回列表中指定区间内的元素,区间以偏移量 START 和 END 指定。
* 其中 0 表示列表的第一个元素, 1 表示列表的第二个元素,以此类推。
* 你也可以使用负数下标,以 -1 表示列表的最后一个元素, -2 表示列表的倒数第二个元素,以此类推。
* @param string $key
* @param int $start
* @param int $end
* @return array
*/
publicfunctionlrange($key='',$start=0,$end=-1)
{
return$this->_redis->lRange($key,$start,$end);
}
C、可以参考redis的命令,进行扩展。这个方法可以参看CI的文档:http://codeigniter.org.cn/user_guide/general/creating_libraries.html 中有关 使用你自己的类库替换原生类库 部分
D、使用自己替换的原生类库进行操作示例:
$this->load->library('CI_Cache_redis');
if($this->cache->redis->is_supported()){
$this->redis=newCI_Cache_redis();
}
$this->redis->clean();// 清除数据库
$new=array(
'第一'=>'one',
'第二'=>'two'
);
$new1=array(
'第3'=>'one',
'第4'=>'two'
);
$this->redis->rpush('a1',json_encode($new,JSON_UNESCAPED_UNICODE));
$this->redis->rpush('a1',json_encode($new1,JSON_UNESCAPED_UNICODE));
var_dump($this->redis->lrange('a1'));// 返回list中a1的所有值