NOSQL——Redis

什么是NOSQL

NOSQL(Not Only SQL):非关系型数据库;

包括:

Redis:基于内存的KV结构的数据;

MongoDB:文档型数据库,擅长存储JSON(BSON)数据;

HBase:列存储数据库,大数据存储;

特点:

存储半结构化、非结构化数据;

海量存储(通过分布式);

高并发场景;

Redis

Redis(Remote Dictionary Server)远程字典服务。

内存型数据库:数据存储到内存中的,读写速快(GB级);

支持高并发,查询11万次/秒,写入8万次/秒;

支持持久化(将数据定期存储到磁盘中);

常用于缓存,存储热点数据、临时数据;通过加缓存,可以提高并发,减少成本。

Redis常用数据类型

字符串

哈希(hash)

集合

列表

有序集合

缓存失败问题

缓存击穿:一个热点的key失效,直接访问到数据库,导致数据访问量激增。

加锁,从数据库中读取写入缓存后,返回给用户;

通过异步不断刷新过期时间;

缓存穿透:大量用户访问不存在的数据,导致请求直接访问数据库,占用数据库大量的资源;

缓存空值/默认值

布隆过滤器做一层过滤

缓存雪崩:最严重的缓存问题,缓存自身崩溃或者有大量的key都过去,后端数据库压力剧增,或直接崩溃。

缓存增加备份、高可用;

缓存集群;

过期时间设置均匀一些;

多级缓存;

|----------------|------------------------------|-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|
| 配置项名称 | 配置项值范围 | 说明 |
| daemonize | yes、no | yes表示启用守护进程,默认是no即不以守护进程方式运行。其中Windows系统下不支持启用守护进程方式运行 |
| port | | 指定 Redis 监听端口,默认端口为 6379 |
| bind | | 绑定的主机地址,如果需要设置远程访问则直接将这个属性备注下或者改为bind * 即可,这个属性和下面的protected-mode控制了是否可以远程访问 |
| protected-mode | yes、no | 保护模式,该模式控制外部网是否可以连接redis服务,默认是yes,所以默认我们外网是无法访问的,如需外网连接rendis服务则需要将此属性改为no |
| loglevel | debug、verbose、notice、warning | 日志级别,默认为 notice |
| databases | 16 | 设置数据库的数量,默认的数据库是0。整个通过客户端工具可以看得到 |
| rdbcompression | yes、no | 指定存储至本地数据库时是否压缩数据,默认为 yes,Redis 采用 LZF 压缩,如果为了节省 CPU 时间,可以关闭该选项,但会导致数据库文件变得巨大 |
| dbfilename | dump.rdb | 指定本地数据库文件名,默认值为 dump.rdb |
| dir | | 指定本地数据库存放目录 |
| requirepass | | 设置 Redis 连接密码,如果配置了连接密码,客户端在连接 Redis 时需要通过 AUTH命令提供密码,默认关闭 |
| maxclients | 0 | 设置同一时间最大客户端连接数,默认无限制,Redis 可以同时打开的客户端连接数为 Redis 进程可以打开的最大文件描述符数,如果设置 maxclients 0,表示不作限制。当客户端连接数到达限制时,Redis 会关闭新的连接并向客户端返回 max number of clients reached 错误信息 |
| maxmemory | xxx | 指定 Redis 最大内存限制,Redis 在启动时会把数据加载到内存中,达到最大内存后,Redis 会先尝试清除已到期或即将到期的 Key,当此方法处理 后,仍然到达最大内存设置,将无法再进行写入操作,但仍然可以进行读取操作。Redis 新的 vm 机制,会把 Key 存放内存,Value 会存放在 swap 区。配置项值范围列里XXX为数值 |

安装Redis操作步骤

手动安装Redis

1.指定Redis存放位置

cd /usr/local/src/

wget http://download.redis.io/releases/redis-6.2.14.tar.gz

wget https://download.redis.io/releases/redis-6.2.14.tar.gz

2.解压

tar -xvf redis-6.2.14.tar.gz

3.安装依赖

(centos7)

yum clean all

yum makecache fast

yum -y install gcc gcc-c++ make tcl

(可选安装) 安装新版本gcc

yum -y install centos-release-scl

yum -y install devtoolset-9-gcc devtoolset-9-gcc-c++ devtoolset-9-binutils

