推荐一下redis这个好东西

2010年12月15日 | 分类: 分布式 | 标签:

随着项目的发展,我们需要一个高可用性的缓存系统。在对比了memcache和几个流行的key/value数据库之后,我们最终选择了redis。redis绝对是个好东西。用redis之前,推荐看一下下面这几篇文章:

使用php操作redis有好几个选择,个人推荐 Rediskaphpredis,其中Rediska是一个纯php实现的类库,如果你需要多台服务器组建一个redis集群的话,推荐用这个,它支持基于CRC32的一致性哈希算法的分布式集群构建,另外也可以自己实现自己的分布式算法。而phpredis则是一个php的c扩展,需要自己编译然后在生产环境中加载,相比Rediska好处就是速度快一点,最终我们选择了phpredis,我们的项目对性能的要求还是比较苛刻一点,暂时也不需要构建一个集群。

另外,我们的项目特点比较特殊,对于value需要频繁修改,所以我自己在自己的机器上面小测了一下,使用的是redis的hash列表数据结构还有phpredis:

测试环境:
CPU:model name    : Intel(R) Pentium(R) Dual  CPU  T2370  @ 1.73GHz
redis 2.01
phpredis (用来访问redis的扩展)

主要模拟了1K个应用在10W个修改的情况,测试结果:
10W个修改:
real    0m11.930s
user    0m2.976s
sys    0m3.856s

CPU:50%~60% MEM:1.5M+

从这个表现来看,基本上可以支撑1W+/s的并发修改场景,完全可以满足我们的需求了。

<?php
$app_cnt = 1000;                       // 模拟的应用数
$test_cnt = 100000;                     // 模拟的访问次数
 
$redis = new Redis();
$redis->connect('127.0.0.1', 6379);
$start_time_a = microtime();
for ($i = 0; $i < $test_cnt; $i++) {
  $key = 'app_' . rand(1, $app_cnt);
  if ($redis->exists($key)) {
    $redis->hIncrBy($key, 'req', 1);
  }
  else {
    $redis->hMSet($key, array(
      'a' => 0,
      'b' => 0,
      'c' => 0,
      'd' => time() + 60,
      'e' => 0,
      'f' => 0,
      'g' => 0)
    );
    $redis->hIncrBy($key, 'req', 1);
  }
}
$end_time_a = microtime();
$time = $end_time_a - $start_time_a;
printf('all time:%s \n', $time);
$redis->close();
?>
  1. 2011年1月5日09:25

    好东西,果断收藏!~~~~~~

  2. 2011年7月8日15:03

    好东西,帮老公收藏~

注意: 评论者允许使用'@user空格'的方式将自己的评论通知另外评论者。例如, ABC是本文的评论者之一,则使用'@ABC '(不包括单引号)将会自动将您的评论发送给ABC。使用'@all ',将会将评论发送给之前所有其它评论者。请务必注意user必须和评论者名相匹配(大小写一致)。