Redis系列之Ehcache、Memcached、Redis对比

概述

面对海量、高并发请求时,为了实现秒级设置毫秒级响应,增加系统的吞吐量,故而需要考虑引入缓存系统。常见的开源的组件如下。

Ehcache

官网
GitHub
特色:

  1. 够快:Ehcache发布历史长,经过几年的努力和不计其数的性能测试,Ehcache终被设计于large, high concurrency systems;
  2. 够简单:接口非常简单,被广泛的运用于其他的开源项目,比如hibernate;
  3. 够袖珍:small foot print ,一般Ehcache的发布版本不会到2M
  4. 够轻量:核心程序仅仅依赖slf4j这一个包!
  5. 好扩展:Ehcache提供对大数据的内存和硬盘的存储,最近版本允许多实例、保存对象高灵活性、提供LRU、LFU、FIFO淘汰算法,基础属性支持热配置、支持的插件多
  6. 监听器:缓存管理器监听器 (CacheManagerListener)和 缓存监听器(CacheEvenListener),用于做一些统计或数据一致性广播。
    使用:
CacheManager manager = CacheManager.newInstance("src/config/ehcache.xml");
Ehcache cache = new Cache("testCache", 5000, false, false, 5, 2);
cacheManager.addCache(cache);

ehcache.xml配置文件常用属性:

  • name:缓存名称。
  • maxElementsInMemory:缓存最大个数。
  • eternal:对象是否永久有效,一但设置,timeout将不起作用。
  • timeToIdleSeconds:设置对象在失效前的允许闲置时间(秒)。仅当eternal=false对象不是永久有效时使用,可选属性,默认值是0,也就是可闲置时间无穷大。
  • timeToLiveSeconds:设置对象在失效前允许存活时间,最大时间介于创建时间和失效时间之间。仅当eternal=false对象不是永久有效时使用,默认是0,也就是对象存活时间无穷大。
  • overflowToDisk:当内存中对象数量达到maxElementsInMemory时,Ehcache将会对象写到磁盘中。
  • diskSpoolBufferSizeMB:这个参数设置DiskStore(磁盘缓存)的缓存区大小。默认是30MB。每个Cache都应该有自己的一个缓冲区。
  • maxElementsOnDisk:硬盘最大缓存个数。
  • diskPersistent:是否缓存虚拟机重启期数据 Whether the disk store persists between restarts of the Virtual Machine. The default value is false.
  • diskExpiryThreadIntervalSeconds:磁盘失效线程运行时间间隔,默认是120s;
  • memoryStoreEvictionPolicy:当达到maxElementsInMemory限制时,Ehcache将会根据指定的策略去清理内存。默认策略是LRU。可以设置为 FIFO或是LFU。
  • clearOnFlush:内存数量最大时是否清除。

Memcached

官网
GitHub

简介

Memcached是一种高性能、分布式对象缓存系统,最初设计于缓解动态网站数据库加载数据的延迟性,你可以把它想象成一个大的内存HashTable,即key-value键值缓存。特性:

  1. 依赖:C语言所编写,依赖于最近版本的GCC和libevent。GCC是它的编译器,同时基于libevent做socket io。
  2. 多线程支持:Memcached支持多个CPU同时工作,在Memcached安装文件下有个叫threads.txt中特别说明,By default, memcached is compiled as a single-threaded application.默认是单线程编译安装,如果你需要多线程则需要修改./configure --enable-threads,为了支持多核系统,前提是你的系统必须具有多线程工作模式。开启多线程工作的线程数默认是4,如果线程数超过cpu数容易发生操作死锁的概率。结合自己业务模式选择才能做到物尽其用。
  3. 高性能:通过libevent完成socket 的通讯,理论上性能的瓶颈落在网卡上。

安装

下载,放到 /tmp 目录下:
# cd /tmp
# wget http://memcached.org/files/memcached-1.5.10.tar.gz
# wget http://www.monkey.org/~provos/libevent-1.2.tar.gz
安装libevent:
# tar zxvf libevent-1.2.tar.gz
# cd libevent-1.2
# ./configure -prefix=/usr
# make (如果遇到提示gcc 没有安装则先安装gcc)
# make install
测试libevent是否安装成功:
# ls -al /usr/lib | grep libevent
安装memcached,同时需要安装中指定libevent的安装位置:
# cd /tmp
# tar zxvf memcached-1.2.0.tar.gz
# cd memcached-1.2.0
# ./configure -with-libevent=/usr
# make
# make install
安装完成后会把memcached放到 /usr/local/bin/memcached。测试是否成功安装memcached:
# ls -al /usr/local/bin/mem*

