Maison  >  Article  >  cadre php  >  Partager les enregistrements des classes de service d'opération Redis dans le framework TP6

Partager les enregistrements des classes de service d'opération Redis dans le framework TP6

藏色散人
藏色散人avant
2021-08-25 11:45:183091parcourir

Ce qui suit est la colonne du didacticiel thinkphpframework pour partager avec vous les enregistrements de la classe de service d'opération Redis dans ThinkPHP6. J'espère que cela sera utile aux amis dans le besoin !

1. Définir la classe de service

<?php

declare (strict_types=1);

namespace app\api\service\common;

use think\facade\Cache;

/**
 * 缓存服务
 * Class RedisService
 *
 * @package app\api\service\common
 */
class RedisService
{
    private $expire;
    private $expire_at;

    /**
     * 获取redis句柄
     *
     * @return object|null
     */
    public function client(): ?object
    {
        return Cache::store(&#39;redis&#39;)->handler();
    }

    /**
     * 处理缓存key(添加前缀...)
     *
     * @param string $key  key
     *
     * @return string
     */
    private function cacheKey(string $key): string
    {
        return Cache::getCacheKey($key);
    }

    /**
     * 缓存程序运行结果
     *
     * @param          $key
     * @param callable $callback
     * @param int      $expire
     *
     * @return mixed
     */
    public function cache($key, callable $callback, int $expire = 3600)
    {
        $cache = $this->client()->get($key);
        if (! $cache || ! unserialize($cache)) {
            $data = $callback();
            $this->client()->set($key, $cache = serialize($data), $expire);
        }

        return unserialize($cache);
    }

    /**
     * 程序运行锁
     * @param          $key
     * @param callable $callback
     * @param int      $timeout
     *
     * @return array
     */
    public function lock($key, callable $callback, int $timeout = 10): array
    {
        $lock = $this->client()->get($key);
        if ($lock) return ['code' => 0, 'data' => null];
        $this->client()->setex($key, $timeout, 1);
        $data = $callback();
        $this->client()->del($key);

        return ['code' => 1, 'data' => $data];
    }

    /**
     * 设置有效时间
     *
     * @param $ttl
     *
     * @return $this|false
     * @throws \Exception
     */
    public function setExpire($ttl)
    {
        if ($this->expire_at) throw new \Exception('setExpire and setExpireAt can not set both');
        $this->expire = $ttl;

        return $this;
    }

    /**
     * 设置到期时间
     *
     * @param $timestamp
     *
     * @return $this|false
     * @throws \Exception
     */
    public function setExpireAt($timestamp)
    {
        if ($this->expire > 0) throw new \Exception('setExpire and setExpireAt can not set both');
        $this->expire_at = $timestamp;

        return $this;
    }

    /**
     * 调用原生redis方法
     *
     * @return mixed
     */
    public function __call($name, $arguments)
    {
        $cache_key = $this->cacheKey($arguments[0]);

        $result = $this->client()->{$name}(...$arguments);

        // 设置过期时间
        $this->expire && $this->client()->expire($cache_key, $this->expire);
        $this->expire_at && $this->client()->expireAt($cache_key, $this->expire_at);

        return $result;
    }
}

2. Définir la façade

<?php


namespace app\api\facade;


use app\api\service\common\RedisService;
use think\Facade;

/**
 * Class Redis
 *
 * @package app\api\facade
 *
 * @method static \Redis client()
 * @method static \Redis setExpire($ttl)
 * @method static \Redis setExpireAt($timestamp)
 * @method static mixed cache($key, callable $callback, int $expire = 3600)
 * @method static array lock($key, callable $callback, int $timeout = 10)
 */
class Redis extends Facade
{
    protected static function getFacadeClass()
    {
        return RedisService::class;
    }
}

3. Comment utiliser

3.1 Verrouillage du programme

public function test()
    {
        $a = 1;
        $b = 2;
        $result = Redis::lock(&#39;lock:demo&#39;, function () use ($a, $b) {
            return $a + $b;
        }, 5);
        if ($result[&#39;code&#39;] == 0) return &#39;操作频繁,请稍后再试&#39;;
        return $result[&#39;data&#39;]; // 成功返回数据 3
    }

3.2 Méthode de cache de données

public function test()
{
    $a = 1;
    $b = 2;
    $result = Redis::cache(&#39;cache:demo&#39;, function () use ($a, $b) {
        return $a + $b;
    }, 5);

    return $result; // 成功返回数据 3,有效时长5秒
}

3.3 Simplifié Paramétrage de l'heure d'émission

// 24小时到期
Redis::setExpire(86400)->hSet('expire:demo', 'hash-key', 'hash-value');
// 2021-08-24 23:59:59到期
Redis::setExpireAt(strtotime('2021-08-24 23:59:59'))->hSet('expireAt:demo', 'hash-key', 'hash-value');

3.4 Appel normal

// 普通调用,直接跟redis方法名
Redis::set('set:demo', 132456);
// idea支持代码提示调用
Redis::client()->set('set:demo', 132456);
Recommandé : "Les 10 derniers didacticiels vidéo thinkphp"

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Déclaration:
Cet article est reproduit dans:. en cas de violation, veuillez contacter admin@php.cn Supprimer