source /opt/rh/devtoolset-9/enable

echo "source /opt/rh/devtoolset-9/enable" >>/etc/profile

(ubuntu)

sudo apt install build-essential gcc g++ make tcl -y

4. 查看GCC版本

gcc --version

5. Redis的编译安装和配置文件处理

cd /usr/local/src/redis-6.2.14

make && make PREFIX=/usr/local/redis install

mkdir -p /usr/local/redis/{etc,logs,data}

egrep -v "^$|^#" redis.conf > /usr/local/redis/etc/redis.conf

6.启动服务

cd /usr/local/redis/bin

./redis-server

7.进入Redis

不要关,在xshell中再开一个,连接登录

cd /usr/local/redis/bin

./redis-cli

快速安装Redis

1.提前配好yum源或apt源

cd /etc/yum.repos.d/

2.编辑安装脚本

vim redis_install.sh

#!/bin/bash

检查系统类型

if [ -f /etc/os-release ]; then

. /etc/os-release

OS_NAME=$NAME

OS_VERSION=$VERSION_ID

else

echo "无法识别操作系统"

exit 1

fi

echo "当前操作系统: OS_NAME OS_VERSION"

根据操作系统选择安装命令

if [[ "$OS_NAME" == "Ubuntu" ]]; then

更新包列表并安装依赖

apt update

apt -y install build-essential tcl wget

elif [[ "OS_NAME" == "CentOS Linux" \]\] \|\| \[\[ "OS_NAME" == "Red Hat" ]]; then

yum -y install gcc gcc-c++ make tcl wget

else

echo "不支持的操作系统"

exit 1

fi

cd /usr/local/src

下载Redis源码包

if [ -f redis-6.2.14.tar.gz ]; then

echo "redis-6.2.14.tar.gz已存在不需要下载!"

else

wget http://download.redis.io/releases/redis-6.2.14.tar.gz

wget http://192.168.56.200/Software/redis-6.2.14.tar.gz

fi

解压源码包

tar -xvf redis-6.2.14.tar.gz

进入解压后的目录

cd redis-6.2.14

Redis编译安装

make

make PREFIX=/usr/local/redis install

Redis基础配置

mkdir -p /usr/local/redis/{etc,logs,data}

egrep -v "^$|^#" redis.conf > /usr/local/redis/etc/redis.conf

sed -i "s/bind 127.0.0.1/bind 0.0.0.0/g" /usr/local/redis/etc/redis.conf

sed -i "s/protected-mode yes/protected-mode no/g" /usr/local/redis/etc/redis.conf

sed -i "s/daemonize no/daemonize yes/g" /usr/local/redis/etc/redis.conf

sed -i "s/pidfile \/var\/run\/redis_6379.pid/pidfile \/usr\/local\/redis\/redis.pid/g" /usr/local/redis/etc/redis.conf

sed -i "s/dir \.\//dir \/usr\/local\/redis\/data/g" /usr/local/redis/etc/redis.conf

sed -i "s/logfile \"\"/logfile \"\/usr\/local\/redis\/logs\/redis.log\"/g" /usr/local/redis/etc/redis.conf

将配置文件复制到/etc下

mkdir -p /etc/redis/

cp /usr/local/redis/etc/redis.conf /etc/redis/

启动redis

/usr/local/redis/bin/redis-server /etc/redis/redis.conf

更新PATH环境变量

echo 'export PATH=$PATH:/usr/local/redis/bin/' >> /etc/profile

. /etc/profile

查看redis监听端口

echo "查看redis监听端口:"

netstat -tanp | grep redis

3.执行脚本

bash redis_install.sh

4.编辑Redis启动、关机、重启的脚步

vim redis.sh

#!/bin/bash

REDIS_PATH="/usr/local/redis"

REDIS_CONF="/etc/redis/redis.conf"

PID_FILE="$REDIS_PATH/redis.pid"

start() {

if [ -f $PID_FILE ]; then

echo "Redis is already running."

exit 1

fi

echo "Starting Redis..."

REDIS_PATH/bin/redis-server REDIS_CONF &

echo ! \> PID_FILE

echo "Redis started."

}

stop() {

if [ ! -f $PID_FILE ]; then

echo "Redis is not running."

exit 1

fi

echo "Stopping Redis..."

kill (cat PID_FILE)

rm $PID_FILE

echo "Redis stopped."

}