启动memcache服务

  1. 启动Memcache的服务器端:
    # /usr/local/bin/memcached -d -m 8096 -u root -l 192.168.77.105 -p 12000 -c 256 -P /tmp/memcached.pid
    -d:启动一个守护进程
    -m:是分配给Memcache使用的内存数量,单位是MB
    -u:运行Memcache的用户
    -l:监听的服务器IP地址
    -p:设置Memcache监听的端口,最好是1024以上的端口
    -c:选项是最大运行的并发连接数,默认是1024,按照你服务器的负载量来设定
    -P:设置保存Memcache的pid文件
  2. 结束Memcache进程:
    # cat /tmp/memcached.pid 或者 ps -aux | grep memcache(找到对应的进程id号)
    或者# kill 进程id号

可以启动多个守护进程,端口不能重复。

memcache 的连接
telnet ip port
连接之前需要在memcache服务端把memcache的防火墙规则加上:
-A RH-Firewall-1-INPUT -m state --state NEW -m tcp -p tcp --dport 3306 -j ACCEPT
重新加载防火墙规则:
service iptables restart
在客户端输入stats查看memcache的状态信息:

pid              memcache服务器的进程ID
uptime      服务器已经运行的秒数
time           服务器当前的unix时间戳
version     memcache版本
pointer_size         当前操作系统的指针大小(32位系统一般是32bit)
rusage_user          进程的累计用户时间
rusage_system    进程的累计系统时间
curr_items            服务器当前存储的items数量
total_items           从服务器启动以后存储的items总数量
bytes                       当前服务器存储items占用的字节数
curr_connections        当前打开着的连接数
total_connections        从服务器启动以后曾经打开过的连接数
connection_structures          服务器分配的连接构造数
cmd_get get命令          (获取)总请求次数
cmd_set set命令          (保存)总请求次数
get_hits          总命中次数
get_misses        总未命中次数
evictions     为获取空闲内存而删除的items数(分配给memcache的空间用满后需要删除旧的items来得到空间分配给新的items)
bytes_read    读取字节数(请求字节数)
bytes_written     总发送字节数(结果字节数)
limit_maxbytes     分配给memcache的内存大小(字节)
threads         当前线程数

client

https://developer.aliyun.com/article/353888

Memcached vs Redis

Redis和Memcached的最大不同,就是redis支持数据持久化。
Memcached所有的值均是简单的字符串,redis支持更为丰富的数据类型
速度快很多
redis可以持久化其数据

存储方式 Meme cache把数据全部存在内存之中,断电后会挂掉,数据不能超过内存大小。 Redis有部份存在硬盘上,这样能保证数据的持久性,重启的时候可以再次加载进行使用。
Redis支持数据的备份,即master-slave模式的数据备份。
数据支持类型 Memcache对数据类型支持相对简单。Redis有复杂的数据类型。
使用底层模型不同 它们之间底层实现方式 以及与客户端之间通信的应用协议不一样。 Redis直接自己构建VM 机制 ,因为一般的系统调用系统函数的话,会浪费一定的时间去移动和请求。

A. 数据持久化和数据同步:可定期将内存上数据持久化到硬盘上;
B. binLog功能:可将所有操作写入日志,当Redis出现故障时,可依照BinLog进行数据恢复;
C. Redis支持virtual Memory:LRU算法替换机制;
D. Redis支持更多的数据结构和更丰富的数据操作。(值可以是字符串,哈希,列表,集合和有序集合)
E. 一致性哈希算法,用在Redis的Sharding中,一般是在负载非常高需要水平扩展时使用,一般项目单机足够支持并发。Redis3.0将推出CLuster,功能更强大。

都可以通过客户端一致性 Hash 算法解决切片问题。Memcached 更是小项目、小应用场景、快速响应式团队,从高可用角度来说 Redis 还是胜出的。

Redis

Redis客户端clients非常丰富;

对比

特性Ehcache3MemcachedRedis
是否开源
GitHub Star/Fork1.5K/0/5K10.K/2.8K44K/17.4K
开源活跃度较活跃活跃非常活跃
文档齐全较齐全非常齐全
开发语言JavaCC
学习成本较低不低
客户端只有Java较多非常丰富,客户端切片支持
数据类型StringString/Integer5种基本+多个高级数据结构
过期策略支持支持支持
持久化支持不支持支持
集群与高可用自带第三方搭建实现支持多种模式,确保高可用
分布式不支持不支持支持、分布式锁、分布式事务
信息订阅不支持不支持支持

参考

Ehcache & Memcached & Redis

posted @ 2022-11-11 11:16  johnny233  阅读(97)  评论(0编辑  收藏  举报  来源