缓存
- Memcached
- redis
- Redis常见数据类型
- Redis常见场景
- Redis缓存持久化
- RDB-快照
- AOF-追加文件
- Redis数据过期机制
- 惰性删除
- 定期删除
- Redis缓存淘汰策略(8种)
- 淘汰策略的算法
- LRU (Least Recently Used):最近最少使用
- LFU(Least Frequently Used):最近最少频率使用
- 常见面试问题
- Redis事务
- Redis为什么要用分布式缓存
- Redis集群
- 主从模式 - 最简单的
- 哨兵模式
- Redis Cluster
- Redis常见问题及解决方案
- 缓存击穿
- 缓存穿透
- 缓存雪崩
- bigKey
- 热Key
- ==慢查询命令==
- 如何保障数据库和缓存数据的一致性
- 延时双删
- 异步更新缓存
- 假如 Redis 里面有 1 亿个 key,其中有 10w 个 key 是以某个固定的已知的前缀开头的,如果将它们全部找出来?
- 什么情况下可能会导致 Redis 阻塞
- 怎么提高缓存命中率
- 怎么实现分布式锁
- 基于redis命令
- 基于redis Lua脚本
- Redisson分布式锁
- MongDB
- 数据库点这里
- 分布式点这里
- 消息队列
- Spring、SpringBoot、SpringCloud点这里
Memcached
简洁的key-value存储系统,其实是内存中维护一张巨大的Hash表。不支持集群,Memcached彼此之间不进行通信,所以,可能会造成数据丢失。
和redis对比
| Memcached | Redis | |
|---|---|---|
| 数据类型 | 只支持key-value | |
| 数据持久化 | Memcached 把数据全部存在内存之中 | Redis 支持数据的持久化,可以将内存中的数据保持在磁盘中,重启的时候可以再次加载进行使用 |
| 集群模式支持 | 没有原生的集群模式 | 3.0 版本起是原生支持集群模式的 |
| 线程模型 | 多线程,非阻塞 IO 复用的网络模型 | 单线程的多路 IO 复用模型 |
| 特性支持 | Redis 支持发布订阅模型、Lua 脚本、事务等功能 | |
| 过期数据删除 | 只用了惰性删除策略 | 惰性删除策略、定期删除策略 |
redis
redis是一个缓存中间件。
数据基于内存,内存的访问速度比磁盘快很多
单线程,基于I/O多路复用
- 6.0后支持多线程,但是命令执行还是单线程
Redis 除了可以用作缓存之外,还可以用于分布式锁、限流、消息队列、延时队列等>场景
- 延时队列:Redisson 内置了延时队列(基于 Sorted Set 实现的)
- 消息队列:Redis 自带的 List 数据结构可以作为一个简单的队列使用。(Rpush +Lpop)
Redis 5.0 中增加的 Stream 类型的数据结构更加适合用来做消息队列。- 限流: 通过 Redis + Lua 脚本的方式来实现限流。key是ip,value是访问次数
- redis搜索引擎:借助 RediSearch
- redis延时任务
Redis常见数据类型
5 种基础数据类型
String(字符串)、List(列表)、Set(集合)、Hash(散列)、Zset(有序集合)。
- String,二进制安全的,可以存储图片或者序列化的对象,值最大存储为512M
set key valueget key- Hash
hset key field valuehget key field- List
lpush key value [value ...]lrange key start end- Set(集合)
sadd key element [element ...]smembers key- ZSet(有序集合)
zadd key score member [score member ...]zrank key member
3 种特殊数据类型
HyperLogLog(基数统计)、Bitmap (位图)、Geospatial
(地理位置)。除了上面提到的之外,还有一些其他的比如 Bloom filter(布隆过滤器)open in new
window、Bitfield(位域)。
Redis常见场景
应用:排行耪
选用ZSet,这是一个有序集合。根据score来排序
Zrange (从小到大排序)、 ZrevRange (从大到小排序)、ZrevRank (指定元素排名)。
Redis缓存持久化
注:Redis4.0版本之后,RDB 和 AOF 混合使用实现持久化
RDB-快照
定时将redis中的所有键值对数据保存到到一个临时文件中,这个文件就是dump.rdb文件。恢复时候将这个临时文件替换上次持久化的文件即可。
AOF-追加文件
每次操作命令时候,将这次的操作通过Write函数追加到文件中。恢复时候,会自动执行备份文件中的所有命令,达到恢复上次数据的效果。
总结:
- RDB是默认持久化方式,当两种方式同时开启时,数据恢复Redis会优先选择AOF恢复。
- 持久化机制: 当Redis重启后通过把硬盘文件重新加载到内存
- 实现:单独创建fork()一个子进程,将当前父进程的数据库数据复制到子进程的内存中,然后由子进程写入到临时文件中,持久化的过程结束了,再用这个临时文件替换上次的快照文件,然后子进程退出,内存释放。
Redis数据过期机制
设置expire(过期时间)后才会触发。
Redis 采用的是 定期删除+惰性/懒汉式删除 结合的策略
惰性删除
当查询key时候,先看该key是否过期,没有过期就返回数据;负责,删除该key,且不返回数据
定期删除
在一定时间,随机抽取设置过期时间的key,若这些含的key大部分过期,就删除这些过期key
Redis 的定期删除过程是随机的(周期性地随机从设置了过期时间的 key 中抽查一批),所以并不保证所有过期键都会被立即删除。这也就解释了为什么有的 key 过期了,并没有被删除。
并且,执行时间已经超过了阈值,那么就中断这一次定期删除循环,以避免使用过多的 CPU 时间
可在配置文件中设置频率
由 hz 参数控制的。hz 默认为 10,代表每秒执行 10 次
Redis缓存淘汰策略(8种)
当redis内存不够用的时候,当一个新key需要存放时候就会按某种规则将内存中的数据删掉,这个删除规则就是淘汰策略。
- noeviction:默认策略。不删除任何key,新增的key也