ThinkPHP6 redis 缓存有效期、过期时间设置

本文介绍了如何在ThinkPHP框架中配置并使用Redis作为缓存。首先,你需要确保已经安装了Redis,然后在configcache.php配置文件中添加Redis信息。通过设置default字段为'redis',可以设置默认缓存类型为Redis。设置缓存数据的失效时间,可以使用有效时间(单位:秒)或者指定到期时间(使用DateTime类)。例如,设置缓存3600秒后过期或在特定日期时间过期。这使得在TP中灵活管理Redis缓存成为可能。

ThinkPHP,下文简称TP。

TP缓存的配置文件为 config\cache.php,默认使用文件缓存,如需使用Redis缓存,需要安装单独Redis,这里不做介绍。如已安装Redis,将Redis信息加入到TP缓存配置文件中,即可在TP框架中使用Redis业务。参考配置如下图

 配置文件中的 default 字段可设置TP默认使用的缓存类型,后期也可以任意切换缓存类型。例如

Cache::store('redis')::get($name);
Cache::store('redis')::set($name, $value);

设置缓存失效时间

TP有两种设置方式,分别是有效时间和到期时间。
 

一、有效时间

设置有效期很简单,单位是秒。如果指定后,该数据在 N 秒后自动失效。

Cache::set($name, $value, 3600);

二、设置到期时间

设置到期时间使用 DateTime 类,可指定时间和时间戳timestamp

Cache::set($name, $value, new \DateTime('2022-12-30 10:10:10'));
$expired = new \DateTime();
$expired->setTimestamp(1672366210);

Cache::set($name, $value, $expired);

