资讯专栏INFORMATION COLUMN

Lumen中使用速度更快的PhpRedis扩展(更新队列驱动)

kyanag / 1593人阅读

摘要:发布,新增队列驱动,缓存驱动移动至,使用老版本的需要修改中缓存驱动加载位置。目前支持根据获取配置的基本读写等。和可以继续使用自带的驱动,两者互不影响。下一步如有需要可以继续完善这两部分的驱动。

欢迎关注我的博客 http://targetliu.com

Lumen的确是一款适合做API,速度很快的框架。但是在项目中使用Redis时发现Lumen默认使用的 predis/predis 会拖慢整体速度,特别是在高并发的情况下,所以寻思着使用 PhpRedis 代替,毕竟 PhpRedis 是C语言写的模块,性能上肯定优于 predis

文中例子已经整理成一个 composer 包,文末有简单介绍。

[TargetLiu/PHPRedis]

2016.7.29:v1.1.0发布,新增队列驱动,缓存驱动移动至 TargetLiuPHPRedisCache ,使用老版本的需要修改 bootstrap/app.php 中缓存驱动加载位置。

https://github.com/TargetLiu/PHPRedis

https://packagist.org/packages/targetliu/phpredis

编译安装PhpRedis

由于 PhpRedis 是C语言写的模块,需要编译安装。安装方法网上一搜一大把,请根据自己的环境选择相应的方法安装即可。

两个可能用得上的链接:

PECL - PhpRedis

GitHub - PhpRedis

Lumen中使用PhpRedis

很简单,只需要在 bootstrap/app.php 中添加下列代码将PhpRedis注入容器即可:

$app->singleton("phpredis", function(){
    $redis = new Redis;
    $redis->pconnect("127.0.0.1"); //建立连接
        $redis->select(1); //选择库
        $redis->auth("xxxx"); //认证
    return $redis;
});
unset($app->availableBindings["redis"]);

绑定后即可通过 app("phpredis") 直接使用 PhpRedis 了,具体使用方法可以看相应的官方文档。

Lumen中为PhpRedis增加Cache驱动

由于实际使用中更多的将Redis用于缓存,Lumen自带的Redis缓存驱动是基于 predis/predis 实现,我们现在新建一个驱动以支持 Phpredis

新增Cache驱动详细方法可以查看 官方文档,这里指罗列一些关键的点。更多的内容也可以查看 TargetLiu/PHPRedis

我们首先创建一个 ServiceProvider

make("phpredis"), $app->config["cache.prefix"]));
        });
    }

    /**
     * Register bindings in the container.
     *
     * @return void
     */
    public function register()
    {
        //
    }
}

这样就建立一个名为 phpreids 的驱动。再创建一个基于 IlluminateContractsCacheStore 契约的缓存操作类用以操作 PhpRedis

redis = $redis;
        $this->setPrefix($prefix);
    }

    /**
     * Retrieve an item from the cache by key.
     *
     * @param  string|array  $key
     * @return mixed
     */
    public function get($key)
    {
        if (!is_null($value = $this->connection()->get($this->prefix . $key))) {
            return is_numeric($value) ? $value : unserialize($value);
        }
    }

    /**
     * Retrieve multiple items from the cache by key.
     *
     * Items not found in the cache will have a null value.
     *
     * @param  array  $keys
     * @return array
     */
    public function many(array $keys)
    {
        $return = [];

        $prefixedKeys = array_map(function ($key) {
            return $this->prefix . $key;
        }, $keys);

        $values = $this->connection()->mGet($prefixedKeys);

        foreach ($values as $index => $value) {
            $return[$keys[$index]] = is_numeric($value) ? $value : unserialize($value);
        }

        return $return;
    }

    /**
     * Store an item in the cache for a given number of minutes.
     *
     * @param  string  $key
     * @param  mixed   $value
     * @param  int     $minutes
     * @return void
     */
    public function put($key, $value, $minutes)
    {
        $value = is_numeric($value) ? $value : serialize($value);

        $this->connection()->set($this->prefix . $key, $value, (int) max(1, $minutes * 60));
    }

    /**
     * Store multiple items in the cache for a given number of minutes.
     *
     * @param  array  $values
     * @param  int  $minutes
     * @return void
     */
    public function putMany(array $values, $minutes)
    {
        foreach ($values as $key => $value) {
            $this->put($key, $value, $minutes);
        }
    }

    /**
     * Increment the value of an item in the cache.
     *
     * @param  string  $key
     * @param  mixed   $value
     * @return int|bool
     */
    public function increment($key, $value = 1)
    {
        return $this->connection()->incrBy($this->prefix . $key, $value);
    }

    /**
     * Decrement the value of an item in the cache.
     *
     * @param  string  $key
     * @param  mixed   $value
     * @return int|bool
     */
    public function decrement($key, $value = 1)
    {
        return $this->connection()->decrBy($this->prefix . $key, $value);
    }

    /**
     * Store an item in the cache indefinitely.
     *
     * @param  string  $key
     * @param  mixed   $value
     * @return void
     */
    public function forever($key, $value)
    {
        $value = is_numeric($value) ? $value : serialize($value);

        $this->connection()->set($this->prefix . $key, $value);
    }

    /**
     * Remove an item from the cache.
     *
     * @param  string  $key
     * @return bool
     */
    public function forget($key)
    {
        return (bool) $this->connection()->delete($this->prefix . $key);
    }

    /**
     * Remove all items from the cache.
     *
     * @return void
     */
    public function flush()
    {
        $this->connection()->flushDb();
    }

    /**
     * Get the Redis connection instance.
     *
     * @return PredisClientInterface
     */
    public function connection()
    {
        return $this->redis;
    }

    /**
     * Get the Redis database instance.
     *
     * @return IlluminateRedisDatabase
     */
    public function getRedis()
    {
        return $this->redis;
    }

    /**
     * Get the cache key prefix.
     *
     * @return string
     */
    public function getPrefix()
    {
        return $this->prefix;
    }

    /**
     * Set the cache key prefix.
     *
     * @param  string  $prefix
     * @return void
     */
    public function setPrefix($prefix)
    {
        $this->prefix = !empty($prefix) ? $prefix . ":" : "";
    }
}

