面试题一:redis相关问题

介绍

Redis是一个开源的内存中的数据结构存储系统,

Redis采用的是基于内存的采用的是单进程单线程模型的 KV 数据库由C语言编写

1:操作Redis线程安全吗?

答:

Redis是单进程的,所以是线程安全的。Redis是利用队列技术将并发访问变为串行访问。

Redis使用了单线程的设计,所有的客户端请求,也就是redis数据库的连接,使用一种复用的技术。redis可以在任何时候处理单个请求,所有的请求是顺序处理的。因为处理单个请求的时间非常短,所以所有的产出通常不会有慢的感觉,但是最重要的是这些产品被设计为非阻塞系统调用。提到过Redis从2.4版本后是单线程的。所以redis是线程安全的,不会同时有多个线程操作redis数据库的数据。

2:mySQL里有2000w数据,redis中只存20w的数据,如何保证redis中的数据都是热点数据

相关知识:redis 内存数据集大小上升到一定大小的时候,就会施行数据淘汰策略。redis 提供 6种数据淘汰策略: 
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(驱逐):禁止驱逐数据

使用策略规则:

扫描二维码关注公众号,回复: 4628082 查看本文章

  1、如果数据呈现幂律分布,也就是一部分数据访问频率高,一部分数据访问频率低,则使用allkeys-lru

  2、如果数据呈现平等分布,也就是所有的数据访问频率都相同,则使用allkeys-random

3:为什么使用Redis,它有什么好处?

(1)速度快,因为数据存放在内存中。

(2)支持多种数据类型,支持String,List,Set,Sorted set,Hash(底层相当于一个Map结构)。

(3)提供了RDB和AOF两种持久化方式。

(4)丰富的特性:可用作缓存,消息,可以按key设置过期时间,过期将会自动删除。

(5)支持事务,操作都是原子性。(所谓的原子性就是对数据的更改要么全部执行,要么全部不执行)

4:Redis相比memcached有哪些优势?

(1) memcached所有的值均是简单的字符串,redis作为其替代者,支持更为丰富的数据类型

(2) redis的速度比memcached快很多

(3) redis可以持久化其数据

(4)Redis支持数据的备份,即master-slave模式的数据备份。

(5) 使用底层模型不同,它们之间底层实现方式 以及与客户端之间通信的应用协议不一样。Redis直接自己构建了VM 机制 ,因为一般的系统调用系统函数的话,会浪费一定的时间去移动和请求。

(6)value大小:redis最大可以达到1GB,而memcache只有1MB

5:redis常见性能问题和解决方案:

(1)尽量避免在压力很大的主库上增加从库

  (2) Master最好不要做任何持久化工作,如RDB内存快照和AOF日志文件,特别是不要启用内存快照做持久化。

Master写内存快照,save命令调度rdbSave函数,会阻塞主线程的工作,当快照比较大时对性能影响是非常大的,会间断性暂停服务,所以Master最好不要写内存快照。对于Master AOF持久化,如果不重写AOF文件,这个持久化方式对性能的影响是最小的,但是AOF文件会不断增大,AOF文件过大会影响Master重启的恢复速度,如果重写AOF文件,AOF在重写的时候会占大量的CPU和内存资源,出现短暂服务暂停现象。
(3)为了主从复制的速度和连接的稳定性,Master和Slave最好在同一个局域网内。

(4)如果数据比较重要,某个Slave开启AOF备份数据,策略设置为每秒同步一次

(5)为了主从复制的速度和连接的稳定性,Master和Slave最好在同一个局域网内

 (6) 主从复制不要用图状结构,用单向链表结构更为稳定,即:Master <- Slave1 <- Slave2 <- Slave3...;这样的结构方便解决单点故障问题,实现Slave对Master的替换。如果Master挂了,可以立刻启用Slave1做Master,其他不变。

6:RDB和AOF的区别:

RDB持久化:是将在指定的时间间隔内生成的数据集备份到磁盘中。(可能丢失一段时间的数据)。AOF持久化:记录的是服务器执行的所有写操作指令,并在服务器启动时,通过重新执行这些命令来还原数据集。AOF可以每秒同步一次(默认方式),也可以每次执行写入命令时同步一次。

7: redis的内部实现

内部实现采用epoll,采用了epoll+自己实现的简单的事件框架。epoll中的读、写、关闭、连接都转化成了事件,然后利用epoll的多路复用特性,绝不在io上浪费一点时间 这3个条件不是相互独立的,特别是第一条,如果请求都是耗时的,采用单线程吞吐量及性能可想而知了。应该说redis为特殊的场景选择了合适的技术方案。
8:为什么说redis能够快速执行

(1) 绝大部分请求是纯粹的内存操作(非常快速)

(2) 采用单线程,避免了不必要的上下文切换和竞争条件

(3) 非阻塞IO - IO多路复用

猜你喜欢

转载自blog.csdn.net/weixin_41771218/article/details/83143390