关于Memcache与Redis
目录
Memcache与Redis对比分析
相同点
- 内存型数据库:两者均将数据存储在内存中,提供高速数据访问
- LRU淘汰机制:当内存满载时,均采用LRU(Least Recently Used)算法替换数据
- 分布式支持:均支持分布式部署架构
不同点
Memcache
- 多线程架构:采用多线程模型处理请求
- 存储限制:
- 最大Key长度:512B
- 最大Value长度:1MB
Redis
- 单线程架构:采用单线程模型处理请求(但通过I/O多路复用实现高并发)
- 存储限制:
- 最大Key长度:512MB
- 最大Value长度:512MB
- 持久化支持:提供RDB和AOF两种持久化机制
- 丰富数据类型:
- Hashes(哈希表)
- Sorted Sets(有序集合)
- Lists(列表)
- Sets(集合)
- Lua脚本支持:可在Redis中执行Lua脚本,实现原子操作(如实现原子锁)
性能对比:Redis是单线程架构,整体性能不如Memcache,但平均到每个CPU核心上,Redis在存储小数据(<100KB)时性能更高。当存储大数据(>100KB)时,Redis性能逊于Memcache。
Redis注意事项
删除操作延迟
Redis的DEL操作会有毫秒级延迟,因为其数据回收机制并非实时触发,而是通过定时检查回收数据量是否达到阈值后才触发。
执行顺序
Redis的命令执行顺序由"客户端socket文件描述符的数字大小及核心报告客户端事件的顺序"决定,顺序在大体上遵循"先到先处理"原则,但在细节上呈现无序性。
引用自Redis客户端文档:“该顺序是由客户端socket文件描述符的数字大小及核心报告客户端事件的顺序决定的,因此顺序可以看成不确定的。”
最大连接数限制
- 问题:在MacBook上测试,当并发请求数达到约17,000时,会出现"Can’t assign requested address"错误
- 原因:受限于操作系统最大文件描述符限制(TCP的TIME_WAIT问题)
- 解决方案:
- 使用长连接或单例模式优化
- 在系统层面调整最大文件描述符限制
- 减少TCP TIME_WAIT的回收时间
补充说明:以上内容基于当前对Memcache和Redis的理解,如有新发现将及时更新。如需更深入的技术细节,建议参考官方文档或相关技术社区讨论。