揭开Redis的神秘面纱

Redis

Redis介绍

Redis是什么?

Redis是一个开源的内存中的数据结构存储系统,是一个高性能的K-V结构的存储系统,支持多种数据类型,例如string,list,set,sortedset,hash等,并且操作都具有原子性。

Redis的用途

Redis可以当作缓存,消息队列中间件,数据库等。

Redis的特点

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

(2)Redis不仅仅支持简单的key-value类型的数据,还提供string,list,set,sortdSet,hash等数据结构的存储。

(3)Redis支持数据的备份,就是主从结构(master-slave模式)的数据备份。

(4)Redis的内存优化策略也是Redis的一大亮点。具体介绍看下文。

Redis的优势

(1)性能极高 - Redis的读写速度很快,读的速度是110000次/s,写的速度是81000次/s。

(2)提供多种数据类型—Redis支持String,List,Hash,Set,Sorted Set等数据类型。

(3)原子性操作—Redis的所有操作都是原子性的,就是说操作要么执行成功要么执行失败(完全不执行),单个操作是原子性的,多个操作也支持事务,即原子性。

(4)Redis是运行在内存中的,所以使用单线程,单线程避免了上下文切换的时间,单线程没有线程安全问题,省去了创建锁和销毁锁的过程,节省了大量的时间。

Redis支持的数据类型?

Redis支持五中数据类型:String(字符串),hash(hash),list(列表),set(集合)和Zset(或sorted set:有序集合)。

使用Redis的好处?

(1)速度快,因为数据存在内存中,类似于 HashMap,HashMap 的优势就是查找和操作的时间复杂度都是 O1)

(2)支持丰富数据类型,支持 string,list,set,Zset,hash 等

(3)支持事务,操作都是原子性,所谓的原子性就是对数据的更改要么全部执行,要么全部不执行

(4)丰富的特性:可用于缓存,消息,按 key 设置过期时间,过期后将会自动删除。

Redis的三种机制

分片机制,哨兵机制,集群

分片机制

由于也无需要,有可能将海量的数据保存到Redis的内存中,实现用户的快速读取,但是Redis的内存容量有限,不能一味的扩大内存,这会导致寻址的时间大大增加,性价比高,最好的方式就是准备多台Redis分别存储数据,实现内存的扩容,提高读写效率。

在这里插入图片描述

分片机制的作用

实现内存的扩容,提高redis的工作效率,实现用户的快速读取。

一致性hash算法

​ 我们如何知道一个数据存储到了哪台Redis中呢?随机存储么?显然不是,是通过hash算法进行存储,比如现在我们有三台redis,要将一个数据存储到这三个中的一个里面,那么我们可以使用比较简单的hash算法,求余运算:使用该数据的hashcode对3(redis的个数)求余运算,然后确定该数据存储到哪个redis中,这个算法虽然解决了数据存储位置的问题,但是并不适用,假设三台redis中的一台宕机了,不能用了 ,那么redis的个数就变成2,使用该算法算出的该数据位于不同的redis中(原来位于A,现在计算出来可能位于B),造成找不到该数据的结果,那么可用性很差。那么如何解决这一问题呢?接下来我们就介绍一下解决办法:一致性hash算法。

要求:在移除或者添加一个服务器时,能够尽可能小地改变已存在的服务请求与处理请求服务器之间的映射关系。一致性哈希解决了简单哈希算法在分布式哈希表( Distributed Hash Table,DHT) 中存在的动态伸缩等问题 。

算法说明

1).常识1: 对同样的数据进行hash运算,所得到的结果必然相同.

​ 常识2: 一般条件下 hash值的取值范围 2^32

2).为什么hash是2^32次方 (8位16机制数) 16进制(0-9 A-F)---->2^4

​ (24)8=24*8=232 00000000-FFFFFFFF

3).一致性hash算法的原理

运算发生在内存中,但是数据存储需要链接redis实现set/get操作

在这里插入图片描述

一致性hash特点

1.平衡性

