1. Redis的使用场景有哪些?
- 热点数据的缓存
- 限时业务的运用
- 计数器相关问题
- 分布式锁
- 排行榜相关问题
- 点赞、好友等相互关系的存储
- 简单队列
2. Redis数据类型
5种基础数据类型
- String字符串
- List列表
- Set集合
- Hash散列
- Zset有序集合
3种特殊类型
- HyperLogLogs(基数统计)
- Bitmaps (位图)
- geospatial (地理位置)
3. 底层数据结构
SDS 简单动态字符串
保存了长度
预分配内存ZipList
节省空间:根据实际长度来存取
修改需要重新分配内存QuickList(linkedlist)
HashTable
拉链法解决hash冲突
渐进式 rehash 扩容IntSet
字节数组
集合只包含整数值元素,并且元素数量不多时,会使用ZSkipList
https://www.jianshu.com/p/9d8296562806
作为有序列表 (Zset) 的使用
跳跃表的缺点就是需要的存储空间比较大,属于利用空间来换取时间的数据结构
4. Redis持久化
RDB
AOF
混合模式(4.0)
5. 缓存问题
- 缓存穿透:是指缓存和数据库中都没有的数据
解决方案:缓存空值、用户鉴权校验、布隆过滤器 - 缓存击穿:是指缓存中没有但数据库中有的数据(一般是缓存时间到期)
解决方案:设置热点数据永远不过期、接口限流与熔断,降级 - 缓存雪崩:指缓存中数据大批量到过期时间,而查询数据量巨大,引起数据库压力过大甚至down机
解决方案:缓存数据的过期时间设置随机
6. 数据库和缓存一致性
不管是先写MySQL数据库,再删除Redis缓存;还是先删除缓存,再写库,都有可能出现数据不一致的情况
解决方案:
1)延时双删策略
- 先删除缓存
- 再写数据库
- 休眠500毫秒(根据具体的业务时间来定)
- 再次删除缓存。
2)异步更新缓存(基于订阅binlog的同步机制)
7. Redis 单线程模型
Redis使用单线程模型,这意味着它只使用一个CPU来处理所有请求。因此,Redis不需要考虑多线程之间的同步、锁、竞争等问题,也不需要花费时间和资源在多线程之间的上下文切换上。这使得Redis的设计和实现更简单,性能和效率更高。
那么,Redis为什么选择单线程模型呢?主要有以下几个原因:
- Redis性能瓶颈不在于CPU,而在于内存和网络。因为Redis使用内存存储数据,所以数据访问非常迅速,不会成为性能瓶颈。此外,Redis的数据操作大多数都是简单的键值对操作,不包含复杂计算和逻辑,因而CPU开销很小。相反,Redis的瓶颈在于内存的容量和网络的带宽,这些问题无法通过增加CPU核心来解决。
- Redis的单线程模型可以保证数据的一致性和原子性。由于Redis只有一个线程来处理所有的请求,所以不会出现多个线程同时修改同一个数据的情况,也不需要使用锁或事务来保证数据的一致性和原子性。
- Redis的单线程模型可以避免多线程编程的复杂性和难度。例如线程安全、死锁、内存泄漏、竞态条件等,降低了开发和维护的成本和风险。