一:redis的启动方式
1:在基础篇已经介绍过redis的安装了
前端启动reids后默认会出现这样情况,一旦启动了就不能干别的事,需要一直保持redis才能正常使用
2: 所以要改成后端启动:编辑/usr/local/redis/redis.conf文件
把daemonize设置为yes
把/root/redis-3.0.0/redis.conf复制到/usr/local/redis/bin目录下
3: 后端启动redis命令(切换到bin目录下): ./bin/redis-server ./redis.conf
zhengcx:bin apple$ ls
dump.rdb redis-check-rdb redis-sentinel.conf
redis-benchmark redis-cli redis-server
redis-check-aof redis-sentinel redis.conf
zhengcx:bin apple$ ./redis-server redis.conf
26968:C 11 Aug 2020 14:39:47.465 # oO0OoO0OoO0Oo Redis is starting oO0OoO0OoO0Oo
26968:C 11 Aug 2020 14:39:47.465 # Redis version=5.0.7, bits=64, commit=00000000, modified=0, pid=26968, just started
26968:C 11 Aug 2020 14:39:47.465 # Configuration loaded
4: 后端关闭redis命令:./bin/redis-cli shutdown
5: 打开redis客户端,做一些基本操作如下图, 需要启动redis才能做操作
./redis-cli
[root@localhost bin]# ./redis-cli
默认连接localhost运行在6379端口的redis服务。
[root@localhost bin]# ./redis-cli -h 192.168.1.77 -p 6379
-h:连接的服务器的地址
-p:服务的端口号
关闭redis:[root@localhost bin]# ./redis-cli shutdown
二:Redis五种数据类型
Redis 字符串(String)
String:key-value(做缓存)
Redis中所有的数据都是字符串。命令不区分大小写,key是区分大小写的。Redis是单线程的。Redis中不适合保存内容大的数据
set、get
127.0.0.1:6379> set name zcx
OK
127.0.0.1:6379> get name
"zcx"
127.0.0.1:6379> del name
(integer) 1
127.0.0.1:6379> get name
(nil)
127.0.0.1:6379>
incr:加一(生成id)
Decr:减一
127.0.0.1:6379> SET page_view 20
OK
127.0.0.1:6379> INCR page_view
(integer) 21
127.0.0.1:6379> GET page_view
"21"
127.0.0.1:6379> DECR page_view
(integer) 20
127.0.0.1:6379> GET page_view
"20"
127.0.0.1:6379>
Redis 哈希(Hash)
Hash:key-fields-values(做缓存)
相当于一个key对于一个map,map中还有key-value
使用hash对key进行归类。
Hset:向hash中添加内容
Hget:从hash中取内容
127.0.0.1:6379> HSET myhash field1 "foo"
(integer) 1
127.0.0.1:6379> HGET myhash field1
"foo"
127.0.0.1:6379> HDEL myhash field1
(integer) 1
127.0.0.1:6379> HGET myhash field1
(nil)
127.0.0.1:6379> HDEL myhash field2
(integer) 0
127.0.0.1:6379>
我们设置了 redis 的一些描述信息(name, description, likes, visitors) 到哈希表的 runoobkey 中。
127.0.0.1:6379> HMSET runoobkey name "redis tutorial" description "redis basic commands for caching" likes 20 visitors 23000
OK
127.0.0.1:6379> HGETALL runoobkey
1) "name"
2) "redis tutorial"
3) "description"
4) "redis basic commands for caching"
5) "likes"
6) "20"
7) "visitors"
8) "23000"
127.0.0.1:6379>
Redis 列表(List)
127.0.0.1:6379> LPUSH runooblist redis
(integer) 1
127.0.0.1:6379> LPUSH runooblist mongodb
(integer) 2
127.0.0.1:6379> LPUSH runooblist mysql
(integer) 3
127.0.0.1:6379> LRANGE runooblist 0 10
1) "mysql"
2) "mongodb"
3) "redis"
127.0.0.1:6379>
Redis 集合(Set)
127.0.0.1:6379> SADD runoobset redis
(integer) 1
127.0.0.1:6379> SADD runoobset mongodb
(integer) 1
127.0.0.1:6379> SADD runoobset mysql
(integer) 1
127.0.0.1:6379> SMEMBERS runoobset
1) "redis"
2) "mysql"
3) "mongodb"
127.0.0.1:6379>
Redis 有序集合(sorted set)
127.0.0.1:6379> ZADD runoobsort 1 redis
(integer) 1
127.0.0.1:6379> ZADD runoobsort 2 mongodb
(integer) 1
127.0.0.1:6379> ZADD runoobsort 3 mysql
(integer) 1
127.0.0.1:6379> ZADD runoobsort 4 mysql
(integer) 0
127.0.0.1:6379> ZRANGE runoobsort 0 10 WITHSCORES
1) "redis"
2) "1"
3) "mongodb"
4) "2"
5) "mysql"
6) "4"
127.0.0.1:6379>
在以上实例中我们通过命令 ZADD 向 redis 的有序集合中添加了三个值并关联上分数。可用图形界面工具查看redis数据redis desktop manager
三:Redis的持久化方案
Redis的所有数据都是保存到内存中的。
Rdb:快照形式,定期把内存中当前时刻的数据保存到磁盘。Redis默认支持的持久化方案。
1. 如果15min内, 有 >=1 个值发生了改变, 则15min保存一次快照文件
2. 如果5min内, 有 >=10 个值发生了改变, 则5min会保存一次快照文件
3. 如果每分钟都有 >=10000 个值发生改变, 则每分钟都会保存到磁盘中
按照这种方式, 还是有可能会丢失数据的, 但是丢失数据的量会小很多. 这个是redis默认的持久化方案.
aof形式:append only file。把所有对redis数据库操作的命令,增删改操作的命令。保存到文件中。数据库恢复时把所有的命令执行一遍即可
四:Redis集群的搭建
(1)所有的redis节点彼此互联(PING-PONG机制),内部使用二进制协议优化传输速度和带宽.
(2)节点的fail是通过集群中超过半数的节点检测失效时才生效.
(3)客户端与redis节点直连,不需要中间proxy层.客户端不需要连接集群所有节点,连接集群中任何一个可用节点即可
(4)redis-cluster把所有的物理节点映射到[0-16383]slot上,cluster 负责维护node<->slot<->value
(5)Redis 集群中内置了 16384 个哈希槽,当需要在 Redis 集群中放置一个 key-value 时,redis 先对 key 使用 crc16 算法算出一个结果,然后把结果对 16384 求余数,这样每个 key 都会对应一个编号在 0-16383 之间的哈希槽,redis 会根据节点数量大致均等的将哈希槽映射到不同的节点
1. 进入下载的目录,因为刚才redis就是下载到该目录了
cd Desktop/
#创建一个目录
mkdir redisCluter
#进入这个目录
cd redisCluter/
#创建6个节点目录
mkdir 6000 6001 6002 6003 6004 6005
zhengcx:redisCluter apple$ cd /Users/apple/Desktop/redisCluter
zhengcx:redisCluter apple$ mkdir 6000 6001 6002 6003 6004 6005
zhengcx:redisCluter apple$
2: 把刚才解压的包更改一下配置
# 端口号,每个目录都不同
port 6000
# 开启集群模式
cluster-enabled yes
#节点超时实际,单位毫秒
cluster-node-timeout 5000
#集群内部配置文件(默认为 nodes-6379.conf)
cluster-config-file nodes.conf#
#启动 AOFappendonly yes# 默认是no,改成 yes,意思是是否要后台启动。
daemonize yes
3: redis-4.0.11目录 执行命令,redis启动,然后在关闭他,我就简单粗暴了
ps -ef|grep redis
找到redis进程 ,kill -9 进程id。这步启动然后关闭,其目的是为生成一些文件
4: 配置的最后一步是 把 端口号,(每个目录都不同)port 6000 改成相应目录的端口号。也是刚才的步骤,进入每一个redis.conf,修改端口
5:启动6个节点的redis
分别进入每一个端口下的redis 执行启动命令,例如
cd /Users/apple/Downloads/redisCluter/6005/redis-4.0.11
redis-server redis.conf
6个节点都启动成功后,自己看一下
ps -ef|grep redis
6:关联所有节点
刚刚我们已经把所有的节点启动了,但此时他们都是互相独立的单个集群节点。要想实现集群,必须将他们关联起来,随便进入一个节点的 redis-cli.
进入6000节点的redis目录中执行命令,进入控制台
redis-cli -p 6000
依次执行下面的命令
7:分配 slot
redis Cluster 是由 16384 个 slot 组成的,那么我们需要将这些槽分散到这其中 3 个节点里(3 主 3 从)
进入6002的redis目录中执行命令
zhengcx:redis-4.0.11 apple$ redis-cli -p 6000 cluster addslots {0..5461}
OK
zhengcx:redis-4.0.11 apple$ redis-cli -p 6001 cluster addslots {5462..10922}
OK
zhengcx:redis-4.0.11 apple$ redis-cli -p 6002 cluster addslots {10923..16383}
OK
zhengcx:redis-4.0.11 apple$
此时节点已经分配好了。通过以下命令验证:
redis-cli -p 6000 cluster nodes
现在6个节点都是主节点,并且给6000 、6001 、6002分配了槽slot
错误提示是说:slot插槽被占用了、这是因为 搭建集群前时,以前redis的旧数据和配置信息没有清理干净。
解决方案:用redis-cli 登录到每个节点执行 flushall 和 cluster reset 就可以了
zhengcx:redis-4.0.11 apple$ redis-cli -p 6001
127.0.0.1:6001> flushall
OK
127.0.0.1:6001> cluster reset
OK
127.0.0.1:6001>
8:主从复制
主节点已经有了 slot,那么最后一步就是将主节点和从节点进行关联,形成主从复制的关系。
命令如下:注意:需要在从节点的 cli 命令窗口关联主节点。不能反着来
redis-cli -p 6000 cluster replicate 6003的NodeID
redis-cli -p 6001 cluster replicate 6004的NodeID
redis-cli -p 6002 cluster replicate 6005的NodeID
看到我框上的那一串 16 进制字符串,其实就是后面对应进程节点的NodeId,这个是用处的,先放着。
然后分别设置6003、 6004 、6005节点的主库,执行下面命令,你们要对应自己的NodeId。
这时候在执行
redis-cli -p 6000 cluster nodes
到这里三主三从已经设置好了