随笔 - 50  文章 - 0  评论 - 0  阅读 - 3318

NOSQL-Redis

Redis

一个基于key-value类型的数据库

1、安装

# 编译安装
下载
http://download.redis.io/releases/
# 安装脚本
#!/bin/bash
#
#**********************************************************************************************
#Author:        GUQUANHENG
#QQ:            982561159
#Date:          2023-12-18
#FileName:      install_redis.sh
#URL:                       
#Description:   The test script
#Copyright (C):2023 All rights reserved
#*********************************************************************************************
#
# 离线安装
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
# 将 data,etc,log,run目录下的文件进行cp更改service文件
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 #监听地址,可以用空格隔开后多个监听IP
protected-mode yes #redis3.2之后加入的新特性,在没有设置bind IP和密码的时候,redis只允许访问127.0.0.1:6379,可以远程连接,但当访问将提示警告信息并拒绝远程访问
port 6379 #监听端口,默认6379/tcp
tcp-backlog 511 #三次握手的时候server端收到client ack确认号之后的队列值,即全连接队列长度
timeout 0 #客户端和Redis服务端的连接超时时间,默认是0,表示永不超时
tcp-keepalive 300 #tcp 会话保持时间300s
daemonize no #默认no,即直接运行redis-server程序时,不作为守护进程运行,而是以前台方式运行,如果想在后台运行需改成yes,当redis作为守护进程运行的时候,它会写一个 pid 到/var/run/redis.pid 文件 编译安装路径自定义
supervised no #和OS相关参数,可设置通过upstart和systemd管理Redis守护进程,centos7后都使用systemd
pidfile /var/run/redis.pid #pid文件路径,可以修改为/apps/redis/run/redis.pid
loglevel notice #日志级别
logfile "/path/redis.log" #日志路径,示例:logfile "/apps/redis/log/redis_6379.log"
databases 16 #设置数据库数量,默认:0-15,共16个库
always-show-logo yes #在启动redis 时是否显示或在日志中记录记录redis的logo
save 900 1 #在900秒内有1个key内容发生更改,就执行快照机制
save 300 10 #在300秒内有10个key内容发生更改,就执行快照机制
save 60 10000 #60秒内如果有10000个key以上的变化,就自动快照备份
stop-writes-on-bgsave-error yes #默认为yes时,可能会因空间满等原因快照无法保存出错时,会禁止redis写入操作,生产建议为no此项只针对配置文件中的自动save有效
rdbcompression yes #持久化到RDB文件时,是否压缩,"yes"为压缩,"no"则反之
rdbchecksum yes #是否对备份文件开启RC64校验,默认是开启
dbfilename dump.rdb #快照文件名
dir ./ #快照文件保存路径,示例:dir "/apps/redis/data"
#主从复制相关
replicaof <masterip> <masterport> #指定复制的master主机地址和端口,5.0版之前的指令为slaveof
masterauth <master-password> #指定复制的master主机的密码
replica-serve-stale-data yes #当从库同主库失去连接或者复制正在进行,从机库有两种运行方式:
    1、设置为yes(默认设置),从库会继续响应客户端的读请求,此为建议值
    2、设置为no,除去特定命令外的任何请求都会返回一个错误"SYNC with master in progress"。
replica-read-only yes #是否设置从库只读,建议值为yes,否则主库同步从库时可能会覆盖数据,造成数据丢失
repl-diskless-sync no #是否使用socket方式复制数据(无盘同步),新slave第一次连接master时需要做数据的全量同步,redis server就要从内存dump出新的RDB文件,然后从master传到slave,有两种方式把RDB文件传输给客户端:#推荐使用基于硬盘(为no),是因为RDB文件创建后,可以同时传输给更多的slave,但是基于socket(为yes), 新slave连接到master之后得逐个同步数据。只有当磁盘I/O较慢且网络较快时,可用diskless(yes),否则一般建议使用磁盘(no)
    1、基于硬盘(disk-backed):为no时,master创建一个新进程dump生成RDB磁盘文件,RDB完成之后由父进程(即主进程)将RDB文件发送给slaves,此为默认值
    2、基于socket(diskless):master创建一个新进程直接dump RDB至slave的网络socket,不经过主进程和硬盘
