PHP网站redis缓存方式分析

作者:Wucl

时间:2014-02-05

章节内容:基础背景、分析内容、个人心得(这个人非常没品德,想到什么就写什么。)。

1. 基础背景:

为了提高页面访问速度,降低访问数据库压力。

2. Redis缓存分析:

首先提出3个问题:

1)是否缓存整个网站中间件的数据?

2)如果缓存整个中间件的数据redis是否可以承压?

3)PHP缓存redis是否会对中间件的缓存方式存在影响?

现有两种预案:

A方案:缓存时间较短,一般为120s以内,

B方案:缓存时间较长,一般为84600s。

A方案

开发角度:缓存操作比较频繁,但可以分担中间件部分的压力。

编辑角度:编辑数据后至多2-3分钟看到效果,因此可以不用通过操作清除缓存。

用户角度:假设以10分钟为一个时间段,那么在这个时间段里面页面加载表现为时快时慢。

B方案

开发角度:缓存不频繁,可以分担中间件很大部分的压力,建议用这个方式。

编辑角度:编辑后必须通过特定的操作清除以前的缓存。

用户角度:页面加载速度稳定且较快。

缓存与现有项目关联:

1) Redis建立连接(使用长连接):

pconnect: 类的静态变量

private static function getRedisObject($ip = ‘127.0.0.1‘, $port = ‘6379‘){

try{

if(isset(static::$pconnect[‘redis‘.$ip.$port])){

$redis = static::$pconnect[‘redis‘.$ip.$port];

}else{

$redis = new Redis();

$redis->pconnect($ip,$port);

$redis->select(1);

static::$pconnect[‘redis‘] = $redis;

}

try{

$redis->ping();

}catch(\RedisException $e){

$redis->pconnect($ip,$port);

$redis->select(1);

static::$pconnect[‘redis‘] = $redis;

}

}catch(\RedisException $e){

echo $e->getMessage().‘<br>‘;

}

return $redis;

}

2) 主要应用3个method:

$conn->delete ( $key )

$conn->get($key)

$conn->setex ( $key, $expire, $data )

3) 注意异常RedisException

4) 主从同步只要做一个操作:

从redis.conf修改slaveof类似为:

slaveof 127.0.0.1 6379

5) 可以master redis做添加、修改,slave redis做查询。链接阻塞以sleep解决,下列是实际项目的链接方式(参数不多做解释):

private function redisConn(){

if(!empty(static::$memInstance[‘redis‘] ) && static::$memInstance[‘redis‘] instanceof Redis) {

$cacheConn = static::$memInstance[‘redis‘];

try{

$cacheConn->ping(); //链接未出异常,则返回链接实例

return $cacheConn;

}catch(\RedisException $e){}

}

$cacheConn = null;

$tryI = 0;

while ( $cacheConn == null && $tryI < 10 ) {

try {

$cacheConn = new Redis ();

$serverSetting = Config::$redis;

if (! $cacheConn->pconnect ( $serverSetting[$this->_serverType][‘ip‘],  $serverSetting[$this->_serverType][‘port‘])) {

$this->_serverType = "default";

$cacheConn->pconnect (  $serverSetting[$this->_serverType][‘ip‘],  $serverSetting[$this->_serverType][‘port‘]);

}

$cacheConn->setOption ( Redis::OPT_SERIALIZER, Redis::SERIALIZER_NONE );

// 选择DB

$redisDB = $serverSetting[$this->_serverType][‘redisDb‘];

if ($redisDB > 0 && $redisDB <= 16) {

$cacheConn->select ( $redisDB );

} else {

$cacheConn->select ( 0 );

}

} catch ( \Exception $e ) {

sleep ( $tryI * 0.3 );

$tryI ++;

$cacheConn = null;

}

}

static::$memInstance[‘redis‘] = $cacheConn;

return $cacheConn;

}

时间: 2024-12-22 05:29:27

PHP网站redis缓存方式分析的相关文章

Android WebView的缓存方式分析

WebView的缓存可以分为(1)页面缓存和(2)数据缓存. 页面缓存是指当WebView加载一个网页时的html.JS.CSS等页面或者资源数据.这些缓存资源是由于浏览器的行为而产生,开发者只能通过配置HTTP响应头来影响浏览器的行为才能间接地影响到这些缓存数据. 他们的索引存放在/data/data/package_name/databases下.他们的文件存放在/data/data/package_name/cache/xxxwebviewcachexxx下.文件夹的名字在2.x和4.x上

基于Python项目的Redis缓存消耗内存数据简单分析(附详细操作步骤)

