0


Redis学习小记一:基于Docker、Linux部署Redis

一、Redis介绍

1.1 Redis是什么?

简单来讲Redis是一个运行于内存的非关系型数据库,数据的存储格式为键值对的形式,拥有高性能的非关系型数据库,总结三点为:

  • 基于内存结构,性能高
  • 数据是键值对形式存储
  • 非关系型,存储的数据与数据之间是没有关系的

1.2 Redis能干什么?

1.2.1 经典运用场景(点赞)

以目前很火的一个场景来举例子,抖音平台的点赞系统,首先这一场景下如果某条视频的流量特别的高,那么很有可能会同时有非常多的用户对这条视频进行点赞,那么假如说这条视频的相关信息存储在MySQL中,要非常频繁的对他的点赞量进行读写的话显然是不合理的设计,因为MySQL无法支持那么大的同时访问量,这时候就需要redis来帮忙,将点赞信息写入redis,用户读写点赞都在redis上进行,每隔半个小时进行一次redis和MySQL的数据同步(此处时间为举例),这样就避免了MySQL扛不住那么大的请求量造成系统异常的情况。

1.2.2 搜索缓存

这个应该是Redis的实际运用中最常见的也是最基础的一种运用,为了提高数据的访问速度、降低数据库的并发访问量,可以加一层中间件来分担一些搜索压力,也就是Redis搜索缓存,具体可分为三步:

  1. 当出现查询数据的请求时,先查询Redis中是否存在该数据的信息,如果Redis命中,则直接将数据响应用户。
  2. 如果Redis未命中,那就去数据库中进行查询。
  3. 将数据库中查询的数据响应用户,同时,将查询出来的信息写入到Redis中,这样下次再查询Redis就会命中。

二、Redis安装及配置

2.1 基于Docker部署

2.1.1 拉取Redis镜像

docker pull redis

这里直接用这条命令拉取镜像默认拉取的是latest版本的也就是最新版本的,如果对版本有特定要求,前往https://hub.docker.com/docker镜像仓库官网查找对应版本信息。

2.1.2 创建配置文件和数据存储目录

mkdir -p ~/redis_data/conf
mkdir -p ~/redis_data/data

因为无法对docker中容器内的文件进行修改,所以我们需要在linux环境下配置redis的启动配置文件以及持久化rdb、aof文件保存路径。

2.1.3 创建、编辑Redis配置文件

vim ~/redis_data/conf/redis.conf
#直接注释掉 或者配置为bind 0.0.0.0 允许所有ip访问
#bind 127.0.0.1
#禁用保护模式 以允许外部访问(根据需求设置)
protected-mode no
#设置连接密码(根据需求设置)
requirepass yourPassword
#服务端口号
port 6379
tcp-backlog 511
#连接超时时间
timeout 0
tcp-keepalive 300
daemonize no
supervised no
pidfile /var/run/redis_6379.pid
loglevel notice
logfile ""
databases 16
always-show-logo yes
#配置Redis的rdb持久化策略 默认为900s 1次、300s 10次、60s 10000次
save 900 1
save 300 10
save 60 10000
stop-writes-on-bgsave-error yes
#rdb持久化功能开关
rdbcompression yes
rdbchecksum yes
#指定rdb数据存储的文件(此处如果启动多个Redis实例部署集群或主从 最好在此处以每个端口号命名文件名以作区分)
dbfilename dump-6379.rdb
dir ./
replica-serve-stale-data yes
replica-read-only yes
repl-diskless-sync no
repl-diskless-sync-delay 5
repl-disable-tcp-nodelay no
replica-priority 100
lazyfree-lazy-eviction no
lazyfree-lazy-expire no
lazyfree-lazy-server-del no
replica-lazy-flush no
#AOF持久化开关
appendonly yes
#配置AOF文件路径 此处与rdb文件路径命名规则相同
appendfilename "appendonly-6379.aof"
#设置触发条件(三选一)1、always 只要进行成功的写就执行aof 2、everysec 每秒进行一次aof 3、no 让Redis自行决定执行哪种方案
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 yes
lua-time-limit 5000
slowlog-log-slower-than 10000
slowlog-max-len 128
latency-monitor-threshold 0
notify-keyspace-events ""
hash-max-ziplist-entries 512
hash-max-ziplist-value 64
list-max-ziplist-size -2
list-compress-depth 0
set-max-intset-entries 512
zset-max-ziplist-entries 128
zset-max-ziplist-value 64
hll-sparse-max-bytes 3000
stream-node-max-bytes 4096
stream-node-max-entries 100
activerehashing yes
client-output-buffer-limit normal 0 0 0
client-output-buffer-limit replica 256mb 64mb 60
client-output-buffer-limit pubsub 32mb 8mb 60
hz 10
dynamic-hz yes
aof-rewrite-incremental-fsync yes
rdb-save-incremental-fsync yes