repl-diskless-sync-delay 5 #diskless时复制的服务器等待的延迟时间,设置0为关闭,在延迟时间内到达的客户端,会一起通过diskless方式同步数据,但是一旦复制开始,master节点不会再接收新slave的复制请求,直到下一次同步开始才再接收新请求。即无法为延迟时间后到达的新副本提供服务,新副本将排队等待下一次RDB传输,因此服务器会等待一段时间才能让更多副本到达。推荐值:30-60
repl-ping-replica-period 10 #slave根据master指定的时间进行周期性的PING master,用于监测master状态,默认10s
repl-timeout 60 #复制连接的超时时间,需要大于repl-ping-slave-period,否则会经常报超时
repl-disable-tcp-nodelay no #是否在slave套接字发送SYNC之后禁用 TCP_NODELAY,如果选择"yes",Redis将合并多个报文为一个大的报文,从而使用更少数量的包向slaves发送数据,但是将使数据传输到slave上有延迟,Linux内核的默认配置会达到40毫秒,如果 "no" ,数据传输到slave的延迟将会减少,但要使用更多的带宽
repl-backlog-size 512mb #复制缓冲区内存大小,当slave断开连接一段时间后,该缓冲区会累积复制副本数据,因此当slave 重新连接时,通常不需要完全重新同步,只需传递在副本中的断开连接后没有同步的部分数据即可。只有在至少有一个slave连接之后才分配此内存空间,建议建立主从时此值要调大一些或在低峰期配置,否则会导致同步到slave失败
repl-backlog-ttl 3600 #多长时间内master没有slave连接,就清空backlog缓冲区
replica-priority 100 #当master不可用,哨兵Sentinel会根据slave的优先级选举一个master,此值最低的slave会优先当选master,而配置成0,永远不会被选举,一般多个slave都设为一样的值,让其自动选择
min-replicas-to-write 3	#至少有3个可连接的slave,mater才接受写操作
min-replicas-max-lag 10	#和上面至少3个slave的ping延迟不能超过10秒,否则master也将停止写操作
requirepass foobared #设置redis连接密码,之后需要AUTH pass,如果有特殊符号,用" "引起来,生产建议设置
rename-command #重命名一些高危命令,示例:rename-command FLUSHALL "" 禁用命令 示例: rename-command del magedu
maxclients 10000 #Redis最大连接客户端
maxmemory <bytes> #redis使用的最大内存,单位为bytes字节,0为不限制,建议设为物理内存一半,8G内存的计算方式8(G)*1024(MB)1024(KB)*1024(Kbyte),需要注意的是缓冲区是不计算在maxmemory内,生产中如果不设置此项,可能会导致OOM
appendonly no #是否开启AOF日志记录,默认redis使用的是rdb方式持久化,这种方式在许多应用中已经足够用了,但是redis如果中途宕机,会导致可能有几分钟的数据丢失(取决于dump数据的间隔时间),根据save来策略进行持久化,Append Only File是另一种持久化方式,可以提供更好的持久化特性,Redis会把每次写入的数据在接收后都写入 appendonly.aof 文件,每次启动时Redis都会先把这个文件的数据读入内存里,先忽略RDB文件。默认不启用此功能
appendfilename "appendonly.aof" #文本文件AOF的文件名,存放在dir指令指定的目录中
appendfsync everysec #aof持久化策略的配置 #no表示由操作系统保证数据同步到磁盘,Linux的默认fsync策略是30秒,最多会丢失30s的数据


#同时在执行bgrewriteaof操作和主进程写aof文件的操作,两者都会操作磁盘,而bgrewriteaof往往会涉及大量磁盘操作,这样就会造成主进程在写aof文件的时候出现阻塞的情形,以下参数实现控制

no-appendfsync-on-rewrite no #在aof rewrite期间,是否对aof新记录的append暂缓使用文件同步策略,主要考虑磁盘IO开支和请求阻塞时间。#默认为no,表示"不暂缓",新的aof记录仍然会被立即同步到磁盘,是最安全的方式,不会丢失数据,但是要忍受阻塞的问题 #为yes,相当于将appendfsync设置为no,这说明并没有执行磁盘操作,只是写入了缓冲区,因此这样并不会造成阻塞(因为没有竞争磁盘),但是如果这个时候redis挂掉,就会丢失数据。丢失多少数据呢?Linux的默认fsync策略是30秒,最多会丢失30s的数据,但由于yes性能较好而且会避免出现阻塞因此比较推荐

# rewrite即对aof文件进行整理,将空闲空间回收,从而可以减少恢复数据时间
auto-aof-rewrite-percentage 100 #当Aof log增长超过指定百分比例时,重写AOF文件,设置为0表示不自动重写Aof日志,重写是为了使aof体积保持最小,但是还可以确保保存最完整的数据

