一、Redis的配置和简单使用1:

1. ./config/redis.php:

<?php
$config['redis_host'] = '127.0.0.1';
$config['redis_port'] = '6379';
$config['redis_isopen'] = true;

2. ./config/config.php:

require_once(APPPATH . "config/redis.php");

3. ./application/libraries/RedisService.php:

<?php
class RedisService{
public $CI;
public $redis;
public function __construct()
{
$this->CI = & get_instance();
$this->CI->load->driver('cache', array('adapter' => 'redis'));
$this->redis = $this->CI->cache->get_redis();
$this->cache = $this->CI->cache;
}
}

4../system/libraries/Cache/Cache.php:

//修改:
protected $valid_drivers = array(
'cache_apc', 'cache_file', 'cache_memcached', 'cache_dummy', 'cache_redis'
); //添加:
public function get_redis(){
if($this->_adapter == 'redis'){
return $this->{$this->_adapter}->get_redis();
}
return false;
}

5. ./system/libraries/Cache/drivers/Cache_redis.php:

<?php
/**
* CodeIgniter
*
* An open source application development framework for PHP
*
* This content is released under the MIT License (MIT)
*
* Copyright (c) 2014 - 2016, British Columbia Institute of Technology
*
* Permission is hereby granted, free of charge, to any person obtaining a copy
* of this software and associated documentation files (the "Software"), to deal
* in the Software without restriction, including without limitation the rights
* to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
* copies of the Software, and to permit persons to whom the Software is
* furnished to do so, subject to the following conditions:
*
* The above copyright notice and this permission notice shall be included in
* all copies or substantial portions of the Software.
*
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
* AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
* OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
* THE SOFTWARE.
*
* @package CodeIgniter
* @author EllisLab Dev Team
* @copyright Copyright (c) 2008 - 2014, EllisLab, Inc. (https://ellislab.com/)
* @copyright Copyright (c) 2014 - 2016, British Columbia Institute of Technology (http://bcit.ca/)
* @license http://opensource.org/licenses/MIT MIT License
* @link https://codeigniter.com
* @since Version 3.0.0
* @filesource
*/
defined('BASEPATH') OR exit('No direct script access allowed'); /**
* CodeIgniter Redis Caching Class
*
* @package CodeIgniter
* @subpackage Libraries
* @category Core
* @author Anton Lindqvist <anton@qvister.se>
* @link
*/
class CI_Cache_redis extends CI_Driver{
/**
* Default config
*
* @static
* @var array
*/
protected static $_default_config = array(
'host' => '10.19.108.196',
'password' => 'datu@com',
'port' => 6379,
'timeout' => 0
); /**
* Redis connection
*
* @var Redis
*/
protected $_redis; // ------------------------------------------------------------------------ /**
* Class constructor
*
* Setup Redis
*
* Loads Redis config file if present. Will halt execution
* if a Redis connection can't be established.
*
* @return void
* @see Redis::connect()
*/
public function __construct(){
if ( ! $this->is_supported()){
log_message('error', 'Cache: Failed to create Redis object; extension not loaded?');
return;
} $CI =& get_instance(); // 读取配置文件
$config_all = get_config();
$config['host'] = $config_all['redis_host'];
$config['port'] = $config_all['redis_port'];
// $config['password'] = $config_all['redis_pwd'];
$config['timeout'] = 0; $this->_redis = new Redis(); try{
if ( ! $this->_redis->connect($config['host'], ($config['host'][0] === '/' ? 0 : $config['port']), $config['timeout'])){
log_message('error', 'Cache: Redis connection failed. Check your configuration.');
} if (isset($config['password']) && ! $this->_redis->auth($config['password'])){
log_message('error', 'Cache: Redis authentication failed.');
}
}
catch (RedisException $e){
log_message('error', 'Cache: Redis connection refused ('.$e->getMessage().')');
}
} // ------------------------------------------------------------------------ /**
* Get cache
*
* @param string $key Cache ID
* @return mixed
*/
public function get($key){
$data = $this->_redis->hMGet($key, array('__ci_type', '__ci_value')); if (!$data['__ci_type']) $data['__ci_type'] = 'integer'; if ( ! isset($data['__ci_type'], $data['__ci_value']) OR $data['__ci_value'] === FALSE){
return FALSE;
} switch ($data['__ci_type']){
case 'array':
case 'object':
return unserialize($data['__ci_value']);
case 'boolean':
case 'integer':
case 'double': // Yes, 'double' is returned and NOT 'float'
case 'string':
case 'NULL':
return settype($data['__ci_value'], $data['__ci_type'])
? $data['__ci_value']
: FALSE;
case 'resource':
default:
return FALSE;
}
} // ------------------------------------------------------------------------ /**
* Save cache
*
* @param string $id Cache ID
* @param mixed $data Data to save
* @param int $ttl Time to live in seconds
* @param bool $raw Whether to store the raw value (unused)
* @return bool TRUE on success, FALSE on failure
*/
public function save($id, $data, $ttl = 60, $raw = FALSE){
switch ($data_type = gettype($data)){
case 'array':
case 'object':
$data = serialize($data);
break;
case 'boolean':
case 'integer':
case 'double': // Yes, 'double' is returned and NOT 'float'
case 'string':
case 'NULL':
break;
case 'resource':
default:
return FALSE;
} if ( ! $this->_redis->hMSet($id, array('__ci_type' => $data_type, '__ci_value' => $data))){
return FALSE;
}elseif ($ttl){
$this->_redis->expireAt($id, time() + $ttl);
} return TRUE;
} // ------------------------------------------------------------------------ /**
* Delete from cache
*
* @param string $key Cache key
* @return bool
*/
public function delete($key){
return ($this->_redis->delete($key) === 1);
} // ------------------------------------------------------------------------ /**
* Increment a raw value
*
* @param string $id Cache ID
* @param int $offset Step/value to add
* @return mixed New value on success or FALSE on failure
*/
public function increment($id, $offset = 1){
return $this->_redis->hIncrBy($id, '__ci_value', $offset);
} // ------------------------------------------------------------------------ /**
* Decrement a raw value
*
* @param string $id Cache ID
* @param int $offset Step/value to reduce by
* @return mixed New value on success or FALSE on failure
*/
public function decrement($id, $offset = 1){
return $this->_redis->hIncrBy($id, '__ci_value', -$offset);
} // ------------------------------------------------------------------------ /**
* Clean cache
*
* @return bool
* @see Redis::flushDB()
*/
public function clean(){
return $this->_redis->flushDB();
} // ------------------------------------------------------------------------ /**
* Get cache driver info
*
* @param string $type Not supported in Redis.
* Only included in order to offer a
* consistent cache API.
* @return array
* @see Redis::info()
*/
public function cache_info($type = NULL){
return $this->_redis->info();
} // ------------------------------------------------------------------------ /**
* Get cache metadata
*
* @param string $key Cache key
* @return array
*/
public function get_metadata($key){
$value = $this->get($key); if ($value !== FALSE){
return array(
'expire' => time() + $this->_redis->ttl($key),
'data' => $value
);
} return FALSE;
} // ------------------------------------------------------------------------ /**
* Check if Redis driver is supported
*
* @return bool
*/
public function is_supported(){
return extension_loaded('redis');
} // ------------------------------------------------------------------------ /**
* return redis
*
* @return redis
*/
public function get_redis(){
return $this->_redis;
} // ------------------------------------------------------------------------ /**
* Class destructor
*
* Closes the connection to Redis if present.
*
* @return void
*/
public function __destruct(){
if ($this->_redis){
$this->_redis->close();
}
}
}

