Rumah  >  Artikel  >  pembangunan bahagian belakang  >  Cache kongsi PHP Yac menggantikan memcache APCU!

Cache kongsi PHP Yac menggantikan memcache APCU!

藏色散人
藏色散人ke hadapan
2023-03-03 15:47:303071semak imbas

Artikel ini membawakan anda pengetahuan yang berkaitan tentang php+yac terutamanya tentang cara menggantikan memcache APCU dengan Yac. Rakan-rakan yang berminat boleh lihat di bawah.

yac cache

Yac ialah cache data pengguna memori yang dikongsi dan bebas kunci untuk PHP. Ia boleh digunakan untuk menggantikan APC atau memcached tempatan. Produk Niao Ge mestilah berkualiti tinggi

Keperluan

PHP 7 +

Pasang

$/path/to/phpize
$./configure --with-php-config=/path/to/php-config
$make && make install

Nota

  • Yac ialah cache tanpa kunci, anda harus cuba mengelak atau mengurangkan kebarangkalian berbilang proses menetapkan kunci yang sama

  • Yac Menggunakan crc separa, lebih baik anda susun semula kandungan cache untuk meletakkan bait (pembolehubah) paling ketara di kepala atau ekor

Sekatan

  • Kunci cache tidak boleh lebih besar daripada 48 (YAC_MAX_KEY_LEN) bait

  • Kandungan cache tidak boleh lebih besar daripada 64M (YAC_MAX_LE_NUE_RAW_RAW ) bait

  • Nilai cache termampat tidak boleh lebih besar daripada 1M 1M (YAC_MAX_VALUE_COMPRESSED_LEN) bait

konfigurasi ini

yac.enable = 1
yac.keys_memory_size = 4M ; 4M can get 30K key slots, 32M can get 100K key slots
yac.values_memory_size = 64M
yac.compress_threshold = -1
yac.enable_cli = 0 ; 是否使用cli启用yac,默认为0
yac.serializer = php ; yac2.2.0以来,yac使用的特定seralizer json(-- enable-json) 、msgpack(-- enable-msgpack) 或igbinary(-- enable-igbinary)

Malar

YAC_VERSION
YAC_MAX_KEY_LEN = 48 ; if your key is longer than this, maybe you can use md5 result as the key
YAC_MAX_VALUE_RAW_LEN = 64M
YAC_MAX_VALUE_COMPRESSED_LEN = 1M
YAC_SERIALIZER_PHP = 0   ; since yac-2.2.0
YAC_SERIALIZER_JSON = 1  ; since yac-2.2.0
YAC_SERIALIZER_MSGPACK = 2 ; since yac-2.2.0
YAC_SERIALIZER_IGBINARY = 3 ; since yac-2.2.0
YAC_SERIALIZER  ; serializer according to yac.serializer, default is YAC_SERIALIZER_PHP

Beri perhatian kepada masalah yang akan berlaku di bawah cli

Jika cli digunakan, konfigurasi ini mesti didayakan untuk membolehkan cli-enable