平衡性是指hash的结果应该平均分配到各个节点,这样从算法上解决了负载均衡问题。

问题描述:

由于节点是通过hash计算得到的结果.所以可能出现如下的情况,发现数据分配严重不平衡.

在这里插入图片描述

优化:采用虚拟机节点的方式,实现数据的平衡

图解:引入虚拟节点之后,将原本属于node3的数据,自动的划分给了node2.实现了尽可能的数据平衡。

2.单调性

单调性是指在新增或者删减节点时,不影响系统正常运行,其中的数据可以自动的实现迁移。

在这里插入图片描述

3.分散性

分散性是指数据应该分散地存放在分布式集群中的各个节点(节点自己可以有备份),不必每个节点都存储所有的数据。

归纳:鸡蛋不要放到一个篮子里。

Redis分片特点

1.Redis分片机制可以实现Redis内存数据的扩容.

2.Redis分片机制中,是业务服务器进行一致性hash的计算.而redis服务器只需要负责数据的存储即可.所以redis分片机制性能更高.

3.Redis分片机制本身没有实现高可用的效果.如果redis节点缺失,则直接影响用户的使用.

在这里插入图片描述

哨兵机制

Redis的分片机制有一个问题,如果将来有1台redis宕机,则直接影响程序正常的执行。

如何解决:高可用 当redis服务器宕机,可以实现自动的主从的切换。

前提条件:需要配置缓存数据同步,数据的同步时实现高可用的前提条件。

如果没有数据同步,那么即使实现了高可用,则也可能由于从服务器中没有数据而导致缓存雪崩效应。

哨兵机制搭建

在这里插入图片描述

主从测试

搭建好主从结构后进行测试:

1)当搭建主从结构之后,用户操作主机,从机可以自动的实现数据的同步。

2).搭建主从结构之后,从机是只读操作,不允许写入。

3).不要使用主从结构,测试分片API。

哨兵的主要作用:实现了redis节点的高可用(HA)。

工作流程

​ 1).当哨兵启动时,首先要监控当前redis的主机.并且从主机中获取所有的从机信息.

​ 2).当redis主机宕机之后,哨兵通过心跳检测机制检验主机是否宕机.如果连续3次都没有获取主机的反馈,则断定主机宕机.之后根据算法筛选出新的主机.

​ 3).当哨兵选举出新的主机之后,则为了保证主从的关系,则会动态的修改各自的redis.conf配置文件.并且将其他的节点标识为新主机的从机.

Redis哨兵特点

1).redis哨兵实现了redis节点的高可用。

2).redis哨兵机制不能实现内存数据的扩容。

3).哨兵本身没有实现高可用.哨兵如果宕机,则直接影响用户使用。

Redis集群

目标: 既能实现redis分片机制,又能实现redis节点的高可用,同时不需要第三方监控,节点之间互相监督。

为什么搭建集群

通常,为了提高网站响应速度,总是把热点数据保存在内存中而不是直接从后端数据库中读取。

Redis是一个很好的Cache工具。大型网站应用,热点数据量往往巨大,几十G上百G是很正常的事儿。

由于内存大小的限制,使用一台 Redis 实例显然无法满足需求,这时就需要使用多台 Redis作为缓存数据库。但是如何保证数据存储的一致性呢,这时就需要搭建redis集群,采用合理的机制,保证用户的正常的访问需求。

采用redis集群,可以保证数据分散存储,同时保证数据存储的一致性.并且在内部实现高可用的机制.实现了服务故障的自动迁移.

Redis的持久化策略

说明:redis的运行环境是内存中,其特点是断电或者宕机即数据清空,为了保证数据的有效性,提高用户的查询效率,所以内存的数据必须持久化,定期将内存中的数据写入到执行的文件中(磁盘中),如果redis服务器宕机了,如果下次重启时,则先读取持久化文件实现数据的恢复。

RDB模式

1).RDB模式是redis的默认的持久化策略。

2).Redis会定期的将数据以快照的形式保存的RDB文件中。

​ 风险:RDB模式由于定期保存数据,所以可以会丢失数据

