Redis
一个基于key-value类型的数据库
1、安装
下载
http://download.redis.io/releases/
VERSION=redis-7.23
PASSWORD=123456
INSTALL_DIR=/apps/redis
color () {
RES_COL=60
MOVE_TO_COL="echo -en \\033[${RES_COL} G"
SETCOLOR_SUCCESS="echo -en \\033[1;32m"
SETCOLOR_FAILURE="echo -en \\033[1;31m"
SETCOLOR_WARNING="echo -en \\033[1;33m"
SETCOLOR_NORMAL="echo -en \E[0m"
echo -n "$1 " && $MOVE_TO_COL
echo -n "["
if [ $2 = "success" -o $2 = "0" ] ;then
${SET1COLOR_SUCCESS}
echo -n $"OK"
elif [ $2 = "failure" -o $2 = "1" ] ;then
${SETCOLOR_FAILURE}
echo -n $"FAILED"
else
${SETCOLOR_WARNING}
echo -n $"WARNING"
fi
${SETCOLOR_NORMAL}
echo -n "]"
echo
}
install () {
yum -y install gcc jemalloc-devel || { color "安装软件包失败,请检查网络配置" 1;
exit ; }
tar xf ${VERSION} .tar.gz
cd ${VERSION}
make -j 4 PREFIX=${INSTALL_DIR} install && color "Redis 编译安装完成" 0 || { color "Redis 编译安装失败" 1 ;exit ; }
ln -s ${INSTALL_DIR} /bin/redis-* /usr/bin/
mkdir -p ${INSTALL_DIR} /{etc,log ,data,run}
cp redis.conf ${INSTALL_DIR} /etc/
sed -i -e 's/bind 127.0.0.1/bind 0.0.0.0/' -e "/# requirepass/a requirepass $PASSWORD " -e "/^dir .*/c dir ${INSTALL_DIR} /data/" -e "/logfile .*/c logfile ${INSTALL_DIR} /log/redis-6379.log" -e "/^pidfile .*/c pidfile ${INSTALL_DIR} /run/redis_6379.pid" ${INSTALL_DIR} /etc/redis.conf
if id redis &> /dev/null ;then
color "Redis 用户已存在" 1
else
useradd -r -s /sbin/nologin redis
color "Redis 用户创建成功" 0
fi
chown -R redis.redis ${INSTALL_DIR}
cat >> /etc/sysctl.conf <<EOF
net.core.somaxconn = 1024
vm.overcommit_memory = 1
EOF
sysctl -p
echo 'echo never > /sys/kernel/mm/transparent_hugepage/enabled' >> /etc/rc.d/rc.local
chmod +x /etc/rc.d/rc.local
/etc/rc.d/rc.local
cat > /usr/lib/systemd/system/redis.service <<EOF
[Unit]
Description=Redis persistent key-value database
After=network.target
[Service]
ExecStart=${INSTALL_DIR}/bin/redis-server ${INSTALL_DIR}/etc/redis.conf --supervised systemd
ExecStop=/bin/kill -s QUIT \$MAINPID
#Type=notify
User=redis
Group=redis
RuntimeDirectory=redis
RuntimeDirectoryMode=0755
[Install]
WantedBy=multi-user.target
EOF
systemctl daemon-reload
systemctl enable --now redis &> /dev/null && color "Redis 服务启动成功,Redis信息如下:" 0 || { color "Redis 启动失败" 1 ;exit ; }
redis-cli -a $PASSWORD INFO Server 2> /dev/null
}
install
1.1 多实例
tree /apps/redis
/apps/redis
├── bin
│ ├── redis-benchmark
│ ├── redis-check-aof -> redis-server
│ ├── redis-check-rdb -> redis-server
│ ├── redis-cli
│ ├── redis-sentinel -> redis-server
│ └── redis-server
├── data
│ └── dump.rdb
├── etc
│ └── redis.conf
├── log
│ └── redis-6379.log
└── run
└── redis_6379.pid
sed -ir 's#6379#6380#g' redis6380.conf
sed -ir 's#6379#6381#g' redis6381.conf
sed -ir 's#dump.rdb#dump6380.rdb#' redis6380.conf
sed -ir 's#dump.rdb#dump6381.rdb#' redis6381.conf
sed -ir 's#appendonly.aof#appendonly6380.aof#' redis6380.conf
sed -ir 's#appendonly.aof#appendonly6381.aof#' redis6381.conf
cp -p /lib/systemd/system/redis.service /lib/systemd/system/redis6380.service
cp -p /lib/systemd/system/redis.service /lib/systemd/system/redis6381.service
sed -ir 's#redis.conf#redis6380.conf#' /lib/systemd/system/redis6380.service
sed -ir 's#redis.conf#redis6381.conf#' /lib/systemd/system/redis6381.service
tree /apps/redis
.
└── redis
├── bin
│ ├── redis-benchmark
│ ├── redis-check-aof -> redis-server
│ ├── redis-check-rdb -> redis-server
│ ├── redis-cli
│ ├── redis-sentinel -> redis-server
│ └── redis-server
├── data
│ ├── dump6380.rdb
│ ├── dump6381.rdb
│ └── dump.rdb
├── etc
│ ├── redis6380.conf
│ ├── redis6381.conf
│ └── redis.conf
├── log
│ ├── redis-6379.log
│ ├── redis-6380.log
│ └── redis-6381.log
└── run
├── redis_6379.pid
├── redis_6380.pid
└── redis_6381.pid
2、配置
2.1 配置信息详解
bind 0.0.0.0
protected-mode yes
port 6379
tcp-backlog 511
timeout 0
tcp-keepalive 300
daemonize no
supervised no
pidfile /var/run/redis.pid
loglevel notice
logfile "/path/redis.log"
databases 16
always-show-logo yes
save 900 1
save 300 10
save 60 10000
stop-writes-on-bgsave-error yes
rdbcompression yes
rdbchecksum yes
dbfilename dump.rdb
dir ./
replicaof <masterip> <masterport>
masterauth <master-password>
replica-serve-stale-data yes
1、设置为yes (默认设置),从库会继续响应客户端的读请求,此为建议值
2、设置为no,除去特定命令外的任何请求都会返回一个错误"SYNC with master in progress" 。
replica-read-only yes
repl-diskless-sync no
1、基于硬盘(disk-backed):为no时,master创建一个新进程dump生成RDB磁盘文件,RDB完成之后由父进程(即主进程)将RDB文件发送给slaves,此为默认值
2、基于socket(diskless):master创建一个新进程直接dump RDB至slave的网络socket,不经过主进程和硬盘
repl-diskless-sync-delay 5
repl-ping-replica-period 10
repl-timeout 60
repl-disable-tcp-nodelay no
repl-backlog-size 512mb
repl-backlog-ttl 3600
replica-priority 100
min-replicas-to-write 3
min-replicas-max-lag 10
requirepass foobared
rename-command
maxclients 10000
maxmemory <bytes>
appendonly no
appendfilename "appendonly.aof"
appendfsync everysec
no-appendfsync-on-rewrite no
auto-aof-rewrite-percentage 100
auto-aof-rewrite-min-size 64mb
aof-load-truncated yes
aof-use-rdb-preamble no
ua-time-limit 5000
cluster-enabled yes
cluster-config-file nodes-6379.conf
cluster-node-timeout 15000
cluster-replica-validity-factor 10
cluster-migration-barrier 1
cluster-require-full-coverage yes
CLUSTERDOWN The cluster is down的提示,cluster_state:fail,但ping 仍PONG),而no则可以继续使用,但是会出现查询数据查不到的情况(因为有数据丢失)。生产建议为no
cluster-replica-no-failover no
slowlog-log-slower-than 10000
slowlog-max-len 128
2.2 动态修改配置
2.2.1 获取当前配置
CONFIG GET *
CONFIG GET requirepass
2.2.2 修改配置
CONFIG SET parameter value
config set requirepass 12345678
2.3 数据持久化
2.3.1 rdb模式
2.3.1.1 介绍
RDB(Redis DataBase):基于时间的快照,其默认只保留当前最新的一次快照,特点是执行速度比较快,缺点是可能会丢失从上次快照到当前时间点之间未做快照的数据
redis 生成一个子进程用来生成一个临时备份文件,当备份完成后覆盖原有的rbd文件
2.3.1.2 实现
save: 同步,会阻赛其它命令,不推荐使用
bgsave: 异步后台执行,不影响其它命令的执行
自动: 制定规则,自动执行
#! /bin/bash
BACKUP=/backup/redis-rdb
DIR=/data/redis
FILE=dump_6379.rdb
PASS=123456
color () {
RES_COL=60
MOVE_TO_COL="echo -en \\033[${RES_COL} G"
SETCOLOR_SUCCESS="echo -en \\033[1;32m"
SETCOLOR_FAILURE="echo -en \\033[1;31m"
SETCOLOR_WARNING="echo -en \\033[1;33m"
SETCOLOR_NORMAL="echo -en \E[0m"
echo -n "$1 " && $MOVE_TO_COL
echo -n "["
if [ $2 = "success" -o $2 = "0" ] ;then
${SET1COLOR_SUCCESS}
echo -n $"OK"
elif [ $2 = "failure" -o $2 = "1" ] ;then
${SETCOLOR_FAILURE}
echo -n $"FAILED"
else
${SETCOLOR_WARNING}
echo -n $"WARNING"
fi
${SETCOLOR_NORMAL}
echo -n "]"
echo
}
redis-cli -h 127.0.0.1 -a $PASS --no-auth-warning bgsave
result=`redis-cli -a 123456 --no-auth-warning info Persistence |grep rdb_bgsave_in_progress| sed -rn 's/.*:([0-9]+).*/\1/p' `
until [ $result -eq 0 ] ;do
sleep 1
result=`redis-cli -a 123456 --no-auth-warning info Persistence |greprdb_bgsave_in_progress| sed -rn 's/.*:([0-9]+).*/\1/p' `
done
DATE=`date +%F_%H-%M-%S`
[ -e $BACKUP ] || { mkdir -p $BACKUP ; chown -R redis.redis $BACKUP ; }
mv $DIR /$FILE $BACKUP /dump_6379-${DATE} .rdb
color "Backup redis RDB" 0
vim /apps/redis/etc/redis.conf
save 60 3
2.3.2 aof模式
类似于mysql二进制文件
AOF默认为每秒钟 fsync一次,即将执行的命令保存到AOF文件当中,这样即使redis服务器发生故障的话最多只丢失1 秒钟之内的数据,也可以设置不同的fsync策略always,即设置每次执行命令的时候执行fsync,fsync会在后台执行线程,所以主线程可以继续处理用户的正常请求而不受到写入AOF文件的I /O影响
2.3.2.1 开启方法
config get appendonly
config set appendonly yes
vim /etc/redis.conf
appendonly yes
appendfilename "appendonly-${port} .aof"
appendfsync everysec
dir /path
no-appendfsync-on-rewrite yes
auto-aof-rewrite-percentage 100
auto-aof-rewrite-min-size 64mb
aof-load-truncated yes
BGREWRITEAOF
2.3.3 模式选择
如果主要充当缓存功能,或者可以承受数分钟数据的丢失, 通常生产环境一般只需启用RDB即可,此也是默认值如果数据需要持久保存,一点不能丢失,可以选择同时开启RDB和AOF一般不建议只开启AOF
3、使用
3.1 连接
redis-cli [-a PASSWORD]
redis-cli -h HOSTNAME/IP -p PORT [-a PASSWORD]
3.2. 数据库操作
3.2.1 info
redis-cli -a 123456 info
3.2.2 SELECT
redis 最多允许使用16个数据库
redis cluster 模式下不支持多个数据库
3.2.3 KEYS
keys *
keys k1
keys *k*
KEYS k?
KEYS k[12]9
3.2.4 BGSAVE
手动执行后台数据持久化操作
3.2.5 DBSIZE
返回所有key的数量
3.2.6 FLUSHDB
清空当前数据库数据
3.2.7 FLUSHALL
清空所有数据库数据
3.2.8 type
判断数据类型
3.3 数据操作
3.3.1 str类型
3.2.1 SET
添加或修改一个键值对
set name guquanheng
3.2.2 GET
获取一个key的值
get name
3.2.3 DEL
删除数据
DEL name [name1 ...]
3.2.4 M前缀
批量
MSET 批量设置
MGET 批量获取
3.2.5 APPEND
在value后面追加数据
set name gu
append name quanheng
get name
3.2.6 strlen
返回字符串长度
set name guquanheng
strlen name
3.2.7 exists
判断key是否存在
exists name
3.2.8 ttl
查看key 的过期时间
set fulifang nv ex 60
ttl fulifang
3.2.9 EXPIRE
重新设置ttl
expire fulifang 1000
3.2.10 PERSIST
取消ttl
persist fulifang
3.2.11 INCR, DECR, INCRBY,DECRBY
实现计数功能
incr 增长
decr 下降
incrby key step
decrby 和incrby相反
3.3.2. list类型
3.3.2.1 LPUSH|RPUSH
生成一个列表并添加数据
redis列表属于fifo,添加数据和读取数据相反
LPUSH key value [value …]
lpush name gu fu
3.3.2.2 LLEN
查看列表元素个数
3.3.2.3 lindex
使用索引获取列表中的元素
lindex name 1
3.3.2.4 lrange
批量获取元素
lrange name 0 -1
3.3.2.5 lset
修改指定位置的值
lset 2 java
3.3.2.6 lpop|rpop
从列表中弹出一个值
lpop name [2]
rpop
3.3.2.7 LTRIM
对列表进行切片,仅保留切出来的一部分
ltrim name 2 4
3.3.2.8 del
删除列表
del name
3.3.2.9 exists
判断是否存在
3.3.3 set类型
里面的数据,无序,不重复,支持集合操作
并集,交集
3.3.3.1 生成集合
SADD set1 v1 [v2 ...]
3.3.3.2 添加元素
sadd set1 v3
3.3.3.3 查看
SMEMBERS set1
3.3.3.4 删除
srem set1 v1
3.3.3.5 交集
取两个集合中都存在的数据
sadd tset1 v1 v2 v3
sadd tset2 v3 v4 v5
sinter tset1 tset2
3.3.3.6 差集
以第一参数为基准,去除和第二参数相同的数据
sdiff tset2 tset1
3.3.3.7 并集
将两个集合合并后去重
SUNION set1 set2
3.3.4 sortedset类型
有序集合,在集合基础上对其添加score(浮点数)用以实现排序,score可以重复,值不可以重复
3.3.4.1 生成
zadd tsset 10.2 v1 10.3 v2 10.4 v3 [score keyn ...]
3.3.4.2 查看
zrange tsset 0 -1
zrevrange tsset 0 -1
3.3.4.3 查看集合中元素个数
ZCARD tsset
3.3.4.4 查看某个具体数值排名
ZRANK tsset v3
3.3.4.5 查看某个具体数值的score
zscore tsset v3
3.3.4.6 删除元素
ZREM tsset v1 v2
3.3.6 hash类型
类似于字典,存放了多个k/v对
3.3.6.1 新建
hset hashname filed1 value1
hmset hashname filed1 value1 [filed2 value2 ...]
hset guquanheng age 21
3.3.6.2 查看
hgetall hashname
hget hashname filed
3.3.6.3 删除
hdel hashname filed
del hashname
4、集群
4.1 主从复制
4.1.1 主节点设置
禁止主服务器关闭持久化的同时自动启动 !!!!!!!!!!!!
4.1.2 从节点设置
1、开启持久化
2、设置和主节点相同密码
3、设置节点状态为从
replicaof 172.31.3.104 6379
config set masterauth 123456
vim redis.conf
masterauth 123456
replicaof 10.0.0.8 6379
info replication
4.1.3 主从解除
REPLICAOF no one
4.2 级联复制
只需根据架构将从的从指向从节点即可
4.3 哨兵模式
哨兵模式(sentine)是一种分布式的高可用系统,类似于mysq的MHA,可以实现主从切换
4.3.1 实现主从架构
vim redis.conf
masterauth "123456"
requirepass "123456"
replicaof 172.31.3.106 6379
systemctl enable --now redis
4.3.2 配置sentine
cp /root/redis-7.2.3/sentinel.conf etc/
vim sentinel.conf
bind 0.0.0.0
port 26379
daemonize yes
pidfile /apps/redis/run/redis-sentinel.pid
Logfile /apps/redis/log/sentinel_26379.log
sentinel monitor mymaster 172.31.3.106 6379 2
sentinel auth-pass mymaster 123456
sentinel down-after-milliseconds mymaster 15000
sentinel parallel-syncs mymaster 1
sentinel failover-timeout mymaster 180000
sentinel deny-scripts-reconfig yes
/apps/redis/bin/redis-sentinel /apps/redis/etc/sentinel.conf
4.3.3 验证
kill master 节点进程
tail -f sentinel.log
可以看到配置将自动修改,自动切换主节点,且重启进程后从节点将自动加入集群
4.4 redis-cluster
高性能分布式集群解决方案
通过slot槽位机制进行节点映射,提高并发量,每个node节点进行均分(可以不均分),使用crc16%16384后对数据进行分配保证落在集群槽位之上,有效解决单机的性能瓶颈
节点之间通过ping机制进行互联
不需要任何带代理进行转发,提升性能,使用时将所有ip配置
4.4.1 环境准备
172.31.3.104
172.31.3.105
172.31.3.106
172.31.3.107
172.31.3.108
172.31.3.109
172.31.3.10
ssh-copy-id $ip
http://download.redis.io/releases/
参考1、安装
---
- hosts: all
gather_facts: no
tasks:
- name: 复制文件
copy:
src: "{{ item }}"
dest: /root/
mode: 0755
with_items:
- /root/install_redis.sh
- /root/redis-7.2.3.tar.gz
- name: 执行脚本
shell: |
bash /root/install_redis.sh
tags:
- install
- name: 更换配置
shell: |
sed -i.bak -e 's/bind 127.0.0.1/bind 0.0.0.0/' -e '/masterauth/a masterauth 123456' -e '/# cluster-enabled yes/a cluster-enabled yes' -e '/# cluster-config-filenodes-6379.conf/a cluster-config-file nodes-6379.conf' -e '/cluster-require-full-coverage yes/c cluster-require-full-coverage no' /apps/redis/etc/redis.conf
tags:
- change_conf
- name: 重启服务
service:
name: redis
state: restarted
tags:
- restart_svc
ansible-playbook -i host/redis install_redis.yaml -t copy,install
4.4.2 配置
ansible-playbook -i host/redis install_redis.yaml -t change_conf
ansible-playbook -i host/redis tasks/install_redis.yaml -t restart_svc
4.4.3 创建集群
redis-cli --cluster help
redis-cli -a 123456 --cluster create 172.31.3.104:6379 172.31.3.105:6379 172.31.3.106:6379 172.31.3.107:6379 172.31.3.108:6379 172.31.3.109:6379 --cluster-replicas 1
redis-cli -a 123456 -c INFO replication
4.4.4 集群管理命令
# 查看集群
redis-cli cluster nodes
redis-cli -a 123456 CLUSTER INFO
redis-cli -a 123456 --cluster info 172.31 .3 .105 :6379
redis-cli -a 123456 --cluster check 172.31 .3 .105 :6379
4.4.5 验证数据写入
redis- cli - a 123456 - c - h 172.31 .3.104
4.4.6 模拟集群故障
将redis1机器关机,可以看的自动切换主服务器到从节点
将redis1开机,自动加入集群并成为从服务器
4.4.7 集群扩容
1、初始化节点并安装相同版本的redis
ansible-playbook -i host/redis -l 172.31.3.110,172.31.3.111 tasks/install_redis.yaml
2、添加节点到集群
redis-cli -a 123456 --cluster add-node 172.31.3.110:6379 172.31.3.104:6379
3、 重新分配槽位
redis-cli -a 123456 --cluster reshard
4、给master添加slave节点
redis-cli -a 123456 --cluster add-node 从节点ip:port <任意集群节点>:6379 --cluster-slave --cluster-master-id $id
4.4.8 集群节点缩容
1、查看集群状态
redis-cli -a 123456 --cluster check 172.31.3.104:6379
2、将要迁移的节点slot槽位迁移到保存的节点上
redis-cli -a 123456 --cluster reshard 172.31.3.104:6379 --cluster-slots 个数=要迁移的节点slot数量/剩余节点数 --cluster-from 迁移节点id --cluster-to 剩余节点id
3、 删除节点
redis-cli -a 123456 --cluster del-node 172.31.3.104:6379 $id
5、问题解决
5.1 慢查询
5.1.1 配置修改
vim redis.conf
slowlog-log-slower-than 1
slowlog-max-len 1024
5.1.2 查询慢查询信息
SLOWLOG LEN
SLOWLOG GET [n]
SLOWLOG RESET
5.2 主从架构下master宕机恢复
5.2.1 提升新主
多从架构下选择一个成为新主
1 、停止从节点角色
REPLICAOF no one
2 、从节点指向新主
SLAVEOF 172.31 .3 .106 6379
3 、宕机节点重新设置
replicaof 172.31 .3 .104 6379
config set masterauth 123456
6、优化
6.1 主从复制优化
repl-backlog-size 1mb
repl-backlog-ttl 3600
第一次全量复制不可避免,后续的全量复制可以利用小主节点(内存小),业务低峰时进行全量
节点运行ID不匹配:主节点重启会导致RUNID变化,可能会触发全量复制,可以利用故障转移,例如哨兵或集群,而从节点重启动,不会导致全量复制
复制积压缓冲区不足: 当主节点生成的新数据大于缓冲区大小,从节点恢复和主节点连接后,会导致全量复制.解决方法将repl-backlog-size 调大
一主多从更换为级联架构
集群状态进行分布式管理,避免节点宕机引起主节点全部挂掉
6.2 性能优化
repl-diskless-sync no
repl-diskless-sync-delay 5
repl-ping-slave-period 10
repl-timeout 60
repl-disable-tcp-nodelay no
master会立即发送同步数据,没有延迟,yes 关注性能,no关注redis服务中的数据一致性
repl-backlog-size 1mb
repl-backlog-ttl 3600
slave-priority 100
min-replicas-to-write 1
min-slaves-max-lag 20
7、消息队列
7.1 生产消费模型
利用列表进行传递消息,遵循FIFO
LPUSH testchnnel testmsg1
RPOP testchnnel
7.2 发布订阅模型
PUBLISH channel1 test1
SUBSCRIBE channel1
unsubscribe channel1
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 25岁的心里话
· 闲置电脑爆改个人服务器(超详细) #公网映射 #Vmware虚拟网络编辑器
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· 零经验选手,Compose 一天开发一款小游戏!
· 一起来玩mcp_server_sqlite,让AI帮你做增删改查!!