restart() {

stop

sleep 1

start

}

case "$1" in

start)

start

;;

stop)

stop

;;

restart)

restart

;;

*)

echo "Usage: $0 {start|stop|restart}"

exit 1

;;

esac

5.赋予可执行权限

chmod +x redis.sh

习惯上会把启动脚本放置在/etc/init.d/目录下,方便使用

cp redis.sh /etc/init.d/redis

6.启动Redis

./redis.sh start # 启动Redis服务器

./redis.sh stop # 停止Redis服务器

./redis.sh restart # 重启Redis服务器

7.进入Redis

cd /usr/local/redis/bin

./redis-cli

#若不能再任意位置进入Redis

把 redis-cli 所在目录添加到 PATH(替换成你的实际路径!)

export PATH=$PATH:/usr/local/redis/bin

验证是否添加成功(会输出包含 /root/redis/bin 的路径)

echo $PATH

此时在任意目录执行 redis-cli 即可

redis-cli

若ubuntu安装有问题

显示问题:正在等待缓存锁:无法获得锁 /var/lib/dpkg/lock-frontend。锁正由进程 13996(unattended-upgr)持有

1.终止 unattended-upgr 进程

sudo kill 13996

2.确认进程已结束

ps -ef | grep unattended-upgr

3.移除锁定文件(如果仍有问题)

sudo rm /var/lib/dpkg/lock-frontend

sudo rm /var/lib/dpkg/lock

4.重新配置 dpkg

sudo dpkg --configure -a

8.其余命令

(1)查看端口(Redis默认端口6379)

netstat -lnutp|grep 6379

(2)查看是否启动

ps -ef|grep redis或./bin/redis-cli ping

前台启动

./bin/redis-server

后台启动

vim /usr/local/redis/etc/redis.conf

daemonize yes #前台启动,改后台启动

指定配置文件启动

./bin/redis-server ./etc/redis.conf

(3)关闭

./bin/redis-cli shutdown

返回一主两从三哨兵: ++++实验:一主两从三哨兵++++

返回Redis集群: ++++Redis集群操作步骤++++

Redis基础命令

keys * #查看key

keys *ng* #查看带有"ng"的key

keys zhang?? #查看前面为"zahng"的key

keys zhan[ng]si #查看为zhangsi或zhansi的key

get keyi #查看i号库的内容

1.连接命令

ping #测试连接是否生效

echo m #打印特定信息m

select i #切换到i号数据库,默认是0号数据库

config set requirepass 密码 #设置密码

config set requirepass "" #清空密码

2.键命令( i指库号

set keyi value #将字符串值value关联到key

get keyi #关联字符串值,如果key不存在那么返回特殊值nil

del keyi[keyi1 keyi2... keyi3] #删除一个或多个key,返回删除key 的数量

exists keyi #检查key是否存在,存在返回1,不存在返回0

type keyi #返回 key 所储存的值的类型。none (key不存在)、string (字符串)、list (列表)、set (集合)、zset (有序集)、hash (哈希表)

expire keyi seconds #设置key的生存时间,单位为秒。设置成功返回1,其他返回0

pexpire keyi mseconds #以毫秒设置生存时间。成功返回1,其他返回0

ttl keyi #查看有效时间(单位:秒)。key不存在返回-2,key存在但没有设置剩余生存时间返回-1

pttl keyi #查看有效时间(单位:毫秒)。key不存在返回-2,key存在但没有设置剩余生存时间返回-1

exists keyi #验证是否存在

3.通配符

* 表示多个字符

? 表示一个字符

\] 表示只能是\[\]里面的字符 \\ 表示指定特殊字符 #将当前数据库的key移动到给定的数据库db当中 move key db 例如:move zhangsan 1 移动成功返回1,失败则返回0 key不存在时,移动失败 key移动到1库时,1库中出现同名的key,移动失败 #从当前数据库中随机返回(不删除)一个 key random key 当数据库不为空时,返回一个 key 当数据库为空时,返回 nil #将key改名为newkey rename key newkey 改名成功时提示 OK,失败时候返回一个错误 当 key 和 newkey 相同,或者 key 不存在时,返回一个错误。 当 newkey 已经存在时, RENAME 命令将覆盖旧值 #当且仅当 newkey 不存在时,将 key 改名为 newkey renamenx key newkey 例如:renamenx zhangsi zhangwu 修改成功时,返回 1 。如果 newkey 已经存在,返回 0 ### Redis数据类型 [++++Redis常用数据类型.xmind++++](Redis常用数据类型.xmind) 字符串命令:set key value \[EX seconds\] \[PX milliseconds\] \[NX\|XX

