主要数据类型
- String 数字、字符串等
- Hash 类似于字典
- List 根据索引访问
- Set 集合,不重复
- Sorted Set 有序集合
主要工作模式
- 单节点实例,单一服务主机独立运行
- 主从模式,有主服务节点和从服务节点。主节点崩溃,对整个系统会产品致命大家。从节点只可读,主可读可写(没记错的话)。
- sentinel模式,哨兵服务模式,当主节点崩溃时,可选举产生新的主节点。数据量较小(一台服务器)时使用
- cluster模式,服务于大数据量的情况。
过期策略和内存淘汰机制
- 定期删除
- 懒惰删除
- 各种淘汰机制,类似于操作系统学习时讲的内存操作
单线程的Redis为什么会快
- 纯内存操作
- 避免频繁的上下文切换
- 采用非阻塞的I/o多路复用机制
优劣势
优势:
- 性能好。主要应用于有些特别费时的查询,而且其查询结果长时间不变。
- 并发高。大并发情况下,多个请求同时访问数据库,可以使用缓存来改善这个问题。
劣势:
或者说是可能存在的问题
- 缓存和数据库一致性的问题。有两种一致性,最终结果一致性和强一致性。要求最终结果一致性的问题,需要针对具体问题制定正确的更新策略,并采用合适的补偿措施。而有强一致性需求的数据,不能放缓存。
- 缓存雪崩问题。缓存雪崩主要指,同一时间,缓存大面积失效,然后此时来了一大波请求,请求都直接访问数据库了。解决缓存雪崩问题,可采用 随机缓存失效策略,来避免缓存集体失效;使用互斥锁;双缓存机制。
- 缓存击穿问题。黑客故意访问缓存中不存在的数据,导致所有的请求都访问数据库,进而导致数据库连接异常。可使用互斥锁、异步更新策略、判断请求是否有效的拦截机制。
- 缓存的并发竞争问题。有多个子系统同时去设置一个key。可以使用事务机制来解决,但是有点鸡肋,事务机制仅适用于一个数据服务器上面来使用该方法,在生成场景下,数据多是做分片存储的。如果是不要求数据是有顺序的话,可以加上时间戳等,或者利用队列操作来避免多个子系统的竞争。