2024-09-01

在搭建Redis主从复制架构时,你需要准备至少两个Redis服务实例,一个作为主节点(Master),其余作为从节点(Slave)。以下是基于Linux环境搭建Redis主从复制的步骤和示例配置:

  1. 安装Redis:确保你的系统上安装了Redis。
  2. 配置Master节点:

    • 编辑Master节点的redis.conf文件,设置bind指令为Master的IP地址,并设置port为默认的6379。
    • 确保daemonize设置为yes,以便Redis能作为守护进程运行。
    • 可以选择设置requirepass来设置访问密码。
  3. 配置Slave节点:

    • 编辑Slave节点的redis.conf文件,设置bind指令为Slave的IP地址,并设置port为不同于Master的端口。
    • 设置daemonizeyes
    • 设置slaveof指令为Master节点的IP和端口,如slaveof <master-ip> <master-port>
    • 如果Master设置了访问密码,Slave也应设置masterauth为Master的密码。
  4. 启动Redis服务:

    • 在Master节点上启动Redis服务:redis-server /path/to/redis.conf
    • 在Slave节点上启动Redis服务:redis-server /path/to/redis.conf
  5. 验证主从复制:

    • 连接到Master节点,并检查信息:redis-cli -h <master-ip> -p <master-port>
    • 使用INFO replication命令查看复制信息。
    • 连接到Slave节点,并检查信息:redis-cli -h <slave-ip> -p <slave-port>
    • 使用INFO replication命令查看复制信息。

以下是示例配置:

Master节点的redis.conf




bind 192.168.1.100
port 6379
daemonize yes
requirepass yourmasterpassword

Slave节点的redis.conf




bind 192.168.1.101
port 6379
daemonize yes
slaveof 192.168.1.100 6379
masterauth yourmasterpassword

启动服务后,你可以通过连接到每个节点并执行INFO replication命令来查看复制状态和信息。

2024-09-01

Redis 是一个开源的使用 C 语言编写、支持网络、可基于内存亦可持久化的日志型、Key-Value 数据库,并提供多种语言的 API。

Redis 的基础数据结构包括字符串、哈希表、列表、集合、有序集合等。

  1. 字符串(String)

字符串是 Redis 最基本的数据类型。




# 设置键值
redis.set('key', 'value')
# 获取键值
redis.get('key')
  1. 哈希表(Hash)

哈希表用于存储键值对集合。




# 设置哈希表
redis.hset('hash_key', 'field1', 'value1')
# 获取哈希表
redis.hget('hash_key', 'field1')
  1. 列表(List)

列表是简单的字符串列表,可以添加一个元素到列表的头部或尾部。




# 在列表头部添加元素
redis.lpush('list_key', 'value1')
# 在列表尾部添加元素
redis.rpush('list_key', 'value2')
# 获取列表
redis.lrange('list_key', 0, -1)
  1. 集合(Set)

集合是无序的字符串集合。




# 添加元素
redis.sadd('set_key', 'value1')
# 获取集合
redis.smembers('set_key')
  1. 有序集合(Sorted Set)

有序集合是字符串的有序集合。




# 添加元素
redis.zadd('zset_key', {'value1': 1})
# 获取集合
redis.zrange('zset_key', 0, -1)

以上操作均为 Redis 基础操作,在实际应用中,可以结合业务场景进行复杂操作,例如实现缓存系统、消息队列、计数器、分布式锁等。

2024-09-01

一、部署Redis哨兵集群

  1. 安装Redis并启动主服务器



# 安装Redis
sudo apt-install redis-server
 
# 修改Redis配置文件
sudo nano /etc/redis/redis.conf
 
# 确保以下配置项被设置
bind 0.0.0.0
daemonize yes
 
# 启动Redis服务
sudo systemctl start redis-server
  1. 配置两个从服务器

    对于每个从服务器,重复步骤1,并在redis.conf中添加以下配置:




slaveof <master-ip> <master-port>
  1. 安装和配置哨兵

    在每个哨兵上执行以下步骤:




# 安装Redis
sudo apt-install redis-server
 
# 修改Redis配置文件
sudo nano /etc/redis/redis.conf
 