6. 控制器中就可以使用啦:

//初始化:
$this->load->library('redisservice');
$this->redis = new RedisService; //使用:
$this->redis->redis->set('name', 'chenjian');
$this->redis->redis->get('name');

二、Redis的实际使用2:

对于一个数据的请求,一般情况下controller中接收参数$this->input->get('date'),然后通过参数请求model里面的方法从而得到数据返回,这一层可以做缓存:

~示例~:

  1. 控制器中:****
$this->load->model("user"); //初始化
$this->load->library( 'cache_mgr' ); //引用cache_mgr库文件
function user_list(){
$age = $this->input->get('age');
$key = sprintf('2017-01-12-%s', $age); //利用日期+年龄组成一个key。
/*
get_cache有四个参数:get_cache(key, model里面的方法, 参数数组, 缓存的时长),且get_cache方法不仅仅可以取缓存,如果没有缓存就执行model里面的方法,并且缓存。
*/
$data = $this->cache_mgr->get_cache($key, array($this->user, 'get_user'), array('age' => $age), 60 * 60);
}
  1. library里面的库文件:
<?php
class cache_mgr{
protected static $redis;
protected $host;
protected $port;
protected $pwd;
protected $is_open; private $_config = array(); public function __construct(){
$this->_config = get_config();
$this->host = $this->_config['redis_host'];
$this->port = $this->_config['redis_port'];
$this->is_open = $this->_config['redis_isopen'];
$this->pwd = $this->_config['redis_pwd']; if (! $this->is_open) {
self::$redis = null;
} elseif (! self::$redis)
$this->connect ();
} /**
*
* @return cache_mgr
*/
static function get_instance(){
$ci = get_instance ();
$var = __CLASS__;
return $ci->$var;
} /**
* 返回当前rediscache服务器是否有效
*
* @return boolean
*/
public function is_connected(){
return self::$redis ? true : false;
} /**
* 连接rediscache
*/
private function connect(){
self::$redis = new Redis();
if (! @self::$redis->connect ( $this->host, $this->port )) {
self::$redis = null;
// echo "not redis";
} else {
self::$redis->auth($this->pwd);
}
} /**
* 前端代码读写缓存。所有前端代码只能用这个方法来写缓存
*
* @param string $key 键值,可为数组array(group值,键值),group值可以用做批量删除
* @param callback $function
* @param array $params
* @param int $expire
* @return mixed
*/
public function get_cache($key, $function, $params = array(), $expire = 0){
// 如果缓存没有开
if (! self::$redis) {
return call_user_func_array ( $function, $params );
}
$rs = $this->get ( $key );
if (! $rs) {
$rs = call_user_func_array ( $function, $params );
if (! $rs) $expire = 5 * 60;
$this->save( $key, $rs, $expire );
}
return $rs;
} /**
* 要清除的缓存
*
* @param string $key
*/
public function clear($key){
return self::$redis ? self::$redis->delete ( $key ) : false;
} /**
* Get cache
*
* @param string $key Cache ID
* @return mixed
*/
public function get($key){
$data = self::$redis->hMGet($key, array('__ci_value'));
if ( ! isset($data['__ci_value']) OR $data['__ci_value'] === FALSE){
return FALSE;
}
return unserialize($data['__ci_value']);
} /**
* 生成缓存,通常用于后台
*
* @param string $key
* @param string $value
* @param int $ttl 过期秒数,为0时永不过期
* @return bool
*/
public function save($key, $value, $ttl = 60, $raw = FALSE){
if ( ! self::$redis->hMSet($key, array('__ci_value' => serialize ($value)))){
return FALSE;
}elseif ($ttl){
self::$redis->expireAt($key, time() + $ttl);
}
return TRUE;
} /**
* 加法,只能对数值型缓存使用,对 key 的值做++操作,并返回
*
* @param string $key
* @param int $value
*/
public function increment($key, $offset = 1){
return self::$redis ? self::$redis->hIncrBy($key, 'data', $offset) : false;
} /**
* 减法,只能对数值型缓存使用,对 key 的值做--操作,并返回
*
* @param string $key
* @param int $value
*/
function decrement($key, $offset = 1){
return self::$redis ? self::$redis->hIncrBy($key, 'data', -$offset) : false;
} /**
* 关闭rides
*
* @param string $key
* @param int $value
*/
public function close(){
if (self::$redis) {
return self::$redis->close ();
self::$redis = null;
}
} }

