一、缓存简介
二、缓存分类
三、常见缓存
四、Redis使用
Redis 有 5 ⼤基础数据类型:
- String——字符串类型
- Hash——字典类型
- List——列表类型
- Set——集合类型
- ZSet——有序集合类型
其中最常⽤的是字符串和字典类型。
1.字符串类型
字符串类型(
Simple Dynamic Strings
简称 SDS),译为:简单动态字符串,它是以键值key-value
的形式进⾏存储的,根据key
来存储和获取value
值,它的使⽤相对来说⽐较简单,但在实际项⽬中应⽤⾮常⼴泛。
127.0.0.1:6379> set k1 v1 # 添加数据
OK
127.0.0.1:6379> get k1 # 查询数据
"v1"
127.0.0.1:6379> strlen k1 # 查询字符串的⻓度
(integer) 2
我们也可以使⽤ ex(expires)
参数来设置字符串的过期时间,如下代码所示:
127.0.0.1:6379> set k1 v1 ex 1000 # 设置 k1 1000s 后过期(删除)
OK
2.字典类型
127.0.0.1:6379> hset myhash key1 value1 # 添加数据
(integer) 1
127.0.0.1:6379> hget myhash key1 # 查询数据
"value1"
3.列表类型
127.0.0.1:6379> lpush list 1 2 3 # 添加数据
(integer) 3
127.0.0.1:6379> lpop list # 获取并删除列表的第⼀个元素
3
4.集合类型
127.0.0.1:6379> sadd myset v1 v2 v3 # 添加数据
(integer) 3
127.0.0.1:6379> smembers myset # 查询集合中的所有数据
1) "v3"
2) "v1"
3) "v2"
5.有序集合类型
127.0.0.1:6379> zadd zset1 3 golang 4 sql 1 redis # 添加数据
(integer) 3
127.0.0.1:6379> zrange zset1 0 -1 # 查询所有数据
1) "redis"
2) "golang"
3) "sql"
五、持久化
Redis 持久化的⽅式有以下 3 种:
- 快照⽅式(
RDB, Redis DataBase
)将某⼀个时刻的内存数据,以⼆进制的⽅式写⼊磁盘; - ⽂件追加⽅式(
AOF, Append Only File
),记录所有的操作命令,并以⽂本的形式追加到⽂件
中; - 混合持久化⽅式,
Redis 4.0
之后新增的⽅式,混合持久化
是结合了 RDB 和 AOF 的优点,在写⼊的时候,先把当前的数据以 RDB 的形式写⼊⽂件的开头,再将后续的操作命令以 AOF 的格式存⼊⽂件,这样既能保证 Redis 重启时的速度,⼜能减低数据丢失的⻛险。
RDB 优点
- RDB 的内容为⼆进制的数据,占⽤内存更⼩,更紧凑,更适合做为备份⽂件;
- RDB 对灾难恢复⾮常有⽤,它是⼀个紧凑的⽂件,可以更快的传输到远程服务器进⾏ Redis 服务
恢复; - RDB 可以更⼤程度的提⾼ Redis 的运⾏速度,因为每次持久化时 Redis 主进程都会 fork() ⼀个⼦进程,进⾏数据持久化到磁盘,Redis 主进程并不会执⾏磁盘 I/O 等操作;
- 与 AOF 格式的⽂件相⽐,RDB ⽂件可以更快的重启。
RDB 缺点
- 因为 RDB 只能保存某个时间间隔的数据,如果中途 Redis 服务被意外终⽌了,则会丢失⼀段时间内的 Redis 数据;
- RDB 需要经常 fork() 才能使⽤⼦进程将其持久化在磁盘上。如果数据集很⼤,fork() 可能很耗时,并且如果数据集很⼤且 CPU 性能不佳,则可能导致 Redis 停⽌为客户端服务⼏毫秒甚⾄⼀秒钟。
AOF 优点
- AOF 持久化保存的数据更加完整,AOF 提供了三种保存策略:每次操作保存、每秒钟保存⼀次、
跟随系统的持久化策略保存,其中每秒保存⼀次,从数据的安全性和性能两⽅⾯考虑是⼀个不错的选择,也是 AOF 默认的策略,即使发⽣了意外情况,最多只会丢失 1s 钟的数据; - AOF 采⽤的是命令追加的写⼊⽅式,所以不会出现⽂件损坏的问题,即使由于某些意外原因,导致
了最后操作的持久化数据写⼊了⼀半,也可以通过 redis-check-aof ⼯具轻松的修复; - AOF 持久化⽂件,⾮常容易理解和解析,它是把所有 Redis 键值操作命令,以⽂件的⽅式存⼊了
磁盘。即使不⼩⼼使⽤ flushall 命令删除了所有键值信息,只要使⽤ AOF ⽂件,删除最后的 flushall 命令,重启 Redis 即可恢复之前误删的数据。
AOF 缺点
- 对于相同的数据集来说,AOF ⽂件要⼤于 RDB ⽂件;
- 在 Redis 负载⽐较⾼的情况下,RDB ⽐ AOF 性能更好;
- RDB 使⽤快照的形式来持久化整个 Redis 数据,⽽ AOF 只是将每次执⾏的命令追加到 AOF ⽂件中,因此从理论上说,RDB ⽐ AOF 更健壮。
混合持久化优点
- 混合持久化结合了 RDB 和 AOF 持久化的优点,开头为 RDB 的格式,使得 Redis 可以更快的启
动,同时结合 AOF 的优点,有减低了⼤量数据丢失的⻛险。
混合持久化缺点
- AOF ⽂件中添加了 RDB 格式的内容,使得 AOF ⽂件的可读性变得很差;
- 兼容性差,如果开启混合持久化,那么此混合持久化 AOF ⽂件,就不能⽤在 Redis 4.0 之前版本
了。
六、拓展
缓存雪崩
加锁排队
随机化过期时间
设置二级缓存
缓存穿透
缓存空结果
缓存击穿
加锁排队
设置永不过期