Codeigniter是非常简单好用的PHP框架。Redis是非常流行的分布式缓存服务器框架。这里介绍一下CI框架与Redis相结合,实现数据读取的简单操作。
目录
第三步,将redis库加入到CI框架,实现从CI框架里调用redis。
第一步,开发工具及软件准备:
(1)Codeigniter框架、PHPStudy服务器工具
(2)Redis3.0.5 win64位
(3)Sublimetext编辑器、Chrome浏览器
第二步,CI框架部署、Redis安装部署
(1)CI框架安装部署:下载了PHPStudy后安装在磁盘上,同时启动集成的Apache、SQL服务。将下载的CI框架文件夹放置在phpstudy安装目录内的phptutorial里的www文件夹下,并将CI文件夹名称修改为one(可按照自己意愿来重命名),然后在浏览器上输入127.0.0.1/one,出现欢迎页面即表示部署成功。
(2)Redis安装部署: 下载redis压缩版直接解压缩至本地磁盘(如c盘),然后使用windows自带的命令提示符窗口,进入redis解压缩文件夹,找到redis-server可执行文件,然后执行该文件,即可启动redis服务。
第三步,将redis库加入到CI框架,实现从CI框架里调用redis。
(1)从https://github.com/joelcox/codeigniter-redis下载集成包,并将压缩包解压后,将库文件libraries包里的redis.php直接拷贝至CI框架的system文件夹下libraries里。
(2)将配置文件包config里的redis.php拷贝到CI框架的application文件夹里config配置目录里,其内容如下:
<?php if ( ! defined('BASEPATH')) exit('No direct script access allowed');
/**
* Config for the CodeIgniter Redis library
*
* @see ../libraries/Redis.php
*/
// Default connection group
$config['redis_default']['host'] = 'localhost'; // 主服务器名称
$config['redis_default']['port'] = '6379'; // 默认端口号 6379
$config['redis_default']['password'] = ''; // Can be left empty when the server does not require AUTH
$config['redis_slave']['host'] = ''; //从服务器名称
$config['redis_slave']['port'] = '6379'; //默认端口号
$config['redis_slave']['password'] = '';
同时将配置文件包里的autoload.php里的语句增加到CI框架application文件夹里config配置目录里autoload.php文件中,如下:
$autoload['libraries'] = array('redis');
(3)开始测试redis是否可以启用。
在CI框架控制器目录下添加一个Redis控制器方法, 代码参考如下:
<?php
/**
*
*/
class Redis extends CI_Controller
{
function redisTest(){
$this->load->driver('redis'); //加载redis服务
$array_mset=array(
'username'=>'caojianhua',
'age'=>18); //设置数组内容
$this->redis->mset($array_mset); //以集合方式存入redis
// 读取redis
$arr=$this->redis->mget('username'); //读取键值为username的值
var_dump($arr); //打印出来
}
}
此时在浏览器地址栏输入: http://localhost/one/index.php/Redis/redisTest, 浏览器显示如下:
说明CI操作redis的基本读写都可以了。
第四步应用示例,读取数据库中的数据并存在redis中
页面访问时直接读取redis中的数据,如果redis中有,就读取redis中,如果没有,则读数据库中,同时将数据存入redis中。(这里是手动同步方法,redis与mysql之间同步)
(1)在mysql数据中插入用户列表,通过CI框架model层添加一个all方法读取用户数据,读取后在控制器中将数据返回并存到redis中。这里先使用set集合方法保存,使用sadd方法添加键值对,使用smembers方法读取键对应的内容。
model层User_Model代码如下:
<?php
class User_model extends CI_Model{
public function all(){
$this->load->database(); //记载数据库
$data=$this->db->get('user')->result_array(); //读取user表中所有数据
return $data; //以数组形式返回给控制器
}
?>
然后在控制器Redis中新添加一个方法,用于获取模型层数据并存入redis中。
function redis_insertAsSet(){
$this->load->driver('redis'); //加载redis驱动
$this->load->model('User_model'); //加载数据库
$this->redis->flushdb(); //清除redis现有数据
$userAll=$this->User_model->all(); //获取user_model中all方法返回结果
var_dump($userAll); //打印用户列表数组
foreach ($userAll as $key => $value) {
$this->redis->sadd('username',$value['username']); //将username存入redis
$this->redis->sadd('userpwd',$value['userpwd']); //将userpwd存入redis
$this->redis->sadd('reg_time',$value['reg_time']); //将reg_time存入redis
}
echo '<hr>'; //区分水平线
var_dump($this->redis->smembers('reg_time')); //打印redis中所有reg_time列表
}
浏览器地址栏输入localhost/index.php/one/redis/redis_insertAsSet,回车后获得结果如下:
(2)同样的数据,使用hash表操作式存入redis,然后读取,代码参考如下:
function redis_insertAsHash(){
$this->load->driver('redis');
$this->load->model('User_model');
$this->redis->flushdb();
$userAll=$this->User_model->all();
var_dump($userAll);
$uid=0;
foreach ($userAll as $key => $value) {
$this->redis->hmset("user".$uid,array("username"=>$value['username'],"userpwd"=>$value['userpwd'],"t_time"=>$value['reg_time'])); //以hash表方式存储到redis中
$uid++;
}
echo '<hr>';
var_dump($this->redis->hgetall('user1')); //获取user1的所有信息
}
浏览器地址栏输入localhost/index.php/one/redis/redis_insertAsHash,回车后获得结果如下:
(3)用户登陆实现:在控制器Redis新增一个index方法,加载index.php视图文件,在视图文件中采用表单布局,如下效果:
代码如下:
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Document</title>
<style type="text/css">
fieldset{height: 150px;width: 400px;padding-top: 25px;background: #ffd;font-size: 14px;}
input{margin: 5px;}
</style>
</head>
<body>
<center> <caption>redis用户登陆测试</caption>
<fieldset>
<form action="<?php echo site_url('Redis/login') ?>" method="post" >
用户姓名<input type="text" name="username"><br>
用户密码<input type="password" name="userpwd" ><br><br>
<input type="submit" value="登陆">
</form>
</fieldset>
</center>
</body>
</html>
当在表单两个输入框内输入用户名和密码后点击登陆,将会跳转至redis控制器下的login方法进行处理。处理时调用redis服务器而不是直接去查询数据库,先查询redis服务器中是否存在该用户名,其密码与表单输入的密码是否一致,如果一致就允许登陆,否则就跳转至注册页面或者提示是否输入错误,如下代码:
function login(){ //控制器里的登陆处理方法
$this->load->driver('redis');
$username=$this->input->post('username'); //获取表单输入的用户名
$userpwd=$this->input->post('userpwd'); //获取表单输入的用户密码
$user_exists=$this->redis->hgetall('user:'.$username); //读取redis里所有用户姓名数组
if(in_array($username, $user_exists)){ //判断输入的用户名是否已经存在
$db_password=$this->redis->hget('user:'.$username,'userpwd'); //如果存在,查询redis数据库里当前用户的密码
if($userpwd==$db_password){ //如果输入密码与数据库里密码匹配
$session['username']=$username; //将当前用户名保存到session里
echo 'welcome to my site!';
}else{
echo '密码有误';
}
}else{
echo '用户名不存在';
}
}
此时控制器里的redis_insertAsHash方法需要修改一下redis存储方式:
function redis_insertAsHash(){
$this->load->driver('redis');
$this->load->model('User_model');
$this->redis->flushdb();
$userAll=$this->User_model->all();
foreach ($userAll as $key => $value) {
$this->redis->hmset("user:".$value['username'],array("username"=>$value['username'],"userpwd"=>$value['userpwd'],"t_time"=>$value['reg_time']));
}
}