redis整理

Redis是一个高性能的键值对内存数据库,常用于缓存、数据库和消息中间件。其特点是数据存储在内存中,读写速度快,支持多种数据类型如字符串、哈希、列表、集合和有序集合。Redis的持久化包括RDB和AOF,以确保数据安全。缓存策略包括防止雪崩、穿透和预热。Redis使用单线程模型,但通过IO多路复用提高效率。文章还讨论了Redis的集群、事务、Java客户端、内存管理和优化、以及分布式锁的实现。
摘要由CSDN通过智能技术生成

1、什么是Redis?

    Redis 是C语言开发的一个开源高性能键值对的内存数据库,可以用来做数据库、缓存、   消息中间件等场景,是一种NoSQL(not-only sql,非关系型数据库)的数据库

2、Redis与其他key-value 存储有什么不同?

3、Redis的数据类型?

  •    string 字符串   二进制安全          可以包含任何数据,包含jpg图片,序列化对象;
  •   hash  字典       键值对集合类似于map  适合存储对象;
  •   list       列表      链表(双向链表)           提供操作某一元素的API  最新消息排行;
  •   set      集合        hash实现 元素不重复   添加删除查询的复杂度为0(1),提供差集,并集,交集
  • sorted set           元素按score 排序           插入数据已经进行了排序

4、使用Redis有哪些好处?

  • 优秀的性能,数据是存储在内存中,读写速度非常快,可支持并发10W QPS

  • 单线程但进程,是线程安全的,采用IO 多路复用制

  • 可作为分布式锁

  • 支持五种数据类型

  • 支持数据持久化到磁盘 rdb和AOF

  • 可以作为消息中间件使用,支持消息发布及订阅

5、Redis相比Memcached有哪些优势?

  •       持久化   redis可以定期保存到磁盘 提供了两种持久化方式,AOF和RDB;
  • 数据安全性,灾难恢复–memcache挂掉后,数据不可恢复;
  • Redis支持数据的备份,即master-slave模式的数据备份;
  • Redis不仅仅支持简单的k/v类型的数据,同时还提供list,set,hash等数据结构的存储;
  • 分布式集群,redis 可以一主多从的方式;过期策略redis expire 设置过期时间;

6、Memcache 与Redis 的区别都有哪些?

7、Redis是单进程单线程的?

8、一个字符串类型的值能存储最大容里是多少?

