Administrator
发布于 2025-01-06 / 36 阅读
0
0

Redis教程

环境搭建

# 下载redis
cd /opt
wget http://download.redis.io/releases/redis-5.0.0.tar.gz
​
# 编译安装
tar -zxvf redis-5.0.0.tar.gz
cd redis-5.0.0
make
make PREFIX=/usr/local/redis install
mkdir /usr/local/redis/conf
cp redis.conf /usr/local/redis/conf/redis.conf

可用执行文件说明

# /usr/local/redis/bin/
redis-server       #服务器端
redis-cli          #客户端
redis-benchmark    #调试
redis-check-dump   #数据导出
redis-check-aof    #数据导入

配置文件说明

# /usr/local/redis/conf/redis.conf
daemonize       # 如果需要后台运行,改成 yes
pidfile         # 配置多个 pid 的地址,默认在/var/r un/redis.pid
bind            # 绑定 ip,设置后只接受来自该 ip 的请求
port            # 监听端口,默认为 6379
timeout         # 设置客户端连接时的超时时间,单位为 秒
loglevel        # 分为 4 级,debug、verbose、notice、warning
logfile         # 配置 log 文件地址
databases       # 设置数据库的个数,默认使用的数据库 为 0,最大为 16 个
save            # 设置 Redis 进行数据库镜像的频率(快照)
rdbcompression  # 在进行镜像备份时,是否进行压缩
dbfilename      # 镜像备份文件的文件名
dir             # 数据库镜像备份的文件放置位置
slaveof         # 设置数据库为其他数据库的从数据库
masterauth      # 主数据库连接需要的密码验证
requirepass     # 设置登录时需要使用密码
maxclients      # 限制同时连接的客户数量
maxmemory       # 设置 redis 能够使用的最大内存
appendonly      # 开启 append only 模式

注:常用配置 daemonize、bind、port、requirepass

服务化

# 编写服务化脚本
cat << EOF> /etc/systemd/system/redis.service
[Unit]
Description=Redis
Documentation=http://download.redis.io
After=network.target
[Service]
PIDFile=/var/run/redis.pid
ExecStart=/usr/local/redis/bin/redis-server /usr/local/redis/conf/redis.conf --daemonize no
ExecStop=/usr/local/redis/bin/redis-cli -h 127.0.0.1 -p 6379 shutdown
[Install]
WantedBy=multi-user.target
EOF
​
# 启动redis服务
systemctl start redis

# 设置开机启动
systemctl enable redis

添加环境变量

cat << EOF> /etc/profile
#########redis##########
export REDIS_HOME=/usr/local/redis
export PATH=$PATH:$REDIS_HOME/bin
########################
EOF
​
# 配置生效
source /etc/profile

验证

# 连接redis
redis-cli -h 127.0.0.1 -p 6379
​
# 如果存在密码则需要身份认证
auth your_pwd
​
# 验证命令
ping

集群搭建

一、环境准备

  • 服务器准备:建议至少准备 3 台服务器,每台服务器运行一个主节点和一个从节点。例如:

    • 192.168.1.10

    • 192.168.1.11

    • 192.168.1.12

  • 安装 Redis

    1. 下载 Redis 源码:

      bash复制

      wget http://download.redis.io/releases/redis-7.0.0.tar.gz
      tar xzf redis-7.0.0.tar.gz
      cd redis-7.0.0
    2. 编译并安装:

      bash复制

      make
      make install

二、配置文件设置

为每个 Redis 节点创建独立的配置文件,以下是一个示例配置文件:

conf复制

# redis-7000.conf
port 7000
daemonize yes
pidfile /var/run/redis-7000.pid
logfile /var/log/redis/redis-7000.log
dir /var/redis/7000
cluster-enabled yes
cluster-config-file nodes-7000.conf
cluster-node-timeout 5000
appendonly yes
protected-mode no

根据需要修改端口、日志文件等设置,为每个节点创建配置文件,端口依次修改为 7000、7001、7002 等。

三、启动 Redis 节点

在每台服务器上启动 Redis 节点:

bash复制

redis-server /etc/redis/redis-7000.conf
redis-server /etc/redis/redis-7001.conf
redis-server /etc/redis/redis-7002.conf

可以通过以下命令验证 Redis 是否运行正常:

bash复制

redis-cli -h 192.168.1.10 -p 7000 ping

如果返回 PONG,则表示 Redis 节点启动成功。

四、创建 Redis 集群

使用 redis-cli 工具创建集群,将所有节点加入到集群中:

bash复制

redis-cli --cluster create \
  192.168.1.10:7000 192.168.1.10:7001 192.168.1.10:7002 \
  192.168.1.11:7000 192.168.1.11:7001 192.168.1.11:7002 \
  --cluster-replicas 1

其中 --cluster-replicas 1 表示每个主节点有一个从节点。

