redis和memcache区别及memcache过期策略

https://www.zhihu.com/question/19829601

 

https://blog.csdn.net/hhjianlong/article/details/73928653

memcache的mutex设计模式

https://timyang.net/programming/memcache-mutex/

memcache分布式锁

 

//cache.add (key ,value);

如果service1 分布式部署,又同时操作了一个数据库记录,要对某个字段做更新,而这个字段的值,又依赖于之前的值,如何保证数据的正确性?


public void sevice1(){

if(cache.add(key,value)){
	//可以添加进去,证明是首次调用。
 }else{
       //不可以添加进去,证明是服务已经被调用了。
 }
这样就避免了在分布式环境中的服务调用。

 }



其实数据库本身就有行级锁,可以做到这一点。




并发锁 解决的问题,是一个对象在多个线程之间共享了,并且多个线程在操作对象,修改状态。

分布式锁解决的问题  是多实例部署服务的时候,避免同一个服务被调用的时候出现问题。
(问题举例:服务的逻辑 获取微信token,设置缓存,
如果两个客户端分别调用了两台服务器的同一个服务,这个时候同时检查缓存中没有,
同时请求微信服务器,获取token,同时设置缓存,我们知道前一个获取到的token是
无效的,因为后一个会重置它,这样,如果缓存设置的时候,把错误的token设置进去,
就一直会有问题了。这个时候需要的是分布式锁。
)

memcache和redis是互联网分层架构中,最常用的KV缓存。不少同学在选型的时候会纠结,到底是选择memcache还是redis?

   memcache提供的功能是redis提供的功能的子集,不用想太多,选redis准没错?

   

redis倾向:

   复杂的数据结构:value是哈希,列表,集合,有序集合这类复杂的数据结构时,会选择redis,因为mc无法满足这些需求。用户订单列表,用户消息,帖子评论列表等。

   持久化: mc无法满足持久化的需求,只得选择redis。但是千万不要把redis真的做数据库用

  1.     redis的定期快照不能保证数据不丢失
  2.     redis的AOF会降低效率,并且不能支持太大的数据量
  3.     不要期望redis做固化存储会比mysql做得好,不同的工具做各自擅长的事情
  4.     redis挂掉重启后能够快速恢复热数据,但是如果着期间有数据修改,可能导致数据不一致,因此,只读场景,或者允许一些不一致的业务场景,可以尝试开启redis的固化功能

   自带高可用集群: redis自身支持集群,实现主从读写分离功能,官方也提供sentinal哨兵的集群管理工具,实现主从监控,故障转移,memcached实现集群需要二次开发了

                            但是很多时候需要考虑,真的需要高可用么?缓存很多时候是运行cache miss的,cache挂了可以读db的

  存储的内容比较大 : memcache 单个value最大存储 1M,超过1M只能用redis了。

            注意:纯的k-v 而且数据量特别大,并发也很大 或许使用memcache更合适

  1.   内存分配:memcache使用 预分配内存池的烦事管理内存,更节省内存分配时间,redis使用临时申请的方式,kennel导致碎片。对比看memcache更快一点
  2.   memcache把所有的数据存储在物理内存里。redis有自己的VM机制,理论上能够存储比物理内存更多的数据,当数据超量时,会引发swap,把冷数据刷到磁盘上。对比看数据量大时,memcache更快一点
  3.  memcache使用非阻塞IO复用模型,redis也是使用非阻塞IO复用模型,但由于redis还提供一些非KV存储之外的排序,聚合功能,在执行这些功能时,复杂的CPU计算,会阻塞整个IO调度。从这一点上,由于redis提供的功能较多,mc会更快一些。
  4.  memcache使用多线程,主线程监听,worker子线程接受请求,执行读写,这个过程中,可能存在锁冲突。redis使用单线程,虽无锁冲突,但难以利用多核的特性提升整体吞吐量。从这一点上,mc会快一些。

 

memcached过期策略:

1、memcached的过期时间,有一个最大时限就是30天,若超过30天,存储时返回true,但是在取数据的时候取不到(这个key是1秒后过期的)。

2、memcached的缓存失效策略是LRU(最近最少使用)加上到期失效策略。当向memcached存储数据时,你可能会设置一个过期时间,可以是永久也可以是一段时间,但是如果一旦给memcached分配的内存使用完毕,则首先会替换掉已失效的数据,其次是最近最少使用的数据。

3、memcached内部不会监视记录是否过期,而是在get时查看记录的时间戳,检查记录是否过期。 这种技术被称为 惰性过期。因此,memcached不会在过期监视上耗费CPU时间。

4、如果失效值被设置为0(默认),此元素永不过期(但是它可能由于服务端为了给其他新的元素分配空间而被删除)。

你可能感兴趣的:(redis)