storefrontbvba/zend-cache-redis

使用Redis作为后端,支持标签的全功能缓存,无需使用Magento。

v1.0.0 2019-11-06 10:35 UTC

This package is auto-updated.

Last update: 2024-09-06 22:44:22 UTC


README

此Zend_Cache后端允许您使用Redis服务器作为中央缓存存储。支持标签,无需使用TwoLevels缓存,因此此后端非常适合在单机或集群上使用。与任何Zend Framework项目兼容!

功能

  • 使用phpredis PECL扩展以获得最佳性能(需要master分支或晚于2011年8月19日发布的标记版本)。
  • 如果phpredis不可用,将回退到独立的PHP,使用Credis库。
  • 完全支持标签,使用Redis的"set"和"hash"数据类型实现高效标签管理。
  • Redis自动处理键过期。
  • 支持Unix套接字连接,以在单机上获得更好的性能。
  • 支持可配置的压缩以节省内存。可以选择gzip、lzf和snappy,并且可以在不刷新缓存的情况下更改配置。
  • 使用事务来防止保存、清除或删除时的竞争条件,从而避免意外结果。
  • 支持可配置的"自动过期生存期",如果设置,则用作键未过期时的TTL。
  • 单元测试!

高可用性和负载均衡支持

Cm_Cache_Backend_Redis支持两种实现高可用性和负载均衡的方法。

Redis Sentinel

您可以使用Redis Sentinel实现高可用性和负载均衡。要启用Redis Sentinel的使用,指定的server应该是逗号分隔的Sentinel服务器列表,并且应该指定sentinel_master选项以指示Sentinel主集的名称(例如,'mymaster')。如果使用sentinel_master,还可以指定load_from_slaves,在这种情况下,将选择一个随机从机来执行读取,以在多个Redis实例之间进行负载均衡。使用值'1'表示仅从从机加载,'2'表示包括主机在内的随机读取从机选择。

示例配置

    <!-- This is a child node of config/global -->
    <cache>
      <backend>Cm_Cache_Backend_Redis</backend>
      <backend_options>
        <server>tcp://10.0.0.1:26379,tcp://10.0.0.2:26379,tcp://10.0.0.3:26379</server>
        <timeout>0.5</timeout>
        <sentinel_master>mymaster</sentinel_master>
        <sentinel_master_verify>1</sentinel_master_verify>
        <load_from_slaves>1</load_from_slaves>
      </backend_options>
    </cache>

负载均衡器或服务发现

也可以通过指定主机和从机的单独连接地址来实现高可用性,这些方法可以使用load_from_slave选项。此选项不连接到如上例所示的Sentinel服务器,尽管您可能仍然会从Sentinel设置中受益,因为这样可以更容易地实现复制和故障转移。

示例包括使用具有为主机和从机指定单独端口的TCP负载均衡器(例如HAProxy),或者使用基于DNS的系统,该系统使用服务发现健康检查通过不同的DNS名称公开主机和从机。

示例配置

    <!-- This is a child node of config/global -->
    <cache>
      <backend>Cm_Cache_Backend_Redis</backend>
      <backend_options>
        <server>tcp://redis-master:6379</server>
        <load_from_slave>tcp://redis-slaves:6379</load_from_slave>
        <master_write_only>0</master_write_only>  <!-- Use 1 to prevent reads from master -->
        <timeout>0.5</timeout>
      </backend_options>
    </cache>

静态配置

您还可以通过将数组传递给load_from_slave或使用逗号分隔的多个地址的字符串来静态指定主机和从机服务器。

    <!-- This is a child node of config/global -->
    <cache>
      <backend>Cm_Cache_Backend_Redis</backend>
      <backend_options>
        <server>tcp://redis-master:6379</server>
        <load_from_slave>tcp://redis-slave1:6379,tcp://redis-slave2:6379</load_from_slave>
        <master_write_only>0</master_write_only>  <!-- Use 1 to prevent reads from master -->
        <timeout>0.5</timeout>
      </backend_options>
    </cache>

ElastiCache

以下示例配置允许您使用ElastiCache Redis(禁用集群模式),其中写入发送到主节点,读取发送到副本。这允许您在不同节点之间分配读取流量。

查找主节点和读取副本端点的说明在此处

    <!-- This is a child node of config/global/cache -->
    <backend_options>
      <server>primary-endpoint.0001.euw1.cache.amazonaws.com</server>
      <port>6379</port>
      <database>0</database>                    <!-- Make sure database is 0 -->
      <master_write_only>1</master_write_only>
      <load_from_slave>
        <node-001>
          <server>replica-endpoint-1.jwbaun.0001.euw1.cache.amazonaws.com</server>
          <port>6379</port>
        </node-001>
        <node-002>
          <server>replica-endpoint-2.jwbaun.0001.euw1.cache.amazonaws.com</server>
          <port>6379</port>
        </node-002>
      </load_from_slave>
    </backend_options>

弃用通知

之前,ElastiCache 配置说明建议设置一个 <cluster> 节点,但这种功能存在缺陷,现已不再支持。配置仍可解析和加载以保持向后兼容性,但选择一个随机的从节点进行读取,而不是使用键的md5散列。

相关 / 调优

  • 推荐的 "maxmemory-policy" 是 "volatile-lru"。所有标签元数据都是非易失性的,因此建议使用键过期,除非绝对必要使用非易失性键,以防止标签数据被驱逐。因此,请确保 "maxmemory" 足够高,以便容纳所有标签数据和非易失性数据,同时为易失性键数据留下足够的空间。
  • 自动清理是可选的,不推荐使用,因为它速度慢且占用大量内存。
  • 如果整个缓存不经常清理且未启用自动清理,建议偶尔(例如每天一次)进行垃圾收集。最佳解决方案是运行一个cron作业来执行垃圾收集。(请参阅下方的“垃圾收集脚本示例”)。
  • 压缩将增加CPU开销,但可能值得为了节省内存和减少流量。对于高延迟的网络,甚至可能提高性能。
    • gzip — 压缩速度最慢但压缩率最高。您可能不会想使用1级以上的压缩。
    • lzf — 压缩速度最快,解压也快。安装:sudo pecl install lzf
    • snappy — 解压和压缩速度最快。下载并安装:snappyphp-snappy
  • 使用我修改的 munin插件 监控您的redis缓存统计信息。
  • 启用持久连接。确保如果您的多个配置连接持久字符串对每个配置都是唯一的,以避免“select”命令引起冲突。
  • 使用 stats.php 脚本检查您的缓存,以查找过大或低效的缓存标签。

发行说明

  • 2017年3月:添加了对Redis Sentinel和从节点加载的支持。感谢@Xon的帮助!
  • 2013年某个时候:停止更新这些发行说明...
  • 2012年11月19日:添加了read_timeout选项。(仅支持独立模式,当请求#260合并时将由phpredis支持)
  • 2012年10月29日:添加了对持久连接的支持。(感谢samm-git!)
  • 2012年10月12日:改进了内存使用和垃圾收集效率,并更新了推荐。
  • 2012年9月17日:添加了connect_retries选项(默认:1),以防止随机连接失败引起的错误。
  • 2012年7月10日:添加了对密码认证的支持。
  • 2012年3月1日:使用最新的Credis_Client,为独立模式添加了自动重连。
  • 2012年2月15日:将数据、标签和mtime使用单独的键改为每个键一个哈希。
  • 2011年11月10日:将phpredis和redisent改为Credis(它封装了phpredis)。实现了管道。
@copyright  Copyright (c) 2012 Colin Mollenhour (http://colin.mollenhour.com)
This project is licensed under the "New BSD" license (see source).