javaredis⾯试_Redis⾯试20题(吐⾎整理)
1.Redis 是什么?
是⼀个基于内存的⾼性能key-value数据库。
2.Redis相⽐memcached有哪些优势:
memcached所有的值均是简单的字符串,
redis作为其替代者,⽀持更为丰富的数据类型,
redis的速度⽐memcached快很多,
redis可以持久化其数据。
3.Reids常⽤5种数据类型
string,list,set,sorted set,hash
4.Reids6种淘汰策略:
noeviction: 不删除策略, 达到最⼤内存限制时, 如果需要更多内存, 直接返回错误信息。⼤多数写命令都会导致占⽤更多的内存(有极少数会例外。
allkeys-lru:所有key通⽤; 优先删除最近最少使⽤(less recently used ,LRU) 的 key。
volatile-lru:只限于设置了 expire 的部分; 优先删除最近最少使⽤(less recently used ,LRU) 的 key。
allkeys-random:所有key通⽤; 随机删除⼀部分 key。
volatile-random: 只限于设置了expire的部分; 随机删除⼀部分 key。
volatile-ttl: 只限于设置了expire的部分; 优先删除剩余时间(time to live,TTL) 短的key。
5.为什么Redis是单线程的?
Redis是基于内存的操作,CPU不是Redis的瓶颈,Redis的瓶颈最有可能是机器内存的⼤⼩或者⽹络带宽。
单线程容易实现,⽽且CPU不会成为瓶颈,那就顺理成章地采⽤单线程的⽅案了。
6.Redis是单线程的,但Redis为什么这么快?
完全基于内存,绝⼤部分请求是纯粹的内存操作,⾮常快速。数据存在内存中,类似于HashMap,HashMap的优势就是查和操作的时间复杂度都是O(1);
数据结构简单,对数据操作也简单,Redis中的数据结构是专门进⾏设计的;
采⽤单线程,避免了不必要的上下⽂切换和竞争条件,也不存在多进程或者多线程导致的切换⽽消耗 CPU,不⽤去考虑各种锁的问题,不存在加锁释放锁操作,没有因为可能出现死锁⽽导致的性能消耗;
使⽤多路I/O复⽤模型,⾮阻塞IO;这⾥“多路”指的是多个⽹络连接,“复⽤”指的是复⽤同⼀个线程
使⽤底层模型不同,它们之间底层实现⽅式以及与客户端之间通信的应⽤协议不⼀样,Redis直接⾃⼰构建了VM 机制 ,因为⼀般的系统调⽤系统函数的话,会浪费⼀定的时间去移动和请求;
7.Redis内存模型
used_memory:Redis分配器分配的内存总量(单位是字节),包括使⽤的虚拟内存(即swap);Redis分配器后⾯会介绍。
提交更改是内存条吗used_memory_human只是显⽰更友好。
used_memory_rss:Redis进程占据操作系统的内存(单位是字节),与top及ps命令看到的值是⼀致的;除了分配器分配的内存之
外,used_memory_rss还包括进程运⾏本⾝需要的内存、内存碎⽚等,但是不包括虚拟内存。
mem_fragmentation_ratio:内存碎⽚⽐率,该值是used_memory_rss / used_memory的⽐值。
mem_allocator:Redis使⽤的内存分配器,在编译时指定;可以是 libc 、jemalloc或者tcmalloc,默认是jemalloc;截图中使⽤的便是默认的jemalloc。
8.Redis内存划分
数据
作为数据库,数据是最主要的部分;这部分占⽤的内存会统计在used_memory中。
进程本⾝运⾏需要的内存
Redis主进程本⾝运⾏肯定需要占⽤内存,如代码、常量池等等;这部分内存⼤约⼏兆,在⼤多数⽣产环境中与Redis数据占⽤的内存相⽐可以忽略。这部分内存不是由jemalloc分配,因此不会统计在used_memory中。
缓冲内存
缓冲内存包括客户端缓冲区、复制积压缓冲区、AOF缓冲区等;其中,客户端缓冲存储客户端连接的输⼊输出缓冲;复制积压缓冲⽤于部分复制功能;AOF缓冲区⽤于在进⾏AOF重写时,保存最近的写⼊命令。在了解相应功能之前,不需要知道这些缓冲的细节;这部分内存由jemalloc分配,因此会统计在used_memory中。
内存碎⽚
内存碎⽚是Redis在分配、回收物理内存过程中产⽣的。例如,如果对数据的更改频繁,⽽且数据之间的⼤⼩相差很⼤,可能导致redis释放的空间在物理内存中并没有释放,但redis⼜⽆法有效利⽤,这就形成了内存碎⽚。内存碎⽚不会统计在used_memory中。
9.Redis 持久化⽅案:
RDB 和 AOF
10.AOF常⽤配置总结
下⾯是AOF常⽤的配置项,以及默认值
appendonly no:可以配置为yes
appendfilename "appendonly.aof":AOF⽂件名
dir ./:RDB⽂件和AOF⽂件所在⽬录
appendfsync everysec:fsync持久化策略
no-appendfsync-on-rewrite no:AOF重写期间是否禁⽌fsync;如果开启该选项,可以减轻⽂件重写时CPU和硬盘的负载(尤其是硬盘),但是可能会丢失AOF重写期间的数据;需要在负载和安全性之间进⾏平衡
auto-aof-rewrite-percentage 100:⽂件重写触发条件之⼀
auto-aof-rewrite-min-size 64mb:⽂件重写触发提交之⼀
aof-load-truncated yes:如果AOF⽂件结尾损坏,Redis启动时是否仍载⼊AOF⽂件
11.RDB和AOF的优缺点
优点: RDB⽂件紧凑,体积⼩,⽹络传输快,适合全量复制;恢复速度⽐AOF快很多。当然,与AOF
相⽐,RDB最重要的优点之⼀是对性能的影响相对较⼩。
缺点: RDB⽂件的致命缺点在于其数据快照的持久化⽅式决定了必然做不到实时持久化,⽽在数据越来越重要的今天,数据的⼤量丢失很多时候是⽆法接受的,因此AOF持久化成为主流。此外,RDB⽂件需要满⾜特定格式,兼容性差(如⽼版本的Redis不兼容新版本的RDB⽂件
AOF持久化与RDB持久化相对应,AOF的优点在于⽀持秒级持久化、兼容性好,缺点是⽂件⼤、恢复速度慢、对性能影响⼤。
12.持久化策略选择
如果Redis中的数据完全丢弃也没有关系(如Redis完全⽤作DB层数据的cache),那么⽆论是单机,还是主从架构,都可以不进⾏任何持久化。
在单机环境下(对于个⼈开发者,这种情况可能⽐较常见),如果可以接受⼗⼏分钟或更多的数据丢失,选择RDB对Redis的性能更加有利;如果只能接受秒级别的数据丢失,应该选择AOF
但在多数情况下,我们都会配置主从环境,slave的存在既可以实现数据的热备,也可以进⾏读写分离分担Redis读请求,以及在master宕掉后继续提供服务。
13.Redis常⽤管理命令
dbsize 返回当前数据库 key 的数量。
info 返回当前 redis 服务器状态和⼀些统计信息。
monitor 实时监听并返回redis服务器接收到的所有请求信息。
shutdown 把数据同步保存到磁盘上,并关闭redis服务。
config get parameter 获取⼀个 redis 配置参数信息。(个别参数可能⽆法获取)
config set parameter value 设置⼀个 redis 配置参数信息。(个别参数可能⽆法获取)
config resetstat 重置 info 命令的统计信息。(重置包括:keyspace 命中数、
keyspace 错误数、 处理命令数,接收连接数、过期 key 数)
debug object key 获取⼀个 key 的调试信息。
debug segfault 制造⼀次服务器当机。
flushdb 删除当前数据库中所有 key,此⽅法不会失败。⼩⼼慎⽤
flushall 删除全部数据库中所有 key,此⽅法不会失败。⼩⼼慎⽤
14.Reids⼯具命令
#redis-server:Redis 服务器的 daemon 启动程序
#redis-cli:Redis 命令⾏操作⼯具。当然,你也可以⽤ telnet 根据其纯⽂本协议来操作
#redis-benchmark:Redis 性能测试⼯具,测试 Redis 在你的系统及你的配置下的读写性能
#redis-benchmark -n 100000 –c 50
#模拟同时由 50 个客户端发送 100000 个 SETs/GETs 查询
#redis-check-aof:更新⽇志检查
#redis-check-dump:本地数据库检查
15. redis常见性能问题和解决⽅案:
Master最好不要做任何持久化⼯作,如RDB内存快照和AOF⽇志⽂件
如果数据⽐较重要,某个Slave开启AOF备份数据,策略设置为每秒同步⼀次
为了主从复制的速度和连接的稳定性,Master和Slave最好在同⼀个局域⽹内
尽量避免在压⼒很⼤的主库上增加从库
RESP 是redis客户端和服务端之前使⽤的⼀种通讯协议;
RESP 的特点:实现简单、快速解析、可读性好
17.Redis分布式锁实现
先拿setnx来争抢锁,抢到之后,再⽤expire给锁加⼀个过期时间防⽌锁忘记了释放。如果在setnx之后执⾏expire之前进程意外crash或者要重启维护了,那会怎么样?set指令有⾮常复杂的参数,这个应该是可以同时把setnx和expire合成⼀条指令来⽤的!
18.Redis中海量数据的正确操作⽅式
利⽤SCAN系列命令(SCAN、SSCAN、HSCAN、ZSCAN)完成数据迭代。
19.SCAN系列命令注意事项
SCAN的参数没有key,因为其迭代对象是DB内数据;
返回值都是数组,第⼀个值都是下⼀次迭代游标;
时间复杂度:每次请求都是O(1),完成所有迭代需要O(N),N是元素数量;
可⽤版本:version >= 2.8.0;
20.Reids三种不同删除策略
定时删除:在设置键的过期时间的同时,创建⼀个定时任务,当键达到过期时间时,⽴即执⾏对键的删除操作
优点: 对内存友好,定时删除策略可以保证过期键会尽可能快地被删除,并释放国期间所占⽤的内存
缺点: 对cpu时间不友好,在过期键⽐较多时,删除任务会占⽤很⼤⼀部分cpu时间,在内存不紧张但cpu时间紧张的情况下,将cpu时间⽤在删除和当前任务⽆关的过期键上,影响服务器的响应时间和吞吐量
定期删除:每隔⼀点时间,程序就对数据库进⾏⼀次检查,删除⾥⾯的过期键,⾄于要删除多少过期键,以及要检查多少个数据库,则由算法决定。
优点: 定期删除策略每隔⼀段时间执⾏⼀次删除过期键操作,并通过限制删除操作执⾏的时长和频率来减少删除操作对CPU时间的影响定时删除策略有效地减少了因为过期键带来的内存浪费。
惰性删除:放任键过期不管,但在每次从键空间获取键时,都检查取得的键是否过期,如果过期的话,就删除该键,如果没有过期,
优点: 对cpu时间友好,在每次从键空间获取键时进⾏过期键检查并是否删除,删除⽬标也仅限当前处理的键,这个策略不会在其他⽆关的删除任务上花费任何cpu时间
缺点: 对内存不友好,过期键过期也可能不会被删除,导致所占的内存也不会释放。甚⾄可能会出现内存泄露的现象,当存在很多过期键,⽽这些过期键⼜没有被访问到,这会可能导致它们会⼀直保存在内存中,造成内存泄露。

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。