auto-aof-rewrite-min-size 64mb #触发aof rewrite的最小文件大小
aof-load-truncated yes #是否加载由于某些原因导致的末尾异常的AOF文件(主进程被kill/断电等),建议yes
aof-use-rdb-preamble no #redis4.0新增RDB-AOF混合持久化格式,在开启了这个功能之后,AOF重写产生的文件将同时包含RDB格式的内容和AOF格式的内容,其中RDB格式的内容用于记录已有的数据,而AOF格式的内容则用于记录最近发生了变化的数据,这样Redis就可以同时兼有RDB持久化和AOF持久化的优点(既能够快速地生成重写文件,也能够在出现问题时,快速地载入数据),默认为no,即不启用此功能
ua-time-limit 5000 #lua脚本的最大执行时间,单位为毫秒
cluster-enabled yes #是否开启集群模式,默认不开启,即单机模式
cluster-config-file nodes-6379.conf #由node节点自动生成的集群配置文件名称
cluster-node-timeout 15000 #集群中node节点连接超时时间,单位ms,超过此时间,会踢出集群
cluster-replica-validity-factor 10 #单位为次,在执行故障转移的时候可能有些节点和master断开一段时间导致数据比较旧,这些节点就不适用于选举为master,超过这个时间的就不会被进行故障转移,不能当选master,计算公式:(node-timeout * replica-validity-factor) + repl-ping-replica-period
cluster-migration-barrier 1 #集群迁移屏障,一个主节点至少拥有1个正常工作的从节点,即如果主节点的slave节点故障后会将多余的从节点分配到当前主节点成为其新的从节点。
cluster-require-full-coverage yes #集群请求槽位全部覆盖,如果一个主库宕机且没有备库就会出现集群槽位不全,那么yes时redis集群槽位验证不全,就不再对外提供服务(对key赋值时,会出现
CLUSTERDOWN The cluster is down的提示,cluster_state:fail,但ping 仍PONG),而no则可以继续使用,但是会出现查询数据查不到的情况(因为有数据丢失)。生产建议为no
cluster-replica-no-failover no #如果为yes,此选项阻止在主服务器发生故障时尝试对其主服务器进行故障转移。 但是,主服务器仍然可以执行手动强制故障转移,一般为no


#Slow log 是 Redis 用来记录超过指定执行时间的日志系统,执行时间不包括与客户端交谈,发送回复等I/O操作,而是实际执行命令所需的时间(在该阶段线程被阻塞并且不能同时为其它请求提供服务),由于slow log 保存在内存里面,读写速度非常快,因此可放心地使用,不必担心因为开启 slow log 而影响Redis 的速度

slowlog-log-slower-than 10000 #以微秒为单位的慢日志记录,为负数会禁用慢日志,为0会记录每个命令操作。默认值为10ms,一般一条命令执行都在微秒级,生产建议设为1ms-10ms之间
slowlog-max-len 128 #最多记录多少条慢日志的保存队列长度,达到此长度后,记录新命令会将最旧的命令从命令队列中删除,以此滚动删除,即,先进先出,队列固定长度,默认128,值偏小,生产建议设为1000以上

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 # 60s内有三条记录则触发备份

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
# rewrite配置 由于二进制存放许多重复指令,重写可以起到清理磁盘的作用
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] # 默认连接6379端口
# 跨主机连接
redis-cli -h HOSTNAME/IP -p PORT [-a PASSWORD]

3.2. 数据库操作

3.2.1 info

# 显示当前节点redis运行状态信息
redis-cli -a 123456 info

3.2.2 SELECT

# 切换数据库,相当于mysql的use database
redis 最多允许使用16个数据库
redis cluster 模式下不支持多个数据库

3.2.3 KEYS

# 查看所有的key
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 # 若值已存在,覆盖 对于具有ttl的会刷新ttl

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 # 返回bool值

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 # incrby age -2 以2的步进下降
decrby 和incrby相反 # key不存在将其设置为0

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 # >=0 代表左侧索引 -1 代表右侧索引

3.3.2.5 lset

修改指定位置的值
lset 2 java # 2 代表从左侧开始第三个索引

3.3.2.6 lpop|rpop

从列表中弹出一个值
lpop name [2] # 从name表中弹出共计两个值
rpop # 类似

3.3.2.7 LTRIM

对列表进行切片,仅保留切出来的一部分
ltrim name 2 4 #切出序号为3-5的数据 将其余数据丢弃

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 # 以score的正序显示数值 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 新建

# filed若不存在则创建,若存在则修改
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配置

image-20231220112426015

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
# ansible主机
172.31.3.10 
# 配置免密
ssh-copy-id $ip
# 下载安装包
http://download.redis.io/releases/
# 准备安装脚本
参考1、安装
# 使用ansible统一安装
---
  - 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开机,自动加入集群并成为从服务器

image-20231220132606870

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 # 指定一个新ip和已存在集群ip加入
3、 重新分配槽位
redis-cli -a 123456 --cluster reshard #槽位数量用16383/集群master数量
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 慢查询

