Redis系列之Ehcache、Memcached、Redis对比
概述
面对海量、高并发请求时,为了实现秒级设置毫秒级响应,增加系统的吞吐量,故而需要考虑引入缓存系统。常见的开源的组件如下。
Ehcache
- 够快:Ehcache发布历史长,经过几年的努力和不计其数的性能测试,Ehcache终被设计于large, high concurrency systems;
- 够简单:接口非常简单,被广泛的运用于其他的开源项目,比如hibernate;
- 够袖珍:small foot print ,一般Ehcache的发布版本不会到2M
- 够轻量:核心程序仅仅依赖slf4j这一个包!
- 好扩展:Ehcache提供对大数据的内存和硬盘的存储,最近版本允许多实例、保存对象高灵活性、提供LRU、LFU、FIFO淘汰算法,基础属性支持热配置、支持的插件多
- 监听器:缓存管理器监听器 (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
简介
Memcached是一种高性能、分布式对象缓存系统,最初设计于缓解动态网站数据库加载数据的延迟性,你可以把它想象成一个大的内存HashTable,即key-value键值缓存。特性:
- 依赖:C语言所编写,依赖于最近版本的GCC和libevent。GCC是它的编译器,同时基于libevent做socket io。
- 多线程支持:Memcached支持多个CPU同时工作,在Memcached安装文件下有个叫threads.txt中特别说明,By default, memcached is compiled as a single-threaded application.默认是单线程编译安装,如果你需要多线程则需要修改./configure --enable-threads,为了支持多核系统,前提是你的系统必须具有多线程工作模式。开启多线程工作的线程数默认是4,如果线程数超过cpu数容易发生操作死锁的概率。结合自己业务模式选择才能做到物尽其用。
- 高性能:通过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服务
- 启动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文件 - 结束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非常丰富;
对比
特性 | Ehcache3 | Memcached | Redis |
---|---|---|---|
是否开源 | 是 | 是 | 是 |
GitHub Star/Fork | 1.5K/0/5K | 10.K/2.8K | 44K/17.4K |
开源活跃度 | 较活跃 | 活跃 | 非常活跃 |
文档 | 齐全 | 较齐全 | 非常齐全 |
开发语言 | Java | C | C |
学习成本 | 较低 | 不低 | 低 |
客户端 | 只有Java | 较多 | 非常丰富,客户端切片支持 |
数据类型 | String | String/Integer | 5种基本+多个高级数据结构 |
过期策略 | 支持 | 支持 | 支持 |
持久化 | 支持 | 不支持 | 支持 |
集群与高可用 | 自带 | 第三方搭建实现 | 支持多种模式,确保高可用 |
分布式 | 不支持 | 不支持 | 支持、分布式锁、分布式事务 |
信息订阅 | 不支持 | 不支持 | 支持 |