【推荐】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。
来源:oschina
链接:https://my.oschina.net/u/698249/blog/131162