目录 1 准备工作 2 具体实施   1 准备工作 什么是Redis? Redis:一个高性能的key-value数据库.支持数据的持久化,可以将内存中的数据保存在磁盘中,重启的时候可以再次加载进行使用:提供string.list.set.zset.hash等数据结构的存储,并支持数据的备份. 本文适合使用的场景:当一个项目中Redis缓存的数据量逐渐增大,Redis缓存的数据占用内存也会越来越大,而且其中有很多很可能是价值不大的数据.由于Redis是一个key-value数据库,所以对其中的数

redis缓存队列+MySQL +php任务脚本定时批量入库

原文地址:http://blog.jobbole.com/99567/ 需求背景:有个调用统计日志存储和统计需求,要求存储到mysql中:存储数据高峰能达到日均千万,瓶颈在于直接入库并发太高,可能会把mysql干垮. 问题分析 思考:应用网站架构的衍化过程中,应用最新的框架和工具技术固然是最优选择:但是,如果能在现有的框架的基础上提出简单可依赖的解决方案,未尝不是一种提升自我的尝试.解决: 问题一:要求日志最好入库:但是,直接入库mysql确实扛不住,批量入库没有问题,done.[批量入库和直接

9大浏览器端缓存机制分析

浏览器缓存(Browser Caching)是浏览器端保存数据用于快速读取或避免重复资源请求的优化机制,有效的缓存使用可以避免重复的网络请求和浏览器快速地读取本地数据,整体上加速网页展示给用户.浏览器端缓存的机制种类较多,总体归纳为九种,这里详细分析下这九种缓存机制的原理和使用场景.打开浏览器的调试模式->resources左侧就有浏览器的8种缓存机制. 一.http缓存 http缓存是基于HTTP协议的浏览器文件级缓存机制.即针对文件的重复请求情况下,浏览器可以根据协议头判断从服务器端请求文件

单线程你别阻塞,Redis时延问题分析及应对

单线程你别阻塞,Redis时延问题分析及应对 Redis的事件循环在一个线程中处理,作为一个单线程程序,重要的是要保证事件处理的时延短,这样,事件循环中的后续任务才不会阻塞: 当redis的数据量达到一定级别后(比如20G),阻塞操作对性能的影响尤为严重: 下面我们总结下在redis中有哪些耗时的场景及应对方法: 耗时长的命令造成阻塞 keys.sort等命令 keys命令用于查找所有符合给定模式 pattern 的 key,时间复杂度为O(N), N 为数据库中 key 的数量.当数据库中的个

Linux之搭建redis缓存服务器

Linux之搭建redis缓存服务器(nginx+tomcat+redis+mysql实现session会话共享) 一.redis介绍 redis是一个key-value存储系统.和Memcached类似,它支持存储的value类型相对更多,包括string(字符串).list(链表).set(集合).zset(sorted set --有序集合)和hash(哈希类型).与memcached一样,为了保证效率,数据都是缓存在内存中.区别的是redis会周期性的把更新的数据写入磁盘或者把修改操作写

网站的缓存类型

缓存用的好,大大减轻服务器压力和提升用户体验.只要涉及到缓存,肯定会存在数据更新不及时的问题.下面分为3个级别来说,越往下,说明上一级的缓存不存在或者已经失效. 第一级,浏览器缓存 优点: 这是最省资源的一种方式,浏览器甚至都不需要发起请求. 缺点: 缓存脱离控制,如果缓存时间设置太长,用户无法访问最新的页面.特别出现一个紧急BUG的时候,需要一段时间,才能平息. 使用: 在header头部添加Expires, Cache-control: max-age, Last-Modified, Eta

redis缓存mysql数据

redis (Remote Dictionary Server)是一个开源(BSD许可)的,内存中的数据结构存储系统,它可以用作数据库.缓存和消息中间件.它支持存储的value类型相对更多,包括string(字符串).list(链表).set(集合).zset(sorted set --有序集合)和hash(哈希类型).Redis支持主从同步.数据可以从主服务器向任意数量的从服务器上同步,从服务器可以是关联其他从服务器的主服务器.这使得Redis可执行单层树复制. MySQL和Redis,自身都

《MySQL与Redis缓存架构》

<如何使用redis做mysql的缓存> 应用Redis实现数据的读写,同时利用队列处理器定时将数据写入mysql. 同时要注意避免冲突,在redis启动时去mysql读取所有表键值存入redis中,往redis写数据时,对redis主键自增并进行读取,若mysql更新失败,则需要及时清除缓存及同步redis主键. 这样处理,主要是实时读写redis,而mysql数据则通过队列异步处理,缓解mysql压力,不过这种方法应用场景主要基于高并发,而且redis的高可用集群架构相对更复杂,一般不是很