EX:设置键的过期时间为 second秒 例如:set key1 hello EX 1000

PX:设置键的过期时间为 millisecond毫秒 例如:set key2 hello PX 100000

NX:只在键不存在时,才对键进行设置操作 例如:set key3 hello NX

XX:只在键已经存在时,才对键进行设置操作 例如: set key4 helloworld XX

|------------------|----------------------------------------|------------------------------------------------------------------|----------------------------------------------------------------------------------------------|
| 数据结构 | 特点 | 典型使用场景 | 示例 |
| String(字符串) | 存储文本或二进制数据,最大512MB;支持自增/自减、拼接等操作 | 1.缓存简单键值对(如用户信息、商品详情) 2.计数器(如文章阅读量、接口调用次数) 3.分布式锁(通过SET NX实现) | SET user:1001 "name:张三,age:25" INCR article:views:2001 |
| Hash(哈希) | 存储字段-值对的集合,适合表示对象;可单独操作字段,节省空间 | 1.缓存对象型数据(如用户资料、商品属性) 2.存储结构化数据(如订单详情中的多个字段) | HSET user:1001 name 张三 age 25 HGET user:1001 name |
| List(列表) | 有序字符串集合,支持两端插入/删除,可按索引访问;底层是双向链表或压缩列表 | 1.消息队列(如异步任务队列、实时通知) 2.最新列表(如朋友圈动态、新闻Feed流) 3.排行榜(临时排序场景) | LPUSH news:feed "新闻A" LRANGE news:feed 0 9(获取前10条) |
| Set(集合) | 无序、唯一字符串集合,支持交集、并集、差集等集合运算 | 1.去重场景(如用户标签去重、投票防重复) 2.社交关系(如共同好友、关注列表) 3.筛选数据(如交集找共同兴趣) | SADD user:tags:1001 "音乐" "运动" SINTER user:1001:friends user:1002:friends(共同好友) |
| Sorted Set(有序集合) | 有序、唯一字符串集合,每个元素关联分数,按分数排序;支持范围查询 | 1.排行榜(如游戏积分排名、视频播放量排序) 2.带权重的消息队列 3.时间轴数据(如按时间排序的日志) | ZADD rank:game 950 "用户A" 880 "用户B" ZRANGE rank:game 0 4 WITHSCORES(前5名及分数) |
| Bitmap(位图) | 二进制位的集合,通过位操作高效存储和计算;节省空间(1MB可存800多万位) | 1.签到记录(如用户每月签到情况,1位表示1天) 2.状态标记(如用户在线状态、功能开关) 3.基数统计(如独立访客UV计数)。 | SETBIT sign:user:1001 5 1(第5天签到) BITCOUNT sign:user:1001(签到总天数) |
| HyperLogLog | 用于基数估算(统计不重复元素数量),占用空间极小(约12KB),有一定误差 | 1.大规模数据基数统计(如网站UV、页面访问独立用户数) 2.快速估算集合大小(无需存储全部元素) | PFADD uv:20240821 "user1" "user2" PFCOUNT uv:20240821(估算当天UV) |
| Geospatial(地理空间) | 存储经纬度信息,支持距离计算、范围查询(如附近的人/地点)。 | 1.LBS服务(如外卖配送范围、附近的商家) 2.地理位置排序(如按距离展示周边设施) | GEOADD shops:beijing 116.40 39.90 "商场A" GEORADIUS shops:beijing 116.40 39.90 5000 m(5公里内的商场) |

Redis数据持久化

数据持久化:将内存中的数据保存到磁盘中。

作用:让redis服务重启后可以恢复之前的数据。

Redis数据持久化的方式

RDB(快照):将内存中Redis缓存的所有数据,都以二进制字符串的方式保存为一个.rdb文件。

特点:占用存储小,当恢复所有数据时,速度快。不建议频繁生成快照。每次重启自动加载快照。