编写如上配置,其中部分重要的配置做了备注,其余配置在基础阶段应该还用不上。

2.1.4 使用自定义配置文件启动redis容器

docker run -d --name myredis -p 6379:6379 -v ~/redis_data/conf/redis.conf:/etc/redis/redis.conf -v ~/redis_data/data:/data --restart unless-stopped redis redis-server /etc/redis/redis.conf

使用该命令启动Redis容器,映射端口和挂载配置文件及数据目录。

  • -d:后台运行容器
  • --name:自定义容器的名称
  • -p:将容器的某个端口映射在宿主机的某个端口 简而言之来讲以-p 6970:6379举例,如果外部想连接该redis那么就要以6970的端口来进行连接
  • -v:挂在本地配置文件,将刚刚在Linux本地系统中编写的redis.conf配置文件挂载到容器中去
  • --restart unless-stopped:配置Docker重启后该redis容器自动启动

2.1.5 查看Redis容器启动情况

docker ps -a
docker ps
  • docker ps -a:会展示所有启动、未启动的容器
  • docker ps:会展示所有正在运行中的容器

2.1.6 CLI工具连接Redis

docker exec -it myredis redis-cli -p yourPort -a yourPassword
  • -p:指定连接的redis服务端口,此处如果使用的是默认的redis端口就不需要特殊配置,如果使用的是自定义端口就需要指定。
  • -a:如果设置了密码,就加上此配置并声名密码,如果在配置中未设置密码则不需要此步。

以上每一步进行完毕即完成了 通过docker启动一个简单的redis实例并配置持久化方式以及策略,在cli启动后即可使用:

SET key value
GET key

等指令进行相关的测试操作,该redis实例的持久化文件会存储于-v所指定的路径data路径下。至此通过docker完成redis实例部署的工作全部完成。

2.2 基于Linux安装、部署

2.2.1 依赖检查

gcc -v

因为Redis是基于C语言编写的,所以运行Redis需要把本地含有gcc编译器,云服务器一般来讲默认含有该编译器。

如果检查未含有gcc编译器,运行下面代码进行依赖安装:

yum install -y gcc

2.2.2 Redis下载、安装

可以从Redis的官方网站下载redis,在这里可以进行版本指定,以5.0.5为例

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

下载完成后,解压缩该文件:

tar -zxvf redis-5.0.5.tar.gz

最后可通过ll或ls命令查看解压缩情况成功的话会出现Redis的目录文件,执行下面代码:

cd redis-5.0.5

编译

make MALLOC=libc

安装

make install

启动Redis实例

redis-server

该方法启动实例当前进程会被霸占,也就是当前Linux窗口将无法工作,解决这个问题的方法就是是用另一种方式启动:

redis-server &

2.2.3 多实例启动、自定义配置文件启动

使用redis-server指令启动redis,默认端口为6379。

我们可以在启动的时候加载指定的redis配置文件,使用redis-server redis.conf & 方式启动。

配置文件的内容与在docker中一致,只不过多个Redis的服务需要运行在不同的端口,6379、6390、6381...如果使用的云服务器可以将这些端口全部开放,后期部署主从关系、redis集群都需要多实例启动。如果用的是云服务器,不建议把redis的端口设置为默认!不建议把redis的端口设置为默认!不建议把redis的端口设置为默认!

可以对redis的配置文件进行统一的管理,比如测试使用的配置文件可以在redis的目录下创建test_confs

mkdir test_confs

在这个文件夹下配置每一个启动redis的配置文件。

2.2.4 Redis配置

其实redis文件目录下本身也就包含了一个默认的配置模板,通过ll命令即可发现存在一个redis.conf文件,可以用cat简单是的查看一下这个文件里面有很多注释等解释类的内容,对我们进行配置来说是无用的,此时我们就可以通过该命令排除掉这些无用的信息,并且把剩下的内容放到我们指定的路径去:

cat redis.conf | grep -v "#" | grep -v "^$" > confs/redis-6380.conf

这样我们就拿到了一个纯净的配置文件,可以在这里面进行一些配置,如果要做多实例启动需要多个端口,那些共性的配置(所有实例都需要那样配的配置)不用重复配置,换一个角度来讲就是此时我们需要多个配置文件,但是我们只需要他的端口号不同,以及保存他们的rdb、aof文件命名不同,那么就可以用以下命令:

