Laravel框架中落到实处应用Ali云ACE缓存劳动

Membase 是三个NOSQL数据库。它被规划为在MEMCACHED(一个流行的内部存款和储蓄器缓存工具)之后的贰个漫长化存款和储蓄。Membase相对相比较新可是曾在高质量NOSQL世界有了三个踏实的角度。

以前作者写了风度翩翩篇在 Laravel 4 框架中使用Ali云 OCS 缓存的稿子,介绍了哪些通过增添Laravel 4 来帮忙要求 SASL 认证的Ali云 OCS 缓存服务。有网络基友问笔者,ACE 的缓存怎么在 Laravel 4 中使用。笔者当然以为应该能够完全用同大器晚成的艺术,后来温馨尝尝的时候才意识,ACE 的缓存差异相当的大。所以再写大器晚成篇,介绍一下什么样在 Laravel 框架中行使Ali云 ACE 的缓存服务。

本文是七个透过JAVA使用Membase数据库的全速教程。

何以扩张 Laravel 的缓存驱动

安装MEMBASE

参考Membase.org的说明

在 Laravel 4 中应用 Cache::get($key), Cache::put($key, $value, $minutes) 那样的代码时,实际上是拜望 实例化的 IlluminateCacheRepository, 所以我们因而 Cache::extend 方法增添自定义缓存驱动时,同样应该回到三个IlluminateCacheRepository 对象。

客户端

与Membase的相互类似与Memcached的互相。大家将会动用SpyMemcached Java 客商端。请从 这儿下载。

Laravel 4 内置的 Memcached 缓存驱动,实现的流水生产线是那样的:

代码

本项目中具备应用的代码都提供在GitHub : 
这二个elipse工程,并且风流倜傥度得以运作。

1.开立三个规范 Memcached 类的新指标
2.用上一步创设的 Memcached 对象创立一个完毕了 IlluminateCacheStoreInterface 接口的 IlluminateCacheMemecachedStore 对象。
3.用上一步创设的 MemcachedStore 对象创制叁个IlluminateCacheRepository 对象。

让我们初始

那儿的JAVA代码-它将如日中天串key,value写入Membase並且再将她们读抽出来。

// MembaseTest1 package tutorial;import java.net.InetSocketAddress;import net.spy.memcached.MemcachedClient;/*** Write / Read from Membase* * @author sujee**/public class MembaseTest1{    static int MAX = 100;    static String server = "localhost";    static int port = 11211;     public static void main(String[] args) throws Exception    {        MemcachedClient cache = new MemcachedClient(new InetSocketAddress(server, port));        cache.flush(); // 清除所有         long t1 = System.currentTimeMillis();        for (int i = 0; i < MAX; i++)        {            String s = new Integer(i).toString();            // key : integer converted to String (keys are always string)            // time to live : in seconds, 3600 seconds (1h), 0 means no expiration            // value : actual integer. This can be an object. Our integer will be converted to 'Integer'            // class by 'auto boxing' proess            Object o = cache.set(s, 0, i);            System.out.println("cache put : " + s + " : " + i + ", result " + o);        }        long t2 = System.currentTimeMillis();        System.out.println("Time for " + MAX + " puts is " + (t2 - t1) + " ms");         t1 = System.currentTimeMillis();        int nulls = 0;        for (int i = 0; i < MAX; i++)        {            String s = new Integer(i).toString();            Object o = cache.get(s);            System.out.println("Cache get : " + s + " : " + o);            if (o == null)                nulls++;        }        t2 = System.currentTimeMillis();        cache.shutdown();        System.out.println("Time for " + MAX + " gets is " + (t2 - t1) + " ms. nulls " + nulls);    }} 你可以在eclipse中运行这个文件(MembaseTest1)。或者从命令行执行

         sh compile.sh          sh run.sh              or           java -cp classes/:lib/memcached-2.5.jar tutorial.MembaseTest1

Membase运转在地面,端口为11211(暗许的memcached端口)

我们在一齐来就涤荡了总体数据集,那样大家就足以有个根本的上马情况。

为此大家在扩大自定义的 Cache 驱动时,依照本人的场合,选拔方面包车型地铁某三个步骤自定义,最后依然要回去 IlluminateCacheRepository 对象。比如上一篇小说中,小编正是在率先步,创制标准Memcached 对象之后,通过 setSaslAuthData() 方法设定 OCS 要求的客户名密码。之后第2步、第3步并无需自定义。

