Redis基础知识总结

本文详细介绍了Redis的主要特点,包括其高性能、灵活的数据模型和NoSQL的优势。提到了Redis的单线程模型如何通过IO多路复用提高效率,并对比了与memcached的区别。还深入讨论了Redis的持久化策略AOF和RDB,以及数据库事务的特性。此外,文章阐述了Redis的主从复制和哨兵机制在高可用性方面的角色,以及如何处理缓存穿透、缓存击穿和缓存雪崩等问题。
摘要由CSDN通过智能技术生成

在早期的架构(单体应用),是通过客户端-服务器-数据库服务这种方式相连接的,但是web2.0时期,用户访问量剧增,数据库会增加IO压力,服务器会增加CPU和内存压力。

NoSQL的特点

1.易扩展,数据之间无关系,就非常容易扩展,无形中在架构层面带来了可扩展的功能。

2.高性能,NoSQL数据库具有非常高的可读写功能,这得益于他的无关系性,数据结构关系简单。

3.灵活的数据模型,不同提前设置对应的字段,可以灵活的存储不同类型的数据。

Redis概述

Redis(Remote Dictionary Server ),即远程字典服务,是一个开源的,使用 C 语言编写的,支持网络交互的,内存中的 Key-Value 数据结构存储系统,支持多种语言,它可以用作数据库、缓存和消息中间件

它支持多种类型的数据结构,如 字符串(strings), 散列(hashes), 列表(lists), 集合(sets), 有序集合(sorted sets)。

Redis 与其他 key - value 缓存产品有以下三个特点

Redis 支持数据的持久化,可以将内存中的数据保持在磁盘中,重启的时候可以再次加载进行使用。

提供多种数据结构类型,Redis 不仅仅支持简单的 key-value 类型的数据,同时还提供 list,set,zset,hash 等数据结构的存储。

Redis 支持数据的备份,即 master-slave 模式(主从模式)的数据备份。

主从模式(master-slave模式):在分布式系统中,这种模式的非常常用的,这种模式与进程—线程的关系相似,一台计算机作为master进行任务调度,其余的计算机就作为slave,这些计算机就形成了集群,slave将分配的任务完成后,再到master进行结果的合并。是一种分而治之的思想。

例如在Hadoop中,HDFS采用了基于Master/Slave主从架构的分布式文件系统,一个HDFS集群包含一个单独的Master节点和多个Slave节点服务器,这里的一个单独的Master节点的含义是HDFS系统中只存在一个逻辑上的Master组件。

Redis 优势

性能极高---读写速度很快,读的速度为110000次/s,写的速度为81000次/s

丰富的数据类型---提供二进制案例的Strings、Sets、Lists、hashs等等

丰富的特性---publish和subscribe、通知、key过期等等。

原子---所有操作都具有原子性(原子性:原子性就是指事物是一个不可分割的工作单元,要么都发生要么都不发生,AOP就是具有原子性的,在进行事务代码的提交时,如果其中有一部分错误,那么就不进行提交)

配合关系型数据库做高速缓存

多样数据结构存储持久化数据

Redis是单线程+多路IO复用技术

多路复用是指使用一个线程来检查多个文件描述符(Socket)的就绪状态。比如调用select和poll函数,传入多个文件描述符,如果有一个文件描述符就绪,则返回,否则阻塞知道超时。得到就绪状态后进行真正的操作可以在同一个线程里执行,也可以启动线程执行(比如使用线程池)。

串行操作vs多线程+锁(memcached) vs 单线程+多路IO复用(Redis)

串行操作就是程序执行时按照顺序从上到下来执行。

单线程+多路IO复用:

区别:

mencached:支持单一类型,不支持持久化,且时多线程加锁的机制。

redis:支持多种类型,支持可持久化,支持单线程+IO复用

关系型数据库与非关系型数据库

关系型数据库:由关系模型来组织数据的数据库,关系模型就是二维表格模型,二维表格的列就是一个字段,二维表格的行就是一条数据。

优缺点:

非关系型数据库:非关系,分布式,不采用ACID原则来进行数据的存储系统,无固定结构,键值对存储

优缺点:

Redis是单线程还是多线程

Redis在6.x之前是是真正意义上的单线程,处理客户端的连接和执行操作的命令,都是由一个线程来完成的。

6.x之后处理执行命令的操作是单线程完成的,其他处理客户端的连接用的是其他线程。

