Redis基础

为什么用Redis

  • 在日常的web应用对数据库的操作中,读的数量远超过写的数量,如果使用sql,还需要去磁盘加载数据,非常慢,如果使用缓存,也就是直接存储在内存中,就可以大大提升效率,降低数据库的压力,既能保证高并发也能保证高性能。

在使用缓存时,还应该考虑以下几点:

  • 缓存的命中率如何,如果非常低的话,那就没必要使用缓存;
  • 数据量是不是很大,因为缓存是保存在内存中,受到物理内存的限制,如果很大的话,也就没必要使用缓存;
  • 是不是经常对数据进行增加,删除,修改的操作,如果经常有这些操作,也就没必要使用缓存,每次只要修改数据,缓存就会失效,保证缓存里面都是最新的数据。

Redis的优缺点

优点:

  • 读写性能优异,因为是存储在内存中,所以读写速度非常快;
  • 支持持久化,有RDB和AOF两种持久化方式;
  • 支持事务,Redis的任何操作都是原子性的,也支持将多个操作合并起来的原子性;
  • 支持主从复制,主服务器会将数据同步到从服务器上;
  • 数据结构丰富,支持很多数据结构。

缺点:

  • 因为是存储在内存中的,所以受到物理内存的限制,不能用作海量数据的读和写;
  • 不具备自动容错和恢复功能,主机从机宕机都会导致前端的读写请求失败,需要重新启动服务器或手动切换前端IP,主机在宕机前有部分数据不能及时同步到从机,会导致部分数据丢失,手动切换IP又会引入数据不一致的问题,影响可用性。
  • 较难支持在线扩容,在集群数量达到上限时就会变的很复杂。

Redis为什么用的是单线程

因为Redis是在内存中操作的,既然是在内存中,那CPU就不会是Redis的瓶颈,而且单线程实现起来也简单。

Reids为什么快

  • 纯内存操作,Redis是将数据缓存在内存中,读写速度非常快;
  • 高性能的数据结构,而且对数据结构进行了很大的优化;
  • Redis使用的是单线程,没有线程间的切换,也不用考虑线程阻塞;
  • 使用的是Io多路复用模型,非阻塞式io,通过一个线程就可以处理多个请求。

Redis分布式锁

通过setnx来获取锁,然后再用Expire加个过期时间,防止忘记释放锁;
有可能在setnx获取锁后进程出问题,那锁就释放不了,可以通过set的参数设置将setnx和Expire两条指令合并为一条指令。

keys和scan

这两个都可以获取指定模式的key列表,但还是有不同的:

  • keys会造成线程阻塞,因为是单线程所以需要等指令执行完毕后线程才会继续运行;
  • sacn可以无阻塞的获取key列表,但是可能会有重复元素,需要再进行一次去重,这样一来,所用的时间就会比keys用的时间长。

异步队列

可以用list来实现异步队列,lpop和rpush来实现消费和生产消息,当没有消息的时候,lpop需要sleep,也可以使用blpop,这样就会一直阻塞直到有元素

延时队列

可以用zset来实现,拿时间戳作为score,消息作为key,调用zadd来生产消息,使用zrangebyscore来轮询数据进行处理。

持久化

RDB用来镜像全量持久化,AOF用来增量持久化。RDB消耗的时间比较长,实时性不好,可能会丢失很多数据,需要和AOF配合使用。当Redis实例重启后,用RDB持久化文件重新构建内存,用AOF来重放近期的操作来实现完整恢复重启之前的状态。

RDB优缺点

优点:

  • 会产生很多的数据文件,每个数据文件都代表Redis在某一时刻的数据,很适合做冷备,完整的数据运维设置定时任务,定时的将数据同步到远程服务器,如果在某一时刻服务器挂了,想恢复多久之前的数据就去远程服务器复制一份就行。
  • 对Redis的性能影响不大,RDB只fork一个子进程来进行持久化,而且数据恢复起来也很快。

缺点:

  • RDB需要做快照,一般五分钟甚至更长时间做一次,也就是在这两次之间的数据可能会全部丢失;
  • 在产生快照时,如果文件非常大,会产生停顿。

AOF优缺点

优点:

  • 可以通过sync来设置持久化的间隔,如果对性能要求不高的话,那可以每个指令都进行持久化,如果对性能要求高的话,可以1s持久化一次,最多也就会丢失一秒钟的数据。
  • AOF对文件的操作的以追加的方式,省去了磁盘寻址的开销,读写速度非常快,而且也不易受损。
  • 对文件的记录是以非常可读的方式来记录的,可以用来做灾难性数据误删的恢复工作,如果一不小心把数据全部删除,只要还没重写,就可以复制一份AOF,然后将删除指令去掉就可以。

缺点:
同样的 文件AOF比RDB大。

RDB原理

RDB会fork一个子进程去进行持久化,在子进程产生后,父进程和子进程还是共享同一数据源,父进程仍然提供读写服务,写脏的数据会逐渐的跟子进程分离开。
可以实现读写分离,父进程处理客户端请求,子进程进程持久化,因为是快照,所以子进程的内容是不会有变化的。

AOF重写

AOF产生一个子进程,然后遍历AOF,将AOF里面的内容写到一个新的AOF文件中,然后再用新的AOF文件代替旧的AOF文件。

同步机制

在第一次同步的时候,主节点会进行持久化,并且将后续的更改的操作保存到内存的buffer中,完成后将RDB文件全量同步到复制节点中,同步完成后,复制节点将RDB镜像加载到内存中,加载完成后,通知主节点将近期的更改操作同步到复制节点进行重放来实现同步,后续的增量数据可以通过AOF日志来同步。

Redis的线程模型

Redis内部使用的是文件事件处理器,因为文件事件处理器是单线程的,所以Redis也被称为单线程模型。使用io多路复用机制来同时监听多个socket,对于每个socket所产生的事件都交给对应的事件处理器去处理。多个socket会产生多个不同的操作,每个操作都对应不同的事件,io多路复用机制同时监听,将产生的事件放到一个队列里面,事件分派器再从队列中取出事件交给对应的事件处理器去处理。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值