Redis基础复习1

Redis数据库专题

- 请介绍一下 Redis 常见的业务使用场景?
    - 缓存/排行系统/统计应用/热数据/社交网络等等
    
    
=============== 数据类型及小功能 ==================
- 请介绍一下 Redis 的 String 类型底层实现?
- 请介绍一下 Redis 的数据类型 SortedSet(zset) 以及底层实现机制?
- Redis 的 String 类型使用 SSD 方式实现的好处?
- Redis 的链表数据结构的特征有哪些?

- 请介绍一下 Redis 的发布订阅功能
    - 使用场景:聊天室、公告牌、服务之间利用消息解耦都可以使用发布订阅模式
    - 发布:publish ; 订阅:subscribe 取消订阅:unsubscrible  查询:pubsub
    - 新开启的订阅客户端,无法接受到该频道之前的消息,因为Redis不会对发布的消息进行持久化
    
- 请介绍一下 Redis 的 Pipeline (管道),以及使用场景
    - 使用场景: 减少网络延迟
    - 使用Pipeline将1组Redis命令进行组装,然后通过一次RTT传输给Redis,减少网络性能瓶颈
    - 最佳实践:如果一次组装Pipeline数据量过大,一方面会增加客户端的等待时间,可以将一次包含大量命令的Pipeline拆分成多次较小的Pipeline来完成

- 请说明一下 Redis 的批量命令与 Pipeline 有什么不同?
    - 原生批量命令是原子的,Pipeline是非原子的
    - 原生批量命令是一个命令对应多个key,pipline支持多个命令
    - 原生批量命令是Redis服务端支持实现的,而Pipline需要服务端和客户端共同实现
    

事务相关:
- Redis 事务相关命令有哪些?
- 什么是 Redis 事务?原理是什么?
    -     - multi命令代表事务开始,exec命令代表事务结束,它们之间的命令是原子顺序执行的;停止事务使用discard命令
        - 某些应用场景需要在事务之前,确保事务中的key没有被其他客户端修改过,才执行事务,否则不执行,Redis提供watch命令来解决此类问题
    
- Redis 事务的注意点有哪些?
    - 事务错误处理: a) 语法错误(Redis事务忽略) b) 运行错误(事务提交后执行报错)
        
- Redis 为什么不支持回滚?
    - 保持Redis的简单快捷;关于语法错误而失败应该在开发过程中被发现


=============== 持久化存储 ========================
- 请介绍一下 RDB, AOF两种持久化机制的优缺点?
    RDB优点:
        1. 紧凑压缩的二进制文件,代表Redis在某个时间点上的数据快照,非常适用于备份,全量复制等场景
        2. RDB恢复"大数据集"时比AOF效率高
    RDB缺点:
        1. 数据的实时持久化较差
        2. 每次bgsave操作都要运行fork()创建子进程(将内存中的数据copy一份);如果文件较大会造成“堵塞”
        3. RDB文件使用特定二进制格式,所以版本迭代可能存在不兼容
    
    AOF优点:
        1. AOF默认同步频率为1s,通过后台的一个线程执行fsync操作,如果Redis进程挂掉,最多丢失1s数据
        2. AOF以appen-only的模式写入,所以没有任何磁盘寻址的开销,写入性能非常高
        3. AOF文件的格式可读性较强,为使用者提供了更灵活的处理方式。
           例如:如果我们不小心错用了FLUSHALL命令,在Rewrite还没进行时,我们可以手工将最后
                 的FLUSHALL命令去掉,然后再使用AOF来恢复数据。
    AOF缺点:
        1. 对于具有相同数据的Redis,AOF文件通常会比RDB文件体积更大
        2. 虽然AOF提供了多种同步的频率,默认情况下,每秒同步一次的频率也具有较高的性能。但在Redis的负载较高时,RDB比AOF具好更好的性能保证
        3. 数据恢复比较慢,不适合做冷备(健壮性不如RDB)

