Redis总结

  1. 为什么要用redis/为什么要用缓存?
    主要从"高性能"和"高并发"这两点来看待问题。
    高性能:假设用户第一次访问数据库中的某些数据。这个过程会比较慢,因为是从硬盘上读取的。将该用户访问的数据存在缓存中,这样下一次再访问这些数据的时候就可以直接从缓存中获取了。操作缓存就是直接操作内存,所以速度相当快。如果数据库中的对应数据改变后,同步改变缓存中相应的数据即可。
    高并发:直接操作缓存能够承受的请求是远远大于直接访问数据库的,所以我们可以考虑把数据库中的部分数据转移到缓存中去,这样用户的一部分请求会直接到缓存这里而不用经过数据库,以此降低数据库的压力。
  2. 为什么要用redis而不用map/guava做缓存?
    缓存分为本地缓存和分布式缓存。以Java为例,使用自带的map或者guava实现的事本地缓存,最主要的特点是轻量以及快速,生命周期随着jvm的销毁而结束,并且在多实例的情况下,每个实例都需要各自保存一份缓存,缓存不具有一致性。
    使用redis或memcached之类的称为分布式缓存,在多实例的情况下,各实例共用一份缓存数据,缓存具有一致性。缺点是需要保持redis/memcached服务的高可用,整个程序架构上较为复杂。
  3. redis的线程模型
    redis内部使用文件事件处理器file event handler,这个文件事件处理器是单线程的,所以redis才叫做单线程的模型。采用IO多路复用机制同时监听多个socket,根据socket上的事件来选择对应的事件处理器进行处理。
    文件事件处理器的结构包含4个部分:多个socket,IO多路复用程序,文件事件分派器,事件处理器(连接应答处理器,命令请求处理器,命令回复处理器)
    多个socket可能会并发产生不同的操作,每个操作对应不同的文件事件,但是IO多路复用程序会监听多个socket,会将socket产生的事件放入队列中排队,事件分排期每次从队列中取出一个事件,把该事件交给对应的事件处理器进行处理。
  4. redis和memcached的区别
    a.redis支持更丰富的数据类型(支持更复杂的应用场景):Redis不仅仅支持简单的k/v类型的数据,同时还提供list、set、zset、hash等数据结构的存储。memcached支持简单的数据类型:String
    b.Redis支持数据的持久化,可以将内存中的数据保存在磁盘中,重启的时候可以再次加载进行使用,而memcached把数据全部存在内存之中。
    c.集群模式:memcached没有原生的集群模式,需要依靠客户端来实现往集群中分片写入数据;但是redis目前是原生支持cluster模式的。
    d.memcached是多线程,非阻塞IO复用的网络模型;redis使用单线程的多路IO复用模型。
  5. redis的定期删除和惰性删除
    定期删除: redis默认是每隔100ms就随机抽取一些设置了过期时间的key,检查是否过期,如果过期就删除。
    惰性删除:定期删除可能会导致很多过期key到了时间并没有被删除掉,所以就有了惰性删除。假如你的过期key,靠定期删除没有被删除掉,还停留在内存里,除非你的系统去查一下那个key,才会被redis给删除掉。这就是所谓的惰性删除。
    但是仅仅通过设置过期时间还是有问题的,如果定期删除漏掉了很多过期key,然后你也没及时去查,也就没走惰性删除,此时会怎么样?如果大量过期key堆积在内存里,导致redis内存块耗尽了。怎么解决这个问题?redis内存淘汰机制。
  6. redis内存淘汰机制
    a.volatile-lru:从已设置过期时间的数据集中挑选最近最少使用的数据淘汰
    b.volatile-ttl:从已设置过期时间的数据集中挑选将要过期的数据淘汰
    c.volatile-random:从已设置过期时间的数据集中选择任意数据淘汰
    d.allkeys-lru:当内存不足以容纳新写入数据时,在键空间中,移除最近最少使用的key
    e.allkeys-random:从数据集中任意选择数据淘汰
    f.no-eviction:禁止驱逐数据,也就是说当内存不足以容纳新写入数据时,新写入操作会报错。
    4.0版本后增加以下两种
    g.volatile-lfu:从已设置过期时间的数据集中挑选最不经常使用的数据淘汰
    h.allkeys-lfu:当内存不足以容纳新写入数据时,在键空间中,移除最不经常使用的key
  7. redis持久化机制(怎么保证redis挂掉之后再重启数据可以进行恢复)
    快照持久化:redis可以通过创建快照来获得存储在内存里面的数据在某个时间点上的副本。redis创建快照之后,可以对快照进行备份,还可以将快照复制到其他服务器从而创建具有相同数据的服务器副本(Redis主从结构,主要用来提高redis性能),还可以将快照留在原地以便重启服务器的时候使用。是redis默认的持久化方式。
    AOF持久化:AOF持久化的实时性更好,因此已成为主流的持久化方案。默认情况下redis没有开启AOF方式的持久化。开启AOF持久化后每执行一条会更改redis中数据的命令,redis就会将该命令写入硬盘中的AOF文件。AOF文件的保存位置和RDB文件的位置相同,都是通过dir参数设置的,默认的文件名是appendonly.aof。为了兼顾数据和写入性能,用户可以考虑appendfsync everysec选项,让redis每秒同步一次AOF文件,redis性能几乎没受到任何影响。而且这样即使出现系统崩溃,用户最多只会丢失一秒之内产生的数据。当硬盘忙于执行写入操作的时候,redis还会优雅的放慢自己的速度以便适应硬盘的最大写入速度。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值