redis
Redis配置
Redis安装
yum install gcc automake autoconf libtool make -y && mkdir -p /apps/redis/{etc,bin,data,logs,run}
cd /usr/local/src/ && wget https://repo.huaweicloud.com/redis/redis-6.2.2.tar.gz
tar -xf redis-6.2.2.tar.gz
cd redis-6.2.2
make PREFIX=/apps/redis install
cp redis.conf /apps/redis/etc/
useradd -s /sbin/nologin redis
ln -s /apps/redis/bin/redis-* /usr/bin/
chown -R redis.redis /apps/redis
编辑service文件
cat > /usr/lib/systemd/system/redis.service <<EOF
[Unit]
Description=Redis persistent key-value database
After=network.target
After=network-online.target
Wants=network-online.target
[Service]
Type=notify
ExecStart=/apps/redis/bin/redis-server /apps/redis/etc/redis.conf --supervised systemd
ExecStop=/bin/kill -s TERM \$MAINPID
LimitNOFILE=100000
User=redis
Group=redis
RuntimeDirectory=redis
RuntimeDirectoryMode=0755
[Install]
WantedBy=multi-user.target
EOF
编辑配置文件
bind 0.0.0.0
port 6379
tcp-backlog 511
timeout 30
tcp-keepalive 300
daemonize yes
pidfile /apps/redis/run/redis_6379.pid
loglevel notice
logfile "/apps/redis/logs/redis.log"
databases 16
always-show-logo no
dir /apps/redis/data
dbfilename dump.rdb
rdbcompression yes
rdbchecksum yes
stop-writes-on-bgsave-error no
save 900 1
save 300 10
save 60 1000
maxclients 10000
maxmemory 1073741824
修改内核参数
vm.overcommit_memory = 1
net.core.somaxconn = 512
启动Redis
systemctl start redis
Redis持久化配置
-
配置RDB持久化
cat >> /data/6379/redis.conf << EOF dir "/data/6379" # 数据存放目录 dbfilename "dump.rdb" # 数据文件名称 rdbcompression yes # 是否压缩,默认为yes 采用LZF压缩 设置为no可以节省CPU,但是会使文件变得巨大 rdbchrcksum yes # 是否进行RDB数据校验(校验在读写时均进行),设置为no可以节省10%时间消耗,但是存储的数据有损坏风险 stop-write-on-bgsave-err yes # 后台持久化过程中如果出现错误现象,是否停止保存操作。 save 900 1 # 900s内有1次更改则进行一次保存 save 300 10 # 300s内有10次更改则进行一次保存 save 60 10000 # 60s内有10000次更改则进行一次保存 EOF
- 特点:可以在指定的时间间隔内生成数据集的时间点快照(point-in-time snapshot)
- 优点:
- RDB是一个紧凑压缩的二进制文件,存储效率高
- RDB内部存储的是Redis在某个时间点的数据快照,非常适合数据备份,全量复制等场景
- RDB恢复数据的速度比AOF快很多
- 缺点:
- 无法做到实时持久化,具有较大的可能性丢失数据
- bgsave指令每次运行需要执行fork()函数创建子进程,需要牺牲一些性能
- Redis的众多版本中未进行RDB文件格式的版本同一,有可能出现个版本服务之间数据格式无法兼容的现象
- 应用:
- 服务器每隔一段时间执行bgsave备份,并将RDB文件拷贝到远程机器中用于灾难恢复。
-
配置AOF持久化
cat >> /data/6379/redis.conf << EOF appendonly yes # appendfsync always # 每次操作执行落盘 appendfsync everysec # 每秒执行落盘 # appendfsync no # 交由系统执行落盘 EOF
-
AOF重写规则
- 进程内已经超时的数据不再写入
- 忽略无效指令,重写时使用进程内数据直接生成,新的AOF文件值保留最终数据写入的命令
- 对同一数据的多条命令合并为一条命令(为防止数据量过大造成客户端缓冲区溢出,对list、set、hash、zset等类型,每条指令最多写入64个元素)
- 手动重写
bgrewriteaof
- 自动重写
- 自动重写参数
auto-aof-rewrite-min-size size auth-aof-rewrite-percentage percentage%
- 自动重写参数对比条件
aof_current_size aof_base_size
- 自动重写触发条件
- aof_current_size > auto-aof-rewrite-min-size
- aof_base_size/(aof_current_size-aof_base_size) >= auth-aof-rewrite-percentage
- 自动重写参数
-
特点:记录服务器执行的所有写操作命令,并在服务器启动时,通过重新执行这些命令来还原数据集,AOF文件中的命令全部以Redis协议的格式来保存,新命令会被追加到文件的末尾
-
优点:可以最大程度保证数据不丢
-
缺点:日志记录量级比较大
-
-
两种持久化方式的区别
- RDB:基于快照的持久化,速度更快,一般用作备份,主从复制也是依赖于rdb持久化功能
- AOF:以追加的方式记录redis操作日志的文件。可以最大程度的保证redis数据安全,类似于mysql的binlog
-
RDB与AOF如何选择
- 对数据非常敏感,优先使用AOF everysec持久化策略,在该策略下Redis仍然可以保持很好的性能,出现问题时最多丢失1s的数据(AOF文件较大,恢复较慢)
- 数据呈现阶段有效性,优先使用RDB持久化策略,在该策略下Redis可以做到阶段性数据持久化,且恢复速度较快
- 综合
- RDB与AOF各有利弊
- AOF数据相对于RDB更加安全
- RDB相对于AOF在大数据集恢复时速度更快
- 灾难恢复选择RDB
- 可以同时开启RDB与AOF,重启后优先使用AOF来恢复数据,降低丢失的数据量
Redis数据类型
String数据类型的操作
操作 | 描述 |
---|---|
set | 添加/修改数据 |
get | 获取数据 |
del | 删除数据 |
mset | 添加/修改多个数据 |
mget | 获取多个数据 |
strlen | 获取数据字符个数(字符串长度) |
append | 追加信息到原始信息的尾部(如果不存在则新建)返回长度 |
incr | 设置数值数据增加1 |
incrby | 设置数值数据增加指定的值(整数) |
incrbyfloat | 设置数值数据增加指定的值(浮点数) |
decr | 设置数值数据减少1 |
incrby | 设置数值数据减少指定的值(整数) |
setex | 设置数据有指定的生命周期(s) |
psetex | 设置数据有指定的生命周期(ms) |
String数据类型注意事项
- nil代表空值
- 单个value最大512MB
- 数值计算最大范围9223372036854775807
- key命名规则 表名:主键名:主键值:属性名 = value
Hash数据类型的操作
操作 | 描述 |
---|---|
hset | 添加/修改数据 |
hget | 获取数据 |
hmset | 添加/修改多个数据 |
hmget | 获取多个数据 |
hdel | 删除数据 |
hlen | 获取哈希表中字段的数量 |
hexists | 获取哈希表中是否存在指定的字段 |
hkeys | 获取哈希表中所有的字段名 |
hvalues | 获取哈希表中所有的字段值 |
hincrby | 设置指定字段的数值数据增加指定的值(整数) |
hincrbyfloat | 设置指定字段的数值数据增加指定的值(浮点数) |
hsetnx | 如果字段内有值则不操作 |
Hash数据类型注意事项
- Hash 类型下的vlaue只能存储字符串,不允许存储其他数据类型,不存在嵌套,如果入局未找到对应的值为nil
- 每个Hash可以存储2^32 - 1 个键值对
- hgetall操作可以获取全部属性,如果内部字段过多,遍历整体数据效率会很低,可能会成为数据访问的瓶颈
List数据类型的操作(双向链表)
操作 | 描述 |
---|---|
lpush | 添加/修改数据(左进) |
rpush | 添加/修改数据(右进) |
lrange | 根据范围获取数据 |
lindex | 根据index获取数据 |
llen | 获取长度 |
lpop | 获取并移除数据(左出) |
rpop | 获取并移除数据(右出) |
blpop | 获取并移除数据,如果列表内没有数据则等待指定时间(左出) |
brpop | 获取并移除数据,如果列表内没有数据则等待指定时间(右出) |
lrem | 移除指定数据 |
List数据类型注意事项
- List中保存的数据都是string类型
- 每个List可以存储2^32 - 1 个元素
- List具有索引的概念,但是操作数据时通常以队列的形式进行入队出队操作,或以入栈的形式进行入栈出栈操作
Set数据类型的操作
操作 | 描述 |
---|---|
sadd | 添加数据 |
smembers | 获取全部数据 |
srem | 删除数据 |
scard | 获取集合的数据总量 |
sismember | 判断集合中是否包含指定数据 |
srandemember | 随机获取集合中指定数量的数据 |
spop | 随机获取集合中的某个数据并将该数据移出集合 |
sinter | 取出集合的交集 |
sunion | 取出集合的并集 |
sdiif | 取出集合的差集 |
sinterstore | 取出集合的交集并存储到指定的集合中 |
sunionstore | 取出集合的并集并存储到指定的集合中 |
sdiifstore | 取出集合的差集并存储到指定的集合中 |
smove | 将指定数据从原始集合移动到目标集合中 |
Sorted_Set数据类型的操作
操作 | 描述 |
---|---|
zadd | 添加数据 |
zrange | 获取全部数据(正序) |
zrevrange | 获取全部数据(倒序) |
zrem | 删除数据 |
zrangebyscore | 按照条件获取数据(正序) |
zrevrangebyscore | 按照条件获取数据(倒序) |
zremrangebyrank | 按照索引删除数据 |
zremrangebyscore | 按照条件删除数据 |
zcard | 获取集合数据总量 |
zcount | 根据条件获取集合数据总量 |
zinterstore | 交集操作 |
zunionstore | 并集操作 |
zrank | 获取数据对应的索引(正序) |
zrevrank | 获取数据对应的索引(倒序) |
zscore | 获取score值 |
zincrby | 修改score值 |
通用命令
Key通用命令
操作 | 描述 |
---|---|
del | 删除指定key |
exists | 判断key是否存在 |
type | 获取key的类型 |
expire | 为key设置有效期(s) |
pexpire | 为key设置有效期(ms) |
expireat | 为key设置有效期(s),使用timestamp |
pexpireat | 为key设置有效期(ms),使用timestamp |
ttl | 获取key的有效期(s) |
pttl | 获取key的有效期(ms) |
persist | 切换key的时效性转为永久性 |
keys | 查询key(支持通配符) |
rename | 修改key名称 |
renamenx | 如果目标名称存在则失败 |
sort | 对所有key排序 |
help @generic | 其他key通用操作 |
数据库通用命令
操作 | 描述 |
---|---|
select | 切换数据库 |
echo | 打印消息 |
ping | 打印消息 |
move | 移动数据到指定DB |
dbsize | 获取keys数量 |
flushdb | 清除当前数据库的数据 |
flushall | 清除所有数据库的数据 |
info | 查询信息 |
client list | 列出客户端 |
client kill | 踢出客户端 |
config get * | 查询配置项 |
config resetstat | 重置统计 |
config set | 动态修改 |
config rewrite | 保存修改到配置文件 |
monitor | 监控实时指令 |
shutdown | 关闭服务器 |
save | 前台写入数据到磁盘 |
bgsave | 后台调用fork()函数开启子线程写入数据到磁盘 |
Redis事务(乐观锁)
事务的基本操作
- 开启事务(设定事务的开启位置,后续的所有指令加入到事务中)
multi
- 执行事务(设定事务的结束位置并执行队列中的所有指令,与multi成对出现)
exec
- 取消事务(取消当前事务的定义并取消所有在队列中的指令)
discard
Redis主从复制
RedisSlave需要开启持久化并设置和MASTER相同的密码,在Slave更换MASTER之后会删除之前的所有数据,重新从新的MASTER同步数据。但当断开同步关系之后不会删除当前已经同步过的数据。
配置主从复制在5.0版本之后命令发生变化,使用replicaof masterIP port
,在5.0之前的版本用的命令是slaveof命令,配置文件内也使用此选项。
config set masterauth password
将配置保存到redis配置文件
echo -e "replicaof ip port\nasterauth password" >> /apps/redis/etc/redis.conf
查看slave状态可以使用info replication
# Replication
role:slave # 当前redis的角色
master_host:172.20.1.101
master_port:6379
master_link_status:up # master 连接状态
master_last_io_seconds_ago:2 # 检测master状态倒计时 repl-ping-replica-period选项定义,默认10
master_sync_in_progress:0 # 同步状态
slave_repl_offset:545
slave_priority:100 # 优先级
slave_read_only:1 # 只读
replica_announced:1
connected_slaves:0 # 已连接的从节点数
master_failover_state:no-failover
master_replid:dd2749f5a4e443ba9cf5203d5386e34043db11aa
master_replid2:0000000000000000000000000000000000000000
master_repl_offset:545
second_repl_offset:-1
repl_backlog_active:1
repl_backlog_size:1048576
repl_backlog_first_byte_offset:1
repl_backlog_histlen:545
redis-Cluster配置
- 创建集群之前需要修改配置文件打开cluster-enabled yes cluster-config-file filename
redis-cli -a 123456 --cluster create --cluster-replicas 1 172.20.1.1:6379 172.20.1.2:6379 172.20.1.3:6379 172.20.1.4:6379 172.20.1.5:6379 172.20.1.6:6379
>>> Performing hash slots allocation on 6 nodes...
Master[0] -> Slots 0 - 5460
Master[1] -> Slots 5461 - 10922
Master[2] -> Slots 10923 - 16383
Adding replica 172.20.1.5:6379 to 172.20.1.1:6379
Adding replica 172.20.1.6:6379 to 172.20.1.2:6379
Adding replica 172.20.1.4:6379 to 172.20.1.3:6379
M: cb6ed6788013b82422dde56426b49c458c8443f4 172.20.1.1:6379
slots:[0-5460] (5461 slots) master
M: 7662cfc1db4c64e8d55e58f8587c587756741b8e 172.20.1.2:6379
slots:[5461-10922] (5462 slots) master
M: ab658b879f482b1840aa4af9e64ed65dee687c06 172.20.1.3:6379
slots:[10923-16383] (5461 slots) master
S: 1b97b4a960fb82a4c14b00fe69181364e34dc11f 172.20.1.4:6379
replicates ab658b879f482b1840aa4af9e64ed65dee687c06
S: cddafbed60a366bb525e4d76f94c5126108cddd1 172.20.1.5:6379
replicates cb6ed6788013b82422dde56426b49c458c8443f4
S: 925c64a13537e2403922de354ce7db5468401462 172.20.1.6:6379
replicates 7662cfc1db4c64e8d55e58f8587c587756741b8e
Can I set the above configuration? (type ‘yes‘ to accept): yes
>>> Nodes configuration updated
>>> Assign a different config epoch to each node
>>> Sending CLUSTER MEET messages to join the cluster
Waiting for the cluster to join
.
>>> Performing Cluster Check (using node 172.20.1.1:6379)
M: cb6ed6788013b82422dde56426b49c458c8443f4 172.20.1.1:6379
slots:[0-5460] (5461 slots) master
1 additional replica(s)
S: cddafbed60a366bb525e4d76f94c5126108cddd1 172.20.1.5:6379
slots: (0 slots) slave
replicates cb6ed6788013b82422dde56426b49c458c8443f4
M: 7662cfc1db4c64e8d55e58f8587c587756741b8e 172.20.1.2:6379
slots:[5461-10922] (5462 slots) master
1 additional replica(s)
S: 925c64a13537e2403922de354ce7db5468401462 172.20.1.6:6379
slots: (0 slots) slave
replicates 7662cfc1db4c64e8d55e58f8587c587756741b8e
S: 1b97b4a960fb82a4c14b00fe69181364e34dc11f 172.20.1.4:6379
slots: (0 slots) slave
replicates ab658b879f482b1840aa4af9e64ed65dee687c06
M: ab658b879f482b1840aa4af9e64ed65dee687c06 172.20.1.3:6379
slots:[10923-16383] (5461 slots) master
1 additional replica(s)
[OK] All nodes agree about slots configuration.
>>> Check for open slots...
>>> Check slots coverage...
[OK] All 16384 slots covered.
- 为slave配置masterauth
redis-cli
auth 123456
info replication
config set masterauth 123456
- 修改配置文件添加masterauth选项
masterauth 123456