• Redis介绍


    Redis介绍

    Redis(Remote Dictionary Server ),即远程字典服务,是一个开源的,使用C语言编写、支持网络、可基于内存可持久化的日志型、Key-Value数据库,并提供多种语言的API。

    面试题:

    1.为什么要用Redis

    1、内存数据库,快,很快.......

    2、工作单线程worker,串行化、原子操作. (IO线程是多线程)

    3、IO模型(epoll), 支撑高并发.

    4、kv模型,v具有类型结构.

    5、具有本地方法,计算向数据移动。(a,b) => 交集

    6、二进制安全,Value最大512M

    2.Redis到底是多线程还是单线程?

    redis6.0之前是单线程,之后也是单线程,但是工作使用的是线程池,io是多线程

    3.Redis是单线程,但为什么快

    1. 纯内存操作

    2. 单线程操作,避免了频繁的上下文切换

    3. 合理高效的数据结构

    4. 采用了非阻塞I/O多路复用机制 epool

    4.Redis提供两种持久化机制:

    • RDB:存储数据结果,关注点在数据(快照

    • AOF:存储操作过程,关注点在数据的操作过程(命令

    • RDB

      优点:

      1.恢复数据比较快

      2.备份的文件就是原始内存数据的大小,不会额外增加数据占用,

    • 缺点:

    • 快照时间有间隔,不能实时备份,丢失数据可能会比较多

    • 开启子进程备份数据,在数据集比较庞大时,fork()可能会非常耗时,造成服务器在一定时间内停止处理客户端。

    AOF的优缺点

    优点:

    • 数据安全性高,不易丢数据

    • AOF文件有序保存了所有写操作,可读性强

    缺点:

    • AOF方式生成文件体积大

    • 数据恢复速度比RDB慢

    5.Redis的数据类型?

    6.Redis 过期删除策略

    1)定时删除:在设置键的过期时间的同时,创建一个定时器 timer. 让定时器在键的过期时间来临时,立即执行对键的删除操作。

    2)惰性删除:放任键过期不管,但是每次从键空间中获取键时,都检查取得的键是否过期,如果过期的话,就删除该键;如果没有过期,就返回该键。

    3)定期删除:每隔一段时间程序就对数据库进行一次检查,删除里面的过期键。至于要删除多少过期键,以及要检查多少个数据库,则由算法决定。

    7.Redis主从同步机制

    步骤如下:

    1.从服务器向主服务器发送同步命令;

    2.主数据库接收到同步命令后,会执行 bgsave 命令,在后台生成一个 rdb 文件,并使用一个缓冲区记录从现在开始执行的所有写命令

    3.当主服务器执行完 bgsave 命令后,主服务器会将 bgsave 命令生成的 rdb 文件发送给从服务器;

    4.从服务器接收到这个 rdb 文件,然后加载到内存 ;之后主服务器会把刚刚在缓存区的命令同步过来,从服务器就会执行这些命名。(两边就一致了

    5.以上处理完之后,之后主数据库每执行一个写命令,都会将被执行的写命令发送给从数据库。

    8.MySQL 里有 2000w 数据,Redis 中只存 20w 的数据,如何保证 redis 中的数据都是热点数据?

    Redis 内存数据集大小上升到一定大小的时候,就会施行数据淘汰策略。

    Redis 提供 8 种数据淘汰策略:

    LRU全称Least recently used,意思为淘汰掉最久未使用(即最老)的一条数据;

    LFU全称Least-frequently used,意思为淘汰掉过去被访问次数最少的一条数据

    淘汰策略名称

    策略含义

    人话

    noeviction

    默认策略,不淘汰数据;大部分写命令都将返回错误

    不删除任意数据(但redis还会根据引用计数器进行释放),这时如果内存不够时,会直接返回错误。

    volatile-lru

    从设置了过期时间的数据中根据 LRU 算法挑选数据淘汰(只针对设置过期的keys

    从设置了过期时间的数据集中,选择最近最久未使用的数据释放 ,最老的删掉

    allkeys-lru这个是最常用的

    从所有数据中根据 LRU 算法挑选数据淘汰(所有keys

    从数据集中(包括设置过期时间以及未设置过期时间的数据集中),选择最近最久未使用的数据释放 最老的删掉

    allkeys-random

    从所有数据中随机挑选数据淘汰

    随机选择一个数据进行释放;

    volatile-random

    从设置了过期时间的数据中随机挑选数据淘汰

    从设置了过期时间的数据集中,随机

    volatile-ttl

    从设置了过期时间的数据中,挑选越早过期的数据进行删除

    从设置了过期时间的数据集中,选择马上就要过期的数据进行释放操作

    allkeys-lfu

    从所有数据中根据 LFU 算法挑选数据淘汰(4.0及以上版本可用)

    淘汰掉过去被访问次数最少的一条数据

    volatile-lfu

    从设置了过期时间的数据中根据 LFU 算法挑选数据淘汰(4.0及以上版本可用)

    淘汰掉设置了过期时间的key过去被访问次数最少的一条数据

    9.Redis 和 Mysql 数据库数据如何保持一致性

    我们在实际项目中经常会使用到Redis缓存用来缓解数据库压力,但是当更新数据库时,如何保证缓存及数据库一致性,一般我们采用延时双删策略。

    目前系统中常用的做法是一个查询接口,先查询Redis,如果不存在则查询数据库,并将结果放入到Redis中。

    为什么是删除缓存,而不是更新缓存呢?主要是如果缓存的内容是带有树型结构或者List,Map,那么更新其中一个内容相对较慢。

    本文所讲操作,均是按照如果缓存不存在,查询数据库后,再放入Redis。

    10. 常见更新策略

    • 1 先删缓存,再更新数据库

    • 2 先更新数据库,再删除缓存

    • 3 普通双删

    • 4 延迟双删

    1 先删缓存,再更新数据库

    1、线程A删除缓存数据,此时还没更新数据库

    2、线程B查询缓存没有数据,查询数据库还是旧数据,放入缓存

    3、线程C及其他线程使用旧缓存数据,缓存和数据库不一致

    2 先更新数据库,再删除缓存

    1、线程A更新数据库,此时还没有删除缓存

    2、线程B及其他线程此时使用的还是旧缓存数据,和数据库内容不一致

    3 普通双删

    1、线程A先删除缓存,再更新数据库,再删除缓存

    2、线程B查询缓存没有数据,在线程A更新数据库之前,查询到旧数据,此时系统时间片切换到线程A执行删除缓存,之后又轮到线程B放入缓存旧数据

    3、线程C针对于线程A,查询缓存没有数据,查询到旧数据,放入缓存旧数据

    都不能满足缓存和数据一致性。

    4 延迟双删

    1、线程A先删除缓存,之后更新数据库

    2、线程B和线程C发现缓存没数据,查询数据库。线程B查询到的是旧数据,线程C查询到的是新数据。之后纷纷放入缓存

    3、线程A延时3-5秒(时间一般要大于SQL执行时间+线程切换执行时间100ms足够),再将缓存删除。之后其他线程再查询缓存,发现没数据,再次查询数据库及放入缓存都是新数据

    极端情况就是线程D,所以延时双删还是不一定能保证缓存及数据一致。

    1、在发现缓存没有数据后,在执行查询数据库前,对该Key进行加锁,查询数据库并放入缓存后再解锁,这样可以避免缓存击穿问题,当某个redis数据不存在时,大量线程并发查询数据库。

    2、在需要执行双删前,对该Key进行加锁,之后执行删除缓存,更新数据库,放入新数据到缓存,在解锁。保证缓存和数据一致性。

    3、加锁的Key都需要设置过期时间,避免因为宕机造成死锁。

    11.Spring Boot 使用Redis

    1.Redis面试题-缓存穿透,缓存击穿,缓存雪崩

    1 穿透: 两边都不存在(皇帝的新装)

    2 穿:一个热点的key失效了,这时大量的并发请求直接到达数据库. (提前预热

    3 雪崩:大量key同时失效 (避免大量的key同一时间失效,错峰

    2.慢查询日志的两个配置项

    slowlog-log-slower-than

    • Redis 慢查询日志的时间阈值,单位微妙。

    • 1) 值为正数,执行时间大于该值设置的微秒时才记录到慢日志中。默认 10000 微秒(0.01 秒)。

    • 2) 值为负数,禁用慢查询日志。

    • 3) 值为 0,所有命令都记录到慢日志中

    slowlog-max-len

    • 慢查询日志长度,最小值为零。默认 128

    • 当记录新命令并且当前慢日志已达到最大长度时,最旧的一条记录将被删除。

    可以通过编辑 redis.conf 或者使用 CONFIG GET/SET 命令来进行配置

  • 相关阅读:
    一文学会Canal怎么用
    【神印王座】易军献身为林鑫挡箭,万万没想到林鑫太坑,大跌眼镜
    Efficient DETR 论文精读
    EPICS asyn诊断帮助
    [附源码]Python计算机毕业设计Django线上社区管理系统
    标准库浏览 – Part II
    泛型的类型擦除后,fastjson反序列化时如何还原?
    赶紧进来看看!!!你一定要会做的八道经典指针笔试题!!!
    租用服务器可以干什么呢?
    java高校教师个人信息管理系统计算机毕业设计MyBatis+系统+LW文档+源码+调试部署
  • 原文地址:https://blog.csdn.net/qq_52963857/article/details/132616180