# 确保以下配置项被设置
bind 0.0.0.0
daemonize yes
sentinel monitor mymaster <master-ip> <master-port> 2
sentinel down-after-milliseconds mymaster 30000
sentinel parallel-syncs mymaster 1
sentinel failover-timeout mymaster 180000
 
# 启动哨兵
redis-sentinel /etc/redis/redis.conf

二、知识点总结

  • 哨兵负责监控主服务器和从服务器,并在主服务器宕机时自动进行故障转移。
  • 配置项sentinel monitor mymaster <master-ip> <master-port> 2指定主服务器和最小投票数2。
  • 配置项sentinel down-after-milliseconds mymaster 30000指定判断主服务器宕机的时间。
  • 配置项sentinel parallel-syncs mymaster 1指定一次最多同步的从服务器数。
  • 配置项sentinel failover-timeout mymaster 180000指定故障转移的超时时间。

三、常见问题和解决方案

  1. 如何连接哨兵集群?

    连接哨兵,使用redis-cli命令,指定哨兵的IP和端口,例如:redis-cli -h <sentinel-ip> -p <sentinel-port>

  2. 如何获取当前主服务器信息?

    连接到哨兵后,使用命令SENTINEL get-master-addr-by-name <master-name>

  3. 哨兵集群如何处理故障转移?

    当主服务器宕机,哨兵会选举一个哨兵作为领导者,进行故障转移流程,包括选举新的主服务器和配置其他从服务器指向新主。

  4. 哨兵集群如何处理手动故障转移?

    可以通过SENTINEL failover <master-name>命令手动触发故障转移。

  5. 哨兵集群如何处理配置变更?

    哨兵会监控主服务器和从服务器的配置文件,一旦有变更会自动更新配置。

四、扩展和优化

  • 可以使用哨兵集群来进一步提高可用性,部署多个哨兵实例以提高监控的可靠性和性能。
  • 可以开启Redis的持久化机制,如RDB或AOF,以防止数据丢失。
  • 可以配置主服务器和从服务器的自动重启功能,以便在服务器重启后自动恢复服务。
  • 可以使用自定义的监控脚本来扩展哨兵
2024-09-01

概述

Redis是一个开源的使用C语言编写、支持网络、可基于内存亦可持久化的日志型、Key-Value数据库,并提供多种语言的API。

特性

  • 性能极高 – Redis能读的速度是110000次/s,写的速度是81000次/s。
  • 持久化 – 可以将内存中的数据保存在硬盘中,重启时可以再次加载。
  • 多种数据类型 – 支持字符串(String), 列表(List), 集合(Set), 有序集合(Sorted Set) 和 哈希类型(Hash) 等数据类型。
  • 原子性 – 所有操作都是原子性,要么成功要么失败。
  • 支持多种编程语言 – 支持Python, Ruby, Erlang, Tcl等服务器端语言。

应用场景

  • 缓存系统 – 因为Redis能读的速度是110000次/s,写的速度是81000次/s,所以非常适合作为缓存系统。
  • 分布式集群的会话存储 – 比如Java中的Tomcat、Memcached就是使用Redis做会话存储。
  • 计数器/限速器 – 可以使用Redis的INCR, DECR命令实现。
  • 消息队列 – 使用List作为队列,使用Pub/Sub作为发布/订阅。
  • 排行榜/计分板 – 使用Sorted Set。

安装

  • Linux下安装:

    
    
    
    # 下载
    wget http://download.redis.io/releases/redis-5.0.5.tar.gz
    # 解压
    tar xzf redis-5.0.5.tar.gz
    # 编译
    cd redis-5.0.5
    make
    # 测试
    make test
    # 安装
    sudo make install
  • Windows下安装:

    可以通过下载官方提供的Windows版本或使用WSL(Windows Subsystem for Linux)。

客户端

  • 命令行客户端:

    
    
    
    redis-cli
  • 多种编程语言的客户端:

    • Python: redis-py
    • Java: Jedis
    • Node.js: ioredis
    • Ruby: redis-rb
    • C#: StackExchange.Redis

以上是Redis的基本概念、特性和应用场景,以及如何在Linux和Windows上安装Redis及其常用客户端。

2024-09-01