为什么Redis是用单线程模式,但仍然很快?

Redis的数据储存在内存中,读写速度快,CPU不会有瓶颈,机器内存或者网络宽带会影响性能

Redis的数据结构简单,键值对key-value的底层是哈希结构,查找和操作都时间复杂度都是O(1)

采用IO多路复用和非阻塞IO模式,提高了连接访问的效率。

单线程执行命令,线程是安全的,而且避免了与其他操作线程的切换。

Redis持久化

Redis是一个内存数据库,但数据保存在内存中是容易丢失的,所以我们通过AOF方式和RDB方式来实现Redis的持久化

AOF

以日志的形式将写命令存储在文件中,在再次启动Redis时,将会把文件中的命令再执行还原数据。

在默认情况下是不开启的 appendonly no

同步机制

appendfsync always 每次set记录一次 appendfsync everysec 每秒记录一次

RDB

RDB的持久化是通过快照的方式在一段时间间隔后将数据集从内存保存在硬盘中。这种方式就是将内存中的数据以快照的形式写入到二进制文件中,文件名为dump.rdb。在redis.conf文件中可以进行关于RDB和AOF的配置。

触发快照的时机

1.save的条件,满足save的条件即可触发rdb规则。

可以在redis.conf中配置触发Redis的RDB持久化条件,也就是什么时候将内存中的数据保存硬盘中。save m n m表示在m秒内保存,n表示至少达到n次修改,才会触发bgsave

数据库的事物

数据库的事物是一种机制、一个操作序列,包含了一组数据库操作命令。事物把所有的命令作为一个整体向系统提交或者撤销操作请求,就是说这一组数据库命令要么都执行,要么都不执行,因此事物是一个不可分割的逻辑单元。

事物具有四个特性:原子性、一致性、隔离性和持久性

原子性事物是一个完整的操作,事物中的各元素是不可被分割的,在事务中的元素必须一起提交或者回滚,若事物中有元素失败,那么整个事物就是失败的。比如转账的事物为例,如果事物提交了,那么转账后两个账号上的钱都会更新,但若是由于某个部分 有问题,那么账号上的钱就是不动的。

一致性:当事物完成时,数据必须处于一致状态。在事物开始之前,数据库中存储的数据处于一致状态,在事物进行性中时,可能操作让数据只执行了一半,部分数据被修改。当事物成功完成时,数据必须再次回到一致状态。对于数据的修改不能损坏数据,事物不能使数据储存处于不稳定的状态。比如转账事物为例,在事物开始之前,账号余额的总额是处于一致状态的,在事物进行中时,一个账户余额是减少的,这个时候数据是处于不一致状态的,在事物结束后,账户的余额需要再次恢复到一致的状态。

隔离性:对数据进行修改的所有并发事物(多个用户同时访问数据库时会出现如同多线程对变量进行修改的问题,并发事物会带来的问题:更新丢失、幻读、脏读、重复读)是彼此隔离的,这表明事物必须是独立的,它不能以任何方式依赖于或影响其他事物。修改数据的事物,可以在另一个使用相同数据的事物开始之前访问这些数据,或者是之后访问这些数据。另外,如果当事物修改数据时,有其他进程对该数据进行操作,那么要到该事物成功提交之后,数据的修改结果才能生效。

持久性:事物的持久性指不管系统是否发生了故障,事物处理的结果都是永久的。 一个事物成功之后,它对数据库所作的改变也是永久的,即使的系统的故障也是如此(数据存在硬盘中)。也就是说,事物一旦被提交,事物对数据所作的任务变动都会被永久地保留在数据库中。

事物的修改是具有可恢复性的,当事物失败时,它对数据的修改都会恢复到该事物执行前的状态。

Redis事物

Redis的事物本质上就是一组命令的集合,一个事物中的所有命令都会被序列化,在事物执行过程中,会按照顺序执行。

Redis在单个命令执行时,是具有原子性的,因为是单线程模式,只会一次执行一个线程。Redis在一次操作中执行多条命令,为了保证多条命令能够完整执行,就可以通过Redis事物来实现,将一条条的命令放入到事物中,命令添加进来并不会立即执行,先添加到一个多列中,通过exec来执行事物,事务中的命令按照顺序来执行。(隔离性)在执行时,其他客户端会被隔离,不会发生交替执行。

