文章目录
- 参考
- 为什么使用Redis?
- Redis与Memcached的区别,为什么选择Redis?
- Redis为什么快?
- 什么是上下文切换
- Redis的线程模型是什么?
- 单线程的Redis是否浪费了多核服务器的性能?
- Redis有哪些数据结构和应用场景
- 如果有大量的key在同一时间过期,需要注意什么?
- 缓存穿透和击穿分别是什么,和缓存雪崩有什么区别,又该如何解决
- 布隆过滤器原理是什么?
- Redis分布式锁是怎么回事?
- 如何将存在固定前缀的key找出来?
- 如果Redis正在线上提供服务,此时使用keys命令会有什么问题
- 如何用Redis做异步队列?
- Redis如何实现延时队列
- Redis如何持久化
- Redis同步机制/主从复制如何进行的
- 如果Redis服务突然断电怎么办?
- RDB的原理是什么?
- 如果Redis遇到瓶颈,该如何解决?
- Redis集群的原理是什么,如何保证高可用?
- Redis内存删除策略和逐出算法?
- 手写LRU算法
- 如何保证双写一致性? KV、DB读写模式?
参考
https://github.com/AobingJava/JavaFamily
为什么使用Redis?
传统的关系型数据库已经不适用所有场景了,例如频繁变化和操作的短时热点数据,如果直接访问MySQL这类的关系型数据库,会极大地增添数据库负担,严重时可能引起系统崩溃,所以考虑引入缓存中间件Redis。
Redis与Memcached的区别,为什么选择Redis?
-
Redis支持的数据结构更丰富
-
Redis支持原生集群
-
Redis单核,MemCached多核,在存储小数据上Redis性能更高,大数据上略逊于MemCached
-
MemCached key 不能超过 250 个字节;
-
MemCached value 不能超过 1M 字节;
-
MemCached key 的最大失效时间是 30 天;
-
MemCached 只支持 K-V 结构,不提供持久化和主从同步功能。
Redis为什么快?
- 完全基于内存,类似HashMap
- 单线程,避免不必要的上下文切换和竞争条件
- 多路IO复用模型,非阻塞IO
- 数据结构简单
- 构建了VM机制
什么是上下文切换
比如你看书的时候,突然有朋友说接他看一下,然后你借给他,等他还给你,你要再翻到你之前看到的页码,这就是一个切换过程。
Redis的线程模型是什么?
https://doocs.github.io/advanced-java/#/./docs/high-concurrency/redis-single-thread-model
Redis内部使用文件事件处理器File Event Handler,其包含四个部分:
- 多个socket
- IO多路复用程序
- 文件事件分派器
- 事件处理器
- 连接应答处理器
- 命令请求处理器
- 命令回复处理器
文件事件处理器是单线程的,所以Redis是单线程模型,采用IO多路复用机制通知监控多个socket,多个socket可能会并发产生不同操作,每个操作对应不同的文件事件,IO多路复用程序会将事件放入队列,事件分派器依次从队列中取事件,交给对应的事件处理器处理。
单线程的Redis是否浪费了多核服务器的性能?
并不会。可以在一台服务器部署多个Redis实例。
Redis有哪些数据结构和应用场景
https://blog.csdn.net/Chill_Lyn/article/details/104430104
https://blog.csdn.net/Chill_Lyn/article/details/104484301
- 基本数据结构
- String
- 缓存
setex key seconds value
- 计数器
incr key
incrby key increment
- 共享用户session
- 缓存
- Hash
- 对象有很多属性
hset key field value
- 对象有很多属性
- List
- 消息队列
lpush key value1
rpop key
- 分页展示
lrange key start stop
- 消息队列
- Set
- 获取随机数据
srandmember key [count]
spop key [count]
- 交集、并集、差集 `sinter key1 [ke
- 获取随机数据
- String