博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
codeigniter的Redis使用
阅读量:4209 次
发布时间:2019-05-26

本文共 10609 字,大约阅读时间需要 35 分钟。

Redis的配置和简单使用1:

1.system/config/redis.php:

  1. ./application/config/config.php:
require_once(BASEPATH . "config/redis.php");

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

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(protected $valid_drivers = array(		'apc',		'dummy',		'file',		'memcached',		'redis',		'wincache'	);修改:/**	 * Reference to the driver	 *	 * @var mixed	 */	//protected $_adapter = 'dummy';    protected $_adapter = 'redis'; // change by wuyongyu	/**	 * Fallback driver	 *	 * @var string	 */	//protected $_backup_driver = 'dummy';    protected $_backup_driver = 'redis'; // change by wuyongyu

//添加:

public function get_redis(){    if($this->_adapter == 'redis'){        return $this->{$this->_adapter}->get_redis();    }    return false;}

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

* @link */class CI_Cache_redis extends CI_Driver{ /** * Default config * * @static * @var array */ protected static $_default_config = array( 'socket_type' => 'tcp', 'host' => '127.0.0.1', 'password' => 'adasadsa', // NULL change by wuyongyu 'port' => 6379, 'timeout' => 0 ); /** * Redis connection * * @var Redis */ protected $_redis; /** * An internal cache for storing keys of serialized values. * * @var array */ protected $_serialized = array(); // ------------------------------------------------------------------------ /** * Get cache * * @param string Cache ID * @return mixed */ public function get($key) { $value = $this->_redis->get($key); if ($value !== FALSE && isset($this->_serialized[$key])) { return unserialize($value); } return $value; } // ------------------------------------------------------------------------ /** * 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) { if (is_array($data) OR is_object($data)) { if ( ! $this->_redis->sIsMember('_ci_redis_serialized', $id) && ! $this->_redis->sAdd('_ci_redis_serialized', $id)) { return FALSE; } isset($this->_serialized[$id]) OR $this->_serialized[$id] = TRUE; $data = serialize($data); } elseif (isset($this->_serialized[$id])) { $this->_serialized[$id] = NULL; $this->_redis->sRemove('_ci_redis_serialized', $id); } return ($ttl) ? $this->_redis->setex($id, $ttl, $data) : $this->_redis->set($id, $data); } // ------------------------------------------------------------------------ /** * Delete from cache * * @param string Cache key * @return bool */ public function delete($key) { if ($this->_redis->delete($key) !== 1) { return FALSE; } if (isset($this->_serialized[$key])) { $this->_serialized[$key] = NULL; $this->_redis->sRemove('_ci_redis_serialized', $key); } return TRUE; } // ------------------------------------------------------------------------ /** * 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->incr($id, $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->decr($id, $offset); } // ------------------------------------------------------------------------ /** * Clean cache * * @return bool * @see Redis::flushDB() */ public function clean() { return $this->_redis->flushDB(); } // ------------------------------------------------------------------------ /** * Get cache driver info * * @param string 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 Cache key * @return array */ public function get_metadata($key) { $value = $this->get($key); if ($value) { return array( 'expire' => time() + $this->_redis->ttl($key), 'data' => $value ); } return FALSE; } // ------------------------------------------------------------------------ /** * Check if Redis driver is supported * * @return bool */ public function is_supported() { if ( ! extension_loaded('redis')) { log_message('debug', 'The Redis extension must be loaded to use Redis cache.'); return FALSE; } return $this->_setup_redis(); } // ------------------------------------------------------------------------ /** * Setup Redis config and connection * * Loads Redis config file if present. Will halt execution * if a Redis connection can't be established. * * @return bool * @see Redis::connect() */ protected function _setup_redis() { $config = array(); $CI =& get_instance(); if ($CI->config->load('redis', TRUE, TRUE)) { $config += $CI->config->item('redis'); } $config = array_merge(self::$_default_config, $config); $this->_redis = new Redis(); //log_message('error',$config); try { if ($config['socket_type'] === 'unix') { $success = $this->_redis->connect($config['socket']); } else // tcp socket { $success = $this->_redis->connect($config['host'], $config['port'], $config['timeout']); } if ( ! $success) { log_message('debug', 'Cache: Redis connection refused. Check the config.'); return FALSE; } } catch (RedisException $e) { log_message('debug', 'Cache: Redis connection refused ('.$e->getMessage().')'); return FALSE; } if (isset($config['password'])) { $this->_redis->auth($config['password']); } // Initialize the index of serialized values. $serialized = $this->_redis->sMembers('_ci_redis_serialized'); if ( ! empty($serialized)) { $this->_serialized = array_flip($serialized); } return TRUE; } // ------------------------------------------------------------------------ /** * Class destructor * * Closes the connection to Redis if present. * * @return void */ public function __destruct() { if ($this->_redis) { $this->_redis->close(); } } public function get_redis(){ return $this->_redis; }}

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

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

二. Redis 实际使用

使用redis 对数据库请求进行缓存.
~示例~:

1 . 控制器中:****

$this->load->model("user"); //初始化$this->load->library( 'cache_mgr' ); //引用cache_mgr库文件/*get_cache有四个参数:get_cache(key, model里面的方法, 参数数组, 缓存的时长),且get_cache方法不仅仅可以取缓存,如果没有缓存就执行model里面的方法,并且缓存。*/	$this->cache_mgr = new CacheMgr();    $data = $this->cache_mgr->get_cache($key, array($this->user, 'get_user'), array('age' => $age), 60 * 60);}

application/libraries/CacheMgr里面的库文件:

_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; } }}

转载地址:http://xdwmi.baihongyu.com/

你可能感兴趣的文章
StringJoiner源码学习
查看>>
Python获取股票历史数据
查看>>
线程池ShutDown和ShowDownNow区别
查看>>
线程池参数详解
查看>>
ThreadLocal学习笔记(二)
查看>>
nginx被动检测
查看>>
SpringBoot源码学习(一)
查看>>
Actuator与服务监控
查看>>
SpringBoot源码学习(三)
查看>>
springboot源码解析(四)
查看>>
CompletionService实践
查看>>
Docker学习笔记[nginx]
查看>>
SpringBoot源码学习(五)
查看>>
SpringBoot源码学习(二)
查看>>
SpringBoot源码学习(六)
查看>>
Arthas学习笔记
查看>>
Java8基础学习(一)- Founction接口
查看>>
YApi在Window上离线安装笔记
查看>>
SpringBoot源码学习(七)
查看>>
SpringBoot源码学习(十一) - bean的实例化过程
查看>>