storefrontbvba / zend-cache-redis
使用Redis作为后端,支持标签的全功能缓存,无需使用Magento。
Requires
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 — 解压和压缩速度最快。下载并安装:snappy 和 php-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).