三分快乐,七纷幸福 发布的文章

                                青玉案·元夕
                                     宋·辛弃疾
                     东风夜放花千树。
                     更吹落、星如雨。
                     宝马雕车香满路。
                     凤箫声动,玉壶光转,一夜鱼龙舞。
                     蛾儿雪柳黄金缕。
                     笑语盈盈暗香去。
                     众里寻他千百度。
                     蓦然回首,那人却在,灯火阑珊处。

Redis缓存有以下几种模式
一、Cache-Aside (旁路缓存)
Cache-Aside Pattern,也称为Lazy-Loading Pattern,是由应用程序负责直接从缓存中读取和写入数据。如果缓存未命中,应用程序将从数据库加载数据,并将其存储在缓存中以供未来使用

读取数据:
   ·应用程序首先查询缓存
   ·如果缓存命中,直接返回数据
   ·如果缓存未命中,应用程序从数据库查询数据,然后将数据存储在缓存中,并返回给用户
更新数据:
   ·应用程序直接更新数据库
   ·接着,应用程序移除或更新缓存中的相应数据

二、Read-Through (透读缓存)
Read-Through Pattern是由缓存层负责从数据源(如数据库)加载数据。当应用程序请求数据时,如果缓存中存在该数据,则直接返回;如果不存在,则缓存层负责从数据源加载数据,存入缓存,并返回给应用程序。
读取数据

    ·应用程序请求数据
    ·如果缓存命中,缓存层直接返回数据
    ·如果缓存未命中,缓存层从数据源加载数据,更新缓存

更新数据:

    ·应用程序更新数据源
    ·缓存层可以更新或删除缓存

三、Write-Through (透写缓存)
Write-Through Pattern是由应用程序在更新数据时同时更新缓存和后端数据源(如数据库)。这种策略确保了缓存和数据源之间的一致性,并减少了数据丢失的风险
更新数据:

    ·应用程序同时更新缓存和数据源
    ·这确保了缓存中的数据总是最新的,并与数据源保持一致

四、Write-Back / Write-Behind (写后缓存)
Write-Back / Write-Behind Pattern是由应用程序首先将数据写入缓存,然后再异步地更新后端数据源(如数据库)。这种策略可以减少对数据源的即时写操作,从而提高应用程序的性能,提升系统的TPS
更新数据:

    ·应用程序首先将数据写入缓存
    ·缓存系统异步地将数据更新到数据库

五、Write-Through-Back (透写后缓存)
Write-Through-Back Pattern是结合了Write-Through和Write-Back模式的缓存方法。在这种模式下,数据首先被写入缓存,然后立即异步地更新到数据库。这种模式旨在平衡写操作的即时性和减少对数据源的直接压力。注:Write-Back通常再写入缓存与数据库存在较大一段时间间隔,Write-Through-Back通常立即执行异步操作,能较大程度减少最终一致性时长
更新数据:

   ·应用程序首先将数据写入缓存
   ·然后,缓存系统异步地将数据更新到数据源

六、Refresh-Ahead (预刷新缓存)
Refresh-Ahead Pattern用于主动刷新即将过期的缓存项。在这种模式下,系统会监控数据的访问模式,并在缓存项接近过期时自动从数据源刷新数据。这有助于保持缓存数据的新鲜度,减少缓存未命中的情况,通常也可用于定时刷新不常用的数据减少RPC远程调用的开销
缓存刷新:

   ·系统监控缓存项的访问模式和过期时间
   ·当缓存项接近过期时,系统自动从数据源刷新数据,并更新缓存

七、Lazy-Loading (懒加载)
Lazy-Loading Pattern模式下,数据仅在首次请求时被加载到缓存中。当应用程序请求数据时,如果数据不在缓存中,则从数据源加载数据并将其存储在缓存中,注:其和Cache Aside Pattern的区别在于,后者是前者的一种实现,后者提供了更多控制缓存何时更新的灵活性,适用于需要精细管理数据一致性的场景,前者仅侧重于按需加载数据
读取数据:

   ·应用程序请求数据。
   ·如果缓存命中,返回缓存中的数据。 
   ·如果缓存未命中,从数据源加载数据,存入缓存,并返回数据

八、Write-Around (绕写缓存)
Write-Around Pattern下数据在更新时直接写入后端数据源(如数据库),而不是首先写入缓存。接着通过异步的方式再写入缓存。这种模式可以减少缓存中不常用数据的写入,从而节省缓存空间并提高缓存的有效性。
更新数据:

   ·应用程序直接更新数据源
   ·缓存不会立即更新,只有在数据被请求时才可能从数据源加载到缓存中

模式汇总图:

文章来源:https://blog.csdn.net/weixin_38522648/article/details/135175188

问题说明:今天再做附件下载时,因为附件名称为中文,在苹果手机safari浏览器下载文件中文名称直接乱码,如图:
WX20231219-151526@2x.png
解决方法:
php代码:

public fuction downloadFile($fileurl, $filename, $charset = 'UTF-8'){
   if (preg_match("/MSIE/", $_SERVER["HTTP_USER_AGENT"])) {
      $filename = urlencode($filename);
      $filename = str_replace("+", "%20", $filename);// 替换空格
      $attachment = "attachment; filename=\"{$filename}\"; charset={$charset}"; 
   } else if (preg_match("/Firefox/", $_SERVER["HTTP_USER_AGENT"])) {
      $attachment = 'attachment; filename*=utf-8\'\'' . $filename; 
   } else if (preg_match("/Safari/", $_SERVER["HTTP_USER_AGENT"])) {
      $filename = rawurlencode($filename); // 注意:rawurlencode与urlencode的区别
      $attachment = 'attachment; filename*=utf-8\'\'' . $filename;
   } else {
      $filename = rawurlencode($filename);
      $attachment = "attachment; filename=\"{$filename}\"; charset={$charset}";
   }
   header('Pragma: public');
   header("Content-Transfer-Encoding: Binary");
   header('Content-Type: application/octet-stream');
   header("Content-disposition:".$attachment."");
   readfile($fileurl);  
}