Redis

我们都知道mysql数据存储在磁盘上

redis6.0版本之前是一个单线程对网络IO和键值对读写

redis命令的执行是单线程的

Redis是一个基于内存存储的key-value形式的非关系型的nosql数据库,数据呢存储在内存中,redis存在的意义就是当很多相同的请求时redis可以直接进行拦截并返回给客户端,redis存储的数据是热点数据和不经常改变的数据,当第一次查询数据时,会从数据库中获取,以后的请求都会去判断redis中是否有数据如果有直接返回,如果没有再从redis中获取

redis为我们提供了五种数据类型,像string、hash、set、list、zset,数据存储在内存中,并且在数据结构中做了大量优化,所以IO性能会比较好,在项目中,我们经常在应用和数据库之间的一个缓存中间件,由于数据存储在内存中,也存在安全隐患,如果服务器突然宕机,那么我们内存中的数据就会丢失,然后redis不会容忍存在这种错误的,redis为我们提供了两种持久化方式

RDB和AOF,RDB呢是以快照的形式保存磁盘文件,也就是说会给当前redis中的操作拍个快照,后续就可以回退到之前拍快照的地方,也就是说RDB是先保存一个临时文件中,然后再覆盖最终的那个文件,而AOF是把写或删除的命令以追加的方式保存磁盘文件中,也就是说每次我们操作的命令,redis呢会把这些命令记录在一个文件中,后续重启之后就会重新执行这些命令,在redis中RDB是默认开启的,RDB和AOF都各有利弊,RDB的优点:文件小、性能高,RDB缺点:如果未及时备份,数据可能会丢失,AOF的优点:因为是重新执行命令所以数据的完整性高,AOF缺点:文件过大,当然在redis中也难免遇到一些问题比如:击穿、雪崩、穿透。

穿透也就是说用户访问了一个数据,redis中不存在,数据库中也不存在的key,那么就会访问数据库,在真实开发中难免遇到这种问题,但是一次两次的请求我们可以不计较,如果说大量的请求都来访问数据库,那么很大可能会造成服务器压力过大,进而导致系统崩溃,如果前端传递了大量的非法请求,那么就会认为是恶意攻击,在redis中我们提供了两种解决方案:1、对于缓存结果为空的数据我们也进行缓存,那么下次用户再访问该key时,redis会直接返回redis中存储的空数据,但是试想,如果后续我们添加了该值,那么用户再访问时还会直接从redis中返回空数据那么就是不合适的,可以给key设置一个过期时间来解决该问题,还有还有第二种方案:2、布隆过滤器,布隆过滤器的底层是一个二进制的数组,数据默认都是0,如果当前我们进来一个key,会对key进行三次hash运算,那么就会得到三个值,对于得到的这三个值我们在数组对应的位置上标记为1,下次查询来进行对比,如果说不一致那就是没有这个数据,布隆过滤器的优点就是存储空间小,而缺点是有一定的误判性、很难删除元素,删除很麻烦,因为运算出来的hash值是可以重复的,如果说我们要删除位置在3的a元素,那么b数据也在那,那我们删除就很麻烦,布隆过滤器说存在的数据那么可能不存在,而布隆过滤器说不存在的数据那就一定不存在

雪崩问题也就是说同一时间大量的数据突然过期,导致该去缓存中查询的全都去了数据库查询,数据库压力过大,导致系统崩溃,解决办法(设置分散的过期时间)

击穿问题,刚好查询的时候缓存中的数据大量过期,导致大量的请求都去mysql查

对于CAP原则,redis不可能同时满足,redis存在的意义就是加快我们读的操作,不需要每次都去访问数据库,如果说在redis中我们想要实现CP原则的话,那就要对其进行加锁,但是我们想想我们本身使用redis就是提升查询效率,如果对其进行加锁就降低了性能,所以在redis中是AP原则,可以保证数据的最终一致性,但是不保证强一致性

redis的集群有两种,一种是主从复制另一种是redis cluster,主从集群就是在redis集群中包括一个master节点和多个slave节点,master节点负责数据的读写,slave节点负责数据的读取master收到数据变更会同步到slave节点上,这样的架构可以实现redis的读写分离提升数据的查询效率,如果说一个master节点挂掉,那么可能会导致后续的请求直接失败所以redis提供了哨兵机制,哨兵会监控redis主从节点的状态,当master节点出现故障时会自动从剩下的slave节点中选取出一个新的master节点,哨兵虽然解决了master选举的问题但是在线扩容还没解决,redis cluster,它实现的redis的分布式存储也就是每个节点存储不同的数据实现数据的分片功能,引入了slot槽,来实现数据分片,slot的取值范围在1-16383,每个节点会分配一个slot区间,当存取key时,redis会根据key进行计算得到一个slot值然后找到对应的节点进行数据的读写,在redis cluster引入了主从复制的一个模式

主从复制分为全量复制和增量复制,全量复制发生在slave初始化的阶段,slave向master发起请求,master会将自己的数据同步给slave节点,那么此时slave节点会丢弃旧的数据重新加载新的数据,增量复制是会根据offset偏移量来判断也就是说当master节点发生了写或删除的操作时要将这些操作同步给slave节点

  • 5
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

橘猫_A

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值