Redis 常见的数据类型及操作方法如下:

  1. 字符串(String)

    • 设置值:SET key value
    • 获取值:GET key
    • 增加数字:INCR keyDECR key
    • 追加值:APPEND key value
  2. 列表(List)

    • 从列表左侧插入:LPUSH key value
    • 从列表右侧插入:RPUSH key value
    • 获取列表:LRANGE key start stop
    • 从列表左侧弹出:LPOP key
    • 从列表右侧弹出:RPOP key
  3. 集合(Set)

    • 添加元素:SADD key member
    • 获取全部元素:SMEMBERS key
    • 删除元素:SREM key member
    • 判断元素是否存在:SISMEMBER key member
  4. 有序集合(Sorted Set)

    • 添加元素:ZADD key score member
    • 获取全部元素:ZRANGE key start stop
    • 删除元素:ZREM key member
    • 按分数范围获取元素:ZRANGEBYSCORE key min max
  5. 哈希(Hash)

    • 设置值:HSET key field value
    • 获取值:HGET key field
    • 获取所有字段和值:HGETALL key
    • 删除字段:HDEL key field
  6. 位图(Bitmap)

    • 设置位:SETBIT key offset value
    • 获取位:GETBIT key offset
    • 统计位为1的数量:BITCOUNT key
  7. HyperLogLog

    • 添加元素:PFADD key element
    • 计算基数:PFCOUNT key
    • 合并多个HyperLogLog:PFMERGE destkey sourcekey [sourcekey ...]
  8. 发布/订阅(Pub/Sub)

    • 订阅频道:SUBSCRIBE channel [channel ...]
    • 发布消息:PUBLISH channel message
  9. 事务(Transaction)

    • 开启事务:MULTI
    • 执行事务:EXEC
    • 放弃事务:DISCARD
  10. 键管理

    • 查看键:KEYS pattern
    • 删除键:DEL key
    • 检查键是否存在:EXISTS key
    • 设置过期时间:EXPIRE key seconds

这些是Redis中最常见的数据类型和操作方法。在实际应用中,可以根据需要选择合适的数据类型和操作命令。

2024-09-01

在Redis中,数据的持久化主要有两种方式:RDB(Redis DataBase)和AOF(Append Only File)。

  1. RDB:定时将内存中的数据快照保存到磁盘的一个压缩二进制文件中。可以配置定时任务来控制快照的频率。



# 在redis.conf中配置
save 900 1      # 900秒内至少1个键被修改则触发保存
save 300 10     # 300秒内至少10个键被修改则触发保存
save 60 10000   # 60秒内至少10000个键被修改则触发保存
 
dbfilename dump.rdb  # RDB文件名
dir /path/to/your/redis/directory  # RDB文件存储目录
  1. AOF:每个写命令都通过append操作保存到文件中。在Redis重启时,通过重放这些命令来恢复数据。



# 在redis.conf中配置
appendonly yes  # 开启AOF
appendfilename "appendonly.aof"  # AOF文件名
dir /path/to/your/redis/directory  # AOF文件存储目录

# AOF文件的更新频率
appendfsync always  # 每次写入都同步,最慢但最安全
appendfsync everysec  # 每秒同步一次,折衷方案
appendfsync no  # 完全依赖操作系统,最快但不安全

在实际操作中,可以根据数据的重要性和性能需求选择合适的持久化方式。如果对数据持久化要求不高,可以只使用RDB;如果对数据安全性要求较高,并且可以接受较长时间的数据丢失,可以只使用AOF;如果需要既保证数据安全性又想要较好的性能,可以同时开启RDB和AOF。

2024-09-01

Redis支持三种集群模式:主从模式、哨兵模式和Cluster模式。

  1. 主从模式(Master-Slave Mode)

主从模式是最简单的Redis集群模式。在这种模式下,有一个主节点和一个或多个从节点,主节点用于处理写操作,从节点用于处理读操作。数据是以快照的方式从主节点同步到从节点。




# 配置主节点
redis-server /etc/redis/redis.conf

# 配置从节点
redis-server /etc/redis/redis.conf --slaveof 127.0.0.1 6379
  1. 哨兵模式(Sentinel Mode)

哨兵模式是主从模式的升级版。它通过哨兵进程监控主节点和从节点,并在主节点出现故障时自动进行故障转移。




# 启动哨兵进程
redis-sentinel /etc/redis/sentinel.conf
  1. Cluster模式(Cluster Mode)

