利用Redis缓存提高斐波拉契数列程序的性能例子

作者:简简单单 2016-03-09
去某家公司面试,PHP岗位,先做笔试,再两轮面试,最后hr面,拿了offer。

 

笔试题都不难,做完随手拍了一张,然后回去把这道求斐波那契数列的题在电脑上运行了一遍,写的当然是对的,但是当你要求第N位,当N大于60的时候就会非常慢了,后来就想着用Redis缓存来优化性能,效果非常惊人!

 

fib

 

我把题目改了一下,也是要用递归,但是是要列出从0到n的斐波那契数列,并且用Redis缓存。

 

思路很简单,每次取第n的值的时候判断Redis有没有,有就不用再去计算了,没有就计算一次存下来,大大减少计算次数。存的是hash结构。代码如下:

 

在Laravel框架写个控制器方法:


//斐波拉契数列
public function fib($n = null)
{
    if ($n > 100) {
        die('Number must <= 100!');
    }
    for ($i = 0; $i <= $n; $i++) {
        echo $this->getNum($i) . ' ';
    }
}
 
private function getNum($n)
{
    $key = 'com.tanteng.me.test.foo';
    $value = Redis::hget($key, $n);
    if ($value) {
        return $value;
    }
    if ($n == 0) $result = 1;
    if ($n == 1) $result = 1;
    if ($n > 1) {
        $result = $this->getNum($n - 2) + $this->getNum($n - 1);
    }
    Redis::hset($key, $n, $result);
    Redis::expire($key, 1800);
    return $result;
}


在routes.php文件添加路由:

PHP


Route::get('/test/fib/{n?}', ['uses' => 'TestController@fib']);
通过浏览器访问:http://www.111com.net /test/fib/65

结果很快出来:

1 1 2 3 5 8 13 21 34 55 89 144 233 377 610 987 1597 2584 4181 6765 10946 17711 28657 46368 75025 121393 196418 317811 514229 832040 1346269 2178309 3524578 5702887 9227465 14930352 24157817 39088169 63245986 102334155 165580141 267914296 433494437 701408733 1134903170 1836311903 2971215073 4807526976 7778742049 12586269025 20365011074 32951280099 53316291173 86267571272 139583862445 225851433717 365435296162 591286729879 956722026041 1548008755920 2504730781961 4052739537881 6557470319842 10610209857723 17167680177565 27777890035288

其中Redis存的内容如下:

 

redis_fib

如果不用Redis,求65个斐波那契数列就会很慢了,使用Redis几乎是刷的一下就出来。在实际开发中,Redis也被广泛使用,Redis真是个好东西

相关文章

精彩推荐