当前位置: 首页 > article >正文

Redis3

Redis分布式锁怎么实现的

使用setnx 命令 由于Redis是单线程的 用了命令后只能有一个客户端对某一个key设置 在没有删除或过期key的时候 其他客户端是不能设置key的

如何控制Redis实现分布式锁有效时长

redis的setnx不好控制这个问题 采用redission实现的 

在redission中需要手动加锁 并且可以控制锁失效和等待的时间 当锁住的业务还有没执行完成的时候 在redission中引入了一个看门狗机制 每隔一段时间检查当前业务是否还是持有锁 如果有就会增加锁的持有时间 当业务执行完成之后需要使用释放锁就行了

还有就是高并发的时候 一个业务执行的很快 这样另外的业务也不会拒绝 而是不断尝试获取锁 提高了性能

redission实现的分布式锁是可重入的吗?

是的 可以避免死锁的产生 重入其实在内部就是判断是否是当前线程持有的锁 如果是当前线程持有的锁 就会计数 然后释放锁的时候减一

存储数据时 采用hash结构 大key可以按照自己的业务进行定制 小key是当前线程的唯一标识 value是当前线程重入的次数

redission实现的分布式锁能解决主从一致性问题吗

不能 比如线程1 加锁成功之后  master节点数据会被复制到slave 节点上 此时持有redis锁的master节点宕机 slave节点被提升为新的master节点 加入现在来了一个线程2 在加锁会加到新的master节点上 导致两个节点同时持有一把锁的问题

可以使用redission提供的红锁解决 主要作用是 不能只在一个redis实例上创建锁 应该是在多个redis实例上创建锁

但是加了红锁会导致性能下降

如果非要保证数据的强一致性 怎么解决

redis本身是高可用的 可以使用Zookeeper实现的分布式锁

Redis集群的方案

主从复制 哨兵模式 Redis分片集群

介绍一下主从同步

单节点的redis并发能力是有上限的  要进一步提高redis的并发能力 可以搭建主从集群 实现读写分离 其中主节点负责写数据 而从节点负责读数据 然后主节点写入数据之后 需要把数据同步到节点中

主从同步的流程

全量同步和增量同步

全量同步是指节点第一次和主节点建立连接的时候

流程

1 节点请求主节点同步数据 节点会自己携带自己的replication id 和offset 偏移量

2 主节点判断是否是第一次请求 主要是判断主从节点是否是 同一个replication id 如果不是 就同步成一个

3 主节点会执行bgsave 生成rdb文件后 发送给从节点执行 从节点先删除数据 在重新生成

如果rdb生成期间 依然有请求到了主节点 主节点就会以命令的方式记录到缓冲区 缓冲区是一个日志文件 最后把这个日志文件发送给从节点 这样就能保证主从节点完全一致了 后期在同步数据的时候 都是依赖这个日志文件 

增量同步

        节点服务重启之后 数据就不一致了 这个时候节点会请求同步 和全量类似 只不过最后主节点只会发缺的数据 也就是offset偏移量之后的数据发给从节点

Redis保证高并发可用

搭建主从集群  然后使用哨兵模式

一般项目都是通过redis的哨兵模式来保证redis 的高并发可用

哨兵模式可以实现主从集群的自动故障恢复 里边就包含了 对主从服务的监控 自动故障恢复 通知

如果master故障 sentinel会将一个slave提升为master

当故障实例恢复后 也会以新的master为主

同时Sentinel也充当Redis客户端的服务发现来源 当集群发生故障转移的时候 会将最新消息推送个Redis的客户端

redis使用单点还是集群

使用主从1+1 + 哨兵

一般单节点不超过10G 如果redis内存不足可以独立分配

尽量不做集群维护起来比较麻烦 而且集群之间的心跳检测和数据通信会消耗大量的网络带宽 也没办法使用lua脚本和事务

redis集群脑裂

情况比较少见 由于redis和master和slave节点和sentinel处于不同的网络分区 是的sentinel没有能欧感知到master 所以通过选举的方式提升了一个slave为master 这样就存在两个master

就像大脑分裂一样 导致old master写入无法同步到新master 

网络回复后 sentinel会把old 降为slave 同时新数据同步会导致oldmaster数据丢失

解决 redis配置可以设置 最少的slave节点 设置至少有一个从节点才可以同步数据集

设置 主从数据复制和同步的延迟时间 达不到要求就拒绝 防止数据大量丢失

Redis分片集群的作用

解决海量数据存储的问题 增大集群高并发的能力

同时通过哨兵可以保持高可用

redis分片集群数据怎么读取和存储的

引入了哈希槽 有16384个 每个主节点绑定了一定的范围 key通过CRC16校验 来取模16384决定放哪个槽 通过槽找到对应的节点进行存储

取值的逻辑也是一样的

Redis 是单线程的 会为什么这么快

基于内存 c语言

避免了上下文切换

采用多路io复用模型 非阻塞io

解释一下io多路复用模型

IO多路复用模式指的是 利用单个线程来同时监听多个Socket 并且在某个Socket可读可写的时候提通知 充分利用CPU资源

目前采用epoll模式实现  在通知socket就绪的同时 把已经就绪的socket写入用户空间 不需要挨个遍历判断了提高了性能

Redis的网络模型就是使用io多路复用结合事件的处理器来应对多个socket请求 比如提供了连接应答处理器 命令回复处理器 命令请求处理器

在Redis6.0之后 为提高性能 在回复处理器采用多线程 请求处理器的命令转换也用了多线程

但是执行命令还是单线程


http://www.kler.cn/news/365241.html

相关文章:

  • 利用飞腾派进行OpenCV开发
  • Flutter 状态管理框架Get
  • vue-vant框架引入
  • 深入了解 kotlinx-datetime:配置与使用指南
  • 【Qt】控件——Qt控件的介绍、QWidget的介绍、QWidget的属性、QWidget的函数
  • Modbus TCP报错:Response length is only 0 bytes
  • 【C】数组(array)
  • PHP PDO:安全、灵活的数据持久层解决方案
  • 【ios】---SwiftUI开发从入门到放弃
  • 每日一题——第一百一十八题
  • TCP控制位|标志位
  • 走廊泼水节——求维持最小生成树的完全图的最小边权和
  • HUAWEI_HCIA_实验指南_Lib3.2_配置Trunk接口
  • Spring Boot整合Stripe订阅支付指南
  • 线程池——Java
  • OCR提取影印版PDF文档的中日英三种文字
  • VUE中文本域默认展示最底部内容
  • C++20中头文件ranges的使用
  • 10.25学习
  • opencv 图像翻转- python 实现
  • 网站建设中需要注意哪些安全问题?----雷池社区版
  • 凯伦股份荣获中国钢结构协会2024年度技术创新奖
  • CentOS7上下载安装 Docker Compose
  • springboot社区网格管理系统-计算机毕业设计源码90901
  • MySQL同步到ES的方案选型
  • Uni-App-01