image-20231219102800608

5.1.1 配置修改

vim redis.conf
slowlog-log-slower-than 1#指定为超过1us即为慢的指令
slowlog-max-len 1024 #指定保存1024条慢记录

5.1.2 查询慢查询信息

SLOWLOG LEN #查看慢查询条数
SLOWLOG GET [n] #查看第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 主从复制优化

# 1、主从复制采用首次全量复制,后续增量复制策略,当复制过程中会产生新的数据,这部分数据会放入一个环形队列,当写满后会覆盖,调大此环形队列内存和保持时间,以防数据丢失
# 复制缓冲区大小,建议要设置足够大
repl-backlog-size 1mb
# Redis同时也提供了当没有slave需要同步的时候,多久可以释放环形队列:
repl-backlog-ttl 3600
# 2、避免全量复制
第一次全量复制不可避免,后续的全量复制可以利用小主节点(内存小),业务低峰时进行全量
节点运行ID不匹配:主节点重启会导致RUNID变化,可能会触发全量复制,可以利用故障转移,例如哨兵或集群,而从节点重启动,不会导致全量复制
复制积压缓冲区不足: 当主节点生成的新数据大于缓冲区大小,从节点恢复和主节点连接后,会导致全量复制.解决方法将repl-backlog-size 调大
# 3、 避免复制风暴
一主多从更换为级联架构
集群状态进行分布式管理,避免节点宕机引起主节点全部挂掉

6.2 性能优化

repl-diskless-sync no # 是否使用无盘同步RDB文件,默认为no,no为不使用无盘,需要将RDB文件保存到磁盘后再发送给slave,yes为支持无盘,支持无盘就是RDB文件不需要保存至本地磁盘,而且直接通过socket文件发送给slave
repl-diskless-sync-delay 5 #diskless时复制的服务器等待的延迟时间
repl-ping-slave-period 10 #slave端向server端发送ping的时间间隔,默认为10秒
repl-timeout 60 #设置主从ping连接超时时间,超过此值无法连接,master_link_status显示为down,并记录错误日志
repl-disable-tcp-nodelay no #是否启用TCP_NODELAY,如设置成yes,则redis会合并小的TCP包从而节省带宽, 但会增加同步延迟(40ms),造成master与slave数据不一致,假如设置成no,则redis
master会立即发送同步数据,没有延迟,yes关注性能,no关注redis服务中的数据一致性
repl-backlog-size 1mb #master的写入数据缓冲区,用于记录自上一次同步后到下一次同步过程中间的写入命令,计算公式:repl-backlog-size = 允许从节点最大中断时长 * 主实例offset每秒写入量,比如master每秒最大写入64mb,最大允许60秒,那么就要设置为64mb*60秒=3840MB(3.8G),建议此值是设置的足够大
repl-backlog-ttl 3600 #如果一段时间后没有slave连接到master,则backlog size的内存将会被释放。如果值为0则 表示永远不释放这部份内存。
slave-priority 100 #slave端的优先级设置,值是一个整数,数字越小表示优先级越高。当master故障时将会按照优先级来选择slave端进行恢复,如果值设置为0,则表示该slave永远不会被选择。
min-replicas-to-write 1 #设置一个master的可用slave不能少于多少个,否则master无法执行写
min-slaves-max-lag 20 #设置至少有上面数量的slave延迟时间都大于多少秒时,master不接收写操作(拒绝写入)

7、消息队列

7.1 生产消费模型

利用列表进行传递消息,遵循FIFO
# 生产
LPUSH testchnnel testmsg1 
# 消费
RPOP testchnnel

7.2 发布订阅模型

# 发布
PUBLISH channel1 test1 # 向管道中放入test1信息
# 订阅
SUBSCRIBE channel1 # 订阅channel1 管道的信息,订阅后将进行持续监控收到发布信息
# 取消订阅 
unsubscribe channel1
posted on   要快乐不要emo  阅读(14)  评论(0编辑  收藏  举报
相关博文:
·  Minio
·  Ansible
·  redis
·  redis
阅读排行:
· 25岁的心里话
· 闲置电脑爆改个人服务器(超详细) #公网映射 #Vmware虚拟网络编辑器
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· 零经验选手,Compose 一天开发一款小游戏!
· 一起来玩mcp_server_sqlite,让AI帮你做增删改查!!
< 2025年3月 >
23 24 25 26 27 28 1
2 3 4 5 6 7 8
9 10 11 12 13 14 15
16 17 18 19 20 21 22
23 24 25 26 27 28 29
30 31 1 2 3 4 5

点击右上角即可分享
微信分享提示