Cluster模式是最复杂的Redis集群模式,它通过分片(sharding)机制实现数据的分布式存储。在Cluster模式下,数据是以集群内部的一个个节点存储的,每个节点都可以处理读写操作。




# 配置Cluster环境
redis-cli --cluster create 127.0.0.1:7000 127.0.0.1:7001 127.0.0.1:7002 --cluster-replicas 1

以上是三种Redis集群模式的简要说明和配置示例。在实际应用中,你需要根据具体需求选择合适的集群模式,并进行相应的配置。

2024-09-01

在项目中使用Redis时,我们主要收获了以下知识点:

  1. 性能优化:通过使用Redis缓存经常访问的数据,显著提高了应用的响应速度。
  2. 提升可用性:Redis的数据持久化机制可以有效地防止因服务器宕机导致的数据丢失问题。
  3. 高并发:Redis提供的分布式锁机制有效地解决了多线程/进程修改同一资源的并发问题。
  4. 数据结构丰富:Redis提供的数据结构丰富,例如Hash、Set、Sorted Set等,可以满足不同的数据存储需求。
  5. 复杂操作:Redis的Lua脚本功能使得我们可以在服务端完成复杂的操作,提高了系统的可扩展性。

解决方案和实例代码:




# 连接Redis
redis_client = redis.StrictRedis(host='localhost', port=6379, db=0)
 
# 缓存数据
def cache_data(key, value, expire_time=3600):
    redis_client.setex(key, expire_time, value)
 
# 获取缓存数据
def get_cached_data(key):
    return redis_client.get(key)
 
# 使用Lua脚本进行原子操作
def safe_increment(key):
    script = """
    local val = redis.call('get', KEYS[1])
    if val then
        return redis.call('incr', KEYS[1])
    else
        return 1
    end
    """
    return redis_client.eval(script, 1, key)

这段代码展示了如何使用Python的redis库连接Redis服务器,如何设置和获取缓存数据,以及如何使用Lua脚本在Redis服务器端安全地进行自增操作。

2024-09-01

ZRANGE 是 Redis 中的一个命令,用于获取有序集合中的成员及其分数。

命令的基本语法如下:




ZRANGE key start stop [WITHSCORES]
  • key: 目标有序集合的名称。
  • start: 成员索引的开始位置,0 表示第一个成员。
  • stop: 成员索引的结束位置,-1 表示最后一个成员。
  • WITHSCORES: 可选参数,如果指定,则命令返回成员和它们的分数。

示例代码(使用 redis-py 库):




import redis
 
# 连接到 Redis
r = redis.Redis(host='localhost', port=6379, db=0)
 
# 有序集合的 key
key = 'myzset'
 
# 获取有序集合中所有成员及其分数
members_with_scores = r.zrange(key, 0, -1, withscores=True)
print(members_with_scores)
 
# 获取有序集合中所有成员
members = r.zrange(key, 0, -1)
print(members)

在这个例子中,我们首先导入了 redis 模块,连接到了本地运行的 Redis 实例,然后使用 zrange 命令获取了名为 myzset 的有序集合中所有成员及其分数。withscores=True 参数表示我们希望同时返回成员和它们的分数。

2024-09-01

缓存穿透:查询不存在的数据,缓存和数据库都不会命中,导致请求直接打到数据库。

解决方法

  1. 使用布隆过滤器:在缓存之前加一层布隆过滤器,可以高效地判断一个元素是否可能存在于集合中。
  2. 为查询参数设置一个固定值:如果查询参数不存在,则返回一个默认值或空结果,并将其缓存。

缓存击穿:缓存失效时,大量请求直接打到数据库。

解决方法

  1. 设置热点数据永不过期:对于访问频率高、更新频率低的数据,设置为永不过期。
  2. 加互斥锁:当缓存失效时,通过互斥锁保证只有一个线程去数据库查询,其他线程等待。

缓存雪崩:缓存集体失效,大量请求打到数据库。

解决方法

  1. 设置随机过期时间:为缓存数据设置不同的过期时间,避免同时失效。
  2. 数据预热:在高峰期之前预先加载数据到缓存中。
  3. 监控告警:设置缓存监控告警机制,一旦发现大量缓存失效,采取相应的流量控制措施。