分享

Redis与Memcached异同一

desehawk 发表于 2015-4-14 14:13:55 [显示全部楼层] 回帖奖励 阅读模式 关闭右栏 5 15568
本帖最后由 desehawk 于 2015-4-14 15:20 编辑
问题导读
1.Redis是什么?
2.Redis是多线程还是单线程?
3.Redis有什么用?




Redis是什么?两句话可以做下概括:
1. 是一个完全开源免费的key-value内存数据库
2. 通常被认为是一个数据结构服务器,主要是因为其有着丰富的数据结构 strings、map、 list、sets、 sorted sets

Redis不是什么?同样从两个方面来做下对比:
1. 不是sql server、mySQL等关系型数据库,主要原因是:
     . redis目前还只能作为小数据量存储(全部数据能够加载在内存中) ,海量数据存储方面并不是redis所擅长的领域
     . 设计、实现方法很不一样.关系型数据库通过表来存储数据,通过SQL来查询数据。而Redis通上述五种数据结构来存储数据,通过命令 来查询数据
2.   不是Memcached等缓存系统,主要原因有以下几个:
     .网络IO模型方面:Memcached是多线程,分为监听线程、worker线程,引入锁,带来了性能损耗。Redis使用单线程的IO复用模型,将速度优势发挥到最大,也提供了较简单的计算功能
     .内存管理方面:Memcached使用预分配的内存池的方式,带来一定程度的空间浪费 并且在内存仍然有很大空间时,新的数据也可能会被剔除,而Redis使用现场申请内存的方式来存储数据,不会剔除任何非临时数据 Redis更适合作为存储而不是cache
     .数据的一致性方面:Memcached提供了cas命令来保证.而Redis提供了事务的功能,可以保证一串 命令的原子性,中间不会被任何操作打断
     . 存储方式方面:Memcached只支持简单的key-value存储,不支持枚举,不支持持久化和复制等功能
   一句话小结一下:Redis是一个高性能的key-value数据库。 redis的出现,很大程度补偿了memcached这类key/value存储的不足,在部分场合可以对关系数据库起到很好的补充作用。

Redis有什么用?只有了解了它有哪些特性,我们在用的时候才能扬长避短,为我们所用:
1. 速度快:使用标准C写,所有数据都在内存中完成,读写速度分别达到10万/20万
2. 持久化:对数据的更新采用Copy-on-write技术,可以异步地保存到磁盘上,主要有两种策略,一是根据时间,更新次数的快照(save 300 10 )二是基于语句追加方式(Append-only file,aof)
3. 自动操作:对不同数据类型的操作都是自动的,很安全
4. 快速的主--从复制,官方提供了一个数据,Slave在21秒即完成了对Amazon网站10G key set的复制。
5. Sharding技术: 很容易将数据分布到多个Redis实例中,数据库的扩展是个永恒的话题,在关系型数据库中,主要是以添加硬件、以分区为主要技术形式的纵向扩展解决了很多的应用场景,但随着web2.0、移动互联网、云计算等应用的兴起,这种扩展模式已经不太适合了,所以近年来,像采用主从配置、数据库复制形式的,Sharding这种技术把负载分布到多个特理节点上去的横向扩展方式用处越来越多。

这里对Redis数据库做下小结:
1. 提高了DB的可扩展性,只需要将新加的数据放到新加的服务器上就可以了
2. 提高了DB的可用性,只影响到需要访问的shard服务器上的数据的用户
3. 提高了DB的可维护性,对系统的升级和配置可以按shard一个个来搞,对服务产生的影响较小
4. 小的数据库存的查询压力小,查询更快,性能更好

   写到这里,可能就会有人急不可待地想用它了,那怎么用呢?可以直接到官方文档,里面帮我们整理好了各个语言环境下的客户端,主要有Ruby、Python、 PHP、Perl、Lua、Java、C#....有几种语言,我也没见过,所以就不多说了,你懂的....

