目录

关于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的理解,如有新发现将及时更新。如需更深入的技术细节,建议参考官方文档或相关技术社区讨论。