- 如果 AOF 文件的数据出现异常, Redis服务怎么处理?
    - 损坏的文件Redis服务会拒绝启动启动
        - 恢复:redis-check-aof --fix命令进行恢复,恢复后diff -u对比数据差异,找出丢失数据,人工修改
    - 结尾不挖完整的文件Redis服务忽略并继续启动,同时打印报警信息
    
    
=========== 阻塞问题 =================
- 请介绍几个可能导致 Redis 阻塞的原因
    - 内在原因:不合理使用API或数据结构、CPU饱和、持久化阻塞
    - 外在原因:CPU竞争,内存交换,网络问题等
    
- 怎么去发现 Redis 阻塞异常情况?    
    - 方法一:登录 Redis,执行 info,查看 blocked_clients
    - 方法二:执行 redis-cli --latency -h -p 查看延时情况

- 什么是 bigkey? 有什么影响?        
    - 大于10K的就被定义为大key,会造成堵塞
    
- 如何发现大对象
    - 使用redis-cli -h[ip] -p[port] bigkeys命令(内部进行scan操作,把历史扫描过的最大对象统计出来)

......

=========== 内存管理 =================
- 简单介绍一下 Redis 的内存管理方式有哪些?
- Redis 的内存消耗分类有哪些?内存统计使用什么命令?
- 如何设置 Redis 的内存上限?有什么作用?
    - 内存消耗:
        - 自身内存
        - 对象内存:Redis内存占用最大的一块,存储着用户所有的数据
        - 缓冲内存:客户端缓冲、复制积压缓冲区、AOF缓冲区
        - 内存碎片:频繁做更新操作;大量过期键删除,释放的空间无法充分利用,导致碎片率上升
    - config get|set maxmemory命令: 获得内存上限
    - info memory命令: 获取内存相关信息
    
    - 内存回收策略:
        - 删除过期键
            - 惰性删除: 客户端读取过期键,删除并返回空值
            - 定时任务删除: 默认每10s运行一次,使用自适应算法删除过期键
        - 内存溢出控制策略
        
- Redis如何做内存优化?
    - 存储编码优化:不同的数据类型采用不同的内部编码类型,可以提高内存使用率
    - 共享内存池
    - 字符串优化
    - 控制键数量: hash代替多个k-v
    - 缩短键值对象:对于key长度越短越好

    
=========== 分布式锁 =================
- 什么是分布式锁?有什么作用?
- 分布式锁可以通过什么来实现?
- 介绍一下分布式锁实现需要注意的事项?
- Redis怎么实现分布式锁?
可参考: https://blog.csdn.net/L_BestCoder/article/details/79336986?utm_source=distribute.pc_relevant.none-task


========== 缓存相关 ==================
- 什么是缓存穿透?怎么解决?
    缓存穿透:查询一个根本不存在的数据,导致不存在的数据每次请求都要到存储层去查询,会使后端存储负载加大
    解决方案:
        1. 缓存空对象:将空值做缓存并设置较短的过期时间
        2. 布隆过滤器拦截:如果布隆过滤器认为键值不存在,就不会访问存储层
    
- 什么是缓存雪崩? 怎么解决?
    缓存雪崩:缓存层宕掉后,流量会突然全部打到后端存储
    解决方案:
        1. 缓存层高可用
        2. 依赖隔离组件为后端做限流并降级

- 缓存的更新策略有几种?分别有什么注意事项?
    - 更新策略:
        1. LRU/LFU/FIFO算法剔除:缓存使用量超过设定的最大值(maxmemory-policy配置剔除策略)
        2. 超时剔除:缓存数据设置过期时间
        3. 主动更新:数据一致性要求高,需要真实数据更新后立马更新缓存数据
        
    - 注意事项:
        1. 低一致性业务建议设置最大内存和淘汰策略的方式使用
        2. 高一致性业务建议结合超时剔除和主动更新