Set

cache.set (string_key,   expiration_time,   object_value)

咱俩的键是风流罗曼蒂克串字符型的数字,大家的靶子是是整数型对象。

下边是出口样例:

2010-11-29 23:36:33.234 INFO net.spy.memcached.MemcachedConnection:  Added {QA sa=localhost/127.0.0.1:11211, #Rops=0, #Wops=0, #iq=0, topRop=null, topWop=null, toWrite=0, interested=0} to connect queue
2010-11-29 23:36:33.240 INFO net.spy.memcached.MemcachedConnection:  Connection state changed for sun.nio.ch.SelectionKeyImpl@b34bed0
cache put : 0 : 0,  result net.spy.memcached.internal.OperationFuture@578088c0
cache put : 1 : 1,  result net.spy.memcached.internal.OperationFuture@37922221
cache put : 2 : 2,  result net.spy.memcached.internal.OperationFuture@5afec107
cache put : 3 : 3,  result net.spy.memcached.internal.OperationFuture@b32e13d
cache put : 4 : 4,  result net.spy.memcached.internal.OperationFuture@39617189
cache put : 5 : 5,  result net.spy.memcached.internal.OperationFuture@2c64f6cd
...
...

Spy Memcache 顾客端缓存了无尽操作,这样能够荣升品质。你可以看出cache.set方法重临了一个'OperartionFuture' 对象。key-value最终将会在Membase中长久化。

ACE 的缓存服务

Get

近来大家试着看看我们刚写的读取语句。 我们用了同样的客户端。输出结果就如上面所示:

Cache get : 96 : 96
Cache get : 97 : 97
Cache get : 98 : 98
Cache get : 99 : 99
Time for 100 gets is 77 ms.  nulls 0

我们紧密注意NULL值。大家这一次不应该赢得NULL,如我们所梦想的null个数为0。

代码也记录了岁月戳,大家能够看到操作是多么得快。

Ali云 ACE 的缓存服务,跟暗中认可的 OCS 有所不一样:

模仿多少个客户端

在上头的例子中大家从同两个顾客端举行读写。但在事实上境况中,三个客商端都会对Membase实行读写。未来大家用七个不等的顾客端连接模拟这种气象。
在此个版本中,我们应用三个接连进行写操作另四个接连进行读操作。

// MembaseTest2package tutorial; import java.net.InetSocketAddress;import net.spy.memcached.MemcachedClient; /*** simulates writing / reading from two different clients*/public class MembaseTest2{    static int MAX = 1000;    static String server = "localhost";    static int port = 11211;     public static void main(String[] args) throws Exception    {        MemcachedClient cache = new MemcachedClient(new InetSocketAddress(server, port));        cache.flush(); // clear all         long t1 = System.currentTimeMillis();        for (int i = 0; i < MAX; i++)        {            String s = new Integer(i).toString();              // key : integer converted to String (keys are always string)            // time to live : in seconds, 3600 seconds (1h), 0 means no expiration            // value : actual integer. This can be an object. Our integer will be converted to 'Integer'            // class by 'auto boxing' proess            Object o = cache.set(s, 0, i);            System.out.println("cache put : " + s + " : " + i + ", result " + o);        }        long t2 = System.currentTimeMillis();        cache.shutdown(); // close the client        System.out.println("Time for " + MAX + " puts is " + (t2 - t1) + " ms");         // open another connection        cache = new MemcachedClient(new InetSocketAddress(server, port));         t1 = System.currentTimeMillis();        int nulls = 0;        for (int i = 0; i < MAX; i++)        {            String s = new Integer(i).toString();            Object o = cache.get(s);            System.out.println("Cache get : " + s + " : " + o);            if (o == null)                nulls++;        }        t2 = System.currentTimeMillis();        cache.shutdown();         System.out.println("Time for " + MAX + " gets is " + (t2 - t1) + " ms. nulls " + nulls + "n");    }}

  java -cp classes/:lib/memcached-2.5.jar tutorial.MembaseTest2

Cache get : 0 : 0
Cache get : 1 : 1
.......
.....
Cache get : 997 : null
Cache get : 998 : null
Cache get : 999 : null
Time for 1000 gets is 540 ms.  nulls 42

近些日子就能够收看叁个景况,当我们读取刚刚安装的值的时候,就能够有NULL产生的意况了。

那么此时到底发生了些什么了?

请记住,Spy Memcache顾客端为了增长质量缓存了成都百货上千操作。当我们调用“shutdown”的时候顾客端从未把具备的缓存值写入数据库就淡出了。所以这么些键值就相当粗略的不见了。

让我们改良那几个难点。

当大家做完SET操作, 让我们更温婉的关门那么些客商端。大家给他10秒的时间再脱离。希望那样能够让客商端有时机把具备的缓存操作都执行到位。

......long t2 = System.currentTimeMillis();cache.shutdown(10, TimeUnit.SECONDS); // graceful shutdownSystem.out.println("Time for " + MAX + " puts is " + (t2 - t1) + " ms"); // open another connectioncache = new MemcachedClient(new InetSocketAddress(server, port));......

java -cp classes/:lib/memcached-2.5.jar tutorial.MembaseTest3

output: 
...
...
Cache get : 998 : 998
Cache get : 999 : 999
Time for 1000 gets is 500 ms.  nulls 0

从未有过任何NULL值。大家收获了具有写入的值。

为此今后我们很成功的效仿了八个客商端的动静。有豆蔻梢头件业务需求牢记,客户端做了缓存所以必要温婉的停业它保险未有数量遗失。 图片 1

1.因而 Alibaba::Cache() 方法取得 Cache 对象。
2.ACE 的 Cache 对象与专门的学问 Memcached 对象不一致,帮忙的情势轻巧。

由此,本次先是步获得的不是正经 Memcached 对象,由此就无法创立IlluminateCacheMemcachedStore 对象。要求协调完成IlluminateCacheStoreInterface 接口。

在调节台创制了缓存空间之后,会有唯意气风发的“缓存空间名称”,然后通过 Alibaba::Cache('缓存空间名称') 来博取 Cache 对象。以下正是促成 ACE 缓存服务驱动的手续:

1.为了有助于修改,笔者在配置文件 app/config/cache.php 中追加一个名叫 ace 的键,存款和储蓄缓存空间名称。
2.然后创建二个 AceMemcachedStore 类,这些类完结IlluminateCacheStoreInterface 接口。
3.提及底,用 AceMemcachedStore 对象来创设 IlluminateCacheRepository 对象。

上面来看具体的代码达成:

编码完成自定义 ACE 缓存驱动:

第一步,修改配置文件。展开 app/config/cache.php,在结尾扩张意气风发行:

复制代码 代码如下:

// 钦点缓存空间名称
'ace' => 'lblog-cache',

其次步,为了有扶助,把自身的类公事放在 src/Ace 目录下,使用 Ace 作为命名空间。

1.在 app 的同级目录成立目录 src/Ace。
2.开采 composer.json 文件,修改 autoload 节,在 classmap 上边用 psr-0 只怕 psr-4 来机关加载文件。

复制代码 代码如下:

"autoload": {
    "classmap": [
        // autoload class
    ],
    "psr-4": {
      "Ace\": "src/Ace"
    }
},

创建 src/Ace/AceMemcachedStore.php 文件,代码如下:

复制代码 代码如下:

<?php
 
namespace Ace;
use IlluminateCacheStoreInterface;
use IlluminateCacheTaggableStore;
 
class AceMemcachedStore extends TaggableStore implements StoreInterface {
 
    protected $memcached;
    protected $prefix;
 
    public function __construct($space, $prefix = '') {
        $this->memcached = Alibaba::Cache($space);
        $this->prefix = strlen($prefix) > 0 ? $prefix.':' : '';
    }
 
    /**
     * Retrieve an item from the cache by key.
     *
     * @param  string $key
     * @return mixed
     */
    public function get($key)
    {
        $value = $this->memcached->get($this->prefix.$key);
        if(is_bool($value) && $value === false) {
            return null;
        }
        return $value;
    }
 
    /**
     * Store an item in the cache for a given number of minutes.
     *
     * @param  string $key
     * @param  mixed $value
     * @param  int $minutes
     * @return boolean
     */
    public function put($key, $value, $minutes)
    {
        return $this->memcached->set($this->prefix.$key, $value, $minutes);
    }
 
    /**
     * Increment the value of an item in the cache.
     *
     * @param  string $key
     * @param  mixed $value
     * @return boolean
     */
    public function increment($key, $value = 1)
    {
        return $this->memcached->increment($this->prefix.$key, $value);
    }
 
    /**
     * Decrement the value of an item in the cache.
     *
     * @param  string $key
     * @param  mixed $value
     * @return boolean
     */
    public function decrement($key, $value = 1)
    {
        return $this->memcached->decrement($this->prefix.$key, $value);
    }
 
    /**
     * Store an item in the cache indefinitely.
     *
     * @param  string $key
     * @param  mixed $value
     * @return boolean
     */
    public function forever($key, $value)
    {
        return $this->memcached->set($key, $value, 0);
    }
 
    /**
     * Remove an item from the cache.
     *
     * @param  string $key
     * @return boolean
     */
    public function forget($key)
    {
        return $this->memcached->delete($this->prefix.$key);
    }
 
    /**
     * Remove all items from the cache.
     *
     * @return void
     */
    public function flush()
    {
        //$this->memcached->flush();
        return false;
    }
 
    public function getMemcached()
    {
        return $this->memcached;
    }
    /**
     * Get the cache key prefix.
     *
     * @return string
     */
    public function getPrefix()
    {
        return $this->prefix;
    }
}

这段代码比较简单,但是要极度注意一下 get($key) 方法的兑现。标准memcached 以致 ACE 的缓存对象的 get 方法都是key有效时回来对应的缓存值,不然重返false,而在 Laravel 4 中,是通过检查实验 get 方法再次回到的是还是不是 null 来做判别,所以这里须求管理一下,重返缓存值可能null。

AceMemcachedStore类已经创制好了,接下去在 bootstrap/start.php 文件中扩充Cache:

开发 bootstrap/start.php, 增多以下代码:

复制代码 代码如下:

// 扩大名叫 ace 的缓存驱动
Cache::extend('ace', function($app)
{
    // 从 app/config/cache.php 文件中读取 "ace" 的值
    $space = $app['config']['cache.ace'];
    
    // 从 app/config/cache.php 文件中读取 "prefix" 的值
    $prefix = $app['config']['cache.prefix'];
    
    // 创建 AceAceMemcachedStore 对象
    $store = new AceAceMemcachedStore($space, $prefix);
    
    // 创建并回到 IlluminateCacheRepository 对象
    return new IlluminateCacheRepository($store);
 
});

钦赐系统利用 'ace' 作为缓存驱动:展开 app/config/cache.php,找到 'driver' => '...' 所在行,修改为:'driver' => 'ace'.

使用和限制

由此上述操作,就足以在 Laravel 4 中调用 ACE 的缓存服务,使用上与平常的用法完全一致,比如:

复制代码 代码如下:

// 增多缓存,有效时间10分钟
Cache::put('my_key', 'my value', 10);
 
// 读取缓存
Cache::get('my_key')
 
// 剖断缓存是或不是留存
Cache::has('my_key')
 
// 数据查询缓存
$users = DB::table('users')->remember(10)->get();

可是出于 ACE 缓存对象自己的限量,只可以删除钦点 key 的缓存对象,不能够遍历、全量操作,由此 Cache::flush() 方法就无法运用。在上边的 AceMemcachedStore 对象中,flush 方法未有做别的操作,只是再次回到 false.

你或然感兴趣的稿子:

  • Laravel Memcached缓存驱动的布局与利用措施剖判
  • Laravel中增加Memcached缓存驱动达成采取阿里云OCS缓存
  • Laravel使用Caching缓存数据缓和数据库查询压力的秘技
  • Laravel框架数据库CU瑞鹰D操作、连贯操作总括
  • PHP开拓框架Laravel数据库操作方法计算
  • 跟小编学Laravel之迅捷入门
  • Laravel框架中扩充函数、扩大自定义类的主意
  • Laravel框架路由配置总计、设置本领大全
  • Laravel中央银行使本身编辑类库的3种艺术
  • Laravel使用memcached缓存对小说增加和删除改查实行优化的点子

本文由365bet体育在线官网发布于365bet,转载请注明出处:Laravel框架中落到实处应用Ali云ACE缓存劳动

TAG标签:
Ctrl+D 将本页面保存为书签,全面了解最新资讯,方便快捷。