「Python 面试」第六次更新

1.说一说 Redis 是什么

Redis 是一种「Key-Value」的内存型、非关系型数据库,属于 NoSQL 的一种。

Redis 的读写速度特别快,特别适合读写频繁的场景。

Redis 支持主从复制,支持数据持久化。

2.知道 Redis 有哪些常用数据类型吗

  • String
  • List
  • Hash
  • Set
  • Zset

3.说一下 Redis 用来做什么

  • 利用 String,可以很容易实现「计数器」功能。
  • 利用 List ,可以实现「粉丝列表」功能。
  • 利用 Hash,可以实现「浏览记录」功能。
  • 利用 Set 的并集、合集特性,可以实现「共同好友」功能。
  • 利用 Zset 的排序特性,可以实现「排行榜」功能。
  • 由于 Redis 的高速读写特性,可以充当「缓存」。
  • 充当「消息队列」,如 Celery 中就是用 Redis 充当中间人,生产者和消费者都是向 Redis 中发布任务和接受任务。

4.说一下 Redis 是怎样将数据持久化的

  • RDB

    为某一时刻下的 Redis 数据库里的内容拍一张照片(快照),并将该照片写进磁盘中,实现数据持久化。

    当数据库崩溃时,会丢失最后一次快照的内容。

    如果数据库内容过大,那么生成快照时间会很长。

  • AOF

    通过写命令,将数据追加到(Append Only File)文件末尾,实现数据持久化。

    但是使用 AOF,需要解决同步问题。

    因为文件的写入不会立马执行,而是先将写入的内容放置「缓存区」,等待操作系统决定何时将缓存区的内容写入磁盘。

    Redis 拥有三种同步策略:Always、Everysec、No。

    绝大多数情况下都是使用第二种策略,每隔一秒钟同步一次,这样就算数据库崩溃也只会损失一秒钟的数据。

    而其他两种策略,要么对数据库的压力过大,过多降低数据库的性能,要么具有丢失数据量过大的风险。

5.了解 Redis 主从复制吗

使用slaveof host port设置主从服务器。

Redis 的主从服务器有点像树结构,从服务器只能有一个主服务器。

Redis 不支持「主-主复制」。

Redis 主从复制通过利用 RDB 快照持久化的特性,将某一时刻下主服务器的内容生成快照,然后发送给从服务器,并利用缓存区保存在这期间里进行的「写命令」,等待快照发送完毕之后,再将写命令发送给从服务器。

从服务器在接收到快照之后,会将自身的数据全部丢弃,载入快照里的数据,载入完毕之后,再执行主服务器的写命令。

6. 说一下 Redis 和 Memcache 的区别

RedisMemcache
支持 String、List、Hash、Set、Zset只支持 String
支持数据持久化不支持
支持事务不支持
支持主从复制不支持
支持分布式不支持
支持将数据交换到磁盘中不支持
单进程、单线程 IO 多路复用多线程、非阻塞 IO

总结为一点,只用得到 Redis 里的 String 类型存储数据时,使用 Memcache。

除此之外,使用 Redis。

7. 了解 Redis 是怎样保证热数据的吗

Redis 是内存型的数据库,可以设置最大内存,当内存不够时,会使用「数据淘汰策略」,删除部分数据。

但是并不是针对 Redis 里所有的数据,而是抽样选取小部分「数据集」。

策略描述
Volatile-LRU从设置了过期时间的「数据集」中,删除最近、最少使用的数据集
Volatile-TTL从设置了过期时间的「数据集」中,删除即将要过期的数据。
Volatile-Random从设置了过期时间的「数据集」中,随机删除数据。
Always-LRU从「数据集」中删除最近、最少使用的数据。
AllKeys-Random从「数据集」中随机删除数据。
Noeviction禁止删除数据。

当 Redis 作为缓存使用时,为了保证缓存数据都是「热数据」,可以将 Redis 的最大内存设置为缓存的大小,并使用 Always-LRU 策略。将最近最少使用的数据舍弃,保证缓存里热数据的「高命中率」。


至此,有关「数据库」知识点的面试题就已告一段落,下次更新「网络通信方面」面试题。

所有内容均已上传至「GitHub」仓库,欢迎大家点击原文查阅。

欢迎大家关注个人微信公众号「PythonDeveloper」,所有内容第一时间更新于公众号

所有内容均为本人一点一点敲出来的,难免会有错字、语句不通顺的地方,欢迎大家指正。

因本人水平有限,文章内容难免会有出错、遗漏,欢迎大家评论指出,一起进步。

相关推荐