- Redis淘汰算法或缓存失效策略
    - IFOF:先进先出。判断被存储的时间,离目前最远的数据优先被淘汰
    - LRU:最近最少使用。判断最近被使用的时间,时间最远的数据优先淘汰
    - LFU:最不经常使用。判断一端时间内使用次数,次数最少的数据优先淘汰
    
- Redis的6种淘汰/缓存策略
    - 设置最大内存限制(maxmemory参数);当达到内存限制后,会根据maxmemory-policy配置的策略来决定具体行为
        1. noeviction: 不删除策略, 达到最大内存限制时, 如果需要更多内存, 直接返回错误信息
        2. allkeys-lru: 所有key通用; 优先删除最近最少使用(less recently used ,LRU)的key
        3. volatile-lru: 只限于设置了expire的部分; 优先删除最近最少使用(less recently used ,LRU)的key
        4. allkeys-random: 所有key通用; 随机删除一部分 key
        5. volatile-random: 只限于设置了expire的部分; 随机删除一部分 key
        6. volatile-ttl: 只限于设置了expire的部分; 优先删除剩余时间(time to live,TTL)短的key
    - 在 Redis 的 LRU 算法中, 可以通过设置样本(sample)的数量来调优算法精度(参数:maxmemory-samples 5->10)
        
- 缓存命中率表示什么?
- 怎么提高缓存命中率?
- 如何实现本地缓存?请描述一下你知道的方式


========= 复制原理 ================

- Redis 集群的主从复制模型是怎样的?
    - 复制原理:
        1. 从节点执行slave masterIP masterPort
        2. 保存主节点信息
        3. 建立socket连接
        4. 发送ping命令
        5. 权限验证
        6. 同步数据集
        7. 命令持续复制
    - 全量复制原理
        1. 从节点发送psync -1命令进行数据同步(第一次复制进行复制;进行全量复制)
        2. 主节点解析为全量复制;发送+FULLRESYNC
        3. 从节点接收主节点的响应数据保存 运行ID和偏移量offset
        4. 主节点执行bgsave保存RDB文件到本地
        5. 主节点发送RDB文件给从节点,从节点把接收的RDB文件保存在本地并直接作为从节点的数据文件
        6. 从节点开始接收RDB快照到接收完成时期,主节点仍然响应读写命令,这期间将写命令数据保存在复制客户端缓冲区
        7. 从节点接收完主节点传送来的全部数据后清空自身旧数据
        8. 从节点加载RDB文件(slave-serve-stale-data参数默认开启,从节点依然响应所有命令)
        9. 从节点加载完RDB,当前节点如果开启AOF持久化功能,会立刻做bgrewriteaof操作
        
    - 部分复制原理
        1. 当主从节点因为网络中断,超过repl-timeout时间,主节点会认为从节点故障并中断复制连接
        2. 主节点依然响应命令,并写入到复制积压缓冲区
        3. 网络恢复后,从节点再次连接到主节点
        4. 当主从连接恢复后,从发送 psync offset runid 命令给主节点,进行部分复制操作
        5. 主节点响应+CONTINUE响应,表示可以进行部分复制
        6. 主节点根据偏移量把复制积压缓冲区里的数据发送给从节点
        
    - 心跳机制:
        1. 通过client list命令查看复制相关客户端信息,主节点连接状态为flags=M,从节点连接状态为flags=S
        2. 主节点默认每隔10s对从节点发送ping命令,判断从节点的存活性和连接状态(repl-ping-slave-period控制发送频率)
        3. 从节点在主线程每隔1s发送replconf ack {offset}命令,给主节点上报自身当前的复制偏移量
        (replconf命令作用:1.实时监测主从节点网络状态;2.检查复制数据是否丢失 3. 保证从节点的数量和延时性功能)
    -     异步复制:主节点不但负责数据读写,还负责将写命令同步给从节点;主节点自身处理完写命令后直接返回给客户端,并不等待从节点复制完成
    

- 请介绍一下 Redis 集群实现方案    
- Redis 集群架构模式有哪几种?
- Redis 的主从复制模式有什么优缺点?
    - 优点:读写分离;读性能提高
    - 缺点:a) 主节点挂掉后需要手动将从节点晋升为主节点; b) 写能力受限 c) 单机存储空间受限
