一.redis介绍
(1)概念:属于非关系型存储数据库——基于kv(键值存储)的开源的内存存储,数据库结构存储。经常被用作数据库,消息队列和缓存。
搜狗截图20171116091316.png
下载可去官网www.redis.io 或是epel源进行下载
主程序/usr/bin/redis-server
监听端口:6379/tcp
客户端:/usr/bin/redis-cli
数据目录:/var/lib/redis
(2)支持的数据结构
字符串、列表(数组)、hashes(关联数组)、集合、有序集合、bitmaps、hyperloglogs、空间索引
(3)redis特点
内建的复制、Lua scripting、LRU、事务、持久存储、高可用(Sentinel,Redis Cluster)
(4)redis:k/v
基于kv键值存储,进入客户端redis-cli
搜狗截图20171116092655.png
通过select命令来选择数据库,不能超过15(15为数据库编号,是第16个数据库)
常用命令
使用help进行查询帮助,Help @generic(通用命令),@string
@list,@set,@hash,@pubsub,@sorted_set
下面选择几个常用的命令演示以加深印象
1.@string
主要应用:增,删,改,查
搜狗截图20171116094054.png
使用get来查看mykey的内容
如果想要在mykey增加内容就是用append命令来实现
搜狗截图20171116094417.png
注意在使用set命令创建key时如果想要设置过期时间可以在后面加入EX 加时间(时间以秒为单位),这样就是代表经过多长时间该内容就会消失
搜狗截图20171116095107.png
在后面加入NX代表只创建不存在的key,如果之前存在就不创建,如果不在后面加入NX,那么创建相同的key,就会把之前的内容覆盖
搜狗截图20171116095651.pngincr和decr使用
set count 0
搜狗截图20171116100922.png查看键值长度
搜狗截图20171116100205.png
2.help @list
使用lpush 命令创建key
搜狗截图20171116103627.pnglindex,lrange
搜狗截图20171116104209.pnglinsert
搜狗截图20171116104359.pngrpop和lpop
搜狗截图20171116104644.png- llen——查看列表长度
- lrem——删除命令,lrem week 1 thu 搜狗截图20171116105039.png
- lset 搜狗截图20171116105328.png
3.help @hash
hget
hget who(key) name(field) tom(values)
搜狗截图20171116110223.pnghmget
搜狗截图20171116110545.png
搜狗截图20171116110611.pnghstrlen和hgetall
搜狗截图20171116110756.pnghdel
搜狗截图20171116110839.png
4.help @set——主要应用于集合的交差并补
设置
sadd animals dog elephant fox horse monkey cat wolf
sadd jiaqin egg chicken dog pig cat duck fish
使用smembers animals和smembers jianqin来查看
搜狗截图20171116111825.png
srem——删除key中的内容
搜狗截图20171116112351.png
*sinter sdiff sunion
搜狗截图20171116112614.png
搜狗截图20171116112730.png
5.help @sorted_set——通过评分机制来划分
- zadd employees1 1 tom 3 jerry 4 hadern 5 bush 7 obama
9 sanpang 10 zhangzhe- zscore key zrank
搜狗截图20171116113735.png
*zrangebyscore
搜狗截图20171116113852.png- ZUNIONSTORE——并集存储
- ZINTERSTORE——交集存储
- ZREM ——删除
6.help @pubsub——发布订阅队列
常用命令:publish——扇出(将内容发给订阅该频道的用户),后来的用户无法接收到,因为该内容扇出
subscribe——订阅具体频道
搜狗截图20171116115022.png
在另一个终端上
搜狗截图20171116115154.png
再开启一个终端
搜狗截图20171116115324.png
- UNSUBSCRIBE——取消订阅
二.配置与使用redis
配置文件——/etc/redis.conf
搜狗截图20171116142250.png
(1).基本配置项
daemonize, supervised, pidfile
搜狗截图20171116155110.png
loglevel,logfile
搜狗截图20171116155208.png
databases,select 0-15来选择数据库
搜狗截图20171116155326.png
(2).网络配置项
bind IP
搜狗截图20171116155901.png
port PORT
默认为6379,一般情况下也不建议修改端口
protected-mode
搜狗截图20171116160156.png
tcp-backlog
unixsocket
timeout:连接的空闲超时时长;
默认设置为0,不设定空闲超时时间
(3).持久化相关配置
Redis的持久化:
RDB:snapshotting, 二进制格式;按事先定制的策略,周期性地将数据从内存同步至磁盘;数据文件默认为dump.rdb;
客户端显式使用SAVE或BGSAVE命令来手动启动快照保存机制;
SAVE:同步,即在主线程中保存快照,此时会阻塞所有客户端请求;
BG(backgroud)SAVE:异步;一般采用bg
yum 安装默认开启rdb持久连接
搜狗截图20171116170425.png
特点:效率高,但是同步内容不够精确
stop-writes-on-bgsave-error yes
dump操作出现错误时,是否禁止新的写入操作请求;
rdbcompression yes
rdbchecksum yes
dbfilename dump.rdb:指定rdb文件名
dir /var/lib/redis:rdb文件的存储路径- AOF:Append Only File, fsync
记录每次写操作至指定的文件尾部实现的持久化;当redis重启时,可通过重新执行文件中的命令在内存中重建出数据库;
BGREWRITEAOF:AOF文件重写;
不会读取正在使用AOF文件,而是通过将内存中的数据以命令的方式保存至临时文件中,完成之后替换原来的AOF文件;
该方式更精准但是效率不高,能实现时间点还原
搜狗截图20171116170858.png
注意:aof和rdb不能同时开启,会影响负载和io性能
no-appendfsync-on-rewrite no
是否在后台执行aof重写期间不调用fsync,默认为no,表示调用;
auto-aof-rewrite-percentage 100
auto-aof-rewrite-min-size 64mb
上述两个条件同时满足时,方会触发重写AOF;与上次aof文件大小相比,其增长量超过100%,且大小不少于64MB;
aof-load-truncated yes- Redis服务器启动时用持久化的数据文件恢复数据,会优先使用AOF
(4).安全相关配置
搜狗截图20171116160617.png
设施密码后再次登录就要输入密码
搜狗截图20171116160915.png
或者使用redis-cli -a magedu来进行登录
搜狗截图20171116161206.png
rename-command
一般是对config命令来进行重命名操作,因为config命令功能强大,如果有其他用户连入,会对redis数据库造成威胁
在AOF或Replication环境中,但不推荐使用
搜狗截图20171116161842.png
体现出config的危险性
config set maxclients 10002
OK
127.0.0.1:6379[15]> config get maxclients
- "maxclients"
"10002"
127.0.0.1:6379[15]> config rewrite
OK
搜狗截图20171116163833.png
(5).Limit相关的配置
maxclients
默认设置最大值为10000
maxmemory <bytes>
maxmemory-policy noeviction
搜狗截图20171116162256.png
淘汰策略:volatile-lru, allkeys-lru, volatile-random, allkeys-random, volatile-ttl, noeviction
maxmemory-samples 5
淘汰算法运行时的采样样本数;
(6).SlowLog相关的配置
slowlog-log-slower-than 10000
单位是微秒;
slowlog-max-len 128
SlowLog记录的日志最大条目;
(7).Advanced配置
hash-max-ziplist-entries 512
hash-max-ziplist-value 64
设置ziplist的键数量最大值,每个值的最大空间;
client-output-buffer-limit normal 0 0 0:
client-output-buffer-limit slave 256mb(最大不超过) 64mb(一般不超过的最大内存) 60(超过64,小于256缓存时间)
client-output-buffer-limit pubsub 32mb 8mb 60
<hard-limit>——硬限制
<soft-limit>——软限制
<soft-limit seconds>——软限制时间限制
(8)redis-cli命令:
Server相关的命令:
搜狗截图20171116164416.png
CLIENT GETNAME
CLIENT KILL
CLIENT KILL [ip:port] [ID client-id] [TYPE normal|master|slave|pubsub] [ADDR ip:port] [SKIPME yes/no]
CLIENT LIST
CLIENT PAUSE
CLIENT PAUSE timeout
CLIENT REPLY
CLIENT SETNAME:Set the current connection name
SHUTDOWN [NOSAVE|SAVE]
搜狗截图20171116164504.png
搜狗截图20171116164627.png
配置参数可运行时修改:
CONFIG GET
CONFIG RESETSTAT
CONFIG REWRITE
CONFIG SET
INFO:服务器状态信息查看;分为多个secion;
INFO [section]
搜狗截图20171116165028.png
搜狗截图20171116165137.png
config resetstat 搜狗截图20171116165325.png
三.redis主从复制
(1)特点
一个Master可以有多个slave主机,支持链式复制;
Master以非阻塞方式同步数据至slave主机;
(2)相关配置
slaveof——在从节点上设置对应的主节点的地址与端口号
masterauth ——进行密码验证,与主节点密码相同
slave-serve-stale-data yes——是否允许过期的数据来影响客户端的请求
slave-read-only yes——只允许从节点读
*repl-diskless-sync no——需不需要启用无磁盘的复制
新的从节点或某较长时间未能与主节点进行同步的从节点重新与主节点通信,需要做“full synchronization",此时其同步方式有两种style:
Disk-backend:主节点新创建快照文件于磁盘中,而后将其发送给从节点;
Diskless:主节占新创建快照后直接通过网络套接字文件发送给从节点;为了实现并行复制,通常需要在复制启动前延迟一个时间段;
repl-diskless-sync-delay 5
repl-ping-slave-period 10
*repl-timeout 60
repl-disable-tcp-nodelay no
repl-backlog-size 1mb
*slave-priority 100
复制集群中,主节点故障时,sentinel应用场景中的主节点选举时使用的优先级;数字越小优先级越高,但0表示不参与选举;
min-slaves-to-write 3:主节点仅允许其能够通信的从节点数量大于等于此处的值时接受写操作;
min-slaves-max-lag 10:从节点延迟时长超出此处指定的时长时,主节点会拒绝写入操作;
示例:配置三台虚拟机,其中172.18.254.242最为主节点172.18.25.62和172.18.250.89作为从节点
在主节点上vim /etc/redis.conf
bind 0.0.0.0
requirepass magedu
在172.18.250.89上
vim /etc/redis.conf
bind 0.0.0.0
slaveof 172.18.254.242 6379
masterauth magedu
requirepass magedu
修改完成后重启登录
redis-cli -h 172.18.250.89
auth magedu
搜狗截图20171116210030.png
在主节点上执行client list 搜狗截图20171116210120.png
从节点连接成功,此时在主节点设置一些命令来验证
select 15
set key whokey "why are you my honey"
get whokey
搜狗截图20171116210320.png
在从节点上select 15
执行get whokey显示
搜狗截图20171116210521.png
再另一个从节点上使用redis-cli 中命令来实现主从复制
首先vim /etc/redis.conf
requirepass magedu
bind 0.0.0.0
redis-cli
搜狗截图20171116210848.png
在主节点上
搜狗截图20171116210956.png
连接成功
搜狗截图20171116211214.png
执行config rewrite 将修改内容存入配置文件
(3)sentinel
1.主要完成三个功能:监控、通知、自动故障转移
选举:流言协议、投票协议
流言协议:当主节点无法自己主观判断时需要询问其他从节点是否down,当其他从节点都一致认为主节点down就是真的down
投票协议:当with quorum>2时,代表主机down,当quorum<=2时,投票协议作废。quorum属于sentinel集群的机制
搜狗截图20171116211611.png
2.配置项:
port 26379
sentinel monitor <master-name> <ip> <redis-port> <quorum>
sentinel auth-pass <master-name> <password>
<quorum>表示sentinel集群的quorum机制,即至少有quorum个sentinel节点同时判定主节点故障时,才认为其真的故障;
搜狗截图20171116211914.png
s_down: subjectively down——主观down,只要自己认为down就是down
o_down: objectively down——客观down,根据投票协议来设定
sentinel down-after-milliseconds <master-name> <milliseconds>
监控到指定的集群的主节点异常状态持续多久方才将标记为“故障”;
sentinel parallel-syncs <master-name> <numslaves>
指在failover过程中,能够被sentinel并行配置的从节点的数量;
sentinel failover-timeout <master-name> <milliseconds>
sentinel必须在此指定的时长内完成故障转移操作,否则,将视为故障转移操作失败;
sentinel notification-script <master-name> <script-path>
通知脚本,此脚本被自动传递多个参数;
redis-cli -h SENTINEL_HOST -p SENTINEL_PORT
redis-cli>
SENTINEL masters
SENTINEL slaves <MASTER_NAME>
SENTINEL failover <MASTER_NAME>
SENTINEL get-master-addr-by-name <MASTER_NAME>
搜狗截图20171116215202.png通过实际操作来验证
在主节点上:vim /etc/redis-sentinel.conf
注意该配置文件中没有bind这一项需要手动添加
bind 0.0.0.0
sentinel monitor mymaster 172.18.254.242 6379 2——主节点ip地址和端口,并且定义了qorum >3/2
sentinl auth-pass mymaster magedu——验证密码
sentinel down-after-milliseconds mymaster 5000——当主机down后设置五秒后为down机状态
sentinel parallel-syncs mymaster 3——故障转移过程中从节点的数量
sentinel failover-timeout mymaster 60000——故障转移连接时间超过60秒就是失败
配置完成后将配置文件复制给另外两个节点
scp /etc/redis-sentinel.conf 172.18.250.89:/etc/
scp /etc/redis-sentinel.conf 172.18.250.223:/etc/
复制成功后分别执行systemctl start redis-sentinel
执行ss -ntl发现26379端口打开
在主节点上执行redis-cli -h 172.18.254.242 -p 26379
-a magedu
执行 sentinel masters——查看主节点信息
搜狗截图20171116215103.png
执行sentinel slaves mymaster
搜狗截图20171116215236.png
此时将主节点的redis关闭,来查看
发现主节点地址发生变化,而主节点的变换机制在未设定的情况下是根据ip地址大小来确定,也可以通过设置slave-priority
100来设置优先级,数字越小优先级越高
修复机制vim /etc/redis.conf
slaveof 172.18.250.89 6379
masterauth magedu
repl-diskless-sync no
配置完成后开启服务
再次进行查看发现
原来的主节点状态变为slave
SENTINEL get-master-addr-by-name <MASTER_NAME>
手动触发故障转移
SENTINEL get-master-addr-by-name mymaster会看见新的主节点的地址
三.cluster设置
(1).redis的集群:redis集群会在所有的redis节点上分配槽点,槽点总数为16384,范围是0-16383
这样每个节点上都会被分配相应的槽点,这样redis数据库的数据就就会被分配到这些节点上,每个节点都会存有一部分数据。当客户创建一个键值时,就会对键值进行hash运算,将计算结果对16384进行运算取模,结果范围在0-16383,那么该键值如果和某个节点的取模后的数值对应上,那么数据就会存储在此,下次用户想要查询时就会找到对应的节点才会找到对应的数据
(2) 集群相关的配置
cluster-enabled 是否开启集群配置
cluster-config-file 集群节点集群信息配置文件,每个节点都有一个,由redis生成和更新,配置时避免名称冲突
cluster-node-timeout 集群节点互连超时的阀值,单位毫秒
cluster-slave-validity-factor 进行故障转移时,salve会 申请成为master。有时slave会和master失联很久导致数据较旧,这样的slave不应该成为master。这个配置用来判断slave是否和master失联时间过长
cluster-require-full-coverage yes:如果任何一个节点故障了,并且没有设置从节点,导致槽不完整了,还能否接受客户端的请求,此配置是要求有完整的槽才能接受请求,因此设置为yes
(3) 配置过程:
设置配置文件,启用集群功能;
启动redis后为每个节点分配slots;
CLUSTER ADDSLOTS
注意:每个slot要独立创建;
设定集群成员关系;
CLUSTE MEET
(4)测试
三个主机不是主从关系
关掉redis-sentinel
在172.18.254.242上
vim /etc/redis.conf
cluster-enabled yes
cluster-config-file nodes-6379.conf
cluster-require-full-coverage yes
cluster-node-timeout 15000
配置完成
(5)在172.18.254.242上
分配给每个节点槽点
echo [16384/3]
5461
echo [5461*2]
10922
redis-cli -a magedu cluster addlots {0..5461}
redis-cli -a magedu -h 172.18.250.89 cluster addlots {5462..10922}
redis-cli -a magedu -h 172.18.250.223 cluster asslots {10923..16383}
(6)完成集群会面
redis-cli -a magedu -h 172.18.254.242
cluster meet 172.18.250.89 6379
cluster meet 172.18.250.223 6379
使用cluster info 来查看结果
显示槽位为16384
(7)设置键值
在172.18.254.242上
redis-cli -a magedu
set hellokey "hi,friends"
get kellokey
显示 “hi,friend”
set mykey "hi,yourfriends"
提示用户要在172.18.250.89的节点上操作,所以在172.18.250.89的主机上
redis-cli -a magedu
set mykey "hi,yourfriends"
显示ok
set whoeverkey "no,who are you"
提示用户要在172.18.250.223的主机上执行该操作
所以在172.18.250.223上
redis-cli -a magedu
set whoeverkey "no,who are you"
显示ok
这就实现了redis的集群复制
网友评论