五、验证集群状态

  1. 查看集群节点信息

    bash复制

    redis-cli -p 7000 cluster nodes

    输出示例:

    复制

    e6e6... 192.168.1.10:7000@17000 master - 0 1630000000000 1 connected 0-5460
    4d4d... 192.168.1.10:7001@17001 master - 0 1630000000000 2 connected 5461-10922
    ...
  2. 检查集群状态

    bash复制

    redis-cli -p 7000 cluster info

    如果返回结果中的 cluster_stateok,则表示集群状态正常。

六、集群管理

  • 添加节点

    bash复制

    redis-cli --cluster add-node <新节点地址> <已有节点地址>
  • 删除节点

    bash复制

    redis-cli --cluster del-node <已有节点地址> <节点ID>
  • 重新分片

    bash复制

    redis-cli --cluster reshard <节点地址> --cluster-from <源节点ID> --cluster-to <目标节点ID> --cluster-slots <槽位数量>

以上是 Redis 集群的部署步骤,适用于常见的 3 主 3 从架构。根据实际需求,可以调整节点数量和配置。

数据类型及示例

1. 字符串(String)

字符串是最基本的数据类型,可以存储文本、数字等。

常用命令

  • SET:设置键的值。

    bash复制

    SET key value

    示例:

    bash复制

    SET name "Kimi"
  • GET:获取键的值。

    bash复制

    GET key

    示例:

    bash复制

    GET name

    输出:

    "Kimi"

  • INCR:将键的值加1(值必须是整数)。

    bash复制

    INCR key

    示例:

    bash复制

    SET counter 10
    INCR counter

    输出:

    11

  • DECR:将键的值减1(值必须是整数)。

    bash复制

    DECR key

    示例:

    bash复制

    DECR counter

    输出:

    10

2. 列表(List)

列表是一个有序的字符串集合,支持从两端插入和删除元素。

常用命令

  • LPUSH:在列表头部插入元素。

    bash复制

    LPUSH key value1 [value2 ...]

    示例:

    bash复制

    LPUSH fruits "apple" "banana"
  • RPUSH:在列表尾部插入元素。

    bash复制

    RPUSH key value1 [value2 ...]

    示例:

    bash复制

    RPUSH fruits "orange"
  • LRANGE:获取列表中指定范围的元素。

    bash复制

    LRANGE key start end

    示例:

    bash复制

    LRANGE fruits 0 -1

    输出:

    复制

    1) "apple"
    2) "banana"
    3) "orange"
  • LPOP:移除并返回列表的第一个元素。

    bash复制

    LPOP key

    示例:

    bash复制

    LPOP fruits

    输出:

    "apple"

3. 哈希(Hash)

哈希是一个键值对集合,适合存储对象。

常用命令

  • HSET:设置哈希表中字段的值。

    bash复制

    HSET key field value [field value ...]

    示例:

    bash复制

    HSET user:1 name "Kimi" age 25
  • HGET:获取哈希表中字段的值。

    bash复制

    HGET key field

    示例:

    bash复制

    HGET user:1 name

    输出:

    "Kimi"

  • HGETALL:获取哈希表中所有字段和值。

    bash复制

    HGETALL key

    示例:

    bash复制

    HGETALL user:1

    输出:

    复制

    1) "name"
    2) "Kimi"
    3) "age"
    4) "25"

4. 集合(Set)

集合是一个无序的字符串集合,支持集合运算。

常用命令

  • SADD:向集合中添加元素。

    bash复制

    SADD key member [member ...]

    示例:

    bash复制

    SADD colors "red" "green" "blue"
  • SMEMBERS:获取集合中的所有元素。

    bash复制

    SMEMBERS key

    示例:

    bash复制

    SMEMBERS colors

    输出:

    复制

    1) "red"
    2) "green"
    3) "blue"
  • SISMEMBER:判断元素是否在集合中。

    bash复制

    SISMEMBER key member

    示例:

    bash复制

    SISMEMBER colors "green"

    输出:

    1

  • SUNION:获取多个集合的并集。

    bash复制

    SUNION key1 [key2 ...]

    示例:

    bash复制

    SADD colors2 "yellow" "blue"
    SUNION colors colors2

    输出:

    复制

    1) "red"
    2) "green"
    3) "blue"
    4) "yellow"

5. 有序集合(Sorted Set)

有序集合是一个带有分数的字符串集合,元素按分数排序。

常用命令

  • ZADD:向有序集合中添加元素。

    bash复制

    ZADD key score1 member1 [score2 member2 ...]

    示例:

    bash复制

    ZADD scores 100 "Alice" 90 "Bob" 80 "Charlie"
  • ZRANGE:获取有序集合中指定范围的元素。

    bash复制

    ZRANGE key start end [WITHSCORES]

    示例:

    bash复制

    ZRANGE scores 0 -1 WITHSCORES

    输出:

    复制

    1) "Charlie"
    2) "80"
    3) "Bob"
    4) "90"
    5) "Alice"
    6) "100"
  • ZSCORE:获取有序集合中元素的分数。

    bash复制

    ZSCORE key member

    示例:

    bash复制

    ZSCORE scores "Bob"

    输出:

    "90"

