环境搭建
# 下载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:
下载 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
编译并安装:
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
表示每个主节点有一个从节点。
五、验证集群状态
查看集群节点信息:
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 ...
检查集群状态:
bash复制
redis-cli -p 7000 cluster info
如果返回结果中的
cluster_state
为ok
,则表示集群状态正常。
六、集群管理
添加节点:
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”。
三、注意事项
性能优化:Lua 脚本在 Redis 中是原子执行的,但过长的脚本可能会阻塞服务器。尽量保持脚本简洁高效。
调试:可以在本地测试 Lua 脚本,确保其逻辑正确后再部署到 Redis 中。
安全性:避免在生产环境中执行用户输入的 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 LOAD
和EVALSHA
可以显著减少网络传输和解析脚本的时间,提高性能。
通过 SCRIPT LOAD
和 EVALSHA
,Redis 可以高效地执行 Lua 脚本,适用于复杂的逻辑操作和高频调用场景。