- Redis sentinel (哨兵) 模式优缺点有哪些?
    - 优点:自动故障转移
    - 缺点:a) Redis较难支持在线扩容,在集群容量达到上限时在线扩容会变得很复杂; b) 单机存储受限
- Redis Cluster分布式解决方案
    - 优点:自动故障转移 ;当内存、并发、流量等到达瓶颈时,Cluster架构可以做到负载均衡
    - 缺点:部分功能受限(key批量操作;key事务操作等等)


- Redis 集群会有写操作丢失吗?为什么?
    - 过期的key被清理
    - 最大内存不足,导致Redis自动清理部分key以节省空间
    - 网络不稳定情况下,哨兵的自动切换,切换期间可能导致数据丢失

- Redis 集群最大节点个数是多少
    - 16384:Redis 集群有 16384 个哈希槽,每个 key 通过 CRC16 算法计算的结果,对 16384 取模后放到对应的编号在 0-16383 之间的哈希槽,
        集群的每个节点负责一部分哈希槽


=============== 其他 ======================
- 如何设置 Redis 的最大连接数?查看Redis的最大连接数?查看Redis的当前连接数?
    - 查看当前连接数: client info  -> connected_clients
    - 查看最大连接数: config get maxclients
    - 设置最大连接数: a) redis.conf配置文件中 b) config set maxclients <numbers> c) redis-server --maxclients <number> -f <configfile>
    
    
- Redis通讯协议是什么?有什么特点?
    - RESP协议
    - 特点:a) 实现容易 b)解析快 c)人类可读

- Redis 的慢查询修复经验有哪些? 怎么修复的?
- Redis 慢查询是什么?通过什么配置?
    - 最佳实践:
        - slowlog-max-len:使用列表存储日志,设置列表最大长度 1000
        - lowlog-log-slower-than:设置阙值 1ms
    - 获取慢查询日志:slowshow get [n]
    - 慢查询日志重置:slowlog reset
    
- 冷热数据表示什么意思?
    - 冷数据:之前使用的数据,热数据:当前使用的数据。
    - 方案: 冷数据放入硬盘之中; 热主机放入内存之中
    
- 如何优化 Redis 服务的性能?
    - 内存分配控制优化:
        - Redis设置合理的maxmemory,保证机器有20%~30%的限制内存
        - 设置vm.overcommit_memory=1,防止极端情况下造成fork失败
        - 集中化管理AOF重写和RDB的bgsave
    - Swap交换内存优化:
        - 当物理内存不足时,系统会使用swap -> 磁盘IO会成为性能瓶颈
        - echo "vm.swappiness={bestvalue}" >> /etc/sysctl.conf  # 值越大,使用swap概率越高
    - OMM killer: 当内存不足时选择性杀死进程
        - echo {value} > /proc/{pid}/oom_adj  降低redis优先级
    - Transparent Huge Pages: 关闭大页;虽然可以加快fork操作,但是写时内存copy消耗从4KB-2MB
        echo never > /sys/kernel/mm/transparent_hugepage/enabled
    - openfile描述符:因为openfile优先级大于redis maxclients
        ulimit -Sn {max-open-files} --> /etc/rc.local配置文件中
    - Tcp backlog: tcp连接队列长度;默认是511 应该调高
        echo 511 > /proc/sys/net/core/somaxconn
       
- 设计一下在交易网站首页展示当天最热门售卖商品的前五十名商品列表?

冷热数据表示什么意思?
[Lěng rè shùjù biǎoshì shénme yìsi?]
Hot and cold data What does it mean?
全部评论

相关推荐

已经烂了:算法去制造业最少也要211,双非搞算法就是死路一条。至少我在的部门,算法工程师最低都是211毕业的,而且岗位极少。
点赞 评论 收藏
分享
评论
点赞
2
分享

创作者周榜

更多
牛客网
牛客企业服务