一、 Docker 安装 Redis
sudo docker run -p 6379:6379 --name redis
-v /home/appuser/redis/data:/data \
-v /home/appuser/redis/conf/redis.conf:/etc/redis/redis.conf \
-d redis redis-server /etc/redis/redis.conf
进入 docker 的 redis 容器进行操作
sudo docker exec -it redis redis-cli
也可以在下面的 github 上下载 redis 的可视化管理工具进行操作
https://github.com/uglide/RedisDesktopManager/releases/tag/0.9.3
二、 redis 的五大数据类型
String : 相当于 Java 的 HashMap< String , String >
Hash : 相当于 Java 的 HashMap< String , HashMap< String , String > >
List : 相当于 Java 的 HashMap< String , LinkedList< String > >
Set : 相当于 Java 的 HashMap< String , HashSet< String > >
Zset : 与 Set 类似,后面的 HashSet< String > 中的每个元素都有一个 Score 评分
三、 redis 持久化
redis 有两种持久化方式 RDB 和 AOF
3.1 RDB
RDB 指在一定的时间间隔下将内存上的 redis 数据快照(Snapshot)写到磁盘上
redis 会 Fork 一个子进程,将内存上的 redis 数据先写入一个临时文件,再将这个文件替换掉上次持久化好的文件。
优点: 适合大规模的数据恢复,且恢复速度快
对数据完整性和一致性要求不高的适用
缺点: 在 Fork 进行 RDB 持久化时,数据会被克隆一份,因此需要2倍的空间
在备份时,可能因 Redis 意外 down 掉,会导致近期的操作修改数据丢失
3.2 AOF
AOF 指以日志的形式记录 redis 的每个修改或增写操作,
redis 在恢复启动的时候,会读取该日志文件重新构建恢复之前的数据。
客户端的请求写命令会 append 到 AOF 缓冲区 -> AOF 缓冲区根据策略同步到磁盘上的 AOF 文件中 -> AOF过大时会进行重写 -> redis 重启恢复时将读取该文件恢复数据
优点:数据恢复有较高的一致性
缺点:比 RDB 更占用磁盘空间
恢复速度慢
四、 Redis 应用问题
4.1 缓存穿透
问题描述:
key 对应的数据在 redis 上不存在,服务端会到数据库上去查找该数据,而数据库中对应的数据也不存在
则会被利用漏洞,发送对该 key 的大量请求,绕过 redis 压垮数据库
解决方案 :
对空值进行缓存
4.2 缓存击穿
问题描述:
一个设置有过期时间的热点 key ,即该 key 的请求和访问量大。在该 key 过期后,其大量的请求和访问会瞬间打到数据库上
解决方案: 预先设置热门数据
实时调整 key 的过期时间
使用锁,在 key 过期后,加锁只允许少量的请求去访问数据库
4.3 缓存雪崩
问题描述:
有多个热点数据 key 在短时间内都过期或失效,导致大量的请求压到数据库上
跟缓存击穿的区别是:雪崩是有多个 key ,而击穿是一个 key
解决方案:
构建多级缓存架构
使用锁或队列
将缓存失效时间分散开
设置过期标志更新缓存