最后,把我使用过程中的一些 经验与教训,做个小结:
1. 要进行Master-slave配置,出现服务故障时可以支持切换。
2. 在master侧禁用数据持久化,只需在slave上配置数据持久化。
3. 物理内存+虚拟内存不足,这个时候dump一直死着,时间久了机器挂掉。这个情况就是灾难!
4. 当Redis物理内存使用超过内存总容量的3/5时就会开始比较危险了,就开始做swap,内存碎片大
5. 当达到最大内存时,会清空带有过期时间的key,即使key未到过期时间.
6. redis与DB同步写的问题,先写DB,后写redis,因为写内存基本上没有问题


相关内容:





已有(5)人评论

跳转到指定楼层
desehawk 发表于 2015-4-14 14:14:52
本帖最后由 desehawk 于 2015-4-14 14:17 编辑

进一步补充:


memcached 是多线程,在计算一些统计数据时会因为锁的关系有一点点效率损耗
redis 是单线程的,作者认为内存的存储已经够快不需要多线程. redis新开了线程做一些管理工作,如缓存失效.
memcached 采用惰性失效,就是当key被访问的时候,去判断是否失效,如果key不被访问时,可能会长驻内存,直到内存不够时,去寻找低访问key腾空间的时候,才会被替换.而memcached在判断哪些key不用,或用的少的逻辑,并不是我们想象的那样,把所有key进行比较,因为memcached把key分存在不同的块里面,所以他的比较是比较一个块内哪些key用的少,所以并不准确,
所以用memcached一定要保证key的一致性.
redis有多种方式管理失效缓存,有惰性方式,有随机清除小数据,还有在内存不够时,暴力淘汰


redis有两种永久化机制,但是都有些问题

一种是内存快照,原理是复制一分内存,然后写入硬盘,这要求redis的内存使用量不能超过物理内存的1/2,如果超过会去用虚拟内存.另外在快照过程中,会有大量读写,如果系统崩了,就会有数据丢失.
第二是读写日志,跟数据库一样,但这样就会有IO操作,并且日志文件也会很大,恢复会比较慢.整体性能上也会比较慢

memcached 在内存分配上,是先申请内存,再使用,为了是省去时时申请内存所耗费的效率,但这样会有极大的内存浪费,memcached在启动时,就划分了大小为1M块,而在块里又分成了几k,几十k不等的小块,使用时,按照value的大小去适合这些块,如果value的大小差不多的话,那很多的块就会浪费掉了.所以memcached采用空间换时间的方法,却会占用大量内存.

redis是时实申请内存,所以不会有什么内存浪费,但速度上肯定是要比memcached慢一点
memcached有分布式api,redis要自己写,

综上所述
个人认为,memcached只是缓存系统,它适合用于,从数据库调数据写入memcached,客户从memcached读取数据的操作,要求key值比较稳定,value 最好大小不一.
适合作搜索这种纯读操作.
redis有写的操作,但是有些问题,如果只用一台服务器的话,还好说,可以将内存快照当成本地数据库,但多台服务器呢,就要有分库策略,但redis为快速读写提供了实现可能
适合用于论坛应用.
但如果是用于论坛,mangodb是不是更好点

回复

使用道具 举报

LeucotheaShi 发表于 2015-4-15 10:23:06
本质的差别就是一个是存储一个是缓存是么?
回复

使用道具 举报

howtodown 发表于 2015-4-15 18:55:17
LeucotheaShi 发表于 2015-4-15 10:23
本质的差别就是一个是存储一个是缓存是么?

两个都可以做缓存
回复

使用道具 举报

feng01301218 发表于 2015-4-15 22:34:49
memcached  好像功能比较单一
回复

使用道具 举报

LeucotheaShi 发表于 2015-4-16 09:21:05
howtodown 发表于 2015-4-15 18:55
两个都可以做缓存

这样呀,那是Redis更适合吗?
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

关闭

推荐上一条 /2 下一条