AOF(日志追加):将每次增、删、改的操作添加到.aof日志中,默认明文存储(可压缩),占据更大的存储空间,保存数据时,运行资源占用小。追加日志可以实时添加。

AOF默认是不开启的

RDB触发方式

手动触发:save与bgsave(save阻塞Redis主线程的执行,vgsave不阻塞)

自动触发:Redis通过判断,满足设置触发条件时自动执行bgsave命令

RDB优缺点

优点:1.RDB是一个紧凑的单一文件,方便传送,适用于灾难恢复。

2.与AOF相比,在恢复大的数据集的时候,RDB方式会更快一些。

缺点:1Redis意外宕机,可能会丢失几分钟的数据(取决于配置的save时间点)。RDB方式需要保存整个数据集,是一个比较繁重的工作,通常需要设置5分钟或者更久做一次完整的保存。

AOF优缺点

优点:1.AOF只是追加日志文件,因此对服务器性能影响较小,速度比RDB要快,消耗的内存较少。

缺点:1.AOF方式生成的日志文件太大,即使通过AOF重写,文件体积仍然很大。

2.恢复数据的速度比RDB慢。

|-------|---------------------------|--------------------------|
| 对比维度 | RDB | AOF |
| 数据格式 | 二进制文件(紧凑,体积小) | 文本日志(记录命令,体积较大) |
| 持久化粒度 | 全量数据快照(间隔性保存) | 每条写命令(实时或近实时保存) |
| 恢复速度 | 快(直接加载二进制文件) | 慢(需重新执行所有命令) |
| 文件体积 | 小(二进制压缩) | 大(文本命令,可能包含冗余) |
| 性能影响 | 持久化时(fork 子进程)可能短暂阻塞 | 频繁写入时(如always模式)性能损耗较大 |
| 数据安全性 | 可能丢失最后一次快照后的所有数据 | 丢失数据量少(最多丢失 1 秒数据,取决于配置) |
| 兼容性 | 旧版本 Redis 可能不兼容新版本 RDB 文件 | 兼容性更好,命令格式相对稳定 |
| 适用场景 | 备份、灾难恢复(文件小,传输快) | 对数据安全性要求高的场景 |

Redis集群

redis主从模式:一主一从或一主多从,自带读写分离,负载均衡。

redis哨兵集群:高可用,主服务宕机,从服务变成主服务。

redis集群模式(分片):将数据拆分存储到多个Redis主从集群中;从而实现高扩展;

Redis主从模式

原理:第一次同步时,使用RDB(快照),在同步时,主服务器产生的数据,会记录偏移量,在同步完成后,进行偏移量的同步。

之后的同步的数据是通过AOF日志方式同步的。

具体的原理

1.当slave启动后,主动向master发送SYNC(同步)命令;

2.master接受到SYNC命令后在后台保存快照(RDB持久化)和缓存保存快照这段时间的命令;

3.将保存的快照文件和缓存的命令发送给slave;

4.slave收到快照文件和命令后加载快照文件和缓存的执行命令;

5.复制初始化后,master每次收到的写命令都会同步发送给slave,保证主从数据一致性。

缺点:只有主服务器能写入,从服务器只能读。主服务器一旦宕机,导致无法写入数据。

Redis哨兵模式

功能:

1.监控所有Redis服务器,重点监控主服务器,1秒ping一次主

2.主服务器宕机主观下线,10秒后未恢复,客观下线,选举新的主服务器,根据条件(数据完整性、服务器性能);

3.通知其他从服务器,主从变更,让其他服务器连接新的主服务。

多哨兵模式

哨兵监控主从的同时,也监控其他哨兵。

当主宕机,哨兵中选出一个哨兵,这个哨兵再从其他从中选出新的主。

Cluster模式

优点:

1.多个redis节点网络互联,数据共享

2.所有的节点都是一主一从(也可以是一主多从),其中从不提供服务,仅作为备用

3.支持在线增加、删除节点

4.客户端可以连接任何一个主节点进行读写

缺点:

1.不支持同时处理多个key(如MSET/MGET),因为redis需要把key均匀分布在各个节点上,

2.并发量很高的情况下同时创建key-value会降低性能并导致不可预测的行为

代理模式

twemproxy:快速、轻量级memcached和redis代理,Twitter推特公司开发