3).RDB模式由于记录的是内存数据的快照所以持久化的效率较高。

新的快照会覆盖旧的快照,每次保留的都是最新的数据,持久化文件的大小,相对固定。

AOF模式

1).AOF模式默认条件下是关闭状态,需要手动开启。

2).AOF模式可以实现实时持久化操作,可以有效的解决数据丢失问题。

3).AOF模式做持久化操作时**,记录的是用户的操作过程**。

4).AOF的持久化文件相对较大,恢复数据的速度较慢

总结

规则:

1.如果内存数据可以允许少量的数据丢失,则首选RDB。

2.如果内存数据存储的是业务数据不允许丢失,则选用aof模式(AOF文件相对较大,所以定期维护)。

3.redis中所有的操作都是单进程单线程操作,(串行的)所以不会造成线程并发性问题。

面试题

问题描述: 如果同时开启了aof模式和rdb模式.问哪个生效?

答:

1.默认条件下redis采用rdb模式,如果开启了AOF模式,则以AOF模式为主.

2.同时可以通过save指令,实现rdb模式的持久化操作.

Redis的内存策略

内存策略前提

说明:redis的数据保存在内存中,但是内存资源是有限的,如果需要存储海量的数据,则将之前的旧的数据应该先删除,之后再新增。

redis中提供了9种内存机制,可以根据其中不同的算法,实现内存数据的优化。

这里提供比较常用的一些算法:

LRU算法

LRU是Least Recently Used的缩写,即最近最少使用,是一种常用的页面置换算法,选择最近最久未使用的页面予以淘汰。该算法赋予每个页面一个访问字段,用来记录一个页面自上次被访问以来所经历的时间 t,当须淘汰一个页面时,选择现有页面中其 t 值最大的,即最近最少使用的页面予以淘汰。

判断维度:时间T

在这里插入图片描述

LFU算法

LFU(least frequently used (LFU) page-replacement algorithm)。即最不经常使用数据置换算法,要求在页置换时置换引用计数最小的页,因为经常使用的页应该有一个较大的引用次数。但是有些页在开始时使用次数很多,但以后就不再使用,这类页将会长时间留在内存中,因此可以将引用计数寄存器定时右移一位,形成指数衰减的平均使用次数。

判断维度: 使用次数

在这里插入图片描述

RANDOM

从key中随机淘汰数据。

TTL

根据剩余的存活时间,挑选时间最少的删除。

关于Redis内存的面试问题

缓存穿透

场景说明:

​ 有个坏人得知数据库中没有name="xxx"的数据,则多线程并发操作访问name="xxx"的数据。

说明:访问数据库中压根不存在的数据,则导致缓存失效,所有的请求都访问数据库,导致数据库有宕机的风险.称之为缓存穿透。

解决方案:

​ 一般做数据的有效性的校验。

缓存击穿

场景说明:

​ 美国的暴乱信息,则redis缓存服务器中存储,但是该数据设定了有效期,当数据有效期时间一到,该数据就会在内存中删除,如果在这时有海量的用户访问"暴乱信息"则都会去查询数据库,导致数据库在一定的时间内并发增多,数据库有宕机的风险。

说明:某个热点数据(1个数据)由于超时/删除,导致大量的用户请求在同一时间访问数据库。

如何解决:

​ 1.将热点数据永久保存.

​ 2.添加互斥(排它)锁(每次只能有一个用户访问数据库/第二次走缓存) lock操作。

缓存雪崩

说明: 在redis内存中的数据,在一定的时间内,有大量的缓存数据失效(多个),这时用户大量的访问缓存服务器,但是缓存中没有指定数据,则访问数据库.容易出现数据库宕机的现象.

如何解决:

​ 1.让热点数据永久有效

​ 2.设定超时时间采用随机数,让超时的数据不要在同一时间发生。

​ 3.设定多级缓存

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-05JOi5XY-1592814086619)(C:\Users\20944\Desktop\总结图片\redis\多级缓存.png)]

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值