「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 的区别
Redis | Memcache |
---|---|
支持 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」,所有内容第一时间更新于公众号。
所有内容均为本人一点一点敲出来的,难免会有错字、语句不通顺的地方,欢迎大家指正。
因本人水平有限,文章内容难免会有出错、遗漏,欢迎大家评论指出,一起进步。