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 高性能,高并发。