codis:redis集群代理解决方案,豌豆荚公司开发,需要修改redis源码

predixy:高性能全特征redis代理,支持Redis Sentinel和Redis Cluster

Redis-cerberus: Redis Cluster代理

Redis集群模式

哈希槽:默认Redis官方在Redis集群模式中内置了16384个槽

1 % 16384 = 1

重定向:在Redis集群任意节点查询或存储修改数据时,通过哈希槽运算,未命中节点,则会重新计算查找节点。

|------------------------------------------------|--------------------------------------------------------------------------|
| 配置文件sentinel.conf说明 ||
| 名称 | 说明 |
| protected-mode no | 关闭保护模式,使外网能访问 |
| port 26379 | 修改端口 |
| daemonize no | 修改为后台运行 |
| pidfile /var/run/redis-sentinel.pid | 指定不同pid文件,注意文件夹不存在自己要新建 |
| logfile "" | 配置哨兵日志文件 |
| dir "/tmp" | 配置哨兵工作路径 |
| sentinel monitor mymaster 127.0.0.1 6379 2 | 配置哨兵需要监控的主节点ip和端口,2表示哨兵数 |
| sentinel auth-pass mymaster 123 | 配置哨兵连接主节点的认证密码 |
| sentinel down-after-milliseconds mymaster 5000 | 配置多少毫秒后没收到主节点的反馈,则主观认为主节点宕机了 |
| sentinel failover-timeout mymaster 30000 | 表示如果30秒后,主服务仍没活过来,则启动failover,从剩下的从服务中选一个升级为主服务 |
| sentinel parallel-syncs mymaster 1 | parallel-syncs 指定了在执行故障转移时,最多可以有多少个从服务同时对新的主服务进行同步,这个数字越小,完成故障转移所需的时间就越长 |

实验:一主两从三哨兵

192.168.8.11 主服务

192.168.8.12 从服务

192.168.8.13 从服务

主从模式(一主两从)

1.关闭防火墙

firewall-cmd --state #查看防火墙状态

service firewalld stop #关闭防火墙

2.安装Redis

安装Redis: ++++安装Redis操作步骤++++

cd /usr/local/redis/bin

./redis-cli

3.配置主机和从机

cd /usr/local/redis/etc

只需要在从节点添加配置

vim redis.conf

最后一行添加

replicaof 192.168.81.11 6379

4.启动服务

启动三台主机的Redis服务器端服务

./bin/redis-server ./etc/redis.conf

ps -ef|grep redis

三台服务器进去Redis

./bin/redis-cli

5.手动设置从服务

slaveof 192.168.81.11 6379

6.查看主从信息

info replication

哨兵集群(单哨兵模式)

哨兵服务

1. 备份配置文件

cp /usr/local/src/redis-6.2.14/sentinel.conf /usr/local/redis/etc/sentinel.conf

2. 进入etc目录

cd /usr/local/redis/etc/

3. 编辑哨兵配置文件

vim sentinel.conf

sentinel monitor mymaster 192.168.81.11 6379 1

mymaster是监控主数据的名称,命名时可以使用大小写字母和".-_"符号;

后面是主机IP、端口号和哨兵的数量,少数服从多数的命令

sentinel down-after-milliseconds mymaster 10000

配置多少毫秒后没收到主节点的反馈,则主观认为主节点宕机了

sentinel failover-timeout mymaster 15000

表示如果30秒后,主服务仍没活过来,则启动failover;

从剩下的从服务中选一个升级为主服务

5. 返回到redis目录里
复制代码
cd ../
或
cd /usr/local/redis
6. 启动哨兵实时查看情况
复制代码
./bin/redis-sentinel ./etc/sel.conf
或
./bin/redis-server ./etc/sentinel.conf --sentinel

(从服务)

7. 从机宕机

(1)查看从服务进程号

复制代码
ps -ef|grep redis
root 22163 1 0 12:18 ? 00:00:02 ./bin/redis-server 0.0.0.0:6379

(2)杀死进程

复制代码
kill -s 9 22163

(3)重新启动服务

复制代码
./bin/redis-server ./etc/redis.conf

(4)观察哨兵日志

(主服务)

8. 主机宕机

(1)查看主服务进程

复制代码
ps -ef | grep redis

(2)杀死进程