<?php  
use Doraemon\pockets\datebase\ShareCache;
//实例化缓存封装类
$cache  = new ShareCache(&#39;test&#39;);
//设置缓存
$cache->set([1,2,3,5,6]);
//获取缓存
$a = $cache->get();


//备注 1.由于yac的缓存是共享的,所以在多个项目中使用时,需要注意key的唯一性,否则会出现缓存覆盖的情况
//备注 2.由于cli在执行后会自动退出,所以在cli中使用时,需要注意缓存的有效期,当再次执行时候换存是拿不到的
//例如

//例
//step 1
<?php
use Doraemon\pockets\datebase\ShareCache;
$cache  = new ShareCache(&#39;test&#39;);
//设置缓存
$cache->set([1,2,3,5,6]);
//php step1.php //执行后会自动退出,缓存失效

<?php
use Doraemon\pockets\datebase\ShareCache; 
//step 2
$cache  = new ShareCache(&#39;test&#39;);
//设置缓存
$arr = $cache->get();
var_dump($arr);// 空
//php step2.php //执行事后上一个进程已经退出,所以缓存失效

Kaedah

Yac::__construct

Yac::__construct([string $prefix = ""])

Pembina Yac, anda boleh menentukan awalan yang akan digunakan apabila melakukan set/get/delete Apabila diprapend pada sebarang kekunci

<?php
   $yac = new Yac("myproduct_");
?>

Yac::set

   Yac::set($key, $value[, $ttl = 0])
   Yac::set(array $kvs[, $ttl = 0])

menyimpan nilai ke dalam cache Yac, kunci adalah unik kepada cache, jadi Menyimpan nilai kedua dengan kunci yang sama akan menimpa nilai asal.

Kembalikan benar jika berjaya, palsu jika ralat berlaku (jika tiada ingatan, cas write right tidak boleh diperolehi)

<?php
$yac = new Yac();
$yac->set("foo", "bar");
$yac->set(
    array(
        "dummy" => "foo",
        "dummy2" => "foo",
        )
    );
?>

Nota:

Jika Yac 2.1, yang mungkin gagal jika perbalahan cas gagal, anda mungkin perlu melakukan perkara berikut:

while (!($yac->set("important", "value")));

Yac::get

 Yac::get(array|string $key[, &$cas = NULL])

Dapatkan pembolehubah storan daripada cache . Jika tatasusunan diluluskan, setiap elemen diambil dan dikembalikan. Mengembalikan nilai pada kejayaan, palsu pada ralat

<?php
$yac = new Yac();
$yac->set("foo", "bar");
$yac->set(
    array(
        "dummy" => "foo",
        "dummy2" => "foo",
        )
    );
$yac->get("dummy");
$yac->get(array("dummy", "dummy2"));
?>

Yac::delete

Yac::delete(array|string $keys[, $delay=0])

Memadamkan pembolehubah yang disimpan daripada cache. Jika kelewatan ditentukan, nilai akan dipadamkan selepas $delay saat.

Yac::flush

Yac::flush()

Batalkan semua item sedia ada serta-merta. Ia sebenarnya tidak mengeluarkan sebarang sumber, ia hanya menandakan semua item sebagai tidak sah.

Yac::info

Yac::info(void)

Dapatkan maklumat cache

<?php
  ....
  var_dump($yac->info());
  /* will return an array like:
  array(11) {
      ["memory_size"]=> int(541065216)
      ["slots_memory_size"]=> int(4194304)
      ["values_memory_size"]=> int(536870912)
      ["segment_size"]=> int(4194304)
      ["segment_num"]=> int(128)
      ["miss"]=> int(0)
      ["hits"]=> int(955)
      ["fails"]=> int(0)
      ["kicks"]=> int(0)
      ["slots_size"]=> int(32768)
      ["slots_used"]=> int(955)
  }
  */
<?php
namespace Test\Cache
use Yac;
use RuntimeException;
/**
 * 共享缓存类
 * Date: 2023/2/22
 * Time: 16:13
 * docs:
 */
class ShareCache
{
    public bool $isEnable = true;
    public string $key = &#39;&#39;;
    /**
     *
     * 共享内存块实例化。
     */
    public function __construct($key)
    {
        if (!extension_loaded("yac")) {
            $this->isEnable = false;
            throw new RuntimeException(&#39;yac 扩展不存在!&#39;);
        }
        if (!$key) {
            throw new RuntimeException(&#39;key 不能为空!&#39;);
        }
        $this->key = md5($key);
    }
    /**
     *
     * 获取共享内存块的值。
     */
    public function get()
    {
        if ($this->isEnable) {
            return (new Yac(&#39;db_&#39;))->get($this->key);
        }
        throw new RuntimeException(&#39;yac is not enable ,skip getCache&#39;);
    }
    /**
     *
     * 设置共享内存块的值。
     */
    public function set($var): bool
    {
        if ($this->isEnable) {
            return (new Yac(&#39;db_&#39;))->set($this->key, $var, 3600);
        }
        throw new RuntimeException(&#39;yac is not enable ,skip setCache&#39;);
    }
    /**
     *
     * 删除共享内存块的值。
     */
    public function del(): bool
    {
        if ($this->isEnable) {
            return (new Yac(&#39;db_&#39;))->delete($this->key);
        }
        throw new RuntimeException(&#39;yac is not enable ,skip delCache&#39;);
    }
    /**
     *
     * 获取共享内存块的信息。
     */
    public function info(): array
    {
        if ($this->isEnable) {
            return (new Yac(&#39;db_&#39;))->info();
        }
        throw new RuntimeException(&#39;yac is not enable ,skip info&#39;);
    }
    /**
     *
     * 清空共享内存块的值。
     */
    public function flush(): bool
    {
        if ($this->isEnable) {
            return (new Yac)->flush();
        }
        throw new RuntimeException(&#39;yac is not enable ,skip flush&#39;);
    }
}

Pembelajaran yang disyorkan: "Tutorial video PHP

Atas ialah kandungan terperinci Cache kongsi PHP Yac menggantikan memcache APCU!. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

Kenyataan:
Artikel ini dikembalikan pada:learnku.com. Jika ada pelanggaran, sila hubungi admin@php.cn Padam