9、Redi s持久化机制

  •     RDB:某个时间点的全量数据备份;例如 每隔几分钟/几小时/几天,会生成当前时刻redis内存中数据的一份完整快照。有三种触发机制:save命令触发(会阻塞其他线程,bgsave命令触发(阻塞时间极短,Redis主进程会fork一个子进程来完成RDB的过程),自动化触发。
  •   AOF:将每条写命令作为日志,以append-only的方式写入一个日志文件,在redis重启时,通过重新执行日志中的写入指令来重构整个Redis数据。    三种持久化方式:                          appendfsync always:同步持久化,每次有数据修改发生时都写入AOF文件,性能低但数据完整。
    appendfsync everysec(推荐):异步操作,每秒钟同步一次,最多会丢失1秒的数据
    appendfsync no: 永不直接调用文件同步,而是让操作系统来决定何时同步磁盘。性能较好,但很不安全。
     
  • Redis4.0新增混合持久化,将 rdb 文件的内容和增量的 AOF 日志文件存在一起;混合持久化默认关闭,可通过配置aof‐use‐rdb‐preamble yes开启;RDB方式恢复数据:快照时间粒度大,易丢失大量数据;AOF方式恢复数据:性能较RDB要低,Redis数据量大的情况下,启动花费时间长

10、缓存雪崩、缓存穿透、缓存预热、缓存更新、缓存降级等问题?

       缓存击穿:缓存中的热点数据过期了之后,会直接去访问数据库。解决方案:①设置用不过期;加锁排队,当热点数据查询数据库之后重新加入到缓存中;

       缓存穿透:缓存和数据库中都没有数据,在访问的时候会把数据放在缓存中,存放的值时空值,必须设置过期时间。

       缓存雪崩:缓存大批量过期。缓存过期时间+随机过期时间;加锁排队。

11、热点数据和冷数据是什么

12、单线程的redi s为什么这么快?

  • 完全基于内存,绝大部分请求是纯粹的内存操作,非常快速;
  • 采用单线程,避免了不必要的上下文切换和竞争条件;
  • 使用多路I/O复用模型,非阻塞IO;
  • 多路I/O复用模型是利用 select、poll、epoll 可以同时监察多个流的 I/O 事件的能力,在空闲的时候,会把当前线程阻塞掉,当有一个或多个流有 I/O 事件时,就从阻塞态中唤醒,于是程序就会轮询一遍所有的流(epoll 是只轮询那些真正发出了事件的流),并且只依次顺序的处理就绪的流,这种做法就避免了大量的无用操作。

13、redi s的数据类型,以及每种数据类型的使用场景

14、redi s的过期策略以及内存淘汰机制?

15、Redis常见性能问题和解决方案?

16、为什么Redi s的操作是原子性的,怎么保证原子性的?

       单线程的操作;

17、Redi s事务

18、Redis. 的持久化机制是什么?各自的优缺点?

19、Redis常见性能问题和解决方案:

20、redis过期键的删除策略?

21、Redis的回收策略(淘汰策略)?

22、为什么redis 需要把所有数据放到内存中?

23、Redis的同步机制了解么?

      1)从节点连接主节点,并发送SYNC命令请求同步数据。
      2)主节点在接收到SYNC命令后,开始执行BGSAVE命令,将数据持久化到磁盘中,并将生               成的RDB文件发送给从节点。
     3)从节点在接收到RDB文件后,通过LOAD命令将其加载到内存中,从而与主节点的数据保持            一致。
    4)从节点开始接收主节点的增量数据,并将其应用到自己的数据集中,保持与主节点的同步

24、Pipeline有什么好处,为什么要用pipeline?

          一次执行多条命令,而不必等待响应的结果。减少网络延迟对性能的影响。但pipeline不是       原子性的操作。

25、是否使用过Redis 集群,集群的原理是什么?

  • 主从模式:

    当slave启动后,主动向master发送SYNC命令。master接收到SYNC命令后在后台保存快照(RDB持久化)和缓存保存快照这段时间的命令,然后将保存的快照文件和缓存的命令发送给slave。slave接收到快照文件和命令后加载快照文件和缓存的执行命令。复制初始化后,master每次接收到的命令都会同步发送给slave,保证主从数据的一致性。

  • Sentinel模式:
  • 每个sentinel以每秒钟一次的频率向它所知的master,slave以及其他sentinel实例发送一个ping命令 多次执行后被确认下线。
  • Cluster模式

26、Redis集群方案什么情况下会导致整个集群不可用?

27、Redis支持的Java 客户端都有哪些?官方推荐用哪个?

<dependency>
    <groupId>redis.clients</groupId>
    <artifactId>jedis</artifactId>
</dependency>

28、Jedis与Redisson对比有什么优缺点?

29、Redis如何设置密码及验证密码?

       读取redis 的密码: config get requirepass

       设置redis密码:   config set requirepass 123456

   验证密码:

      使用 redis-cli 连接时有两种密码验证方式 reids-cli -h hostname -p port -a password

      auth 123456

30、说说Redis 哈希槽的概念?

31、Redis集群的主从复制模型是怎样的?

32、Redis集群会有写操作丢失吗?为什么?

33、Redis集群之间是如何复制的?

34、Redis集群最大节点个数是多少?

35、Redis集群如何选择数据库?

36、怎么测试Redis 的连通性?

      新建一个测试工程,用redis客户端去连接redis 设置key,在redis服务器端,get key