通过以上两个步骤基本上就完成了Cache驱动的创建,现在只需要在 bootstrap/app.php 中注入新建的Cache驱动然后配置 .envCACHE_DRIVER = phpredis ,最后再在 config/cache.php 中加入相应的驱动代码即可

"phpredis" => [
    "driver" => "phpredis"
],

Cache的使用请查看Lumen官方文档

一个基于PhpRedis的Lumen扩展包

[TargetLiu/PHPRedis]

https://github.com/TargetLiu/PHPRedis

https://packagist.org/packages/targetliu/phpredis

安装:composer require targetliu/phpredis

安装及使用方法请看 README

这个包只是我做的一个简单示例,引入了 PhpRedis 并做了最简单的缓存驱动。目前支持根据 .env 获取Redis配置、Cache的基本读写等。

Session和Queue可以继续使用Lumen自带的Redis驱动,两者互不影响。下一步如有需要可以继续完善这两部分的驱动。

这个包将根据自己工作需求以及大家的已经进一步完善。

欢迎大家提出意见共同完善。

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/21789.html

相关文章

  • laravel/lumen 使用 redis队列

    摘要:配置项用于配置失败队列任务存放的数据库及数据表。要使用队列驱动,需要在配置文件中配置数据库连接。如果应用使用了,那么可以使用时间或并发来控制队列任务。你可以使用命令运行这个队列进程。如果队列进程意外关闭,它会自动重启启动队列进程。 一、概述 在Web开发中,我们经常会遇到需要批量处理任务的场景,比如群发邮件、秒杀资格获取等,我们将这些耗时或者高并发的操作放到队列中异步执行可以有效缓解系...

    mengbo 评论0 收藏0
  • Lumen---为速度而生 Laravel 框架

    摘要:什么是官网是一个由组件搭建而成的微框架是当前最快的框架之一在什么时候使用专为微服务或者设计举个例子如果你的应用里面有部分业务逻辑的请求频率比较高就可以单独把这部分业务逻辑拿出来使用来构建一个小因为是对优化了框架的加载机制所以对资源的要求少很 什么是 Lumen?官网 lumen 是一个由 Laravel 组件搭建而成的微框架,是当前最快的 PHP 框架之一! 在什么时候使用 Lume...

    104828720 评论0 收藏0
  • Lumen 初体验(二)

    摘要:的现状目前是版本,是基于开发。入口文件启动文件和配置文件框架的入口文件是。在路由中指定控制器类必须写全命名空间,不然会提示找不到类。目前支持四种数据库系统以及。使用时发生错误,因为在文件中,的默认驱动是。 最近使用 Lumen 做了 2 个业余项目,特此记录和分享一下。 Lumen 的介绍 在使用一项新的技术时,了解其应用场景是首要的事情。 Lumen 的口号:为速度而生的 La...

    Cheriselalala 评论0 收藏0

发表评论

0条评论

最新活动
阅读需要支付1元查看
<