Redis学习笔记
Redis学习笔记
- Redis概述
- Redis是一个开源的、基于内存的数据结构存储系统,可用作数据库、缓存和消息代理。它支持多种数据结构,如字符串、哈希表、列表、集合、有序集合等。
- 具有高性能、持久化、多种数据类型支持、原子操作、数据备份等特性,广泛应用于缓存、计数器、排行榜、消息队列、实时分析等场景。
- 数据结构与应用场景
- 字符串(String)
- 应用场景包括缓存用户信息、计数器(如点赞数、浏览量)、分布式锁等。
- 示例:通过
SET key value设置键值对,GET key获取值,INCR key实现原子自增操作。
- 哈希表(Hash)
- 适合存储对象,如用户信息、商品信息等,可对对象的单个属性进行操作。
- 操作命令有
HSET key field value、HGET key field、HGETALL key等。
- 列表(List)
- 可用于实现消息队列、文章列表、时间线等功能。
- 相关命令如
LPUSH key value(从头部插入元素)、RPUSH key value(从尾部插入元素)、LPOP key(从头部弹出元素)、BRPOP key timeout(阻塞式从尾部弹出元素)。
- 集合(Set) - 用于去重、好友关系、共同关注等场景。
- 操作包括
SADD key member(添加元素)、SMEMBERS key(获取所有元素)、SINTER key1 key2(求交集)等。
- 有序集合(Sorted Set) - 适用于排行榜、按权重排序的数据等。
- 命令如
ZADD key score member(添加元素并指定分数)、ZRANGE key start stop [WITHSCORES](按排名范围获取元素)。
- 持久化策略
- RDB持久化 - 原理是在指定时间间隔内,将内存中的数据集快照写入磁盘。
- 优点是数据恢复速度快,缺点是可能会丢失最后一次快照后的部分数据。
- 配置参数如
save <seconds> <changes>指定触发快照的条件。
- AOF持久化
- 以日志形式记录服务器所处理的每一个写、删除操作,在服务器启动时会重新执行这些命令来恢复数据。
- 优点是数据安全性高,缺点是文件体积较大,恢复速度相对较慢。
- 配置参数包括
appendonly yes/no开启或关闭AOF,appendfsync always/everysec/no指定同步策略。
- 缓存策略与优化
- 缓存穿透
- 问题描述:查询一个不存在的数据,导致请求绕过缓存直接打到数据库,造成数据库压力过大。
- 解决方案:缓存空对象、使用布隆过滤器等。
- 缓存雪崩
- 问题描述:大量缓存同时过期或缓存服务宕机,导致大量请求直接访问数据库。
- 解决方案:设置缓存过期时间随机化、使用分布式缓存架构、限流降级等。
- 缓存热点 - 问题描述:某些热点数据访问频繁,导致缓存节点负载过高。
- 解决方案:热点数据分散存储、热点数据预加载等。
- 集群与分布式
- 主从复制
- 原理:一个主节点(Master)负责写操作,多个从节点(Slave)负责读操作,从节点从主节点复制数据。
- 优点是提高读性能、实现数据备份,缺点是不具备自动故障转移能力。
- Redis Sentinel - 功能:用于监控主从节点状态,实现自动故障转移。
- 配置多个Sentinel节点,当主节点故障时,Sentinel会选举出一个从节点升级为主节点。
- Redis Cluster
- 特点:将数据分片存储在多个节点上,支持自动分片、故障转移、动态扩缩容。
- 数据通过哈希槽(Hash Slot)分布在不同节点,节点之间通过Gossip协议进行通信。
- 性能优化
- 内存优化
- 合理设置数据结构,避免内存浪费,如使用整数对象代替字符串存储整数。
- 控制键值对数量,及时清理过期数据。
- 网络优化 - 使用长连接减少连接建立和断开的开销。
- 优化批量操作,减少网络往返次数。
- 配置优化 - 根据实际场景调整参数,如
maxmemory(设置最大内存)、maxclients(设置最大客户端连接数)等。
- 案例分析
- 以某电商系统为例,介绍Redis在缓存商品信息、购物车、用户订单状态等方面的应用,以及如何通过Redis实现分布式锁解决库存超卖问题。
- 分析在高并发场景下,Redis如何与数据库协同工作,保证系统的高性能和数据一致性。