面试之玩转Redis话题(三)

                                                            哨兵+复制+事务+集群+持久化

一、Redis支持哪几种数据类型?

支持多种类型的数据结构

1.string:最基本的数据类型,二进制安全的字符串,最大512M。

2.list:按照添加顺序保持顺序的字符串列表。

3.set:无序的字符串集合,不存在重复的元素。

4.sorted set:已排序的字符串集合。

5.hash:key-value对的一种集合。

二、Redis主要有哪些功能?

1、哨兵(Sentinel)和复制(Replication)

Redis服务器毫无征兆的罢工是个麻烦事,如何保证备份的机器是原始服务器的完整备份呢?这时候就需要哨兵和复制

哨兵Sentinel

可以管理多个Redis服务器,它提供了监控,提醒以及自动的故障转移的功能

2、复制(Replication)

则是负责让一个Redis服务器可以配备多个备份的服务器。

3、事务

很多情况下我们需要一次执行不止一个命令,而且需要其同时成功或者失败。

redis对事务的支持也是源自于这部分需求,即支持一次性按顺序执行多个命令的能力,并保证其原子性。

4、LUA脚本

在事务的基础上,如果我们需要在服务端一次性的执行更复杂的操作(包含一些逻辑判断),则lua就可以排上用场了。

5、持久化

redis的持久化指的是redis会把内存的中的数据写入到硬盘中,在redis重新启动的时候加载这些数据,从而最大限度的降低缓存丢失带来的影响。

6、集群(Cluster)

单台服务器资源的总是有上限的,CPU资源和IO资源我们可以通过主从复制,进行读写分离,把一部分CPU和IO的压力转移到从服务器上,这也有点类似mysql数据库的主从同步。

 

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

Redis是单进程单线程的,Redis利用队列技术将并发访问变为串行访问,消除了传统数据库串行控制的开销。

 

四、Redis为什么是单线程的?

多线程处理会涉及到锁,而且多线程处理会涉及到线程切换而消耗CPU。因为CPU不是Redis的瓶颈,Redis的瓶颈最有可能是机器内存或者网络带宽。单线程无法发挥多核CPU性能,不过可以通过在单机开多个Redis实例来解决。

 

五、其它开源软件采用的模型

Nginx:多进程单线程模型

Memcached:单进程多线程模型

 

六、使用Redis的优势?

1.速度快,因为数据存在内存中,类似于HashMap,HashMap的优势就是查找和操作的时间复杂度都是O(1)

2. 支持丰富数据类型,支持string,list,set,sorted set,hash

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

4. 丰富的特性:可用于缓存,消息,按key设置过期时间,过期后将会自动删除

 

七、Redis单点吞吐量

单点TPS达到8万/秒,QPS达到10万/秒,补充下TPS和QPS的概念

QPS: 应用系统每秒钟最大能接受的用户访问量

每秒钟处理完请求的次数,注意这里是处理完,具体是指发出请求到服务器处理完成功返回结果。可以理解在server中有个counter,每处理一个请求加1,1秒后counter=QPS。

TPS: 每秒钟最大能处理的请求数

每秒钟处理完的事务次数,一个应用系统1s能完成多少事务处理,一个事务在分布式处理中,可能会对应多个请求,对于衡量单个接口服务的处理能力,用QPS比较合理。

 

八、Redis相比memcached有哪些优势?

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

 2.Redis的速度比memcached快很多

 3.Redis可以持久化其数据

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

 

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

    Redisson、Jedis、lettuce等等,官方推荐使用Redisson。

 

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

Redis集群预分好16384个桶(哈希槽)

 

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

为了使在部分节点失败或者大部分节点无法通信的情况下集群仍然可用,所以集群使用了主从复制模型,每个节点都会有N-1个复制品.

 

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

Redis并不能保证数据的强一致性,这意味这在实际中集群在特定的条件下可能会丢失写操作。

 

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

异步复制

 

十四、Redis如何做内存优化?

尽可能使用散列表(hashes),散列表(是说散列表里面存储的数少)使用的内存非常小,所以你应该尽可能的将你的数据模型抽象到一个散列表里面。比如你的web系统中有一个用户对象,不要为这个用户的名称,姓氏,邮箱,密码设置单独的key,而是应该把这个用户的所有信息存储到一张散列表里面.

 

十五、Redis回收进程如何工作的?

一个客户端运行了新的命令,添加了新的数据。

Redi检查内存使用情况,如果大于maxmemory的限制, 则根据设定好的策略进行回收。

 

十六、Redis回收使用的是什么算法?

LRU算法

 

十七、Redis有哪些适合的场景?

1  Session共享(单点登录)

2   页面缓存

3   队列

4   排行榜/计数器

5   发布/订阅

posted @ 2019-04-10 23:29  武道风清扬  阅读(240)  评论(0编辑  收藏  举报