17.python面试之Redis

Redis(Remote Dictionary Server ),即远程字典服务,是一个开源的使用ANSI C语言编写、支持网络、可基于内存亦可持久化的日志型、Key-Value数据库,并提供多种语言的API。

python最新面试宝典系列文章

  • 01.python面试之基础
  • 02.python面试之文件操作
  • 03.python面试之模块与包
  • 04.python面试之数据类型
  • 05.python面试之元类
  • 06.python面试之内存管理与垃圾回收机制
  • 07.python面试之函数
  • 08.python面试之设计模式
  • 09.python面试之面向对象
  • 10.python面试之正则表达式
  • 11.python面试之系统编程
  • 12.python面试之网络编程
  • 13.python面试之Flask
  • 14.python面试之Django
  • 15.python面试之爬虫
  • 16.python面试之MySQL
  • 17.python面试之Redis
  • 18.python面试之数据结构
  • 99.python面试之常规题
  • 100.python面试之常见题

Redis宕机怎么解决?

宕机:服务器停止服务

如果只有一台redis,肯定会造成数据丢失,无法挽救

多台redis或者是redis集群,宕机则需要分为在主从模式下区分来看:
slave从redis宕机,配置主从复制的时候才配置从的redis,从的会从主的redis中读取主的redis的操作日志

  1. 在redis中从库重新启动后会自动加入到主从架构中,自动完成同步数据;
  2. 如果从数据库实现了持久化,此时千万不要立马重启服务,否则可能会造成数据丢失,正确的操作如下:在slave数据上执行SLAVEOF ON ONE,来断开主从关系并把slave升级为主库,此时重新启动主数据库,执行SLAVEOF,把它设置为从库,连接到主的redis上面做主从复制,自动备份数据。

以上过程很容易配置错误,可以使用redis提供的哨兵机制来简化上面的操作。简单的方法:redis的哨兵(sentinel)的功能

redis和mecached的区别,以及使用场景

区别

  1. redis和Memcache都是将数据存放在内存中,都是内存数据库。不过memcache还可以用于缓存其他东西,例如图片,视频等等
  2. Redis不仅仅支持简单的k/v类型的数据,同时还提供list,set,hash等数据结构的存储
  3. 虚拟内存-redis当物理内存用完时,可以将一些很久没用的value交换到磁盘
  4. 过期策略-memcache在set时就指定,例如set key1 0 0 8,即永不过期。Redis可以通过例如expire设定,例如expire name 10
  5. 分布式-设定memcache集群,利用magent做一主多从,redis可以做一主多从。都可以一主一丛
  6. 存储数据安全-memcache挂掉后,数据没了,redis可以定期保存到磁盘(持久化)
  7. 灾难恢复-memcache挂掉后,数据不可恢复,redis数据丢失后可以通过aof恢复
  8. Redis支持数据的备份,即master-slave模式的数据备份
  9. 应用场景不一样,redis除了作为NoSQL数据库使用外,还能用做消息队列,数据堆栈和数据缓存等;Memcache适合于缓存SQL语句,数据集,用户临时性数据,延迟查询数据和session等

使用场景

  1. 如果有持久方面的需求或对数据类型和处理有要求的应该选择redis
  2. 如果简单的key/value存储应该选择memcached.

Redis集群方案该怎么做?都有哪些方案?

  1. codis
    目前用的最多的集群方案,基本和twemproxy一致的效果,但它支持在节点数量改变情况下,旧节点数据可恢复到新hash节点
  2. redis cluster3.0自带的集群,特点在于他的分布式算法不是一致性hash,而是hash槽的概念,以及自身支持节点设置从节点。具体看官方介绍
  3. 在业务代码层实现,起几个毫无关联的redis实例,在代码层,对key进行hash计算,然后去对应的redis实例操作数据。这种方式对hash层代码要求比较高,考虑部分包括,节点失效后的替代算法方案,数据震荡后的字典脚本恢复,实例的监控,等等

Redis回收进程是如何工作的

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

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

一个新的命令被执行等等,所以我们不断地穿越内存限制的边界,通过不断达到边界然后不断回收回到边界以下。

如果一个命令的结果导致大量内存被使用(例如很大的集合的交集保存到一个新的键),不用多久内存限制就会被这个内存使用量超越。

更多Redis相关面试题

python最新面试宝典系列文章

  • 01.python面试之基础
  • 02.python面试之文件操作
  • 03.python面试之模块与包
  • 04.python面试之数据类型
  • 05.python面试之元类
  • 06.python面试之内存管理与垃圾回收机制
  • 07.python面试之函数
  • 08.python面试之设计模式
  • 09.python面试之面向对象
  • 10.python面试之正则表达式
  • 11.python面试之系统编程
  • 12.python面试之网络编程
  • 13.python面试之Flask
  • 14.python面试之Django
  • 15.python面试之爬虫
  • 16.python面试之MySQL
  • 17.python面试之Redis
  • 18.python面试之数据结构
  • 99.python面试之常规题
  • 100.python面试之常见题