6. 位图(Bitmap)

位图是一个由二进制位组成的数组,适合存储布尔值。

常用命令

  • SETBIT:设置位图中指定位置的值。

    bash复制

    SETBIT key offset value

    示例:

    bash复制

    SETBIT bitmap 0 1
    SETBIT bitmap 1 0
    SETBIT bitmap 2 1
  • GETBIT:获取位图中指定位置的值。

    bash复制

    GETBIT key offset

    示例:

    bash复制

    GETBIT bitmap 1

    输出:

    0

  • BITCOUNT:统计位图中值为1的位数。

    bash复制

    BITCOUNT key

    示例:

    bash复制

    BITCOUNT bitmap

    输出:

    2

7. HyperLogLog

HyperLogLog用于统计唯一元素的个数,适合处理大数据量。

常用命令

  • PFADD:向HyperLogLog中添加元素。

    bash复制

    PFADD key element [element ...]

    示例:

    bash复制

    PFADD visitors "Alice" "Bob" "Charlie"
  • PFCOUNT:获取HyperLogLog中唯一元素的个数。

    bash复制

    PFCOUNT key

    示例:

    bash复制

    PFCOUNT visitors

    输出:

    3

8. 流(Stream)

流是一种日志数据结构,支持多消费者组。

常用命令

  • XADD:向流中添加消息。

    bash复制

    XADD key MAXLEN count * field1 value1 [field2 value2 ...]

    示例:

    bash复制

    XADD mystream MAXLEN 100 * message "Hello" user "Kimi"
  • XRANGE:获取流中的消息。

    bash复制

    XRANGE key start end [COUNT count]

    示例:

    bash复制

    XRANGE mystream - +
  • XREADGROUP:读取消费者组中的消息。

    bash复制

    XREADGROUP GROUP group consumer COUNT count STREAMS key [ID]

    示例:

    bash复制

    XREADGROUP GROUP mygroup myconsumer COUNT 1 STREAMS mystream >

以上是Redis的主要数据类型及其使用示例,每种数据类型都有其独特的应用场景,可以根据实际需求选择合适的类型。

Lua脚本在Redis中的使用

一、说明

Redis 支持在服务器端运行 Lua 脚本,这使得用户可以在 Redis 中执行复杂的操作,而无需多次往返于客户端和服务器之间。Lua 脚本可以对 Redis 的数据进行批量处理、逻辑判断等操作,提高性能和效率。

二、使用示例

1. 基本语法

Lua 脚本可以通过 EVAL 命令在 Redis 中执行。EVAL 命令的语法如下:

bash复制

EVAL script numkeys key [key ...] arg [arg ...]
  • script:Lua 脚本内容。

  • numkeys:键的数量。

  • key [key ...]:键的名称。

  • arg [arg ...]:传递给脚本的参数。

2. 示例:批量设置键值

假设需要批量设置多个键的值,可以通过 Lua 脚本来实现:

bash复制

EVAL "for i=1,#ARGV do redis.call('SET', KEYS[i], ARGV[i]) end" 3 key1 key2 key3 value1 value2 value3

解释:

  • KEYS 表示键的列表,ARGV 表示参数列表。

  • #ARGV 获取参数列表的长度。

  • redis.call 调用 Redis 命令。

3. 示例:原子操作

Lua 脚本在 Redis 中是原子执行的,可以用于实现复杂的原子操作。例如,实现一个简单的计数器,当计数器达到某个阈值时执行特定操作:

bash复制

EVAL "local count = redis.call('INCR', KEYS[1]); if count > tonumber(ARGV[1]) then return 'Threshold exceeded' else return count end" 1 counter 10

解释:

  • INCR 命令对计数器进行加1操作。

  • tonumber(ARGV[1]) 将参数转换为数字。

  • 如果计数器超过阈值(10),返回特定消息。

4. 示例:批量删除键

假设需要删除多个键,可以通过 Lua 脚本来实现:

bash复制

EVAL "for i=1,#KEYS do redis.call('DEL', KEYS[i]) end" 3 key1 key2 key3

解释:

  • 遍历 KEYS 列表中的每个键,并调用 DEL 命令删除。

5. 示例:复杂的逻辑判断

假设需要根据条件更新多个键的值,可以通过 Lua 脚本来实现:

bash复制

EVAL "if redis.call('EXISTS', KEYS[1]) == 1 then redis.call('SET', KEYS[1], ARGV[1]); return 'Updated' else return 'Key does not exist' end" 1 key1 value1

