前言
头一次用这种标题哈哈哈感觉有点。。反正这是一篇关于Redis相关知识点的Blog,面试中会问到的(比重会比较大哈),持续收集更新中
什么是Redis?
一般很少会问这个啦,一般都是问你在真实开发中,在哪儿用到了Redis,不过还是该知道的;
Redis是主流的键值对存储数据库(NoSQL),通常全部数据都存在内存中(为什么这么快的主要原因之一!),但也支持持久化策略,支持事务(资源允许的话,可以当作DB了),并且Redis支持丰富的数据类型(能够应对大部分场景),Redis是单线程的(没有线程安全问题,没有锁的烦恼)
Redis支持的数据类型
在了解Redis能做什么之前,我们先了解下Redis支持的数据类型
常用
- Redis Key
二进制安全的 Key
任何二进制序列都可以作为Key,从字符到JPEG文件的内容,可以存空字符
允许的最大值为 512 M - String 字符串
- List 列表
- Zest / Sorted Sets 有序集合
- Set 集合
- Hash 字典
进阶
- Bitmap / 位图
- HyperLogLogs / 计算唯一事物的概率数据结构
Redis 能做什么?
这是最实际的问题,也是面试中Redis的高频问题
-
缓存 / cache :
加快查询速度,存储热点数据
会话缓存,用户是否在线,通过时效性
记录在线人数,通过incr -
数据库存储 / Database
没有像 MySQL 等的I/O操作限制,支持事务,支持丰富的数据结构,不做DB存储就太可惜了吧
火热排行榜: Zset
社交列表: Set
全局唯一ID / 计数器(每个IP请求限制等等): String 的 incr -
信息队列 / message broker
Redis也是 Pub - Sub 服务器(小声bb,一般不会用到,有用到的,请用力喷我,让我清醒)
通过三个命令 SUBSCRIBE(订阅),UNSUBSCRIBE(取消订阅) 和 PUBLISH(发布信息) 实现了信息订阅发布服务
官方有个实践案例多用户高性能的Web聊天,使用EventMachine和Redis:链接
相比 memcached 有哪些优势?
面试中总会问同类型技术的比较,Spring和Spring Boot 的区别,MyBatis 和 Hibernate 的区别啦,Redis 一般都是和 NoSQL 比较
- memcached只支持字符,Redis 支持丰富的数据类型
- Redis 支持持久化数据,而memcached没有,只能存在内存中
- memcached能缓存的内容没有 Redis 那么灵活
默认 Key 最大是250字节,Value 是1MB,不过官方有说明 memcached 本身就是用来存储小块的任意数据(字符串、对象)。这些数据可以是数据库调用、API调用或者是页面渲染的结果。
Redis 持久化策略
Redis 的持久化策略是面试中比较高频的问题,Redis 中提供了两种持久化策略,可以根据业务需求选择其中一种,也支持两个策略都开,当然也可以都禁用
- RDB持久化( Reids 在内存中的数据库记录定时 dump 到磁盘上的 RDB 持久化)
- AOF 持久化( Reids 的操作日志以追加的方式写入文件)
AOF
AOF 持久化以日志的形式记录 Redis 服务所处理的每一个写,删操作,以文本方式保存;Redis重启时,会优先选择 AOF 文件恢复数据,在服务器启动时逐条执行 AOF 日志里的命令
RDB
以指定的时间间隔执行数据集的时间点快照。
Redis将数据集的快照保存在磁盘上,名为dump.rdb的文件。如果数据集中至少有M个更改,则可以将Redis配置为生成一次快照,或者可以手动调用 SAVE 或 BGSAVE 命令。
下面是RDB持久化配置例子:
# 在redis配置文件中配置下面两行,满足其中一项就生成快照
save 60 1000 # 每分钟,如果有1000条写入命令,就生成快照
save 3600 10000 # 每小时,有1w条写入命令,就生成快照
复制代码
-
SAVE 和 BGSAVE 两个备份(持久化)命令
备份 redis 可以手动使用 SAVE 命令,执行 SAVE 命令会使用主进程执行快照操作,这意味着在 SAVE 的过程中,会阻塞主进程。
使用 BGSAVE 的话,redis 会 fork 出一个子进程来执行快照操作,而不影响主进程。 -
为什么用 RDB 持久化策略
RDB 是 Redis 数据的一个非常紧凑的单文件时间点表示。RDB 文件非常适合备份。例如,您可能希望在最近24小时内每小时归档您的RDB文件。可以在发生灾难时轻松恢复数据集的不同时间段的数据
RDB非常适合灾难恢复,可以将单个压缩文件传输到远端数据中心
与AOF相比,RDB更适合 Redis 数据量大时,更快地重启 Redis(AOF 一条条写命令重新执行,数据量一大,能不慢吗)