Redis

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支持各种不同方式的排序。

  1. 字符串(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 c

lrange 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 七个命令。

img

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
OK

127.0.0.1:8001> info replication

启动主服务器:
cd  /usr/local/redis/etc

root@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
 

 
  • 22
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值