解释:

  • 使用 EXISTS 命令检查键是否存在。

  • 如果键存在,则更新键的值并返回“Updated”。

  • 如果键不存在,则返回“Key does not exist”。

三、注意事项

  1. 性能优化:Lua 脚本在 Redis 中是原子执行的,但过长的脚本可能会阻塞服务器。尽量保持脚本简洁高效。

  2. 调试:可以在本地测试 Lua 脚本,确保其逻辑正确后再部署到 Redis 中。

  3. 安全性:避免在生产环境中执行用户输入的 Lua 脚本,防止潜在的安全风险。

通过 Lua 脚本,Redis 可以实现更复杂的操作逻辑,提高数据处理的效率和灵活性。

Redis SCRIPT LOAD 使用示例

一、SCRIPT LOAD 简介

SCRIPT LOAD 是 Redis 提供的一个命令,用于将 Lua 脚本加载到 Redis 服务器中。加载后的脚本会被存储在服务器的脚本缓存中,后续可以通过脚本的 SHA1 校验和来调用该脚本,而无需再次发送脚本内容。这种方式可以显著提高性能,尤其是在脚本较长或调用频繁的场景下。

二、使用步骤

1. 加载脚本

使用 SCRIPT LOAD 命令将 Lua 脚本加载到 Redis 服务器中,并获取脚本的 SHA1 校验和:

bash复制

SCRIPT LOAD <script>
  • <script>:Lua 脚本内容。

2. 调用脚本

加载完成后,可以通过 EVALSHA 命令使用脚本的 SHA1 校验和来调用该脚本:

bash复制

EVALSHA <sha1> <numkeys> [key [key ...]] [arg [arg ...]]
  • <sha1>:脚本的 SHA1 校验和。

  • <numkeys>:键的数量。

  • [key [key ...]]:键的名称。

  • [arg [arg ...]]:传递给脚本的参数。

三、使用示例

示例 1:批量设置键值对

1. 加载脚本

假设有一个 Lua 脚本用于批量设置键值对:

lua复制

for i = 1, #ARGV do
    redis.call('SET', KEYS[i], ARGV[i])
end

使用 SCRIPT LOAD 命令加载该脚本:

bash复制

SCRIPT LOAD "for i = 1, #ARGV do redis.call('SET', KEYS[i], ARGV[i]) end"

返回值示例:

"5f4dcc3b5aa765d61d8327deb882cf99"

这个返回值是脚本的 SHA1 校验和。

2. 调用脚本

使用 EVALSHA 命令调用加载的脚本:

bash复制

EVALSHA 5f4dcc3b5aa765d61d8327deb882cf99 3 key1 key2 key3 value1 value2 value3
  • 5f4dcc3b5aa765d61d8327deb882cf99 是脚本的 SHA1 校验和。

  • 3 表示有 3 个键。

  • key1 key2 key3 是键的名称。

  • value1 value2 value3 是对应的值。

示例 2:原子计数器

1. 加载脚本

假设有一个 Lua 脚本用于实现一个原子计数器:

lua复制

local count = redis.call('INCR', KEYS[1])
if count > tonumber(ARGV[1]) then
    return 'Threshold exceeded'
else
    return count
end

使用 SCRIPT LOAD 命令加载该脚本:

bash复制

SCRIPT LOAD "local count = redis.call('INCR', KEYS[1]); if count > tonumber(ARGV[1]) then return 'Threshold exceeded' else return count end"

返回值示例:

"e4d7f1b3a3a3b3c3d3e3f3g3h3i3j3k3"

2. 调用脚本

使用 EVALSHA 命令调用加载的脚本:

bash复制

EVALSHA e4d7f1b3a3a3b3c3d3e3f3g3h3i3j3k3 1 counter 10
  • e4d7f1b3a3a3b3c3d3e3f3g3h3i3j3k3 是脚本的 SHA1 校验和。

  • 1 表示有 1 个键。

  • counter 是键的名称。

  • 10 是阈值参数。

四、注意事项

1. 脚本缓存

  • Redis 会自动缓存加载的脚本,因此后续调用时可以直接使用 EVALSHA

  • 如果脚本未加载,调用 EVALSHA 时会返回错误。可以使用 SCRIPT EXISTS 命令检查脚本是否已加载:

    bash复制

    SCRIPT EXISTS <sha1>

2. 错误处理

  • 如果脚本执行失败,Redis 会返回错误信息。建议在脚本中添加适当的错误处理逻辑。

3. 性能优势

  • 使用 SCRIPT LOADEVALSHA 可以显著减少网络传输和解析脚本的时间,提高性能。

通过 SCRIPT LOADEVALSHA,Redis 可以高效地执行 Lua 脚本,适用于复杂的逻辑操作和高频调用场景。


评论