zoukankan      html  css  js  c++  java
  • Redis总结

    非常好的面试题点击链接

    序列化方式:

    rdb 快照
    aof append_only 日志追加 开始是 :appendonly yes
    rdb的缓存文件,如果同时开启aof,会默认加载aof
    如果从rdb恢复文件,一定要关闭aof,因为redis默认从aof恢复

    Redis的高性能:

    完全的内存数据库,读写效率高
    单线程的,避免了cpu上下文切换的资源损耗
    使用非阻塞的io多路复用技术
    传统的bio操作一个socket对应一个线程,,同一时间读写的毕竟是少数,所以性能很慢,
    而nio多路复用就是有一个注册器select,把所有的socket都注册到select上,然后去轮训select;
    有work准备好了就处理,减少了线程开销;
    这个select底层是epoll处理。
    //todo

    Redis集群:

    主从节点,读写分离
    master 主节点进行写操作,然后同步到salve节点,
    salve 从节点进行读操作
    哨兵模式,高可用
    多节点哨兵模式,进行高可用监控
    redis-custom模式,高可用

    Redis数据结构:

    Stirng setnx(判断是否存在) 返回1操作成功,返回0操作失败,Set多参数命令用来设计分布式锁;
    setex(增加超时时间) 设置过期时间,ttl可以查询过期时间,设置为-1表示永不过期。
    理论上可以存储任何值,因为他存储的是二级制,只要能序列化为二级制的都可以存储,sdsStr {}数据结构,包含了len 和char[]
    value 最大支持512M
    Hash 一般性能比较高。哈希算法 hset ,hmset, hget, hgetall, hget key va

    List 双向队列,很少用 lpush ,lrange

    有序集合用在什么情况下  对列 可以做一些消息队列什么吗,利用先进先出的原则,但是一般不建议这样使用,建议使用专门的mq。

    Set 去重的集合,可以进行进行一些需要去重的参数保存 sadd, smembers

    Zset 一个权重参数score,集合中的元素能够按score进行排列。可以做排行榜应用 zadd key score value ,zrange key score

    Redis淘汰策略:

    hz=10 设置每秒扫描多少次过期时间的key,如果有些没有扫到就会被查询时惰性检测并删除; 一般是1-100次

    1. 定时淘汰策略:定时删除
    1. 访问淘汰策略:  惰性删除
    1. 6种算法:
      已经设置过期时间的最少使用和即将过期和随机淘汰的三种;

    volatile-lru 已设置过期时间,中最少使用

    volatile-ttl 已设置过期时间,中即将过期的

    volatile-random 已设置过期时间中,随机挑选淘汰

    所有数据中最少使用,任意淘汰
    alikeys-lru 从所有数据集中最少使用

    alikeys-random 从所有数据集中任意淘汰

    no-enviction 禁止新插入数据,直接报错。 (默认的淘汰策略)

    Redis雪崩: 某一时刻大部分数据集中失效;

    规避雪崩:

    1,搭建高可用集群

    2,错开数据过期时间

    3,降级,熔断

    Redis数据不一致问题:

    1,删除,更新,在删除(重试多次,保证一定要删除成功,否则记录日志)

    2,先写库,在写缓存

    Redis缓存击穿

    Q:Redis也没有,数据库也没有,一般只多个key都访问到数据库中;

    A:加锁的解决方案。
    A:布隆过滤器。

    Redis缓存穿透:

    Q:Redis也没有,数据库也没有,一个单key不断访问数据库造成数据宕机,一般是恶意攻击;

    A:可以设计默认值;
    A:布隆过滤器加缓存中,可以hash判断,如果没有就直接返回。

    Redis的数据结构中String的底层实现结构,以及有什么优势?

    SDS(简单动态字符串)
    包括char[], len,free字段,

    struct sdshdr{

         ``//记录buf数组中已使用字节的数量

         ``//等于 SDS 保存字符串的长度

         ``int len;

         ``//记录 buf 数组中未使用字节的数量

         ``int free``;

         ``//字节数组,用于保存字符串

         ``char buf[];

    }

    优势:
    减少内存重分配的次数
    o(1)内获取字符串长度
    防止内存溢出

    Redis的zipList?

    双向列表

    Redis的zset实现原理?

    满足一下条件的使用ziplist编码,否则使用skiplist编码

    1. 有序集合保存的元素数量少于128个,
    2. 有序集合保存的所有元素的大小小于64字节

    skiplist的数据结构:

    1. 跳跃表的结构是采用多层思量,越是上层的分布的越稀疏,最底层包含所有数据。每次从上边一层一层往下缩小范围,直到找到数据。

    缓存穿透,缓存雪崩,缓存击穿的概念?

    穿透:查询不存在数据造成没地都打到数据库,
    解决:设置默认值,布隆过滤器,api层变做好参数校验
    雪崩:发生大规模缓存失效
    解决:打散失效时间(过期时间后加上随机时间),或者永不过期,
    击穿:打量的请求请求同一个key,而刚好这个key不存在,导致全部打到数据库中
    解决:加锁,一个线程更新,其他线程等待,或者设置永不过期key。

    Redis集群?

    Redis大key的影响?

    Q:如果key过大自动过期时会阻塞,压缩需要进行,浪费性能,Redis是单线程的。
    A:读写大key会导致超时严重,甚至阻塞服务。

    A:如果删除大key,DEL命令可能阻塞Redis进程数十秒,使得其他请求阻塞,对应用程序和Redis集群可用性造成严重的影响。

    Redis 事物?

    todo

    Redis Watch?

    Redis Watch 命令用于监视一个(或多个) key ,如果在事务执行之前这个(或这些) key 被其他命令所改动,那么事务将被打断

  • 相关阅读:
    Java浮点数内存存储
    Spring Cloud(一)—— 一小时了解Spring Cloud
    Java基础(三)—— 常用类
    Oracle数据库(三)—— 表(一)
    Java资源记录
    Oracle数据库(一)—— 用户与表空间(常用命令)
    Oracle数据库(二)—— 用户与表空间(错误收集)
    Java Web(一)—— html
    Hibernate框架(二)—— Hibernate的持久化类
    项目 —— spring boot博客系统(一)—— 系统简介
  • 原文地址:https://www.cnblogs.com/czbcxy/p/14519010.html
Copyright © 2011-2022 走看看