sed 's/6380/6381/g' redis-6380.conf > redis-6381.conf

将所有的6380转换为6381然后将内容保存在redis-6381.conf这个文件内,此处如果这个文件不存在会自动创建。配置如和配置与docker部署相同。

2.2.5 客户端连接Redis

2.2.5.1 redis-cli

此处与docker相同,redis在连接时自带了一个本地客户端,通过redis-cli可以直接启动

redis-cli -p port #连接到指定端口

如果进行了密码的配置,下一步要进行密码校验:

auth yourPassword
2.2.5.2 RedisDesktopManager

这个是Redis的可视化工具,可以在Windows系统上远程连接Redis(需要打开防火墙,云服务器还需要开放安全组)

三、Redis主从配置

3.1 什么是主从配置?

3.1.1 基础配置

在多个Redis实例中建立主从关系,当主Redis发生改变后,从Redis也会同步发生改变。通过主从配置可以实现对Redis中的数据进行备份,进一步保证了数据的安全性。

3.1.2 读写分离

  • 主节点: 1.负责处理所有的写请求 2.将数据更新同步到所有的从节点​​​​​​​
  • 从节点: 1.主要用于处理读请求,减轻主节点的压力 2.从节点通过向主节点发送‘SYNC’命令来初始化数据同步

读写分离是指将读操作和写操作分配到不同的服务器上,以提高系统的整体性能。具体几点来讲:

  • 性能提升:在大多数的场景中,读操作的频率远超写操作。通过将读操作分散到多个从节点,可以显著提高读取速度以及响应时间。
  • 降低负载:主节点只需处理写请求,有效降低主节点负载,避免高并发读取在成的性能瓶颈。

3.1.3 主从配置实现步骤

  1. 创建管理配置文件的文件夹
  2. 从redis目录中复制一份模板配置
  3. 对模板配置进行编辑
  4. 对修改后的配置进行复制同时进行端口号的修改
  5. 增加主从配置
  6. 启动三个Redis实例
3.1.3.1 创建管理配置文件的文件夹
mkdir myconfs
3.1.3.2 从redis目录中复制一份模板配置
cat redis.conf | grep -v "#" | grep -v "^$" > myconfs/redis-master.conf
3.1.3.3 对模板配置进行编辑
vim redis-master.conf

3.1.3.4 对修改后的配置进行复制同时进行端口号的修改
sed 's/6380/6381/g' redis-master.conf > redis-slave1.conf
sed 's/6380/6382/g' redis-master.conf > redis-slave2.conf
3.1.3.5 增加主从配置
vim redis-slave1.conf    slaveof 127.0.0.1 6380
vim redis-slave2.conf    slaveof 127.0.0.1 6380

这一步为主从配置,通过**

SLAVEOF <master-ip> <master-port>

**命令建立连接。

3.1.3.6 启动三个Redis实例
redis-server redis-master.conf &
redis-server redis-slave1.conf &
redis-server redis-slave2.conf &

至此完成了一个基础的主从关系的配置,其中端口号都可以进行自定义,只从关系通过slaveof处理明确即可。

3.2 哨兵模式

3.2.1 什么是哨兵模式?

Redis的哨兵模式是基于主从配置模式的一种高可用配置,可以提升系统的可靠性和自动故障恢复能力。

  • 高可用性:哨兵模式允许自动监控Redis主从节点的状态,一旦主节点发生故障,哨兵可以自动将一个从节点提升为新的主节点,确保服务的可用性,因为从节点的数据与主节点实时同步所以不会出现数据不一致的问题。
  • 故障检测与恢复:哨兵通过定期发送PING命令来检查主节点的健康状态。当检测到主节点失效时,哨兵会进行投票,选则一个合适的从节点作为新的主节点,从这点可以看出哨兵不可以为双数,也就是不可以出现平票的情况。

3.2.2 哨兵模式实现步骤

  1. 如上,完成主从配置,并启动主从Redis实例。
  2. 创建哨兵配置管理目录
  3. 哨兵模式也需要单独的配置,同样在Redis目录下存在配置模板,复制到哨兵配置管理目录下。
  4. 编辑配置
  5. 修改端口
  6. 依次启动哨兵Redis
