Redis面试题复习

Redis面试题汇总

  1. 使用Redis的好处?
  • key-value 形式的内存数据库。
  • 数据访问在内存中,访问速度快。
  • 存储的形式类似于HashMap,支持多种数据结构(string,set,hash,sorted set,list)。
  • 支持事务(单条操作都是原子性的,但是不像数据库的事务具有原子性)。
  • 可用于缓存,消息,按key设置过期时间,过期后将会自动删除。
  1. redis和memcached的共同点
  • 都是 key-value 形式的内存数据库。
  • 都是NoSQL家族的数据管理解决方案。
  • 都基于同样的key-value 数据模型。
  • 数据放在内存中(这也是适用于缓存的原因)。
  1. redis相比memcached有哪些优势?
  • memcached只支持简单的字符串,redis具有更丰富的类型。
  • redis的访问速度更快。
  • redis可以持久化数据。
  1. redis常见性能问题和解决方案。
  • Master最好不要做持久化机制。如RDB内存快照和AOF日志文件。
  • 如果数据比较重要,某个Slave开启AOF备份数据,策略设置为每秒同步一次。
  • 为了主从复制的速度和连接的稳定性,Master和Slave最好在同一个局域网内。
  • 尽量避免在压力很大的主库上增加从库。
  • 主从复制不要用图状结构,用单向链表结构更为稳定,即:Master <- Slave1 <- Slave2 <- Slave3… 这样的结构方便解决单点故障问题,实现Slave对Master的替换。如果Master挂了,可以立刻启用Slave1做Master,其他不变。
  1. redis的6种数据淘汰策略
  • voltile-lru:从已设置过期时间的数据集(server.db[i].expires)中挑选最近最少使用的数据淘汰。
  • volatile-ttl:从已设置过期时间的数据集(server.db[i].expires)具有更早过期时间的key优先移除。
  • volatile-random:从已设置过期时间的数据集(server.db[i].expires)中任意选择数据淘汰。
  • allkeys-lru:从数据集(server.db[i].dict)中挑选最近最少使用的数据淘汰
  • 从数据集(server.db[i].dict)中任意选择数据淘汰。
  • no-enviction(驱逐):禁止驱逐数据。
  1. Memcache与Redis的区别都有哪些?
    1. 存储方式
      Memecache把数据全部存在内存之中,断电后会挂掉,数据不能超过内存大小。
      Redis有部份存在硬盘上,这样能保证数据的持久性。
    1. 数据支持类型
      Memecache只支持简单的数据结构(字符串)。
      redis支持相对复杂的数据结构。
    1. 使用底层模型不同。
      它们之间底层实现方式 以及与客户端之间通信的应用协议不一样。
      Redis直接自己构建了VM 机制 ,因为一般的系统调用系统函数的话,会浪费一定的时间去移动和请求。
    1. value的大小的限制
      redis最大可以达到1GB,而memcache只有1MB。
  1. redis 最适合的场景
  • 会话缓存(Session Cache)
  • 全页缓存(FPC)
  • 队列
  • 排行版计数器
  • 发布订阅

高可用分布式集群

一、高可用

高可用(High Availability),是当一台服务器停止服务后,对于业务及用户毫无影响。 停止服务的原因可能由于网卡、路由器、机房、CPU负载过高、内存溢出、自然灾害等不可预期的原因导致,在很多时候也称单点问题。

  1. 解决单点问题主要有2种方式:
  • 主备方式
    通常是一台主机、一台或多台备机,在正常情况下主机对外提供服务,并把数据同步到备机,当主机宕机后,备机立刻开始服务。
    Redis HA中使用比较多的是keepalived,它使主机备机对外提供同一个虚拟IP,客户端通过虚拟IP进行数据操作,正常期间主机一直对外提供服务,宕机后VIP自动漂移到备机上。
    优点:对客户端毫无影响,仍然通过VIP操作。
    缺点:在绝大多数时间内备机是一直没使用,被浪费着的。
  • 主从方式
    一主多从的办法,主从之间进行数据同步。 当Master宕机后,通过选举算法(Paxos、Raft)从slave中选举出新Master继续对外提供服务,主机恢复后以slave的身份重新加入。
    主从另一个目的是进行读写分离,这是当单机读写压力过高的一种通用型解决方案。 其主机的角色只提供写操作或少量的读,把多余读请求通过负载均衡算法分流到单个或多个slave服务器上。
    缺点是主机宕机后,Slave虽然被选举成新Master了,但对外提供的IP服务地址却发生变化了,意味着会影响到客户端。 解决这种情况需要一些额外的工作,在当主机地址发生变化后及时通知到客户端,客户端收到新地址后,使用新地址继续发送新请求。
  1. 数据同步
  • 同步方式:当主机收到客户端写操作后,以同步方式把数据同步到从机上,当从机也成功写入后,主机才返回给客户端成功,也称数据强一致性。 很显然这种方式性能会降低不少,当从机很多时,可以不用每台都同步,主机同步某一台从机后,从机再把数据分发同步到其他从机上,这样提高主机性能分担同步压力。 在redis中是支持这杨配置的,一台master,一台slave,同时这台salve又作为其他slave的master。
  • 异步方式:主机接收到写操作后,直接返回成功,然后在后台用异步方式把数据同步到从机上。 这种同步性能比较好,但无法保证数据的完整性,比如在异步同步过程中主机突然宕机了,也称这种方式为数据弱一致性。
  1. 方案的选择
    keepalived方案配置简单、人力成本小,在数据量少、压力小的情况下推荐使用。 如果数据量比较大,不希望过多浪费机器,还希望在宕机后,做一些自定义的措施,比如报警、记日志、数据迁移等操作,推荐使用主从方式,因为和主从搭配的一般还有个管理监控中心。

分布式

概念
分布式(distributed), 是当业务量、数据量增加时,可以通过任意增加减少服务器数量来解决问题。

集群时代
至少部署两台Redis服务器构成一个小的集群,主要有2个目的:

  • 高可用性:在主机挂掉后,自动故障转移,使前端服务对用户无影响。
  • 读写分离:将主机读压力分流到从机上。
    可在客户端组件上实现负载均衡,根据不同服务器的运行情况,分担不同比例的读请求压力。


    image.png

分布式集群时代

当缓存数据量不断增加时,单机内存不够使用,需要把数据切分不同部分,分布到多台服务器上。

image.png

大规模分布式集群时代
当数据量持续增加时,应用可根据不同场景下的业务申请对应的分布式集群。 这块最关键的是缓存治理这块,其中最重要的部分是加入了代理服务。 应用通过代理访问真实的Redis服务器进行读写。
这样做的好处是:
避免越来越多的客户端直接访问Redis服务器难以管理,而造成风险。
在代理这一层可以做对应的安全措施,比如限流、授权、分片。
代理这层无状态的,可任意扩展节点,对于客户端来说,访问代理跟访问单机Redis一样。

总结

分布式缓存再向后是云服务缓存,对使用端完全屏蔽细节,各应用自行申请大小、流量方案即可,如淘宝OCS云服务缓存。
分布式缓存对应需要的实现组件有:

  • 一个缓存监控、迁移、管理中心。
  • 一个自定义的客户端组件,上图中的SmartClient。
  • 一个无状态的代理服务。
  • N台服务器。

参考以及转载的文章

https://blog.csdn.net/yajlv/article/details/73467865
http://www.runoob.com/redis/redis-data-types.html

https://www.cnblogs.com/OnlyCT/p/9036440.html(集群)

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容