最新文章

  1. linux下添加环境变量
  2. ES6与ES5差别
  3. fuse进级
  4. oracle存储过程--导出数据库表的说明文档
  5. 【转载】eclipse调试arm裸机程序
  6. SQL Server 2008数据库重命名方法
  7. 在linux下安装memcacheq
  8. [wikioi]乘积最大
  9. 重置出错?微软Win10平板Surface Pro 4重装系统教程详解
  10. UVAlive 2519 Radar Installation (区间选点问题)
  11. HTML DOM的nodeName,nodeValue,nodeType介绍
  12. [BZOJ]1045 圆上的整点(HAOI2008)
  13. linux装tomcat遇到的坑
  14. [Dynamics 365] 关于Currency的一点随笔
  15. tips:解决bootstrap-switch 在jqgrid中动态加载不显示的问题
  16. UVa 11292 Dragon of Loowater (水题,排序)
  17. OpenCV学习(25) 直方图(2)
  18. html Canvas 画图 能够选择并能移动
  19. bug 调试
  20. HUAS 1483 mex(莫队算法)

热门文章

  1. 统计单词数(WordCount)
  2. js正则匹配过滤 特殊字符
  3. MySQL模糊搜索的四种用法
  4. 第四章 --- 关于Javascript 设计模式 之 迭代器模式
  5. 记一次Suse下的Django环境配置——第一弹
  6. 关于在vs2010中编译Qt项目时出现“无法解析的外部命令”的错误
  7. MVC-命名空间“System.Web.Mvc”中不存在类型或命名空间名称“Html”(是否缺少程序集引用?)
  8. expect实现自动登录
  9. windows XP上实现python2.7.5和python3.4.3共存
  10. Sql Server函数全解&lt;三&gt;数据类型转换函数和文本图像函数