37、怎么理解Redis 事务?

      redis 的事物主要依靠 MULTI、EXEC、DISCARD 等指令实现,同时,还提供了 WATCH、      UNWATCH 来进一步扩展事务的能力:

      MULTI 开启事务;

     EXEC事务提交;

     DISCARD 取消事务;

38、Redis事务相关的命令有哪几个?

39、Redis key的过期时间和永久有效分别怎么设置?

       EXPIRE key "seconds" setkey时,同时设置过期时间;

      persist 永久有效;

40、Redis如何做内存优化?

41、Redis回收进程如何工作的?  Redis 使用了内存池(memory pool)来分配空间,并且它针对         不同对象的大小,提供了不同的内存分配策略。
      Redis中所有的键值都保存在内存中,如果内存占满,Redis服务器就会stop working 

     基本原理是周期性地扫描存储数据库中所有的键,并一步步对所有键进行检测:

(1)、判断键是否已经过期

(2)、是否使用了LRU算法,以及它最后一次被访问的时间

(3)、是否被删除但仍然留在内存中(当多个客户端同时访问同一个 key VALUE 时,如果没有正确处理引用计数,则会发生这种情况)

42、都有哪些办法可以降低Redis的内存使用情况呢?

  • expire key;
  • 内存淘汰策略 config set maxmemory-policy ${策略} 一般配置的是LRU算法,最近最少使用。

43、Redis的内存用完了会发生什么?

       写命令返回错误,读命令正常返回。在设置key存放时,根据业务需要,可以设置过期时间。

44、一个Redis 实例最多能存放多少的keys? List、Set、SortedSet他们最多能存放多少元素

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

46、Redis最适合的场景?

47、假如Redis里面有1亿个key;其中有10w 个key是以某个固定的已知的前缀开头的,如果将它们全部找出来?

48、如果有大里的key 需要设置同一时间过期,-般需要注意什么

      大量的 key 集中在某个时间点过期,Redis 可能会出现短暂的卡顿现象。如果访问量大的情况        下,还可能出现缓存雪崩

      处理办法:可以在时间上加一个随机值,分散过期时间点

49、使用过Redis 做异步队列么你是怎么用的?

50、使用过Redis 分布式锁么,它是什么回事
       setnx命令:set if not exists,当且仅当 key 不存在时,将 key 的值设为 value。若给定的 key         已经存在,则 SETNX 不做任何动作。

  • 返回1,说明该进程获得锁,将 key 的值设为 value
  • 返回0,说明其他进程已经获得了锁,进程不能进入临界区
  • 加锁:使用setnx进行加锁,当该指令返回1时,说明成功获得锁
  • 解锁:当得到锁的线程执行完任务之后,使用del命令释放锁,以便其他线程可以继续执行setnx命令来获得锁

 解锁存在的问题:

(1)存在的问题:假设线程获取了锁之后,在执行任务的过程中挂掉,来不及显示地执行del命令释放锁,那么竞争该锁的线程都会执行不了,产生死锁的情况。

(2)解决方案:设置锁超时时间

 设置锁超时时间:setnx 的 key 必须设置一个超时时间,以保证即使没有被显式释放,这把锁也要在一定时间后自动释放。可以使用expire命令设置锁超时时间

51、redis 为什么那么快?纯内存访问;单线程避免上下文切换;间接式ReHash、缓存时间戳;

       间接式ReHash :全局hash表,巧妙的把一次性大量拷贝的开销,分摊到了多次处理请求过程中,避免了耗时操作,保证了数据的快速访问。

       缓存时间戳;每毫秒更新一次缓存时间。

52、redis 合适那些场景;

       缓存,

       计数器,

       分布式会话,

       排行榜,

       最新列表,

       分布式锁,

        消息队列;列表,

53、为什么不使用多线程?线程切换,加锁\解锁,导致死锁的问题。

54、redis6.0引入多线程;单线程>内存,IO多线程(内部执行命令还是单线程)

        多线程任务,分摊到Redis   同步IO读写 负载。

55、redis 高级功能:慢查询,

56、为什么用redis  高性能,高并发。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值