Redis
586字约2分钟
2024-09-25
提问
- Redis有哪些常见的类型?
- Redis对于已过期的数据如何淘汰?
- 如何保证与MySQL之间的一致性?
- 为什么先操作数据库?
- 应该更新缓存还是删除缓存?
常见的数据类型
- String
- Set: 集合
- Zset: 有序集合
- List
- Hash: dict
Set和Zset之间的区别:
Zset是有序的, 额外提供了一个double类型的评分进行排序. 评分可以重复, 但是元素不能重复.
Zset和List之间的区别:
List的元素可以重复, 实现上使用的是双向链表.
Zset保证元素之间的唯一性, 实现上使用的是哈希表.
淘汰机制
详情见Redis详解
缓存一致性
我们先来看为什么会导致缓存与数据库的不一致. 这种不一致通常是由于多线程并发读写引起的.
延迟双删
读操作
缓存命中, 直接返回;缓存没有命中则查询数据库, 写入缓存, 设定超时时间
写操作
先删除缓存
再更新数据库
休眠一会(比如1秒), 再次删除缓存
为什么先操作数据库?
必须先更新数据库
我们来看如果先操作缓存会发生什么.
线程A发起一个写操作,第一步del cache
此时线程B发起一个读操作,cache miss
线程B继续读DB,读出来一个老数据
然后线程B把老数据设置入cache
线程A写入最新的数据到DB
此时数据库是新数据, redis是老数据, 不一致了.
到底是删除缓存呢,还是更新缓存?
应当 删除缓存.
我们看如果不删除缓存而是更新缓存会怎么样:
线程A先发起一个写操作,第一步先更新数据库
线程B再发起一个写操作,第二步更新了数据库
由于网络等原因,线程B先更新了缓存
线程A更新缓存
此时数据库里面是B的数据, 而缓存里面是A的数据.