3.2.2.1 创建哨兵配置管理目录
mkdir sentinelconfs
3.2.2.2 同样在Redis目录下存在配置模板,复制到哨兵配置管理目录下
cat sentinel.conf | grep -v "#" | grep -v "^$" > sentinelconfs/sentinel-26380.conf
3.2.2.3 编辑配置
 vim sentinel-26380.conf 
port 26380
daemonize no
pidfile "/var/run/redis-sentinel-26380.pid"
logfile ""
dir "/tmp"
sentinel deny-scripts-reconfig yes
# 此处配置默认的主库的ip 和端口   最后的数字是哨兵数量的一半多一个
sentinel monitor mymaster 127.0.0.1 6380 2
# 如果主Redis设置了密码则需要在这里写明密码 如果没有则不需要
#sentinel auth-pass mymaster your_password_here
sentinel config-epoch mymaster 1
sentinel leader-epoch mymaster 1
protected-mode no
3.2.2.4 修改端口
sed 's/26380/26381/g' sentinel-26380.conf > sentinel-26381.conf
sed 's/26380/26382/g' sentinel-26380.conf > sentinel-26382.conf
3.2.2.5 依次启动哨兵Redis
redis-sentinel sentinel-26380.conf &
redis-sentinel sentinel-26381.conf &
redis-sentinel sentinel-26382.conf &

四、Redis集群

4.1 集群配置的意义

  • 高可用:保证Redis一直处于可用状态。
  • 高并发:一个Redis实例已经可以支持最高11w并发读操作或者8.1w并发写操作;但如果对于有更高并发需求的应用来说,我们可以通过集群配置来解决高并发的问题。

Redis集群特性:

  • Redis集群中节点对等,无中心结构。
  • 数据按照slots分布式存储在不同的redis节点上,节点数据可共享。
  • 可扩展性强,可以动态增删节点。
  • 集群每个节点都可用过主从配置+哨兵模式保证每个结点的高可用性

4.2 集群搭建

  1. 创建集群配置文件管理文件夹
  2. 复制redis配置文件模板
  3. 编辑配置文件
  4. 对编辑好的配置文件进行五次复制同时修改端口号
  5. 依次启动六个Redis实例
  6. 检查Redis实例是否启动成功
  7. 防火墙放行7001-7006端口以及17001-17006端口,如果是云服务器安全组也要放行
  8. 连接集群

4.2.1 创建集群配置文件管理文件夹

mkdir cluster-confs

4.2.2 复制redis配置文件模板

cat redis.conf | grep -v "#" | grep -v "^$" > cluster-confs/redis-7001.conf

4.2.3 编辑配置文件

 vim redis-7001.conf

4.2.4 对编辑好的配置文件进行五次复制同时修改端口号

sed 's/7001/7002/g' redis-7001.conf > redis-7002.conf
sed 's/7001/7003/g' redis-7001.conf > redis-7003.conf
sed 's/7001/7004/g' redis-7001.conf > redis-7004.conf
sed 's/7001/7005/g' redis-7001.conf > redis-7005.conf
sed 's/7001/7006/g' redis-7001.conf > redis-7006.conf

4.2.5 依次启动六个Redis实例

redis-server redis-7001.conf &
redis-server redis-7002.conf &
redis-server redis-7003.conf &
redis-server redis-7004.conf &
redis-server redis-7005.conf &
redis-server redis-7006.conf &

4.2.6 查看实例是否启动成功

ps -ef | grep redis

此处如果每一个实例后面都有**[cluster]**标识及证明启动成功!

4.2.7 防火墙放行7001-7006端口以及17001-17006端口,如果是云服务器安全组也要放行

#查看防火墙状态
systemctl status firewalld

#放行端口
firewall-cmd --zone=public --add-port=7001-7006/tcp --permanent
firewall-cmd --zone=public --add-port=17001-17006/tcp --permanent

#重新加载防火墙配置
firewall-cmd --reload

#验证端口是否开放
firewall-cmd --zone=public --list-ports

4.2.8 连接集群

redis-cli --cluster create xxx:7001 xxx:7002 xxx:7003 xxx:7004 xxx:7005 xxx:7006 --cluster-replicas 1

此处xxx为你的服务器、Linux虚拟机ip地址。

4.2.9 查看集群状态

redis-cli --cluster info xxx:7001

此处xxx为你的服务器、Linux虚拟机ip地址。


本文转载自: https://blog.csdn.net/yihaochengxuyuan/article/details/144041579
版权归原作者 yihaochengxuyuan 所有, 如有侵权,请联系我们删除。

“Redis学习小记一:基于Docker、Linux部署Redis”的评论:

还没有评论