redis简介
Redis(全称:Remote Dictionary Server 远程字典服务)
redis是一个key-value存储系统。和Memcached类似,它支持存储的value类型相对更多,包括string(字符串)、list(链表)、set(集合)、zset(sorted set --有序集合)和hash(哈希类型)。这些数据类型都支持push/pop、add/remove及取交集并集和差集及更丰富的操作,而且这些操作都是原子性的。在此基础上,redis支持各种不同方式的排序。与memcached一样,为了保证效率,数据都是缓存在内存中。区别的是redis会周期性的把更新的数据写入磁盘或者把修改操作写入追加的记录文件,并且在此基础上实现了master-slave(主从)同步。
Redis 是一个高性能的key-value数据库。 redis的出现,很大程度补偿了memcached这类key/value存储的不足,在部 分场合可以对关系数据库起到很好的补充作用。它提供了Java,C/C++,C#,PHP,JavaScript,Perl,Object-C,Python,Ruby,Erlang等客户端,使用很方便。 [1]
Redis支持主从同步。数据可以从主服务器向任意数量的从服务器上同步,从服务器可以是关联其他从服务器的主服务器。这使得Redis可执行单层树复制。存盘可以有意无意的对数据进行写操作。由于完全实现了发布/订阅机制,使得从数据库在任何地方同步树时,可订阅一个频道并接收主服务器完整的消息发布记录。同步对读取操作的可扩展性和数据冗余很有帮助。
redis的官网地址,非常好记,是redis.io。(域名后缀io属于国家域名,是british Indian Ocean territory,即英属印度洋领地),Vmware在资助着redis项目的开发和维护。
从2010年3月15日起,Redis的开发工作由VMware主持。从2013年5月开始,Redis的开发由Pivotal赞助。
Redis是NoSQL中的一种存储工具,他是一个key-value(键值对)存储系统。默认有16个数据库从0到15来进行表示。提升缓存,可以提高访问性能;
Redis数据类型
Redis的存储类型:
包括
string(字符串)、
list(列表)、
set(集合)、
zset(sorted set --有序集合)
和hash(哈希类型)。在此基础上,Redis支持各种不同方式的排序。
字符串(String):字符串是 Redis 最基础的数据类型,它存储的是二进制安全的数据,可以是数字、字符串或二进制数据。由于 Redis 的字符串是二进制安全的,因此可以用来存储图片、视频等二进制数据。应用场景包括缓存、配置信息等。
2.哈希(Hash):哈希是一种键值对集合,其中每个键都可以映射到一个或多个字段和值。哈希类型适用于存储对象,例如用户信息、商品详情等。通过使用哈希,可以更方便地对数据进行操作和查询。应用场景包括用户信息管理、商品详情管理等。
添加:hset key field value
127.0.0.1:6379> hset k2 xm lisi
获取:hget key field
127.0.0.1:6379> hget k2 xm "lisi"
删除:hdel key field [field …]
127.0.0.1:6379> del k1 (integer) 1
hexists key field包含显示1;不包含显示0;
127.0.0.1:6379> hset k1 xm zhangsan xb nan (integer) 2 127.0.0.1:6379> hexists k1 xm (integer) 1 127.0.0.1:6379> hdel k1 xb (integer) 1 127.0.0.1:6379> hexists k1 xb (integer) 0 hgetall key
返回哈希表 key 中,所有的域和值。
127.0.0.1:6379> hgetall k1 1) "xm" 2) "zhangsan" 127.0.0.1:6379> hset k1 xb nan (integer) 1 127.0.0.1:6379> hgetall k1 1) "xm" 2) "zhangsan" 3) "xb" 4) "nan"hvals key
返回哈希表 key 中所有域的值。
3.列表(List):列表是一种基于字符串的线性表数据结构,可以存储多个有序的字符串元素。列表适用于需要按照插入顺序排序的数据,例如消息队列、时间戳记录等。应用场景包括社交网络的时间线、任务队列等。
栈:先进后出
队列:先进先出
列表命令:
lpush key value [value …]
lpush k a b c #他的值为:c b a #相当于 lpush k a lpush k b lpush k c rpush key value [value …]
将一个或多个值 value 插入到列表 key 的表尾(最右边)
rpush k a b c #他的值为:a b c #相当于 rpush k a rpush k b rpush k clrange key start stop
以 0 表示列表的第一个元素,以 1 表示列表的第二个元素;
以 -1 表示列表的最后一个元素, -2 表示列表的倒数第二个元素.
127.0.0.1:6379> lrange k4 0 -1 1) "f" 2) "e" 3) "d" 4) "c" 5) "b" 6) "a"ltrim key start stop
让列表只保留指定区间内的元素,不在指定区间之内的元素都将被删除。
lpop key
移除并返回列表 key 的头元素。ltrim k1 0 2 表示只保留列表 list 的前三个元素,其余元素全部删除。
127.0.0.1:6379> lpush a 212 fdsf fds fd fsd fds (integer) 6 127.0.0.1:6379> lrange a 0 -1 1) "fds" 2) "fsd" 3) "fd" 4) "fds" 5) "fdsf" 6) "212" 127.0.0.1:6379> lpop a "fds"rpop key
移除并返回列表 key 的尾元素。
127.0.0.1:6379> lrange a 0 -1 1) "fsd" 2) "fd" 3) "fds" 4) "fdsf" 5) "212" 127.0.0.1:6379> rpop a "212" 127.0.0.1:6379> lrange a 0 -1 1) "fsd" 2) "fd" 3) "fds" 4) "fdsf"
4.集合(Set):去重复;集合是一种无序的字符串集合,其中的每个元素都是唯一的,且没有重复的元素。集合适用于需要快速查找和删除的数据,例如用户标签、黑名单等。应用场景包括用户标签管理、黑名单管理等。
sadd key member [member …]
127.0.0.1:6379> sadd s_a 123 234 345 (integer) 3 127.0.0.1:6379> smembers s_a 1) "123" 2) "234" 3) "345"smembers key
返回集合 key 中的所有成员。
不存在的 key 被视为空集合。
5.有序集合(Sorted Set):有序集合是一种特殊的集合,其中的每个元素都会关联一个分数,通过分数可以对集合进行排序。有序集合适用于需要按照分数排序的数据,例如评分排名、排行榜等。应用场景包括评分排名、热度排名等。
Redis 被广泛应用在缓存方向,与传统数据库不同的是 Redis 的数据是存在内存中的,因此读写速度非常快。
redis特点
性能极高 – Redis读的速度是11W次/s,写的速度是81K次/s
支持数据的持久化,可以将内存中的数据保存在磁盘中,重启的时候可以再次加载进行使用。
丰富的数据类型,Redis不仅仅支持简单的key-value类型的数据,同时还提供Strings, Lists, Hashes, Sets 及 Ordered Sets 等数据结构的存储。
支持数据的备份,即master-slave模式的数据备份。
redis安装
端口默认:6379,只要端口不一样,一台虚拟机可以通过修改端口达到 开多台虚拟机的效果;例如:将配置文件中端口号6379改为6380/6381/6382后,即形成了3个不同的配置文件,相当于3台机器;
【相关介绍】
gcc: c语言的编译器,编译—源代码不能直接执行,所以需要编译;
gcc-c++: c++语言的编译器;
make:编译
redis -cli :redis客户端登录
rdb:存储备份/持久化
aof:持久化
dir:目录
daemonize 后台运行
echo $!: 会显示pid
安装脚本
#!/bin/bash # 安装依赖 yum clean all yum makecache fast yum -y install gcc gcc-c++ make tcl # 下载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.3.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 sed -i "s/dbfilename dump.rdb/dbfilename dump.rdb/g" /usr/local/redis/etc/redis.conf sed -i "s/appendfilename \"appendonly.aof\"/appendfilename \"appendonly.aof\"/g" /usr/local/redis/etc/redis.conf # 将配置文件复制到/etc下 mkdir /etc/redis/ cp /usr/local/redis/etc/redis.conf /etc/redis/ # 启动redis /usr/local/redis/bin/redis-server /etc/redis/redis.conf echo 'export PATH=$PATH:/usr/local/redis/bin/' >> /etc/profile source /etc/profile #查看redis监听端口 netstat -tanp|grep redis
启动脚本
#!/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
习惯上会把启动脚本放置在/etc/init.d/目录下,方便使用 cp redis.sh /etc/init.d/redis
redis常用命令
1.ping测试是否正常连接:
ping 返回PONG
2.select 切换到指定数据库
127.0.0.1:6379> select 1 OK 127.0.0.1:6379[1]>
键命令:
set key value
将字符串值 value关联到 key 。
127.0.0.1:6379> set key1 1 OK
get key
返回 key所关联的字符串值。如果 key 不存在那么返回特殊值 nil 。
127.0.0.1:6379> get key1 "1"
del key1 [key2 … keyn]
删除给定的一个或多个 key 。没有的key忽略,返回被删除 key 的数量。
声明key1,key2,key3,删除key1,key2,key4
127.0.0.1:6379> set key1 1 OK 127.0.0.1:6379> set key2 1 OK 127.0.0.1:6379> set key3 1 OK 127.0.0.1:6379> del key1 key2 key4 (integer) 2127.0.0.1:6379> del key1 (integer) 1
exists key
检查给定 key 是否存在。若 key 存在,返回 1 ,否则返回 0 。
127.0.0.1:6379> exists key3 (integer) 1
expire key seconds
为给定 key 设置生存时间,以秒为单位,当 key 过期时(生存时间为 0 ),它会被自动删除。设置成功返回 1 。其他为0。
127.0.0.1:6379> expire key3 30 (integer) 1 127.0.0.1:6379> ttl key3 #查看有效时间 (integer) 24 127.0.0.1:6379> exists key3 #验证是否存在 (integer) 0
pexpire key mseconds
这个命令和 EXPIRE 命令的作用类似,但是它以毫秒为单位设置 key 的生存时间,而不像 EXPIRE 命令那样,以秒为单位。设置成功,返回 1。key不存在或设置失败,返回0
127.0.0.1:6379> set key1 abc OK 127.0.0.1:6379> pexpire key1 10000 (integer) 1 127.0.0.1:6379> ttl key1 (integer) 5 127.0.0.1:6379> pttl key1 (integer) 746
persist key
移除给定 key 的生存时间,将这个 key 从易失的转换成持久的。当生存时间移除成功时,返回 1 .如果 key 不存在或 key 没有设置生存时间,返回 0 。
127.0.0.1:6379> set zhangwu 1 OK 127.0.0.1:6379> persist zhangwu (integer) 0 127.0.0.1:6379> expire zhangwu 30 (integer) 1 127.0.0.1:6379> persist zhangwu (integer) 1 127.0.0.1:6379> ttl zhangwu (integer) -1
ttl key
以秒为单位,返回给定 key 的剩余生存时间(TTL, time to live)。当 key 不存在时,返回 -2 。当 key 存在但没有设置剩余生存时间时,返回 -1 。
127.0.0.1:6379> set key1 helloworld OK 127.0.0.1:6379> ttl key1 (integer) -1 127.0.0.1:6379> expire key1 50 (integer) 1 127.0.0.1:6379> ttl key1 (integer) 44 127.0.0.1:6379> ttl key1 (integer) -2
pttl key
这个命令类似于 TTL 命令,但它以毫秒为单位返回 key 的剩余生存时间,而不是像 TTL 命令那样,以秒为单位。当 key 不存在时,返回 -2 。当 key 存在但没有设置剩余生存时间时,返回 -1 。
127.0.0.1:6379> pttl key1 (integer) -2 127.0.0.1:6379> set key1 abc OK 127.0.0.1:6379> pexpire key1 30000 (integer) 1 127.0.0.1:6379> pttl key1 (integer) 27345
type key
返回 key 所储存的值的类型。none (key不存在)、string (字符串)、list (列表)、set (集合)、zset (有序集)、hash (哈希表)
127.0.0.1:6379> type key1 string
改名rename key newkey
将 key 改名为 newkey 。改名成功时提示 OK ,失败时候返回一个错误。
127.0.0.1:6379> rename key key1 OK 127.0.0.1:6379> keys * 1) "key1" 2) "zhangwu" 3) "zhangsi"
注意:
当 key 和 newkey 相同,或者 key 不存在时,返回一个错误。
当 newkey 已经存在时, RENAME 命令将覆盖旧值。
renamenx key newkey
当且仅当 newkey 不存在时,将 key 改名为 newkey 。修改成功时,返回 1 。如果 newkey 已经存在,返回 0 。
127.0.0.1:6379> renamenx zhangsi zhangwu (integer) 0 127.0.0.1:6379> renamenx zhangsi zhangsan (integer) 1 127.0.0.1:6379> keys * 1) "zhangsan" 2) "key1" 3) "zhangwu"
move key db
将当前数据库的 key 移动到给定的数据库 db 当中。移动成功返回 1 ,失败则返回 0 。
127.0.0.1:6379> keys * 1) "zhangwu" 2) "zhangsan" 3) "zhangsi" 127.0.0.1:6379> select 1 OK 127.0.0.1:6379[1]> keys * (empty list or set) 127.0.0.1:6379[1]> select 0 OK 127.0.0.1:6379> move zhangsan 1 (integer) 1 127.0.0.1:6379> select 1 OK 127.0.0.1:6379[1]> keys * 1) "zhangsan" 127.0.0.1:6379[1]> select 0 OK 127.0.0.1:6379> keys * 1) "zhangwu" 2) "zhangsi"
创建多个:
127.0.0.1:6379> mset zhangsan 1 zhangsi 2 zhangwu 3 OK 127.0.0.1:6379> keys * 1) "zhangwu" 2) "zhangsan" 3) "zhangsi" 127.0.0.1:6379> keys ng* (empty list or set) 127.0.0.1:6379> keys *ng* 1) "zhangwu" 2) "zhangsan" 3) "zhangsi" 127.0.0.1:6379> keys zhang?? 1) "zhangwu" 2) "zhangsi" 127.0.0.1:6379> keys zha[ng]si (empty list or set) 127.0.0.1:6379> keys zhan[ng]si 1) "zhangsi"
通配符:
* 表示多个字符 ? 表示一个字符 [] 表示只能是[]里面的字符 \ 表示指定特殊字符
nginx脚本安装步骤
#! /bin/bash ip_address=$( hostname -I | cut -d ' ' -f1) if [ -z "$ip_address" ]; then echo "无法获取IP地址" exit 1 fi touch /etc/yum.repos.d/nginx.repo echo '[nginx] name = nginx repo baseurl = "https://nginx.org/packages/mainline/centos/7/$basearch/" gpgcheck = 0 enabled = 1' >>/etc/yum.repos.d/nginx.repo echo "配置yum源完成" yum -y install nginx echo "安装nignx成功" sed -i 's/.*//' /etc/nginx/conf.d/default.conf echo "删除原先脚本中的内容" echo ' server { listen 80; root /usr/share/nginx/html; server_name hostname; #charset koi8-r; #access_log /var/log/nginx/log/host.access.log main; # location / { index index.php index.html index.htm; } #error_page 404 /404.html; #redirect server error pages to the static page /50x.html # error_page 500 502 503 504 /50x.html; location = /50x.html { root /usr/share/nginx/html; } #pass the PHP scripts to FastCGI server listening on 127.0.0.1:9000 # location ~ .php$ { fastcgi_pass 127.0.0.1:9000; fastcgi_index index.php; fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name; include fastcgi_params; } }' >> /etc/nginx/conf.d/default.conf sed "s/hostname/$ip_address/" /etc/nginx/conf.d/default.conf echo "修改文件成功" systemctl start nginx systemctl enable nginx echo "启动 Nginx,设置 Nginx 为开机自启动"
字符串命令
EX:设置键的过期时间为 second 秒
127.0.0.1:6379> set key1 hello EX 1000 OK 127.0.0.1:6379> get key1 "hello" 127.0.0.1:6379> ttl key1 (integer) 992
PX:设置键的过期时间为 millisecond 毫秒
127.0.0.1:6379> set key2 hello PX 100000 OK 127.0.0.1:6379> get key2 "hello" 127.0.0.1:6379> pttl key2 (integer) 89973
3.19数据持久化
Redis支持两种数据持久化方式:RDB方式和AOF方式
1.RDB(快照方式)save/bgsave:
RDB方式是一种快照式的持久化方法,将某一时刻的数据持久化到磁盘中。这种方式就是将内存中数据以快照的方式写入到二进制文件中 ,默认的文件名为dump.rdb。
2.AOF(日志追加)优先:
命令写入 (append)、文件同步(sync)、文件重写(rewrite)、重启加载 (load)
AOF方式是将执行过的写指令记录下来,在数据恢复时按照从前到后的顺序再将指令执行一遍。这种方式 redis 会将每一个收到的写命令都通过 write 函数追加到文件中(默认appendonly.aof)。
1.配置文件:
vim /etc/redis/redis.conf
添加数据保存路径:
dir /usr/local/redis/data
2.杀死进程
kill -9 $(cat /usr/local/redis/redis.conf)
Redis集群模式
1.主从模式
-
主数据库可以进行读写操作,当读写操作导致数据变化时会自动将数据同步给从数据库
-
从数据库一般都是只读的,并且接收主数据库同步过来的数据
-
一个master可以拥有多个slave,但是一个slave只能对应一个master
-
slave挂了不影响其他slave的读和master的读和写,重新启动后会将数据从master同步过来
-
master挂了以后,不影响slave的读,但redis不再提供写服务,master重启后redis将重新对外提供写服务
-
master挂了以后,不会在slave节点中重新选一个master
工作机制
当slave启动后,主动向master发送SYNC命令。master接受到SYNC命令后在后台保存快照(RDB持久化)和缓存保存快照这段时间的命令,然后将保存的快照文件和缓存的命令发送给slave。slave收到快照文件和命令后加载快照文件和缓存的执行命令。复制初始化后,master每次收到的写命令都会同步发送给slave,保证主从数据一致性。
缺点:
从上面可以看出,master节点在主从模式中唯一,若master挂掉,则redis无法对外提供写服务。
例:一主两从:
安装redis:
安装脚本:
#!/bin/bash # 安装依赖 yum clean all yum makecache fast yum -y install gcc gcc-c++ make tcl # 下载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.3.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 sed -i "s/dbfilename dump.rdb/dbfilename dump.rdb/g" /usr/local/redis/etc/redis.conf sed -i "s/appendfilename \"appendonly.aof\"/appendfilename \"appendonly.aof\"/g" /usr/local/redis/etc/redis.conf # 将配置文件复制到/etc下 mkdir /etc/redis/ cp /usr/local/redis/etc/redis.conf /etc/redis/ # 启动redis /usr/local/redis/bin/redis-server /etc/redis/redis.conf echo 'export PATH=$PATH:/usr/local/redis/bin/' >> /etc/profile source /etc/profile # 查看redis监听端口 netstat -tanp|grep redis
启动脚本
#!/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
添加权限:
chmod +x redis.sh
启动Redis服务器
./redis.sh start
习惯上会把启动脚本放置在/etc/init.d/目录下,方便使用
cp redis.sh /etc/init.d/redis
配置单机一主二从(在一台虚拟机上通过修改配置文件,达到启动三台虚拟机的效果)
1.进行文件的复制
在/usr/local/redis/etc目下,将redis.conf复制成三份分别取名为:redis-8000.conf、redis-8001.conf、redis-8002.conf三个配置文件
cd /usr/local/redis/etc/ cp redis.conf redis-8000.conf cp redis.conf redis-8001.conf cp redis.conf redis-8002.conf
2.关闭之前的服务
先确保服务文件是否有执行的权限然后在输入
/etc/init.d/systemctl_redis.sh stop
3.进入主机配置文件
vim /usr/local/redis/etc/redis-8000.conf
bind 127.0.0.1 #将bind注释掉 或 bind 0.0.0.0 port 8000 #改变其服务端口 daemonize yes #修改服务为后台运行 pidfile /var/run/redis_8000.pid #指定不同的pid文件,注意三份配置文件不同。 logfile "/usr/local/redis/log/redis_8000.log" #指定log日志路径,自己配,要求不同。 dir ./data/redis_8000 #这个指定rdb文件和aof文件的路径配置,要求改成不同。 masterauth 123 #都配上吧,从服务到主服务的认证密码。 requirepass 123 #三份文件都配置,客户端访问需要密码验证。 保存并退出
第四步:进入从服务器的配置文件修改内容
#bind 127.0.0.1 #将bind注释掉 或 bind 0.0.0.0 port 8001 #改变其服务端口 daemonize yes #修改服务为后台运行 pidfile /var/run/redis_8001.pid #指定不同的pid文件,注意三份配置文件不同。 logfile "/usr/local/redis/log/redis_8001.log" #指定log日志路径,自己配,要求不同。 dir ./data/redis_8001 #这个指定rdb文件和aof文件的路径配置,要求改成不同。 replicaof 127.0.0.1 8000 #主服务这句话注释,从服务配置的两台需要开启。配置主服务的ip的port。 masterauth 123 #都配上吧,从服务到主服务的认证密码。 requirepass 123 #三份文件都配置,客户端访问需要密码验证。 #bind 127.0.0.1 #将bind注释掉 或 bind 0.0.0.0 port 8002 #改变其服务端口 daemonize yes #修改服务为后台运行 pidfile /var/run/redis_8002.pid #指定不同的pid文件,注意三份配置文件不同。 logfile "/usr/local/redis/log/redis_8002.log" #指定log日志路径,自己配,要求不同。 dir ./data/redis_8002 #这个指定rdb文件和aof文件的路径配置,要求改成不同。 replicaof 127.0.0.1 8000 #主服务这句话注释,从服务配置的两台需要开启。配置主服务的ip的port。 masterauth 123 #从服务到主服务的认证密码。 requirepass 123 #三份文件都配置,客户端访问需要密码验证。
第五步:启动服务;
../bin/redis-server ./redis-8000.conf
../bin/redis-server ./redis-8001.conf
../bin/redis-server ./redis-8002.conf
查看端口号是否正常
netstat -lnutp | grep redis
第六步:开启客户端
redis-cli -h 127.0.0.1 -p 8000
redis-cli -h 127.0.0.1 -p 8001
redis-cli -h 127.0.0.1 -p 8002
分别进行验证
在主机的redis中输入
info replication即可查看是否有从机
2.redis哨兵模式
Redis 的主从复制模式下,一旦主节点由于故障不能提供服务,需要手动将从节点晋升为 主节点,同时还要通知客户端更新主节点地址,这种故障处理方式从一定程度上是无法接受的。Redis 2.8 以后提供了 Redis Sentinel 哨兵机制 来解决这个问题。
一、哨兵简介 1、哨兵的组成 Redis 哨兵(Sentinel)是由一个或多个 Sentinel 实例组成的 Sentinel 系统,可以监视任意多个主服务器,以及这些主服务器的所有从服务器。
Sentinel 本质上是一个运行在特殊状模式下的 Redis 服务器。Sentinel 模式下 Redis 服务器只支持 PING、SENTINEL、INFO、SUBSCRIBE、UNSUBSCRIBE、PSUBSCRIBE、PUNSUBSCRIBE 七个命令。
2、哨兵的作用 Redis官方文档的描述如下:
监控(Monitoring):哨兵会不断地检查主节点和从节点是否运作正常。
自动故障转移(Automatic failover):当主节点不能正常工作时,哨兵会开始自动故障转移操作,它会将失效主节点的其中一个从节点升级为新的主节点,并让其他从节点改为复制新的主节点。 配置提供者(Configuration provider):客户端在初始化时,通过连接哨兵来获得当前Redis服务的主节点地址。
通知(Notification):哨兵可以将故障转移的结果发送给客户端。
自动哨兵模式步骤
第一步:找到sentinel.conf文件
vim /usr/local/redis/sentinel.conf
第二步:复制三个文件
cd /redis-6.2.14/
egrep -v "$|#" sentinel.conf > /usr/local/redis/etc/sentinel-26379.conf
egrep -v "$|#" sentinel.conf > /usr/local/redis/etc/sentinel-26380.conf
egrep -v "$|#" sentinel.conf > /usr/local/redis/etc/sentinel-26381.conf
第三步:cd /usr/local/redis/etc查看
第四步:修改3个配置文件
改port 26379
pidfile ‘/var/run/redis-sentinel-26379.pid’
logfile "/usr/local/redis/logs/sentinel-26379.log"
sentinel monitor mymaster 127.0.0.1 8002 2 sentinel down-after-milliseconds mymaster 5000
sentinel failover-timeout mymaster 30000
第五步:**三个文件都执行**
[root@localhost etc]# redis-sentinel sentinel-26379.conf
另外开一个端口**验证**:
[root@localhost ~]# cd "/usr/local/redis/etc"
[root@localhost etc]# cd ../
查看
[root@localhost redis]# ls
root@localhost redis]# cd logs[root@localhost logs]# ls
redis_8000.log sentinel-26379.log
redis_8001.log sentinel-26380.log
redis_8002.log sentinel-26381.log
[root@localhost logs]# cat sentinel-26379.log杀死主服务器进程
root@localhost logs]# kill -9 10059
查看是否有主服务器端口:
[root@localhost logs]# ps -aux |grep redis
root 10118 0.1 0.2 165076 2684 ? Ssl 19:24 0:0
root 10125 0.1 0.2 165076 2688 ? Ssl 19:24 0:0
root 11277 0.3 0.3 162516 3264 pts/1 Sl+ 21:11 0:0
root 11366 0.3 0.3 162516 3264 pts/2 Sl+ 21:14 0:0
root 11371 0.3 0.3 162516 3268 pts/3 Sl+ 21:14 0:0
root 11421 0.0 0.0 112824 984 pts/4 R+ 21:18 0:
登录从服务器验证:
[root@localhost logs]# redis-cli -h 127.0.0.1 -p 8001
输入密码:
127.0.0.1:8001> auth 123
OK127.0.0.1:8001> info replication
启动主服务器:
cd /usr/local/redis/etcroot@localhost etc]# ../bin/redis-server ./redis-8000.conf
[root@localhost etc]# redis-cli -h 127.0.0.1 -p 8000
127.0.0.1:8000> auth 123
OK
127.0.0.1:8000> info replication