复制代码
kill -s 9 进程号

(3)重新启动主服务

复制代码
 ./bin/redis-server ./etc/redis.conf

(4)观察哨兵日志

(哨兵服务)

9.测试哨兵连接

端口默认为26379

复制代码
redis-cli -p 26379 sentinel masters

如果哨兵工作正常,返回所有节点信息

10.通过哨兵获取当前节点地址
复制代码
redis-cli  -p 26379 sentinel get-master-addr-by-name mymaster

哨兵集群(多哨兵模式)

(主服务)

1.备份配置文件
复制代码
cp  /usr/local/src/redis-6.2.14/sentinel.conf  /usr/local/redis/etc/sentinel.conf
2.进入etc目录
复制代码
cd  /usr/local/redis/etc/
3.复制份哨兵文件
复制代码
cp sentinel.conf sentinel-1.conf
cp sentinel.conf sentinel-2.conf
cp sentinel.conf sentinel-3.conf
4.修改配置文件

先看看/usr/local/redis下有没有logs目录

(1)修改/sentinel-1.conf

复制代码
vim sentinel-l.conf
protected-mode no
port 27001
daemonize yes
pidfile "/var/run/redis-sentinel-27001.pid"
logfile "/usr/local/redis/logs/27001.log"
sentinel monitor mymaster 192.168.81.11 6379 2

(2)修改/sentinel-2.conf

复制代码
vim sentinel-2.conf
protected-mode no
port 27002
daemonize yes
pidfile "/var/run/redis-sentinel-27002.pid"
logfile "/usr/local/redis/logs/27002.log"
sentinel monitor mymaster 192.168.81.11 6379 2

(3)修改/sentinel-3.conf

复制代码
vim sentinel-3.conf
protected-mode no
port 27003
daemonize yes
pidfile "/var/run/redis-sentinel-27003.pid"
logfile "/usr/local/redis/logs/27003.log"
sentinel monitor mymaster 192.168.81.11 6379 2
5.启动哨兵
复制代码
cd  /usr/local/redis
 ./bin/redis-sentinel ./etc/sentinel-1.conf
 ./bin/redis-sentinel ./etc/sentinel-2.conf
 ./bin/redis-sentinel ./etc/sentinel-3.conf
6.启动哨兵实时查看情况

tail -100 sentinel-1.conf

tail -100 sentinel-2.conf

tail -100 sentinel-3.conf

(从服务)

7.从机宕机

(1)查看进程

ps -ef|grep redis

(2)杀死进程

kill -s 9 进程名

(3)重新启动

./bin/redis-server ./etc/redis.conf

(主服务)

8.主机宕机

(1)查看进程

ps -ef|grep redis

(2)杀死进程

kill -s 9 进程名

(3)重新启动

./bin/redis-server ./etc/redis.conf

Redis集群操作步骤

用ubuntu操作,centos有问题

集群搭建:至少要三个master(123为主,456为从)

安装Redis: ++++安装Redis操作步骤++++

1. 创建文件夹redis-cluster

复制代码
cd /usr/local/redis
mkdir redis-cluster
cd redis-cluster/
mkdir 700{1..6}
#mkdir 700{1..6}与下面的相等
mkdir 7001
mkdir 7002
mkdir 7003
mkdir 7004
mkdir 7005
mkdir 7006

2.复制配置文件到 700*

复制代码
cd /usr/local/redis
cp ./etc/redis.conf ./redis-cluster/7001/redis.conf
cp ./etc/redis.conf ./redis-cluster/7002/redis.conf
cp ./etc/redis.conf ./redis-cluster/7003/redis.conf
cp ./etc/redis.conf ./redis-cluster/7004/redis.conf
cp ./etc/redis.conf ./redis-cluster/7005/redis.conf
cp ./etc/redis.conf ./redis-cluster/7006/redis.conf

3.安装ruby

复制代码
apt install ruby
gem install redis

4.修改集群配置

配置修改的地方都一样,把700*改成相对应的值(例如:7001)

复制代码
vim ./redis-cluster/700*/redis.conf
daemonize yes
port 700* 
#(分别对每个机器的端口号进行设置)
bind 192.168.3.210
#(必须要绑定当前机器的ip,不然会无限悲剧下去哇..深坑勿入!!!)
dir /usr/local/redis/redis-cluster/700*/
#(指定数据文件存放位置,必须要指定不同的目录位置,不然会丢失数据,深坑勿入!!!)
appendonly yes
pidfile /usr/local/redis/redis-700*.pid
logfile "/usr/local/redis/logs/redis-700*.log"

