Redis是一个开源的内存数据库,用于存储键值对。它支持多种数据结构,如字符串、哈希、列表、集合等。
Redis优势
- 高性能:基于内存操作,读写速度快。
- 数据结构丰富:支持多种数据结构,适用于不同场景。
- 持久化:支持RDB快照和AOF日志两种持久化方式。
- 支持事务:通过MULTI和EXEC命令实现事务操作。
- 分布式:支持主从复制和Sentinel高可用。
Redis数据结构
- 字符串(String)
- 哈希(Hash)
- 列表(List)
- 集合(Set)
- 有序集合(Sorted Set)
Redis持久化
Redis的持久化指的是将内存中的数据写入磁盘,以防止数据在服务器重启时丢失。主要有两种方式:RDB快照和AOF日志。
- RDB是定期将内存中的数据生成快照并写入磁盘,适用于备份和恢复。
- AOF则是将每次写操作都追加到日志文件中,适用于实时的持久化。
Redis的数据过期策略
Redis使用两种过期策略:定时删除和惰性删除。
- 定时删除是指在设置键的过期时间时同时创建一个定时器,过期时删除键。
- 惰性删除是在访问键时检查过期时间,过期时删除键。
Redis实现分布式
Redis实现分布式主要通过主从复制和Sentinel高可用机制。主从复制是指一个主节点可以有多个从节点,数据同步从主节点到从节点。Sentinel是用于监控和自动故障恢复的系统。
Redis事务
Redis事务是一组命令的集合,可以一次性、顺序地执行,保证原子性。通过MULTI和EXEC命令来开启和执行事务。
Redis的缓存淘汰策略
- LRU(Least Recently Used):
描述: 选择最近最少使用的数据进行淘汰。
配置参数: maxmemory-policy 设置为 “volatile-lru” 或 “allkeys-lru”。 - LFU(Least Frequently Used):
描述: 选择最不经常使用的数据进行淘汰。
配置参数: maxmemory-policy 设置为 “volatile-lfu” 或 “allkeys-lfu”。 - TTL(Time To Live):
描述: 选择具有最早过期时间的数据进行淘汰。
配置参数: maxmemory-policy 设置为 “volatile-ttl”。 - Random(随机选择):
描述: 随机选择要淘汰的数据。
配置参数: maxmemory-policy 设置为 “volatile-random”。 - NoEviction(不淘汰):
描述: 不执行淘汰操作,而是返回错误,告知写操作无法完成。
配置参数: maxmemory-policy 设置为 “noeviction”。
Redis-sentinel
redis-sentinel 是 Redis 的一个组件,Redis 是一个开源的内存数据结构存储,用作数据库、缓存和消息代理。Redis Sentinel 的设计目的是为了提供 Redis 的高可用性。它监视 Redis 主节点及其副本,并在主节点失效时执行自动故障切换。
Redis Sentinel 的主要特性包括:
- 监控: Sentinel 监视 Redis 实例,检查其健康状况和可用性。
- 通知: 如果主或副本被认为不可用,Sentinel 可以通知管理员或其他系统。
- 自动故障切换: 当主节点不可达时,Sentinel 可以将其中一个副本晋升为新的主节点,确保持续的服务。
- 配置提供者: Sentinel 作为客户端的配置提供者,引导它们连接到当前的主节点。
- 基于仲裁的决策: Sentinel 使用基于仲裁的方法进行决策,以避免出现分裂脑的情况。
使用 Redis Sentinel 提高了 Redis 部署的整体可靠性和可用性,使其适用于关键任务的应用程序。它特别适用于需要高可用性和容错性的场景,需要将停机时间最小化的情况。
Redis-sentinel配置
- 创建sentinel.conf文件
配置指定监视的 Redis 实例、通知设置、故障切换策略
port 26379
sentinel monitor mymaster 127.0.0.1 6379 2
# 指定了需要多少失效时间,一个master才会被这个sentinel主观地认为是不可用的。单位是毫秒,默认为30秒
sentinel down-after-milliseconds mymaster 5000
# 这个配置项指定了在发生failover主备切换时最多可以有多少个slave同时对新的master进行 同步,这个数字越小,完成failover所需的时间就越长,但是如果这个数字越大,就意味着越 多的slave因为replication而不可用。可以通过将这个值设为 1 来保证每次只有一个slave 处于不能处理命令请求的状态
sentinel parallel-syncs mymaster 1
# 同一个sentinel对同一个master两次failover之间的间隔时间
#当一个slave从一个错误的master那里同步数据开始计算时间。直到slave被纠正为向正确的master那里同步数据时。
#当想要取消一个正在进行的failover所需要的时间。
#当进行failover时,配置所有slaves指向新的master所需的最大时间。不过,即使过了这个超时,slaves依然会被正确配置为指向master,但是就不按parallel-syncs所配置的规则来了。
sentinel failover-timeout mymaster 10000
sentinel monitor mymaster 127.0.0.1 6379 2
sentinel monitor <master-group-name> <ip> <port> <quorum>
quorum(仲裁数):表示几个sentinel同意(投票)才能做出对 Redis 主节点状态的决策,确保可靠性和稳定性的关键。
这个例子中,配置了 Sentinel 监控名为 mymaster 的 Redis 主节点,当主节点在 5 秒内不可达时认为它失效,进行故障切换。
- 启动Sentinel进程
redis-sentinel /path/to/sentinel.conf
Sentinel 会根据配置文件中的信息开始监控和管理 Redis 实例。
- 检查sentinel进程
redis-cli -p 26379
sentinel master mymaster
这将连接到 Sentinel 进程的端口(默认为 26379)并检查名为 mymaster 的 Redis 主节点的信息。