目录
一、Redis概念
1.1 Redis定义
1.2 Redis的特点
1.3 Redis的用途
1.4 Redis与其他数据库的对比
二、Redis数据库
三、Redis五个基本类型
3.1 字符串
3.2 列表(list) ——可以有相同的值
3.3 集合(set) ——值不能重复
3.4 哈希(hash) ——类似于Map集合
3.5 有序集合(zset) ——不能重复
四、事务
4.1 事务定义
4.2 与mysql的事务的区别
4.3 代码解释
五、乐观锁和悲观锁
5.1 乐观锁
5.2 悲观锁
5.3 乐观锁与悲观锁的区别和适用场景
六、Redis持久化
6.1 定义
6.2 两种方式
(1)RDB
(2)AOF
七、主从复制
7.1 概念
7.2 模式
(1)一个主机有两个从机
(2)链路模式
八、哨兵模式
8.1 概念
8.2 优缺点
九、缓存穿透、击穿和雪崩
1.缓存穿透——查不到
2.缓存击穿——量太大,缓存过期
3.缓存雪崩
一、Redis概念
1.1 Redis定义
Redis(Remote Dictionary Server)是一个开源的、基于内存的数据结构存储系统,通常用作数据库、缓存或消息代理。它支持多种数据结构,如字符串(strings)、哈希(hashes)、列表(lists)、集合(sets)、有序集合(sorted sets)等,并提供丰富的操作命令。
1.2 Redis的特点
- 高性能:数据存储在内存中,读写速度极快,适合高并发场景。
- 持久化:支持RDB(快照)和AOF(日志)两种持久化机制,确保数据安全。
- 数据结构丰富:支持多种数据结构,满足不同业务需求。
- 原子操作:所有操作是原子性的,适合分布式锁等场景。
- 扩展性:支持主从复制、分片(集群)等功能。
1.3 Redis的用途
- 缓存:加速数据访问,减轻后端数据库压力。
- 会话存储:存储用户会话信息,支持分布式系统。
- 消息队列:利用列表或发布/订阅模式实现消息传递。
- 实时排行榜:使用有序集合实现实时排名功能。
- 地理空间索引:支持存储和查询地理位置数据。
1.4 Redis与其他数据库的对比
- 与关系型数据库(如MySQL):Redis基于内存,适合高速读写;关系型数据库适合复杂查询和事务。
- 与Memcached:Redis支持更多数据结构和持久化,Memcached更简单,仅支持键值存储。
二、Redis数据库
1.Redis有16个(0-15)数据库,默认使用0号数据库。
2.Redis数据库的有关操作
三、Redis五个基本类型
3.1 字符串
(1)特点
最基本数据类型,可以存储文本或二进制数据。
(2)常用的操作
(3)使用场景
①计数器
②统计多个单位数量
③对象缓存存储
3.2 列表(list) ——可以有相同的值
(1)定义
有序的字符串列表,可以在表头或表尾推入或弹出元素(队列或栈结构)。
支持队列(先进先出)和栈(后进先出)的操作。
(2)常用命令
(3)使用场景
①消息队列
②任务调度
3.3 集合(set) ——值不能重复
(1)定义
无序唯一元素的集合。
(2)常见命令
(3)使用场景
可以实现差集、交集、并集。
3.4 哈希(hash) ——类似于Map集合
(1)定义
用于存储键值对的集合。
(2)常用命令
(3)使用场景
需要频繁访问和更新某个实体的多个字段的场景。
3.5 有序集合(zset) ——不能重复
(1)常用命令
(2)使用场景
应用于排行榜、优先队列等场景。
四、事务
4.1 事务定义
是一组命令的集合,不保证原子性。
4.2 与mysql的事务的区别
mysql事务:支持完整的ACID事务,保证所有操作要么全部成功,要么全部失败。
区别:redis事务不支持隔离级别,也不支持回滚。
4.3 代码解释
注意:
①如果编译出错,则exec执行不成功,所有命令均不会执行。
②运行时错误,其他命令仍可以执行,只是在出错的地方抛出异常。
五、乐观锁和悲观锁
5.1 乐观锁
(1)定义:假设冲突很少发生,操作过程中不锁定资源,只在提交时检测冲突。检测是否修改过数据,如果有修改,则放弃修改,不提交。
(2)使用场景:冲突较少、读多写少的场景(读取远多于写入的场景)
5.2 悲观锁
(1)定义:假设冲突总是会发生,操作前就锁定资源,直到操作结束再解锁
(2)使用场景:需要极强一致性、冲突频繁的场景(金融交易、多写操作)
5.3 乐观锁与悲观锁的区别和适用场景
实现方式差异:
乐观锁通常通过版本号(Version)或时间戳实现。例如数据库表中增加version
字段,更新时检查版本是否一致:
UPDATE table SET column = new_value, version = version + 1 WHERE id = ? AND version = old_version
悲观锁依赖数据库或编程语言提供的锁机制,如:数据库:SELECT FOR UPDATE
性能对比:
乐观锁在低冲突场景下性能更高,因为无需加锁和解锁,减少了线程阻塞的开销。
悲观锁在高冲突场景中更稳定,但加锁会导致线程阻塞,可能引发死锁或性能下降。
适用场景:
乐观锁适合:
读多写少的场景(如热点数据缓存更新)
冲突概率较低的业务(如用户信息修改)
需要高吞吐量的系统(如电商库存扣减)
悲观锁适合:
写多读少的场景(如银行转账)
关键数据的强一致性要求(如订单状态变更)
短事务且冲突概率高的操作
优缺点总结:
乐观锁优点:
无阻塞,并发性能高
避免死锁问题
适合分布式环境
乐观锁缺点:
冲突频繁时重试成本高
需处理业务逻辑的回滚
悲观锁优点:
保证强一致性
实现简单
悲观锁缺点:
线程阻塞影响性能
可能引发死锁
不适合分布式系统
六、Redis持久化
6.1 定义
将内存中的数据保存到磁盘中。
6.2 两种方式
(1)RDB
①原理:通过fork创建一个子进程,子进程将内存的内容写入到一个临时文件,持久化过程结束,把临时文件替换上一次持久化好的文件。(但要注意:整个过程中,主进程不进行任何IO操作)。
②优点:适合大规模数据恢复;对数据完整性要求不高。
③缺点:fork进程会占用一定的空间;需要一定的时间间隔操作,如果redis意外宕机,最后一次持久化后的数据就没有。
(2)AOF
①原理:将所有命令记录下来,恢复时将所有命令执行一遍。
②优点:每修改一次,都会同步,文件完整性比较好。
③缺点:AOF数据文件大,修复速度慢,运行效率低。
七、主从复制
7.1 概念
将一个Redis服务器数据复制(数据复制是单向的)到其他服务器,前者称为主节点,后者称为从节点。主机负责写数据,从机读数据。(注意:从机不能写数据,从机将主机中的数据备份,同步主机数据)
7.2 模式
(1)一个主机有两个从机
(2)链路模式
八、哨兵模式
8.1 概念
Redis哨兵(Sentinel)是Redis官方提供的高可用性解决方案,用于监控和管理Redis主从集群。哨兵模式的核心功能包括:自动故障检测、主从切换(failover)、配置更新和通知。哨兵通过心跳机制监测主节点和从节点的健康状态,当主节点故障时,哨兵会自动选举一个从节点晋升为新的主节点,并更新其他从节点的配置。
简而言之:哨兵监测主机是否宕机,如果宕机则进行“投票”选举新的主节点,自动切换新主机。
8.2 优缺点
优点:
高可用性:自动故障转移机制确保主节点故障时服务不中断,提升系统容错能力。
自动化运维:无需人工干预即可完成主从切换和配置更新,降低运维成本。
监控与告警:哨兵持续监控节点状态,支持通过API或通知机制推送故障事件。
兼容性:与Redis主从复制无缝集成,无需修改客户端代码即可使用。
脑裂问题:网络分区可能导致多个主节点同时存在(split-brain),需额外配置解决(如min-slaves-to-write
)。
性能开销:哨兵进程本身需要资源,且故障转移期间可能存在短暂服务不可用。
配置复杂度:需部署多个哨兵节点(建议至少3个)以避免单点故障,配置和管理较复杂。
客户端适配:部分旧版客户端可能不支持哨兵协议,需升级或使用代理(如Twemproxy)。
九、缓存穿透、击穿和雪崩
1.缓存穿透——查不到
(1)定义
客户端查询要查询数据,但发现Redis(缓存)中没有,向持久层数据库发起查询,数据库中也没有该数据,多次重复,会给持久层数据库造成较大的压力。
(2)解决办法
①布隆过滤器
②缓存空对象
2.缓存击穿——量太大,缓存过期
(1)定义
对于热点数据,存在大量的并发,当热点数据消失时,持续并发穿破缓存,直接请求数据库,导致数据库瞬间压力大。
(2)解决办法
①互斥锁
②热点数据不过期
3.缓存雪崩
(1)定义
缓存集中过期/Redis宕机
(2)解决办法
①限流降级
②数据预热
③Redis高可用