• Redis


    分布式缓存与本地缓存的区别

    分布式缓存所有分布式系统都可以访问,本地缓存只能当前jvm才能访问。

    Redis的应用场景有哪些?

    1. Token令牌的生成
    2. 短信验证码Code (有效时间)
    3. 缓存查询数据
    4. 网页计数器
    5. 分布式锁
    6. 延迟操作

    Redis线程模型IO多路复用

    IO多路复用指多个channel或者网络IO,共用一个或者少量线程来处理。

    为什么使用多路复用,是因为与用户网络传输是需要等待的,IO操作不能直接返回。所以使用IO多路复用来解决这个问题,防止一个IO阻塞影响其他IO的读取。

    Redis线程为什么效率这么高

    • 完全基于内存,绝大部分请求是纯粹的内存操作,非常快速。数据存在内存中,类似于HashMap,HashMap的优势就是查找和操作的时间复杂度都是O(1);
    • 数据结构简单,对数据操作也简单,Redis中的数据结构是专门进行设计的;
    • 采用单线程,避免了不必要的上下文切换和竞争条件,也不存在多进程或者多线程导致的切换而消耗 CPU,不用去考虑各种锁的问题,不存在加锁释放锁操作,没有因为可能出现死锁而导致的性能消耗;
    • 使用多路I/O复用模型,非阻塞IO;
    • 使用底层模型不同,它们之间底层实现方式以及与客户端之间通信的应用协议不一样,Redis直接自己构建了 VM 机制 ,因为一般的系统调用系统函数的话,会浪费一定的时间去移动和请求;

    Redis线程线程安全吗?

    安全,因为是单线程的。Redis使用单线程,可以避免上下文切换,效率最高。避免了线程切换、加锁等资源消耗。

    因为Redis是基于内存的操作,CPU不是Redis的瓶颈,Redis的瓶颈最有可能是机器内存的大小或者网络带宽

    Redis分为16个库的作用(0~15)

    Redis支持多个数据库,并且每个数据库的数据是隔离的不能共享,并且基于单机才有,如果是集群就没有数据库的概念。

    Redis是一个字典结构的存储服务器,而实际上一个Redis实例提供了多个用来存储数据的字典,客户端可以指定将数据存储在哪个字典中。这与我们熟知的在一个关系数据库实例中可以创建多个数据库类似,所以可以将其中的每个字典都理解成一个独立的数据库。

    Redis的常用五种数据类型

    • String类型:String是redis最基本的类型,一个key对应一个value,sring类型是二进制安全的。意思是redis的string可以包含任何数据。比如jpg图片或者序列化的对象, Sring类型是Redis最基本的数据类型,一个键最大能存储512MB。
    • Hash类型:可以将Redis中的Hash类型看成具有>,其中同一个key可以有多个不同key值的,所以该类型非常适合于存储值对象的信息。
    • List类型:Redis列表是简单的字符串列表,按照插入顺序排序。你可以添加一个元素到列表的头部(左边)或者尾部(右边)
    • Set类型:Redis 的 Set 是 String 类型的无序集合。集合成员是唯一的,这就意味着集合中不能出现重复的数据。
    • Sorted-Sets:Redis 有序集合和集合一样也是string类型元素的集合,且不允许重复的成员。

    Redis中如何存放对象?

    • 将对象序列化之后直接存储。
    • 使用fastjson将对象转为json字符串之后存储。
    • 使用hash数据类型。

    二进制与json存放对象的区别

    • 二进制序列化器需要向需要序列化的类应用[Serializable]特性,而Json序列化器不需要
    • 二进制序列化器只能序列化字段,而不能序列化属性,也就是说当一个类中不显示定义字段,二进制序列化器是不起作用的,JSON序列化器没有这条规定。在JSON序列化器中,若某个字段不需要序列化,可向其应用[NonSerialized]特性,以节省网络传输的带宽以及减少序列化后文件大小。
    • 二进制序列化后得到的是一个二进制文件,而JSON序列化后得到的是JSON字符串。

    MySQL与Redis一致性解决方案

    MySQL与Redis一致性解决同步问题

    • 方式1:直接清除Redis的缓存,重新读取数据库即可
    • 方式2:使用mq异步订阅mysql binlog实现增量同步
    • 方式3:使用alibaba的canal

    全量同步与增量同步实现的区别

    全量同步:就是每天定时(避开高峰期)或者采用一个周期实现将数据拷贝到一个地方也就是Rdb存储。
    增量同步:比如采用对行为的操作实现对数据的同步,也就是AOF。
    全量与增量的比较:增量同步比全量同步更加消耗服务器的内存,但是能够更加的保证数据的同步。

    RDB与AOF同步存在哪些区别

    Redis提供了两种持久化的机制,分别为RDB、AOF实现,RDB采用定时(全量)持久化机制,但是服务器因为某种原因宕机后可能数据会丢失,AOF是基于数据日志操作实现的持久化,所以AOF采用增量同步的方案。
    Redis已经帮助我默认开启了rdb存储。当两种方式同时开启时,数据恢复Redis会优先选择AOF恢复。

    Redis内存满了,如何处理?

    如果内存空间用满,就会自动驱逐老的数据。根据配置的内存淘汰策略来驱逐老数据。

    Redis内存淘汰策略有哪些?

    总共六种

    • noeviction:当内存使用达到阈值的时候,所有引起申请内存的命令会报错。
    • allkeys-lru:在主键空间中,优先移除最近未使用的key。(推荐)
    • volatile-lru:在设置了过期时间的键空间中,优先移除最近未使用的key。
    • allkeys-random:在主键空间中,随机移除某个key。
    • volatile-random:在设置了过期时间的键空间中,随机移除某个key。
    • volatile-ttl:在设置了过期时间的键空间中,具有更早过期时间的key优先移除。

    通过redis.conf文件来修改redis的淘汰策略。

    比如下单30分钟未支付自动更改订单状态

    利用key的有效时间来实现,当key失效之后会有个监听事件,通过失效监听事件的方法来修改订单状态。

    Redis事务支持回滚吗?

    支持
    Multi 开启事务
    EXEC 提交事务
    Watch 可以监听一个或者多个key,在提交事务之前是否有发生了变化 如果发生边了变化就不会提交事务,没有发生变化才可以提交事务,版本号码,乐观锁
    Discard 取消提交事务
    注意:Redis官方是没有提供回滚方法, 只提供了取消事务。

    Multi 开启事务存在那些优缺点

    答:

    Watch与 Multi 的区别

    答:

    Redis实现分布式锁的思路?

    Redis实现分布式锁基于SetNx命令,因为在Redis中key是保证是唯一的。所以当多个线程同时的创建setNx时,只要谁能够创建成功谁就能够获取到锁。

    Redis中SetnX与Set命令的区别

    Set 命令 每次set时,可以修改原来旧值;
    SetNx命令 每次SetNx检查该 key是否已经存在,如果已经存在的话不会执行任何操作。返回为0 如果已经不存在的话直接新增该key。
    1:新增key成功, 0: 失败

    在分布式锁中如果超时了?如何处理

    答:给锁(key)设置一个有效期避免死锁的现象。

    Redis主从复制的问题

    答:单个Redis如果因为某种原因宕机的话,可能会导致Redis服务不可用,可以使用主从复制实现一主多从,主节点负责写的操作,从节点负责读的操作,主节点会定期将数据同步到从节点中,保证数据一致性的问题。

    Redis主从复制整个原理过程

    1.Redis从节点向主节点建立socket连接
    2.Redis采用全量或者增量的形式将数据同步给从节点
    全量复制:一般用于在初次的复制场景(从节点与主节点第一次建立)
    增量复制:网络出现问题,从节点再次连接主节点时,主节点补发缺少的数据,每次数据增量同步

    传统一主多从复制存在那些问题

    如果主节点存在了问题,整个Redis环境是不可以实现写的操作

    在Redis如何配置一主多从关系

    答:相关配置Redis.conf

    # replicaof  
    slaveof 192.168.212.160 6379 #主节点的服务器
    masterauth 123456
     info replication 
    
    • 1
    • 2
    • 3
    • 4

    主从复制存在那些缺陷BUG

    如果主节点存在了问题,整个Redis环境是不可以实现写的操作,需要人工更改配置变为主操作。
    如何解决该问题:使用哨兵机制可以帮助解决Redis集群主从选举策略。

    哨兵集群架构设计原理

    1. 哨兵机制每个10s时间只需要配置监听我们的主节点就可以获取当前整个Redis集群的环境列表,采用info 命令形式。
    2. 哨兵不建议是单机的,最好每个Redis节点都需要配置哨兵监听。
    3. 哨兵集群原理是如何:多个哨兵都执行同一个主的master节点,订阅到相同都通道,有新的哨兵加入都会向通道中发送自己服务的信息,该通道的订阅者可以发现新哨兵的加入,随后相互建立长连接。
    4. Master的故障发现 单个哨兵会向主的master节点发送ping的命令,如果master节点没有及时的响应,哨兵会认为该master节点为“主观不可用状态”会发送给其他都哨兵确认该Master节点是否不可用,当前确认的哨兵节点数>=quorum(可配置),会实现重新选举。

    master如何确定宕机重新选举

    单个哨兵会向主的master节点发送ping的命令,如果master节点没有及时的响应,哨兵会认为该master节点为“主观不可用状态”会发送给其他都哨兵确认该Master节点是否不可用,当前确认的哨兵节点数>=quorum(可配置),会实现重新选举。

    哨兵集群配置需要注意的事项

    哨兵机制只能解决master选举的问题,不能解决主从复制的问题。

    Redis缓存穿透概念与解决方案

    缓存穿透是指使用不存在的key进行大量的高并发查询,导致缓存无法命中,每次请求都要都要穿透到后端数据库查询,使得数据库的压力非常大,甚至导致数据库服务压死;
    解决方案:

    • 接口层实现api限流、用户授权、id检查等、 黑名单和白名单;
    • 从缓存和数据库都取不到数据的话,一样将数据库空值放入缓存中,设置30s有效期避免使用同一个id对数据库攻击压力大;
    • 使用布隆过滤器

    Redis缓存击穿概念与解决方案

    在高并发的情况下,当一个缓存key过期时,因为访问该key请求较大,多个请求同时发现缓存过期,因此对多个请求同时数据库查询、同时向Redis写入缓存数据,这样会导致数据库的压力非常大;
    解决方案:

    • 使用分布式锁
      保证在分布式情况下,使用分布式锁保证对于每个key同时只允许只有一个线程查询到后端服务,其他没有获取到锁的权限,只需要等待即可;这种高并发压力直接转移到分布式锁上,对分布式锁的压力非常大。
    • 使用本地锁
      使用本地锁与分布式锁机制一样,只不过分布式锁适应于服务集群、本地锁仅限于单个服务使用。
    • 软过过期
      设置热点数据永不过期或者异步延长过期时间;

    Redis缓存雪崩概念与解决方案

    缓存雪崩指缓存服务器重启或者大量的缓存集中在某个时间段失效,突然给数据库产生了巨大的压力,甚至击垮数据库的情况。

    解决思路:防止多个key在同一时刻失效,对不用的数据使用不同的失效时间,加上随机数。

    Redis集群有哪些方式

    答:哨兵集群方式、RedisCluster集群。

    主从复制集群存在哪些缺点

    主节点只有一个,每个节点都保存全量同步数据,冗余的数据比较多;其次只能允许有一个主的节点,属于中心化的集群。

    哨兵集群存在哪些缺点

    主节点只有一个,每个节点都保存全量同步数据,冗余的数据比较多;

    RedisCluster分片集群实现原理

    采用hash槽的概念,预先分配16384个卡槽,并且将该卡槽分配给具体服务的节点;通过key进行crc16(key)%16384 获取余数,余数就是对应的卡槽的位置,一个卡槽可以存放多个不同的key,从而将读或者写转发到该卡槽的服务的节点。 最大的优点:动态扩容、缩容。

    RedisCluster如何快速扩容

    新增一个主节点
    新增一个从节点
    通过redis-cli --cluster add-node命令添加到集群中去,之后再分配卡槽 cluster slots /usr/redis/bin/redis-cli --cluster add-node 192.168.212.163:7007 192.168.212.163:7000 --cluster-slave --cluster-master-id 5d94171eb34ed4396bf5b9db8efaab4d96d0cf10

    执行命令分配卡槽,执行该命令后填写分配卡槽的数量,再之后选择数据卡槽分配的规则。
    /usr/redis/bin/redis-cli --cluster reshard 192.168.212.163:7000

    RedisCluster如何实现减少冗余数据

    就是RedisCluster的分片原理,根据key的hash值的不同分配到不同的卡槽(节点)。

    redis在开发中的使用场景有哪些?怎么使用的。

  • 相关阅读:
    链式二叉树高质量OJ—【Leedcode】
    机器学习算法基础--层次聚类法
    [C语言数据结构]队列
    MMKV(1)
    screen中conda激活环境后登录jupyter notebook导入包提示找不到,但是在命令行中就可以导入包
    CodeWhisperer 使用经验分享
    day08-XML
    【Linux命令】curl 命令
    迷你Ceph集群搭建(超低配设备)
    【错误记录】Android Studio 中 Kotlin 版本报错 ( Module was compiled with an incompatible version of Kotlin. T )
  • 原文地址:https://blog.csdn.net/weixin_44044929/article/details/126239801