服务端Web资源缓存

1.前言

虽然客户端缓存效果很好,但它有一个核心问题:要在本地提供资源,必须先将其存储在缓存中。因此,每个客户端都需要其缓存的资源。如果请求的资源需要大量计算,则无法扩展。服务器端缓存背后的理念是计算一次资源,然后从缓存中将其提供给所有客户端。

专用的服务器端资源缓存解决方案: Memcached,Varnish,Squid、Redis、Hazelcast。

2.演示

使用 Apache APISIX 来演示服务器端缓存。APISIX 依赖于代理缓存插件进行缓存。不幸的是,目前 APISIX 不与任何第三方缓存解决方案集成。它提供两种选项:基于内存和基于磁盘。

一般来说,前者速度更快,但内存昂贵,而后者速度较慢,但​​磁盘存储便宜。然而,在 OpenResty 中,由于 LuaJIT 处理内存的方式,磁盘选项可能更快。您可能应该从磁盘开始,如果速度不够快,请挂载/dev/shm。

2.1.创建新路由

apisix.yaml配置:

yaml 复制代码
routes:
  - uri: /cache
    upstream_id: 1
    plugins:
      proxy-rewrite:
        regex_uri: ["/cache(.*)", "/$1"]
      proxy-cache: ~

请注意,默认缓存键是主机和请求 URI,其中包括查询参数。

当然也可以通过修改路由配置绕过缓存,配置如下:

yaml 复制代码
routes:
  - uri: /cache*
    upstream_id: 1
      proxy-cache:
        cache_bypass: ["$arg_bypass"]   
bash 复制代码
curl -v localhost:9080/cache?bypass=please

2.2.默认proxy-cache配置

使用默认的基于磁盘的配置。

config-default.yaml配置:

yaml 复制代码
  proxy_cache:                      # Proxy Caching configuration
    cache_ttl: 10s                  # The default caching time in disk if the upstream does not specify the cache time
    zones:                          # The parameters of a cache
      - name: disk_cache_one        # The name of the cache, administrator can specify
                                    # which cache to use by name in the admin api (disk|memory)
        memory_size: 50m            # The size of shared memory, it's used to store the cache index for
                                    # disk strategy, store cache content for memory strategy (disk|memory)
        disk_size: 1G               # The size of disk, it's used to store the cache data (disk)
        disk_path: /tmp/disk_cache_one  # The path to store the cache data (disk)
        cache_levels: 1:2           # The hierarchy levels of a cache (disk)
      - name: memory_cache
        memory_size: 50m

启动对应的应用,即可进行后续的测试工作。

2.3.测试

2.3.1.测试命令

bash 复制代码
curl -v localhost:9080/cache
bash 复制代码
< HTTP/1.1 200 OK
< Content-Type: text/html; charset=utf-8
< Content-Length: 147
< Connection: keep-alive
< Date: Thu, 16 May 2024 06:35:00 GMT
< Last-Modified: Thu, 16 May 2024 07:41:00 GMT
< ETag: "637e271f-93"
< Server: APISIX/3.0.0
< Apisix-Cache-Status: MISS                      
< Accept-Ranges: bytes

2.3.2.MISS

bash 复制代码
.
.
.
Apisix-Cache-Status: MISS 
.
.
.

2.3.3.HIT

如果我们curl再次在默认缓存过期时间(300 秒)之前,响应来自缓存

bash 复制代码
.
.
.
Apisix-Cache-Status: HIT
.
.
.

2.3.4.EXPIRED

bash 复制代码
.
.
.
Apisix-Cache-Status: EXPIRED
.
.
.

2.3.5.清除整个缓存

请注意,我们可以使用自定义 PURGE HTTP 方法显式清除整个缓存:

bash 复制代码
curl localhost:9080/cache -X PURGE
相关推荐
梅孔立13 小时前
两种免费的翻译API调用方式详解 - Edge官方API与个人缓存服务
前端·缓存·edge
gwf21613 小时前
SSD读写速度深度解析:顺序读写vs随机读写、IOPS、延迟,你的硬盘性能到底怎么看?
git·嵌入式硬件·缓存·github·智能硬件
番茄炒鸡蛋加糖15 小时前
缓存三大问题
缓存
江晓鱼未暖20 小时前
十七、Redis 核心原理与架构详解
大数据·数据库·数据仓库·redis·缓存·架构
小罗水20 小时前
第13章 Redis 缓存、幂等锁与任务状态
数据库·redis·缓存
热心市民lcj21 小时前
Spring Boot 整合 Caffeine 本地缓存实战
spring boot·后端·缓存
zx1154501 天前
【热点 Key 探测与加长缓存 TTL 实战】
缓存
toooooop81 天前
如何用 ss + ps 精准定位本机 Redis 的“隐形”消费者?
linux·数据库·redis·缓存
软萌萌的11 天前
C#中的多级缓存架构设计与实现深度解析
缓存·c#·wpf
醉城夜风~2 天前
HTML表单域学习博客:表单标签、输入框、按钮详解
android·java·缓存