开启事务: multi

但是Redis执行多条命令的事物并不能保证原子性,在一个命令执行发生错误时,依旧会执行其他的命令。

主从复制

主从---主机和从机---集群架构,如果只有一台Redis服务,万一服务器宕机,所有的请求都会到达mysql,导致mysql宕机。因此我们可以搭建多态Redis服务器,如果其中一台出现故障,其他服务还可以正常使用。

主机负责写数据,将数据同步到从机,一般的读数据从从机上查询。实现读写分离,主机上执行读命令,从机上执行写命令。

主从复制的作用主要包括:

1.数据冗余:主从复制实现了数据的热备份,是持久化之外的一种数据冗余方式。

2.故障恢复:当主节点出现问题时,可以由从节点提供服务,实现快速的故障恢

复;实际上是一种服务的冗余。

3.负载均衡:在主从复制的基础上,配合读写分离,可以由主节点提供写服务,

由从节点提供读服务(即写 Redis 数据时应用连接主节点,读 Redis 数据时应

用连接从节点),分担服务器负载;尤其是在写少读多的场景下,通过多个从节

点分担读负载,可以大大提高 Redis 服务器的并发量。

4.高可用(集群)基石:除了上述作用以外,主从复制还是哨兵和集群能够实施的基础,因此说主从复制是 Redis 高可用的基础。

哨兵机制

有一个单独线程,对集群中的多态服务进行监听,给每个服务发请求,如果没有响应,表明出现故障,比如主机宕机,会从从机选举一台当作主机。当主机恢复后,又可以当作主机继续使用。

单哨兵

一个哨兵检测多个Redis服务器,向服务器发送请求,等待服务器的响应,从而监控运行的多个Redis实例。

 

哨兵集群

如果只有单个哨兵,会很容易出现一个哨兵的进程出现故障,导致无法监测到Redis服务器出现的问题,因此可以使用哨兵集群,哨兵除了监控各个服务器,会可以互相之间监测,减少因为单个的故障造成的问题。

key过期策略

Redis的定期删除分为三个立即删除、惰性删除和定时删除。

1.立即删除,在key过期后,由时间处理器自动执行键的删除操作,执行回调函数,立即释放内存,会占用CPU导致性能下降。

2.惰性删除,在key过期后不立即删除,在一段时间后再删除,也就是在下一次使用该键的时候,根据状态来决定是否决定删除key,提高了CPU的性能,但是浪费了内存。

3.定期删除,每隔一段时间对所有到期的键进行删除,类似于Java的垃圾回收机制。

1和3都是主动删除,2是被动删除

缓存穿透、缓存击穿、缓存雪崩

查询数据的流程是先在缓存中进行查找,如果缓存中存在,就直接返回,缓存中不存在,就在数据库中进行查找,再返回。

 

 

缓存穿透

缓存穿透就是所查询的数据在缓存中没有,但在数据库进行查询后也没有,返回时也不会存储在缓存中,缓存相当于失效了。

解决方案

方案一:就是设置这个空对象存入缓存中,下一次访问的时候,就可以返回为空。

方案二:可以对输入的参数进行校验,如果属于不合法参数就进行拦截,不进入到数据库。

缓存击穿

缓存击穿就是数据库中有数据只是在某个时间点上,某个热点key过期了,但是大量查询请求到达Redis中请求访问这个数据(查询数据是没有上锁的),缓存中没有,那么就去都去数据库中查找,会导致数据库的崩溃。

解决方案

方案一:将热点key设置为永不过期

方案二:可以在查询数据这块加互斥锁,当一个线程进行查询时,其他线程只能等待这个线程查询操作完成后再进行查询数据,当一个线程完成了查询操作时,缓存中已经有了这个线程查询出来的数据放在了缓存中,其他线程也就可以直接访问缓存了。

 

缓存雪崩

缓存雪崩就是大量的热点key过期或者Redis服务故障,导致大量的请求到达数据库,数据库的调用量暴增。

解决方案

方案一:随机设置key失效的时间,避免大量key失效。

方案二:若是在集群部署的情况下,可以将热点key均匀分布到不同的Redis库中,就可以避免一个Redis出现问题,数据库直接崩溃的状况。

方案三:不设置过期时间的热点key(内存占用大)

方案四:跑定时任务,在缓存失效前刷进新的缓存

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值