Redis系列之Ehcache、Memcached、Redis对比
概述
面对海量、高并发请求时,为了实现秒级设置毫秒级响应,增加系统的吞吐量,故而需要考虑引入缓存系统。常见的开源的组件如下。
Ehcache
官网
GitHub
特色:
- 够快: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
官网
GitHub
简介
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种基本+多个高级数据结构 |
过期策略 | 支持 | 支持 | 支持 |
持久化 | 支持 | 不支持 | 支持 |
集群与高可用 | 自带 | 第三方搭建实现 | 支持多种模式,确保高可用 |
分布式 | 不支持 | 不支持 | 支持、分布式锁、分布式事务 |
信息订阅 | 不支持 | 不支持 | 支持 |
参考
Ehcache & Memcached & Redis
Redis系列之Ehcache、Memcached、Redis对比相关推荐
- Redis系列教程(一):Redis缓存的设计、性能、应用与数据集群同步
Redis 是完全开源免费的,遵守BSD协议,是一个高性能的key-value数据库.Redis本质上是一个Key-Value类型的内存数据库,很像memcached,整个数据库统统加载在内存当中进行 ...
- Redis系列教程(四):Redis为什么是单线程、及高并发快的3大原因详解
Redis的高并发和快速原因 1.redis是基于内存的,内存的读写速度非常快: 2.redis是单线程的,省去了很多上下文切换线程的时间: 3.redis使用多路复用技术,可以处理并发的连接.非阻塞 ...
- Redis系列教程(六):Redis缓存和MySQL数据一致性方案详解
需求起因 在高并发的业务场景下,数据库大多数情况都是用户并发访问最薄弱的环节.所以,就需要使用redis做一个缓冲操作,让请求先访问到redis,而不是直接访问MySQL等数据库. 这个业务场景,主要 ...
- Redis系列教程(五):Redis哨兵、复制、集群的设计原理,以及区别
前一篇文章高并发架构系列:Redis为什么是单线程.及高并发快的3大原因详解谈了Redis高并发快的3个原因,本篇主要谈Redis的高可用,两篇合起来就可以把redis的高并发和高可用搞清楚了. 谈到 ...
- Redis系列教程(九):Redis的内存回收原理,及内存过期淘汰策略详解
Redis内存回收机制 Redis的内存回收主要围绕以下两个方面: 1.Redis过期策略:删除过期时间的key值 2.Redis淘汰策略:内存使用到达maxmemory上限时触发内存淘汰数据 Red ...
- Redis系列教程(七):Redis并发竞争key的解决方案详解
Redis高并发的问题 Redis缓存的高性能有目共睹,应用的场景也是非常广泛,但是在高并发的场景下,也会出现问题: 高并发架构系列:Redis缓存和MySQL数据一致性方案详解 如何解决Redis缓 ...
- Redis系列2- C#中使用Redis的示例
上一篇Redis的系列已经讲了Redis的下载.安装,接下来这一篇,主要讲使用Redis提供的 ServiceStack.Redis 这个开发库在C#项目中作为缓存服务使用的一个简单示例,废话不多话, ...
- 深入理解Redis系列之SpringBoot集成Redis
SpringBoot环境 快速搭建一个SpringBoot工程 进入 https://start.spring.io 网站, 使用该网站初始化一个SpringBoot工程 添加相关依赖 因为使用spr ...
- 「Redis 系列」那些你不知道的Redis配置文件详解,毕向东java基础视频教程
daemonize ========= 是否以守护进程的方式运行,默认是 no,我们需要的话可以修改成 yes pidfile ======= 以后台方式运行 redis ,我们就需要制定一个 pid ...
最新文章
- 计算机翻译字串符,字符的计算机处理和显示 外文翻译.doc
- LeetCode 581. 最短无序连续子数组(排序单调栈)
- JSONObject 自定义过滤配置
- Linux操作系统:文件和目录命令
- 苹果无人车野心越发明显,再挖一名特斯拉工程师,或负责汽车软件UI
- (原文)基于甘特图的深度强化学习方法求解端到端在线重调度
- 100篇文献-万字总结 || 强化学习求解车间调度
- C语言实现汉诺塔(程序执行步骤详解)
- jupyter notebook的自动补全
- android n 下载地址,android N镜像文件下载地址
- 第十三届蓝桥杯大赛软件赛省赛(b组c语言)
- 【开源小软件 】Bing每日壁纸 V1.2.1
- spring-retry框架使用说明
- 如何用python解方程组_python如何解方程组
- SELECT... FOR UPDATE 排他锁
- Fully Attentional Network for Semantic Segmentation
- MySQL 实现不同分组取不同值
- 看腻了数字,拼图验证码?推荐一个开源项目——把验证码设计成射击游戏
- 计算机专业英语影印版单词,计算机专业英语词汇词组翻译(08影印版)
- 视频教程-Access2013数据库入门教程3查询部分-MySQL
热门文章
- vue element自定义图标-iconfont图标的使用
- win10 wubi linux,迁移Wubi安装的ubuntu到Win10纯净版
- (专升本)PowerPnt(新建演示文稿、PowerPoint 2010视图)
- 不得不说华为P30这场发布会让苹果着实难堪
- 实例26 循环体的过滤器
- 在线学习与考试App源码
- git push origin master报错error: src refspec master does not match any || git commit报错nothing to commi
- 今日起,白嫖阿里云服务器,1年!
- [转]MySQL的binlog日志
- 618最值得买的数码好物有哪些、全网数码产品推荐指数最高清单