Redis 中间件
一、Windown 下安装
1.1 下载: https://github.com/MSOpenTech/redis/releases
2. 解压:
3. 加入环境变量(就不需要到解压目录运行命令)
//redis-server.exe运行程序//redis.windows.conf配置文件, 可以不加,会使用默认配置redis-server.exe redis.windows.conf

二、Linux 下安装
2.1 下载 安装及编译
//放到特定位置//这里放到/usr/local/cd /usr/local///注意权限问题,需要权限,则加上sudo 运行//下载wget http://download.redis.io/releases/redis-6.0.0.tar.gz//解压tar xzf redis-6.0.0.tar.gz//切换到解压目录cd redis-6.0.0//编译make
- 问题
linux 安装sudo apt remove apparmor解决:Could not create server TCP listening socket 0.0.0.0:6379: unable to bind socket, errno: 13
2.2 启动
src/redis-server
三、Docker 安装(推荐)
3.1 创建文件夹
mkdir -p $PWD/redis/{data,conf}
3.2 拷贝配置文件
#先启动一个redis 服务docker run -p 6379:6379 --name redis -d redis:6.0#拷贝配置文件(可能找不到)docker cp redis:/etc/redis/redis.conf $PWD/conf#到官网下载#https://redis.io/download#https://github.com/antirez/redis/blob/6.0/redis.confwget https://raw.githubusercontent.com/antirez/redis/6.0/redis.conf
3.3 配置(进入配置文件修改以下属性)
port 6379requirepass 123456 #设置密码protected-mode no #保护模式(yes|no)bind 127.0.0.1 #绑定访问的地址,如果想任何地址都能访问,加上注释
3.4 启动
docker container stop redisdocker container rm redisdocker run -d -p 6379:6379 \--name redis \-v $PWD/redis/conf/redis.conf:/conf/redis.conf \-v $PWD/redis/data:/data \--restart=always \--privileged=true \redis:6.0 redis-server /conf/redis.conf #指定配置文件启动
四、docker搭建主从
4.1 修改配置
获取配置
wget http://download.redis.io/redis-stable/redis.conf
master 配置
port 6123 #这里修改了默认端口6379protected-mode no #关闭保护模式bind 0.0.0.0 #测试,开放给所有ip 都能访问, 生产环境注意绑定特定iprequirepass test #密码
slave1
masterauth test #主节点验证密码port 6124 #这里修改了默认端口6379protected-mode no #关闭保护模式bind 0.0.0.0 #测试,开放给所有ip 都能访问, 生产环境注意绑定特定iprequirepass test #密码#指定主节点replicaof redis-master 6123
slave2
masterauth test #主节点验证密码port 6125 #这里修改了默认端口6379protected-mode no #关闭保护模式bind 0.0.0.0 #测试,开放给所有ip 都能访问, 生产环境注意绑定特定iprequirepass test #密码#指定主节点replicaof redis-master 6123
4.2 docker-compose.yml
```shell version: ‘3’ services: redis-master: image: ‘redis:6.0’ container_name: ‘redis-server-master’ restart: always privileged: true expose:
- 6123
environment:
TZ: "Asia/Shanghai" #时区,保证时间正确
volumes:
- '$PWD/redis/master/conf/redis.conf:/usr/local/etc/redis/redis.conf'- '$PWD/redis/master/data:/data'
networks:
- ms-redis-netword
command: [“redis-server”, “/usr/local/etc/redis/redis.conf”] redis-slave-1: image: ‘redis:6.0’ container_name: ‘redis-server-slave-1’ restart: always privileged: true expose:
- 6124
environment:
TZ: "Asia/Shanghai" #时区,保证时间正确
volumes:
- '$PWD/redis/slave1/conf/redis.conf:/usr/local/etc/redis/redis.conf'- '$PWD/redis/slave1/data:/data'
networks:
- ms-redis-netword
depends_on:
- redis-master
command: [“redis-server”, “/usr/local/etc/redis/redis.conf”] redis-slave-2: image: ‘redis:6.0’ container_name: ‘redis-server-slave-2’ restart: always privileged: true expose:
- 6125
environment:
TZ: "Asia/Shanghai" #时区,保证时间正确
volumes:
- '$PWD/redis/slave2/conf/redis.conf:/usr/local/etc/redis/redis.conf'- '$PWD/redis/slave2/data:/data'
networks:
- ms-redis-netword
depends_on:
- redis-master
command: [“redis-server”, “/usr/local/etc/redis/redis.conf”]
networks: ms-redis-netword: driver: bridge
<a name="eR4ex"></a>#### 4.3 启动验证```shell#连接masterdocker exec -it redis-server-master bash#连接redisredis-cli -p 6123#验证127.0.0.1:6123> auth testOK#查看分片情况127.0.0.1:6123> info replication# Replicationrole:masterconnected_slaves:2 #有两个从节点slave0:ip=192.168.48.3,port=6125,state=online,offset=826,lag=0slave1:ip=192.168.48.4,port=6124,state=online,offset=826,lag=0master_replid:b540d4dbee52d6284bda72186b55bec1b8064ab0master_replid2:0000000000000000000000000000000000000000master_repl_offset:826second_repl_offset:-1repl_backlog_active:1repl_backlog_size:1048576repl_backlog_first_byte_offset:1repl_backlog_histlen:826# 设置值127.0.0.1:6123> set test1 java## 登录从节点,看是否有同步docker exec -it redis-server-slave-1 bash#连接redisredis-cli -p 6124#验证127.0.0.1:6124> auth testOK127.0.0.1:6124> get test1"java"
五、搭建简单的集群
5.1 redis配置文件模板redis.cluster.template
#关闭保护模式protected-mode no#端口port ${PORT}#后台运行daemonize no#配置,数据文件路径dir ./#是否开启持久化appendonly yes#是否开启集群cluster-enabled yes#集群配置文件cluster-config-file nodes.conf#节点连接超时时间cluster-node-timeout 15000
5.2 初始化配置文件脚本 init_redis_cluster.sh
#!/bin/bash#删除创建的文件rm -rf $PWD/master $PWD/slave#master 和 slave 文件夹for port in `seq 7000 7005`; doms="master"if [ $port -ge 7003 ]; thenms="slave"fimkdir -p $PWD/$ms/$port/conf \&& mkdir -vp $PWD/$ms/$port/data \&& PORT=$port envsubst < ./redis.cluster.template > $PWD/$ms/$port/conf/redis.conf;done
5.3 创建redis容器脚本(create_redis_cluster.sh)
#!/bin/bash#运行docker redis 的 master 和 slave 实例for port in `seq 7000 7005`; doms="master"if [ $port -ge 7003 ]; thenms="slave"fiif [ "$(docker ps -q -f name=redis-cluster-$ms-$port)" ]; then#stopdocker container stop redis-cluster-$ms-$portfiif [ "$(docker ps -aq -f status=exited -f name=redis-cluster-$ms-$port)" ]; then#cleanupdocker container rm redis-cluster-$ms-$portfi# run your containerdocker run -d -p $port:$port -p 1$port:1$port \-v $PWD/$ms/$port/conf:/conf \-v $PWD/$ms/$port/data:/data \--privileged=true --restart always \--name redis-cluster-$ms-$port \--net network-redis-cluster \redis redis-server /conf/redis.conf;done
5.4 执行脚本,启动容器
#注意,模板和脚本要在同一文件目录下sudo sh ./init_redis_cluster.shsudo sh ./create_redis_cluster.sh#查看容器是否正常启动docker ps -a --filter "network=network-redis-cluster"
5.5 分配启动集群
#!/bin/bash#拼接masters : slaves 节点参数matches=""for port in `seq 7000 7005`; doms="master"if [ $port -ge 7003 ]; thenms="slave"fimatches=$matches$(docker inspect --format '{{(index .NetworkSettings.Networks "network-redis-cluster").IPAddress}}' "redis-cluster-$ms-${port}"):${port}" ";done# 创建docker-cluster# redis 4 or 3版本#需要redis-trib 镜像#docker run -it --rm --net redis-cluster-net redis-trib ruby redis-trib.rb create --replicas 1 $matches#redis 5 版本docker run -it --rm --net network-redis-cluster --privileged=true redis redis-cli --cluster create $matches --cluster-replicas 1#如果权限不够,则添加一下参数#--privileged=true

5.6 测试
#登录7001redisdocker exec -it redis-cluster-master-7001 bash#连接root@a70b1d940dae:/usr/local# redis-cli -c -p 7001127.0.0.1:7001> set foo bar-> Redirected to slot [12182] located at 172.20.0.5:7002OK172.20.0.5:7002> set hello world-> Redirected to slot [866] located at 172.20.0.4:7000OK172.20.0.4:7000> get foo-> Redirected to slot [12182] located at 172.20.0.5:7002"bar"172.20.0.5:7002> get hello-> Redirected to slot [866] located at 172.20.0.4:7000"world"172.20.0.4:7000>
5.7 这里还涉及(待续…)
- 添加节点
- 移除节点
- 重新调整节点分片大小