#下面三行没有,添加上去
cluster-enabled yes  #(启动集群模式,开始玩耍)
cluster-config-file nodes700*.conf #(这里700*最好和port对应上)
cluster-node-timeout 5000  #redis节点宕机被发现的时间 

#也可以把配置好的7001复制到其余上,在全文修改(以7002为例)
cp ./redis-cluster/7001/redis.conf ./redis-cluster/7002/redis.conf
vim ./redis-cluster/7002/redis.conf
:%s/7001/7002/g

5.启动Redis服务

复制代码
./bin/redis-server ./redis-cluster/7001/redis.conf
./bin/redis-server ./redis-cluster/7002/redis.conf
./bin/redis-server ./redis-cluster/7003/redis.conf
./bin/redis-server ./redis-cluster/7004/redis.conf
./bin/redis-server ./redis-cluster/7005/redis.conf
./bin/redis-server ./redis-cluster/7006/redis.conf

6.创建集群

复制代码
./bin/redis-cli --cluster create 192.168.3.210:7001 192.168.3.210:7002 192.168.3.210:7003 192.168.3.210:7004 192.168.3.210:7005 192.168.3.210:7006 --cluster-replicas 1

create表示创建一个redis集群。

cluster-replicas 1表示为集群中的每一个主节点指定一个从节点,即一比一的复制

显示OK即为成功

7.查看redis服务状态

ps -ef|grep redis

8.进入一个节点

./bin/redis-cli -c -h 192.168.3.210 -p 7001

192.168.3.210:7001> info cluster

cluster_enabled:1 #节点是否为cluster模式(1为是0为否)

9.测试

复制代码
[root@zuolaoshi redis]# ./bin/redis-cli -c -h 192.168.3.210 -p 7005
192.168.3.210:7005> set b fdfsfsd
-> Redirected to slot [3300] located at 192.168.3.210:7001
OK
192.168.3.210:7001> get b
"fdfsfsd"
192.168.3.210:7001> set c fdsfdfdsfds
-> Redirected to slot [7365] located at 192.168.3.210:7002
OK
192.168.3.210:7002> get c
"fdsfdfdsfds"
192.168.3.210:7002> set x fdsfdsfsdf
-> Redirected to slot [16287] located at 192.168.3.210:7003
OK
192.168.3.210:7003> keys *
1) "x"
2) "a"
192.168.3.210:7003> get b
-> Redirected to slot [3300] located at 192.168.3.210:7001
"fdfsfsd"
192.168.3.210:7001> keys *
1) "b"
192.168.3.210:7001> set d fdsfdsfsd
-> Redirected to slot [11298] located at 192.168.3.210:7003
OK
192.168.3.210:7003> get d
"fdsfdsfsd"
192.168.3.210:7003> set x zhangsan
OK
192.168.3.210:7003> get x
"zhangsan"
相关推荐
光电的一只菜鸡3 小时前
ubuntu之坑(十九)——VMware虚拟机扩容磁盘
linux·数据库·ubuntu
C语言小火车3 小时前
【C++八股文】数据结构篇
数据结构·数据库·c++·c++八股文
CHEN5_024 小时前
【CouponHub项目开发】EasyExcel解析Excel并使用线程池异步执行和延时队列兜底
java·数据库·excel
川石课堂软件测试4 小时前
Oracle 数据库使用事务确保数据的安全
数据库·python·功能测试·docker·oracle·单元测试·prometheus
guslegend4 小时前
数据库小册(1)
数据库
皆过客,揽星河4 小时前
mysql初学者练习题(从基础到进阶,相关数据sql脚本在最后)
数据库·sql·mysql·oracle·mysql基础练习·mysql基础语法·数据库练习题
weixin_471525785 小时前
【单片机day01】
数据库·mongodb
RestCloud6 小时前
企业为何仍困在“数据孤岛”?——从iPaaS重构信息流的实践路径
数据库·api
RestCloud6 小时前
Oracle到ClickHouse:异构数据库ETL的坑与解法
数据库·api