<think> 我们正在使用FastAdmin(基于ThinkPHP5)框架,并且已经配置好了Redis作为缓存驱动。用户现在需要知道在代码中如何设置Redis缓存过期时间以及如何直接删除Redis缓存。 根据ThinkPHP5的缓存操作文档,我们可以这样操作: 1. 设置缓存并指定过期时间: `Cache::store('redis')->set('key', 'value', 过期时间秒数);` 2. 删除指定缓存: `Cache::store('redis')->rm('key');` 或者 `Cache::store('redis')->delete('key');` 另外,我们也可以使用原生的Redis命令,通过获取Redis对象来操作,但是框架已经封装了上述简便方法。 下面我将详细介绍: ### 一、设置Redis缓存并指定过期时间 在FastAdmin中,使用`Cache`类设置缓存时可以传递第三个参数作为过期时间(单位为秒)。 示例代码: ```php use think\Cache; // 设置缓存,键为'cache_key',值为'some value',过期时间为3600秒(1小时) Cache::store('redis')->set('cache_key', 'some value', 3600); ``` 这样,这个缓存会在3600秒后自动过期。 ### 二、直接删除Redis缓存 删除缓存可以使用`rm`方法或`delete`方法(两者等效)。 示例代码: ```php use think\Cache; // 删除键为'cache_key'的缓存 Cache::store('redis')->rm('cache_key'); // 或者 Cache::store('redis')->delete('cache_key'); ``` ### 三、其他相关操作 1. **获取缓存**: ```php $value = Cache::store('redis')->get('cache_key'); ``` 2. **判断缓存是否存在**: ```php if (Cache::store('redis')->has('cache_key')) { // 存在 } ``` 3. **设置过期时间缓存(永久缓存,但实际可能受Redis内存淘汰策略影响)**: ```php Cache::store('redis')->set('cache_key', 'value'); // 或者设置过期时间为0,但根据文档,0表示永久(具体看框架版本,有些版本0表示默认配置的过期时间) // 建议:如果希望永久,可以设置一个很长的过期时间,或者使用不设置过期时间的set方法(即不传第三个参数)。但是注意,在Redis配置的内存淘汰策略下,即使没有设置过期时间,也可能被淘汰。 ``` ### 四、关于Redis缓存过期的注意事项 - 当Redis内存不足时,会根据配置的内存淘汰策略(如LRU、LFU等)删除部分缓存,即使这些缓存尚未过期[^1]。 - 如果需要实现类似JWT令牌的过期验证,可以在设置缓存时指定过期时间,然后每次请求验证缓存是否存在(即是否过期)[^2]。 ### 五、完整示例 下面是一个完整的控制器方法示例,展示了如何设置、获取和删除缓存: ```php public function cacheExample() { $key = 'test_key'; // 设置缓存有效期60秒 Cache::store('redis')->set($key, 'Hello, Redis!', 60); // 获取缓存 $value = Cache::store('redis')->get($key); echo "缓存值:".$value; // 输出:Hello, Redis! // 等待一段时间(超过60秒)后,再次获取 sleep(61); $value = Cache::store('redis')->get($key); if (is_null($value)) { echo "缓存已过期"; } // 重新设置缓存 Cache::store('redis')->set($key, 'New value'); // 手动删除缓存 Cache::store('redis')->rm($key); } ``` ### 六、常见问题 1. **删除缓存失败?** - 检查键名是否正确(注意大小写) - 检查Redis连接是否正常 - 检查是否使用了正确的缓存驱动(`store('redis')`) 2. **设置过期时间缓存未按时过期?** - 可能是Redis内存淘汰策略导致提前删除[^1],也可能是系统时间问题。 ### 七、流程图:Redis缓存操作流程 ```mermaid graph TD A[设置缓存] --> B[Cache::store('redis')->setkey, value, ttl] C[获取缓存] --> D[Cache::store('redis')->getkey] E[删除缓存] --> F[Cache::store('redis')->rmkey] ``` §§相关问题§§ 1. 如何在FastAdmin中批量删除Redis缓存? 2. Redis内存淘汰策略如何影响FastAdmin中的缓存? 3. 如何监控FastAdmin中Redis缓存的命中率和过期情况? 4. 在FastAdmin中如何实现缓存自动续期(例如续签token)? 5. 如何配置Redis集群以提高FastAdmin缓存的可用性? [^1]: Redis内存淘汰策略可能导致未过期的缓存被删除。 [^2]: 使用Redis缓存设置过期时间可以用于控制令牌的有效期。 </think> 在 FastAdmin(基于 ThinkPHP5)中操作 Redis 缓存时,设置过期时间和删除缓存是核心操作。以下是完整实现方案: --- ### 一、设置 Redis 缓存过期时间 #### 方法 1:设置缓存时直接指定过期时间(推荐) ```php use think\Cache; // 设置缓存并指定过期时间(单位:秒) Cache::store('redis')->set('token_user1', 'abc123xyz', 3600); // 1小时后过期 ``` #### 方法 2:对已存在缓存设置过期时间 ```php // 获取原生 Redis 对象操作 $redis = Cache::store('redis')->handler(); // 对已存在的 key 设置过期时间 $redis->expire('token_user1', 7200); // 2小时后过期 ``` #### 方法 3:设置 UNIX 时间戳过期 ```php $expireTimestamp = time() + 1800; // 30分钟后过期 $redis->expireAt('token_user1', $expireTimestamp); ``` --- ### 二、删除 Redis 缓存的方法 #### 方法 1:删除单个缓存 ```php // 标准删除方法 Cache::store('redis')->rm('token_user1'); // 等效写法 Cache::store('redis')->delete('token_user1'); ``` #### 方法 2:批量删除缓存(使用通配符) ```php $redis = Cache::store('redis')->handler(); // 删除所有以 fa_token_ 开头的缓存 $keys = $redis->keys('fa_token_*'); foreach ($keys as $key) { $redis->del($key); } // 更高效的方式(Redis 4.0+) $redis->eval("return redis.call('del', unpack(redis.call('keys', ARGV[1])))", 0, 'fa_token_*'); ``` #### 方法 3:清除整个 Redis 数据库 ```php // 清除当前数据库 (慎用!) Cache::store('redis')->clear(); // 清除指定数据库 $redis->select(1); // 切换到 DB1 $redis->flushDB(); // 仅清除 DB1 ``` --- ### 三、关键注意事项 1. **过期时间的精度** Redis 过期时间精度为毫秒级,但实际到期删除是**被动+主动结合**: - 被动:当访问 key 时检查是否过期 - 主动:Redis 定期抽样删除过期 key 2. **内存淘汰策略影响** 当 Redis 内存不足时,即使未到期也会根据策略删除 key[^1]: ```bash # 查看当前策略 redis-cli config get maxmemory-policy ``` 常用策略:`volatile-lru`(淘汰最近最少使用的带过期 key) 3. **令牌场景最佳实践** ```php // 登录成功时生成令牌 $token = generate_jwt_token($user); Cache::store('redis')->set('token_'.$user->id, $token, 86400); // 拦截器验证 public function checkToken() { $token = request()->header('Authorization'); $userId = get_user_id_from_token($token); if (!Cache::store('redis')->has('token_'.$userId)) { throw new Exception('令牌已过期'); } // 放行请求... } ``` --- ### 四、操作验证方法 1. **检查过期时间** ```php $ttl = Cache::store('redis')->handler()->ttl('token_user1'); echo "剩余过期时间:{$ttl}秒"; // -2 表示 key 不存在 ``` 2. **监控删除效果** ```bash # 命令行实时监控 redis-cli monitor | grep -E 'DEL|EXPIRE' ``` --- ### 五、流程图:缓存生命周期管理 ```mermaid graph LR A[设置缓存] --> B[Cache::setkey, value, ttl] B --> C{缓存使用} C -->|访问时检查| D[是否过期?] D -->|是| E[自动删除并返回空] D -->|否| F[返回缓存值] G[主动删除] --> H[Cache::rmkey] H --> I[立即释放内存] ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值