专栏首页写PHP的老王聊聊Yii2和ThinkPHP5的文件缓存

聊聊Yii2和ThinkPHP5的文件缓存

Yii2和ThinkPHP5缓存操作提供的公共方法对比

Yii2缓存提供的方法
  1. get 获取缓存
  2. set 设置缓存数据
  3. exists 判断缓存是否存在
  4. mset multiSet 方法别名,批量设置缓存
  5. mget multiGet 方法别名,批量获取缓存
  6. add 添加缓存返回true,存在则不做操作
  7. madd 批量添加多个,返回成功插入数组
  8. delete 删除缓存
  9. flush 清空缓存所有数据
  10. offsetExists ,exists别名
  11. offsetGet ,get别名
  12. offsetSet,set别名
  13. offsetUnset,delete别名
  14. getOrSet,获取缓存,不存在则设置缓存

ThinkPHP5缓存提供的方法

  1. get 获取缓存
  2. set 设置缓存
  3. inc 缓存数据自增
  4. dec缓存数据自减
  5. rm 删除缓存
  6. clear 根据tag 删除缓存
  7. pull 读取缓存并删除缓存
  8. remember读取缓存,不存在则设置
  9. tag 缓存分组加标签
  10. has 判断缓存是否存在

Yii2 和ThinkPHP5 缓存操作对比

  1. 读写操作 ThinkPHP5 读写缓存文件都是通过file_get_contents和file_put_contents操作文件,且不加任何锁。因此在极端情况下,有可能会出现读取文件头不对尾的情况。如果遇到多个请求同时写缓存,会涉及到并发问题。Yii2读取缓存加共享锁LOCK_SH,写缓存加排它锁LOCK_EX保证读写数据完整。
  2. ThinkPHP5 虽然实现了自增自减方法,但是内部实现实际上是先读取后设置,并且中间没有锁操作,所以在多个请求同时对数据进行自增自减的情况数据会不正确。如果要实现原子操作的自增自减,两个框架都需要开发者自己去实现。
  3. Yii2缓存过期方式通过修改文件的更改时间记录过期时间。ThinkPHP5 则是在缓存文件中插入过期时间数据,根据文件最后修改时间以及过期时间确定缓存是否过期。
  4. Yii2缓存有gc机制,在每次写入缓存的时候会以一定的概率删除过期缓存文件。ThinkPHP5 则是在读取缓存的时候,如果缓存过期则删除。如果缓存保存的是多层级的文件夹,Yii2会删除缓存文件夹,但是ThinkPHP5 不会删除。因此ThinkPHP5 需要开发者编写额外的脚本去定期删除缓存文件,避免空间占用。
  5. 两种框架都支持缓存可序列化数据。Yii2缓存操作支持自定义数据序列化方法,默认使用serialize方式。 ThinkPHP5 只能是开发者在每次调用的时候用自定义的方法序列化在存入缓存或者使用默认serialize序列化。
  6. Yii2缓存可以设置依赖,当依赖的数据变更,缓存依赖器会将相关的缓存设置成过期状态。ThinkPHP5 没有。

文件缓存中一些其他东西

  • 文件锁。 LOCK_SH 共享锁(读文件),LOCK_EX 排它锁(写文件),LOCK_UN 释放锁,LOCK_NB 锁定不阻塞;写文件先执行写锁,其他进程不能读文件,必须等写锁释放。如果读文件加了LOCK_NB标志,则读文件不阻塞,直接读取失败!读文件先执行读锁,其他进程可读。写入文件必须等读锁释放。如果写文件加了LOCK_NB标志,则写文件不阻塞,直接失败
  • 文件状态缓存。PHP会缓存对文件状态信息的检查结果。如果在一个脚本中多次检查同一个文件,只在最初会读取信息,其他都是从缓存中获取。受影响的函数有:stat() lstat() file_exists() is_writable() is_readable() is_executable() is_file() is_dir() is_link() filectime() fileatime() filemtime() fileinode() filegroup() fileowner() filesize() filetype() fileperms()因此如果文件被操作过或者不需要缓存文件状态,则需要清除文件状态缓存,使用clearstatcache清除文件状态缓存

本文分享自微信公众号 - 写PHP的老王(laowang_php),作者:写PHP的老王

原文出处及转载信息见文内详细说明,如有侵权,请联系 yunjia_community@tencent.com 删除。

原始发表时间:2018-08-03

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • Laravel 中Facade门面是怎么实现?有没有其他实现方式?

    在laravel中的路由文件routes/web.php有这么一段代码,用于配置路由。这里Route就是用Facade实现类方法get的静态调用。

    写PHP的老王
  • Laravel5.6博客中文章标签增删改查

    该命令会在 app 目录下创建模型文件 Tag.php,由于我们在 make:model 命令中使用了 --migration 选项,所以同时会创建 Tag 模...

    写PHP的老王
  • 高性能MySQL(第3版)阅读笔记

    1、char(5) 和varchar(200) 存储'hello'的空间开销相同,使用短列有什么优势?

    写PHP的老王
  • 缓存穿透、缓存击穿和缓存雪崩实践

    我们使用缓存的主要目是提升查询速度和保护数据库等稀缺资源不被占满。而缓存最常见的问题是缓存穿透、击穿和雪崩,在高并发下这三种情况都会有大量请求落到数据库,导致数...

    java思维导图
  • 面试前必须要知道的Redis面试题

    在前面学习我们都知道Redis不可能把所有的数据都缓存起来(内存昂贵且有限),所以Redis需要对数据设置过期时间,并采用的是惰性删除+定期删除两种策略对过期键...

    Java团长
  • 分布式系统关注点(18)——「缓存穿透」和「缓存雪崩」到底啥区别?

    有句话说得好,欲要使其毁灭,先要使其疯狂。当你沉浸在缓存所带来的系统tps飙升的喜悦中时,使你系统毁灭的种子也已经埋在其中。

    Zachary_ZF
  • 一篇文章理解Web缓存

    前端缓存主要是分为HTTP缓存和浏览器缓存。其中HTTP缓存是在HTTP请求传输时用到的缓存,主要在服务器代码上设置;而浏览器缓存则主要由前端开发在前端js上进...

    :::::::
  • 分布式缓存考点梳理 + 高频面试题

    对缓存和数据库的考察,一直都是业务开发同学在面试中的核心问题,特别是缓存部分,随着大部分公司业务规模的增加,缓存的应用越来越重要。我偶尔会和身边的同事调侃:如何...

    MickyInvQ
  • 缓存 | 从本地缓存到分布式缓存, Guava, Caffeine, Memcached, Redis

    在程序设计中,经常能听到的就是以时间换空间和以空间换时间。缓存作为一种能加快程序性能的银弹,它是典型的后者(以空间换时间).

    双鬼带单

扫码关注云+社区

领取腾讯云代金券