Redis与Memcached的区别

非 Y 不嫁゛ 提交于 2019-12-12 15:59:04

【推荐】2019 Java 开发者跳槽指南.pdf(吐血整理) >>>

memcached和redis的区别

区别:

1、数据类型不同,memcached只支持key-value,redis支持String,List,Map,set,sorted Set

 

2、memcached保存在内存中,redis内存和文件里面都有保存,宕机之后memcached完全丢失,redis还可以从文件中恢复到内存中

3、memcahed的内存分配是基于slab划分的,通过page(默认1M)申请内存,然后每个slab会划分为好多的chunk,数据都存储在chunk中,redis为了屏蔽不同平台之间的差异,redis对内存分配函数进行了一层封装,程序中统一使用zmalloc,zfree一系列函数

 

4、memcahed基于libevent网络库,而redis是基于epoll网络模型,紧接着说下,

select,poll,epoll的区别

select同步阻塞,最大文件描述符1024,

poll同步阻塞,没有最大文件描述符限制,

epoll异步非阻塞,没有最大文件描述符限制。

select是轮询式的事件通知,

epoll是回调事件通知callback

5、memcahed多线程的,redis是单线程的,redis使用epoll,这就是redis为什么使用单线程性能一点也不逊于memcahed的原因

 

 

6、key过期策略,memcahed采用的消极策略,也就是get时候判定做删除,redis除了消极策略,还有积极策略,积极清理就是每秒钟有一个定时任务会扫描10次

    1.随机测试100个设置了过期时间的key
    2.删除所有发现的已过期的key
    3.若删除的key超过25个则重复步骤1

7、memcahed只支持客户端的分布式,采用consistent hashing,redis有基于服务端的集群模式

 

8、memcached采用cas来保证数据一致性,redis有比较弱的事务支持

 

 

redis笔记

1、redis的数据类型

2、redis的key过期机制(消极过期和主动清理(积极过期))

3、redis的客户端jedis,序列化之类的

4、redis的集群怎么做的,jedis自带有一致性hash,但是不能自动剔除节点,twemproxy,可以自动剔除节点,但是它本身是个单点,需要用keepalive做个VIP高可用,cluster 3.0以后推出的方案 16384个slot,每个节点负责一部分的slot

5、redis采用了epoll机制,epoll异步非阻塞,并且是触发式的callback,顺带提一下,select同步阻塞的,最大文件描述符1024,poll同步阻塞的,最大文件描述符没有限制,epoll,异步非阻塞,没有最大文件描述符限制

 

Redis淘汰策略

Redis提供了下面几种淘汰策略供用户选择,其中默认的策略为noeviction策略:

  • noeviction:当内存使用达到阈值的时候,所有引起申请内存的命令会报错。
  • allkeys-lru:在主键空间中,优先移除最近未使用的key。
  • volatile-lru:在设置了过期时间的键空间中,优先移除最近未使用的key。
  • allkeys-random:在主键空间中,随机移除某个key。
  • volatile-random:在设置了过期时间的键空间中,随机移除某个key。
  • volatile-ttl:在设置了过期时间的键空间中,具有更早过期时间的key优先移除。

 

值得一提的是将key设置过期时间实际上会消耗更多的内存,因此我们建议使用allkeys-lru策略从而更有效率的使用内存。

 

下面看看几种策略的适用场景:

  • allkeys-lru:如果我们的应用对缓存的访问符合幂律分布(也就是存在相对热点数据),或者我们不太清楚我们应用的缓存访问分布状况,我们可以选择allkeys-lru策略。
  • allkeys-random:如果我们的应用对于缓存key的访问概率相等,则可以使用这个策略。
  • volatile-ttl:这种策略使得我们可以向Redis提示哪些key更适合被eviction。
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!