// +---------------------------------------------------------------------- namespace crmeb\services; use think\facade\Cache; use think\facade\Config; use think\cache\TagSet; /** * CRMEB 缓存类 * Class CacheService * @package crmeb\services */ class CacheService { /** * 过期时间 * @var int */ protected static $expire; /** * 写入缓存 * @param string $name 缓存名称 * @param mixed $value 缓存值 * @param int|null $expire 缓存时间,为0读取系统缓存时间 */ public static function set(string $name, $value, int $expire = 0, string $tag = 'crmeb') { try { return Cache::tag($tag)->set($name, $value, $expire); } catch (\Throwable $e) { return false; } } /** * 如果不存在则写入缓存 * @param string $name * @param mixed $default * @param int|null $expire * @param string $tag * @return mixed|string|null */ public static function remember(string $name, $default = '', int $expire = 0, string $tag = 'crmeb') { try { return Cache::tag($tag)->remember($name, $default, $expire); } catch (\Throwable $e) { try { if (is_callable($default)) { return $default(); } else { return $default; } } catch (\Throwable $e) { return null; } } } /** * 读取缓存 * @param string $name * @param mixed $default * @return mixed|string */ public static function get(string $name, $default = '') { return Cache::get($name) ?? $default; } /** * 删除缓存 * @param string $name * @return bool */ public static function delete(string $name) { return Cache::delete($name); } /** * 清空缓存池 * @return bool */ public static function clear(string $tag = 'crmeb') { return Cache::tag($tag)->clear(); } /** * 检查缓存是否存在 * @param string $key * @return bool */ public static function has(string $key) { try { return Cache::has($key); } catch (\Throwable $e) { return false; } } /** * 指定缓存类型 * @param string $type * @param string $tag * @return TagSet */ public static function store(string $type = 'file', string $tag = 'crmeb') { return Cache::store($type)->tag($tag); } /** * 检查锁 * @param string $key * @param int $timeout * @return bool */ public static function setMutex(string $key, int $timeout = 10): bool { $curTime = time(); $readMutexKey = "redis:mutex:{$key}"; $mutexRes = Cache::store('redis')->handler()->setnx($readMutexKey, $curTime + $timeout); if ($mutexRes) { return true; } //就算意外退出,下次进来也会检查key,防止死锁 $time = Cache::store('redis')->handler()->get($readMutexKey); if ($curTime > $time) { Cache::store('redis')->handler()->del($readMutexKey); return Cache::store('redis')->handler()->setnx($readMutexKey, $curTime + $timeout); } return false; } /** * 删除锁 * @param string $key * @author 等风来 * @email 136327134@qq.com * @date 2022/11/22 */ public static function delMutex(string $key) { $readMutexKey = "redis:mutex:{$key}"; Cache::store('redis')->handler()->del($readMutexKey); } /** * 数据库锁 * @param $key * @param $fn * @param int $ex * @return mixed * @author 吴汐 * @email 442384644@qq.com * @date 2023/03/01 */ public static function lock($key, $fn, int $ex = 6) { if (Config::get('cache.default') == 'file') { return $fn(); } return app()->make(LockService::class)->exec($key, $fn, $ex); } }