1、什么是Redis?
Redis是完全开源免费的,遵守BSD协议,是一个高性能的key-value数据库。
Redis与其他key-value缓存产品有以下三个特点:
Redis支持数据的持久化,可以将内存中的数据保存在磁盘中,重启的时候可以再
次加载进行使用。
Redis不仅仅支持简单的key-value类型的数据,同时还提供list,set,zset,
hash等数据结构的存储。
Redis支持数据的备份,即master-slave模式的数据备份。
Redis优势
性能极高–Redis能读的速度是次/s,写的速度是次/s。
丰富的数据类型–Redis支持二进制案例的Strings,Lists,Hashes,Sets及
OrderedSets数据类型操作。
原子–Redis的所有操作都是原子性的,意思就是要么成功执行要么失败完全不
执行。
单个操作是原子性的。多个操作也支持事务,即原子性,通过MULTI和EXEC
指令包起来。
丰富的特性–Redis还支持publish/subscribe,通知,key过期等等特性。
Redis与其他key-value存储有什么不同?
Redis有着更为复杂的数据结构并且提供对他们的原子性操作,这是一个不同于其
他数据库的进化路径。
Redis的数据类型都是基于基本数据结构的同时对程序员透明,无需进行额外的抽象。
Redis运行在内存中但是可以持久化到磁盘,所以在对不同数据集进行高速读写时
需要权衡内存,因为数据量不能大于硬件内存。
在内存数据库方面的另一个优点是,相比在磁盘上相同的复杂的数据结构,在内存
中操作起来非常简单,这样Redis可以做很多内部复杂性很强的事情。
同时,在磁盘格式方面他们是紧凑的以追加的方式产生的,因为他们并不需要进行
随机访问。
2、Redis的数据类型?
答:Redis支持五种数据类型:
string(字符串),hash(哈希),list(列表),set(集合)及zsetsorted
set:有序集合)。
我们实际项目中比较常用的是string,hash如果你是Redis中高级用户,还需要
加上下面几种数据结构HyperLogLog、Geo、Pub/Sub。
如果你说还玩过RedisModule,像BloomFilter,RedisSearch,Redis-ML,面
试官得眼睛就开始发亮了。
3、使用Redis有哪些好处?
1、速度快,因为数据存在内存中,类似于HashMap,HashMap的优势就是查
找和操作的时间复杂度都是O1).
2、支持丰富数据类型,支持string,list,set,Zset,hash等
3、支持事务,操作都是原子性,所谓的原子性就是对数据的更改要么全部执行,
要么全部不执行.
4、丰富的特性:可用于缓存,消息,按key设置过期时间,过期后将会自动删除
4、Redis相比Memcached有哪些优势?
1、Memcached所有的值均是简单的字符串,redis作为其替代者,支持更为丰
富的数据类
2、Redis的速度比Memcached快很
3、Redis可以持久化其数据
5、Memcache与Redis的区别都有哪些?
1、存储方式Memecache把数据全部存在内存之中,断电后会挂掉,数据不能
超过内存大小。Redis有部份存在硬盘上,这样能保证数据的持久性。
2、数据支持类型Memcache对数据类型支持相对简单。
Redis有复杂的数据类型.
3、使用底层模型不同它们之间底层实现方式以及与客户端之间通信的应用协议
不一样。
Redis直接自己构建了VM机制,因为一般的系统调用系统函数的话,会浪费一
定的时间去移动和请求。
6、Redis是单进程单线程的?
答:Redis是单进程单线程的,redis利用队列技术将并发访问变为串行访问,消
除了传统数据库串行控制的开销。
7、一个字符串类型的值能存储最大容量是多少?
答:M.
8、Redis的持久化机制是什么?各自的优缺点?
Redis提供两种持久化机制RDB和AOF机制:
1、RDBRedisDataBase)持久化方式:是指用数据集快照的方式半持久化模式)
记录redis数据库的所有键值对,在某个时间点将数据写入一个临时文件,持久化
结束后,用这个临时文件替换上次持久化的文件,达到数据恢复。
优点:
1、只有一个文件dump.rdb,方便持久化。
2、容灾性好,一个文件可以保存到安全的磁盘。
3、性能最大化,fork子进程来完成写操作,让主进程继续处理命令,所以是IO
最大化。使用单独子进程来进行持久化,主进程不会进行任何IO操作,保证了redis
的高性能)
4.相对于数据集大时,比AOF的启动效率更高。
缺点:
1、数据安全性低。RDB是间隔一段时间进行持久化,如果持久化之间redis发生
故障,会发生数据丢失。所以这种方式更适合数据要求不严谨的时候)
2、AOFAppend-onlyfile)持久化方式:是指所有的命令行记录以redis命令请
求协议的格式完全持久化存储)保存为aof文件。
优点:
1、数据安全,aof持久化可以配置appendfsync属性,有always,每进行一次
命令操作就记录到aof文件中一次。
2、通过append模式写文件,即使中途服务器宕机,可以通过redis-check-aof
工具解决数据一致性问题。
3、AOF机制的rewrite模式。AOF文件没被rewrite之前(文件过大时会对命令
进行合并重写),可以删除其中的某些命令(比如误操作的flushall))
缺点:
1、AOF文件比RDB文件大,且恢复速度慢。
2、数据集大的时候,比rdb启动效率低。
9、Redis常见性能问题和解决方案:
1、Master最好不要写内存快照,如果Master写内存快照,save命令调度rdbSave
函数,会阻塞主线程的工作,当快照比较大时对性能影响是非常大的,会间断性
暂停服务.
2、如果数据比较重要,某个Slave开启AOF备份数据,策略设置为每秒同步一
3、为了主从复制的速度和连接的稳定性,Master和Slave最好在同一个局域网
4、尽量避免在压力很大的主库上增加
5、从复制不要用图状结构,用单向链表结构更为稳定,即:Master-Slave1
-Slave2-Slave3…这样的结构方便解决单点故障问题,实现Slave对Master
的替换。如果Master挂了,可以立刻启用Slave1做Master,其他不变。
10、redis过期键的删除策略?
1、定时删除:在设置键的过期时间的同时,创建一个定时器timer).让定时器在键
的过期时间来临时,立即执行对键的删除操作。
2、惰性删除:放任键过期不管,但是每次从键空间中获取键时,都检查取得的键是
否过期,如果过期的话,就删除该键;如果没有过期,就返回该键。
3、定期删除:每隔一段时间程序就对数据库进行一次检查,删除里面的过期键。
至于要删除多少过期键,以及要检查多少个数据库,则由算法决定.
11、Redis的回收策略(淘汰策略)?
volatile-lru:从已设置过期时间的数据集(server.db[i].expires)中挑选最近最
少使用的数据淘汰
volatile-ttl:从已设置过期时间的数据集(server.db[i].expires)中挑选将要过
期的数据淘汰
volatile-random:从已设置过期时间的数据集(server.db[i].expires)中任意
选择数据淘汰
allkeys-lru:从数据集(server.db[i].dict)中挑选最近最少使用的数据淘汰
allkeys-random:从数据集(server.db[i].dict)中任意选择数据淘汰
no-enviction(驱逐):禁止驱逐数据
注意这里的6种机制,volatile和allkeys规定了是对已设置过期时间的数据集淘
汰数据还是从全部数据集淘汰数据,后面的lru、ttl以及random是三种不同的
淘汰策略,再加上一种no-enviction永不回收的策略。
使用策略规则:
1、如果数据呈现幂律分布,也就是一部分数据访问频率高,一部分数据访问频率
低,则使用allkeys-lru
2、如果数据呈现平等分布,也就是所有的数据访问频率都相同,则使用
allkeys-random
12、为什么edis需要把所有数据放到内存中?
答:Redis为了达到最快的读写速度将数据都读到内存中,并通过异步的方式将数
据写入磁盘。所以redis具有快速和数据持久化的特征。如果不将数据放在内存中,
磁盘I/O速度为严重影响redis的性能。在内存越来越便宜的今天,redis将会越
来越受欢迎。如果设置了最大使用的内存,则数据已有记录数达到内存限值后不
能继续插入新值。
13、Redis的同步机制了解么?
答:Redis可以使用主从同步,从从同步。第一次同步时,主节点做一次
bgsave,并同时将后续修改操作记录到内存buffer,待完成后将rdb文件全量同
步到复制节点,复制节点接受完成后将rdb镜像加载到内存。加载完成后,再通
知主节点将期间修改的操作记录同步到复制节点进行重放就完成了同步过程。
14、Pipeline有什么好处,为什么要用pipeline?
答:可以将多次IO往返的时间缩减为一次,前提是pipeline执行的指令之间没有
因果相关性。使用redis-benchmark进行压测的时候可以发现影响redis的QPS
峰值的一个重要因素是pipeline批次指令的数目。
15、是否使用过Redis集群,集群的原理是什么?
1)、RedisSentinal着眼于高可用,在master宕机时会自动将slave提升为
master,继续提供服务。
2)、RedisCluster着眼于扩展性,在单个redis内存不足时,使用Cluster进行
分片存储。
16、Redis集群方案什么情况下会导致整个集群不可用?
答:有A,B,C三个节点的集群,在没有复制模型的情况下,如果节点B失败了,
那么整个集群就会以为缺少-这个范围的槽而不可用。
17、Redis支持的Java客户端都有哪些?官方推荐用哪个?
答:Redisson、Jedis、lettuce等等,官方推荐使用Redisson。
18、Jedis与Redisson对比有什么优缺点?
答:Jedis是Redis的Java实现的客户端,其API提供了比较全面的Redis命令
的支持;Redisson实现了分布式和可扩展的Java数据结构,和Jedis相比,功
能较为简单,不支持字符串操作,不支持排序、事务、管道、分区等Redis特
性。
Redisson的宗旨是促进使用者对Redis的