redis

一、摘要:转自:https://www.cnblogs.com/bigben0123/p/9115597.html (还不错)

  小曲只雇佣一个快递员。然后呢,客户送来的快递,小曲按送达地点标注好,然后依次放在一个地方。最后,那个快递员依次的去取快递,一次拿一个,然后开着车去送快递,送好了就回来拿下一个快递。

对比
上述两种经营方式对比,是不是明显觉得第二种,效率更高,更好呢。在上述比喻中:

    • 每个快递员---------->每个线程

    • 每个快递------------>每个socket(I/O流)

    • 快递的送达地点------>socket的不同状态

    • 客户送快递请求------>来自客户端的请求

    • 小曲的经营方式------>服务端运行的代码

    • 一辆车--------------->CPU的核数;

  经营方式 :I/O多路复用。只有单个线程(一个快递员),通过跟踪每个I/O流的状态(每个快递的送达地点),来管理多个I/O流;(redis 是单线程模型)。

二、数据结构:

1、string、set、sorted set、list、hash;

三、redis的过期策略以及内存淘汰机制(redis采用的是定期删除+惰性删除策略)

  这个问题其实相当重要,到底redis有没用到家,这个问题就可以看出来。比如你redis只能存5G数据,可是你写了10G,那会删5G的数据。怎么删的,这个问题思考过么?还有,你的数据已经设置了过期时间,但是时间到了,内存占用率还是比较高,有思考过原因么?

  定期删除+惰性删除是如何工作的呢?

  定期删除,redis默认每个100ms检查,是否有过期的key,有过期key则删除。需要说明的是,redis不是每个100ms将所有的key检查一次,而是随机抽取进行检查(如果每隔100ms,全部key进行检查,redis岂不是卡死)。因此,如果只采用定期删除策略,会导致很多key到时间没有删除。


  于是,惰性删除派上用场。也就是说在你获取某个key的时候,redis会检查一下,这个key如果设置了过期时间那么是否过期了?如果过期了此时就会删除。


  采用定期删除+惰性删除就没其他问题了么?
  不是的,如果定期删除没删除key。然后你也没即时去请求key,也就是说惰性删除也没生效。这样,redis的内存会越来越高。那么就应该采用内存淘汰机制

四、redis和数据库双写一致性问题、

  方案1:将读写请求放到同一个队列里

 

posted @ 2019-05-05 13:26  佛系-小白  阅读(146)  评论(0编辑  收藏  举报