一:Redis概述:
1:概念:
非关系型数据库,基于K/V存储,存储于内存的数据库.
每一个数据项都由KEY和VALUE组成。V可以是字符串,列表,关联数组(hashs),集合,有序集合。使用key来引用这些值。
redis是单进程的。多核cpu对redis无用。但可以运行多实例。
支持持久化存储。
支持主从复制。 主 rw 从 read-only
2:学习存储的逻辑
1:交互式接口的命令
2:主从如何实现
3:高可用如何实现sentnal(专用于实现redis高可用)
二:命令
此节命令重要的有五个:string list hash set sorted_set
一:安装
redis包在epl仓库中。直接使用yum安装即可
监听端口:6379/tcp
二:连接至Redis
1:本机连接:
在未给redis配置账号密码时。仅支持本地连接
redis-cli :即可连接至redis
2: 远程连接:
redis-cli -h 172.16........ –p 端口 -a 密码
三:命令概述
redis 默认有16个数据库,使用数字标识。
select:切换数据库
help 查看 帮助命令的具体使用
四:string
help @string可以获取string的所有命令帮助使用信息
设定:SET key value [EX seconds] [PX milliseconds] [NX|XX]
[EX seconds] 过期时间。数据是存于内存中的
NX 只有不存在时,才去创建这个值
获取:GET key
追加:APPEND key value
自增:DECR key
DECRBY key increment
自减:INCR key
INCRBY key increment
多设定:MSET
多获取: MGET
获取字段长度:STRLEN key
eg:
设定 获取 追加的使用
数值: 设定 自增 自减 自增多少 自减多少
五:list—列表 数组
设定: LSET key index value
依据索引去设定值
左增:LPUSH key value [value ...]
右增:PUSH key value [value ...]
右减:RPOP key
左减:LPOP key
左侧第几个位置删除数值:LREM key count value 此种用的不多
插入:LINSERT key BEFORE|AFTER pivot value
查看:LINDEX key index
六:hash—映射 关联数组
设定:HSET key field value
HMSET key field value [field value ...] 一次 给一个key 设定多个值
查看信息HKEYS key
查看值 HVALS key
删除信息:HDEL key field [field ...]
七:set—(无序)集合
定义集合:SADD key member [member ...]
交集:SINTER key [key ...]
并集:两个集合的并集 SUNION key [key ...]
差集:SDIFF key [key ...]
前面的key有 而后面的key没有的
删除集合中的成员:SREM key member [member ...]
随机弹出集合中的一个元素:SPOP key [count]
查看:SMEMBERS key
交集后存入另一个集合;SINTERSTORE destination key [key ...]
并集后存入另一个集合SUNIONSTORE destination key [key ...]
八:sorted_set—有序集合
与无序集合 相比 。多了元素的下标
添加: ZADD key [NX|XX] [CH] [INCR] score member [score member ...]
集合内元素的个数:ZCARD key
指定范围内元素的个数:ZCOUNT key min max
获取元素的下标:ZSCORE key member
获取元素的索引:ZRANK key member
列出集合内的元素:ZRANGE key start stop [WITHSCORES]
当向集合内添加元素时,内部默认会给每个元素增加一个内部的index
九:pubsub—订阅
订阅:PSUBSCRIBE pattern [pattern ...]
订阅子频道
发布信息:PUBLISH channel message
获取状态:PUBSUB subcommand [argument [argument ...]]
取消订阅:PUNSUBSCRIBE [pattern [pattern ...]]
订阅:SUBSCRIBE channel [channel ...]
十:transactions—事务
启动一个事务:MULTI –
运维很少用到此功能
十一:connecton—连接
127.0.0.1:6379> help @connection
AUTH password
summary: Authenticate to the server
since: 1.0.0
ECHO message
summary: Echo the given string
since: 1.0.0
PING [message]
summary: Ping the server
since: 1.0.0
QUIT -
summary: Close the connection
since: 1.0.0
SELECT index 切换数据库
summary: Change the selected database for the current connection
since: 1.0.0
十二:设定数据库登录密码:
1)编辑配置文件:
#vim /etc/redis.conf
加入:requirepass mashuai
2)重启redis服务
3)连接 redis-cli
不输入密码登录时 是不可以 输入命令的
4)认证
十二:server
help @server 查看server端的命令
1)主要命令:info
info: server
client
replication 从节点的相关信息
info client
info cpu
info memory
2)其他指令
2)flushdb
清空某个数据库
3) CLIENT LIST
列出当前登录的客户端
三:配置文件
一:配置文件
核心配置:Limits相关的配置:
网络配置项 NETWORK
持久化相关配置 SNAPSHOTTING
配置和使用Redis:
基本配置项 GENERAL
网络配置项
持久化相关配置 SNAPSHOTTING
另外一个持久化的配置 APPEND ONLY MODE
主从复制相关的配置 REPLICATION
安全相关配置
Limit相关的配置
SlowLog相关的配置
INCLUDES
Advanced配置
[root@h~]#grep -i "^##" /etc/redis.conf
INCLUDES
NETWORK
GENERAL
SNAPSHOTTING
REPLICATION
SECURITY
LIMITS
APPEND ONLY MODE
LUA SCRIPTING
REDIS CLUSTER
SLOW LOG
LATENCY MONITOR
EVENT NOTIFICATION
ADVANCED CONFIG
通用配置项:GENERAL
daemonize, supervised, loglevel, pidfile, logfile,
databases:设定数据库数量,默认为16个,每个数据库的名字均为整数,从0开始编号,默认操作的数据库为0;
切换数据库的方法:
SELECT <dbid>
网络配置项:
bind IP
port PORT
protected-mode
tcp-backlog
unixsocket
timeout:连接的空闲超时时长;
bind: 监听在本机哪个网卡的ip网络地址上
bind 172.16.253.96
安全配置:
requirepass <PASSWORD>
Limits相关的配置:
maxclients
maxmemory <bytes>
maxmemory-policy noeviction
淘汰策略:volatile-lru,设置lru时间的键
volatile-ttl,离淘汰时间最近的键淘汰
allkeys-lru, volatile-random, allkeys-random, noeviction
maxmemory-samples 5
淘汰算法运行时的采样样本数;
SlowLog相关的配置:
slowlog-log-slower-than 10000
单位是微秒;
slowlog-max-len 128
SlowLog记录的日志最大条目
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
client-output-buffer-limit pubsub 32mb 8mb 60
<hard-limit>
<soft-limit> 超出 64m后 在60秒内清除
<soft-limit seconds>
二:配置命令
redis的配置参数 允许 运行时修改
可以不用更改配置文件
CONFIG GET
CONFIG RESETSTAT 重置各种状态
CONFIG REWRITE :利用内存中的设定 重写至 配置文件
CONFIG SET
四:redis持久化
redis是基于内存的存储
redis的所有数据都是在内存中运行
重启服务后,内存中的所有数据将没有。
持久化:将数据保存在磁盘上,但不是基于磁盘提供服务
两种实现方式:
一:RDB
按事先定制的策略,周期性地将数据从内存同步至磁盘;数据文件默认为dump.rdb;
/var/lib/redis/dumo.rdb
客户端显式使用SAVE或BGSAVE命令来手动启动快照保存机制;
SAVE:同步,即在主线程中保存快照,此时会阻塞所有客户端请求;
BGSAVE:异步;后台同步,主程序可以继续向客户端提供请求
RDB相关的配置:
SNPSHOTTING
*save <seconds> <changes>
save 900 1
save 300 10
save 60 10000
表示:三个策略满足其中任意一个均会触发SNAPSHOTTING操作;900s内至少有一个key有变化,300s内至少有10个key有变化,60s内至少有1W个key发生变化;
stop-writes-on-bgsave-error yes
dump操作出现错误时(不能向磁盘中同步数据时),是否禁止新的写入操作请求;
rdbcompression yes 是否支持压缩,当cpu有较大空闲时,可以启动此选项
rdbchecksum yes 每次同步完之后,是否对RDB文件做检查
dbfilename dump.rdb:指定rdb文件名
*dir /var/lib/redis:rdb文件的存储路径。生产中建议将此文件存储于其他固态硬盘上。
二:AOF
记录每次写操作至指定的文件尾部实现的持久化;当redis重启时,可通过重新执行文件中的命令在内存中重建出数据库;
BGREWRITEAOF:AOF文件重写;
执行此命令,实现AOF文件重写(合并多条命令至一条命令,这就叫做AOF文件重写)
不会读取正在使用AOF文件,而是通过将内存中的数据以命令的方式保存至临时文件中,完成之后替换原来的AOF文件;
启用AOF:
1) 配置文件 appendonly yes
2)命令行 CONFIG SET appendonly yes
此项启用后会生成 /var/lib/redis/appendonly.aof文件
appendfsync: 内存中的数据发生改变,何时向磁盘中同步数据
Redis supports three different modes:
no:redis不执行主动同步操作,而是内核决定何时执行;
everysec:每秒一次;当redis出现故障时,有可能会丢失部分数据
always:每语句一次;此种模式,会对系统I/O造成极大的压力
但是,保证了数据的安全性
默认使用everysec模式
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崩溃时,重新恢复redis后,从磁盘中aof文件重新构建数据至内存后,要不要把aof文件删除。
三:注意
建议不要同时启用RDB及AOF
RDB与AOF同时启用:
(1) BGSAVE和BGREWRITEAOF不会同时进行;
(2) Redis服务器启动时用持久化的数据文件恢复数据,会优先使用AOF;
五:主从复制
一:理论要点
特点:
一个Master可以有多个slave主机,支持链式复制;
Master以非阻塞方式同步数据至slave主机;
配置slave节点:
redis-cli> SLAVEOF <MASTER_IP> <MASTER_PORT>
与主节点相连
redis-cli> CONFIG SET masterauth <PASSWORD>
写入与主节点相连的密码
其他配置参数:
配置参数:
*slaveof
*masterauth
slave-serve-stale-data yes 主节点出问题时,是否使用本机数据提供服务
slave-read-only yes 从节点是 只读的
*repl-diskless-sync no 快照先存于磁盘,再发送给从节点
no, Disk-backed, Diskless
新的从节点或某较长时间未能与主节点进行同步的从节点重新与主节点通信,需要做“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:从节点延迟时长超出此处指定的时长时,主节点会拒绝写入操作;
二:实现主从复制
环境: 96 主节点 97 98 从节点
1: 主节点 96主机
配置文件: bind 0.0.0.0
requirepass mashuai
2 :从节点95
使用命令 与 主节点实现相连
1)连接至本机 redis
redis-cli
2)
[root@h~]#redis-cli
127.0.0.1:6379> SLAVEOF 172.16.253.96 6379
OK
127.0.0.1:6379> CONFIG SET masterauth mashuai
OK
127.0.0.1:6379> CONFIG REWRITE
OK
3)测试
get name
"tom lucylili"
3 97 主机
1)
更改配置文件:实现
vim /etc/redis.conf
slaveof 172.16.253.96
masterauth mashuai
2) 重启redis 服务 测试
4 96主节点
查看连接的从节点
info replication
六:sentinel 主从切换:
主要完成三个功能:监控、通知、自动故障转移
选举:流言协议、投票协议
一:sentinel配置项
1 配置项:
port 26379
sentinel monitor <master-name> <ip> <redis-port> <quorum>
sentinel auth-pass <master-name> <password>
<quorum>表示sentinel集群的quorum机制,即至少有quorum个sentinel节点同时判定主节点故障时,才认为其真的故障。 quorum的数值依据redis集群中的节点数来决定;
s_down: subjectively down
o_down: objectively 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>
通知脚本,此脚本被自动传递多个参数;
2 连接至 sentinel
连接至sentinel端口,查看相关信息
redis-cli -h SENTINEL_HOST -p SENTINEL_PORT
redis-cli>
SENTINEL masters 监听的主节点
SENTINEL slaves <MASTER_NAME> 从节点信息
SENTINEL failover <MASTER_NAME> 手动down掉主节点
SENTINEL get-master-addr-by-name <MASTER_NAME>
二:实现sentinel
主节点故障时,服务切换至从节点
1)95 97 主机 实现认证功能
2)更改配置文件
95 96 97 主机配置文件更改如下 : /etc/redis-sentinel.conf
bind 0.0.0.0
sentinel monitor mymaster 172.16.253.96 6379 2
监测的主节点
sentinel auth-pass mymaster mashuai
主节点远程连接的密码
sentinel down-after-milliseconds mymaster 5000
主节点多长时间连接不上时标记位DOWN
sentinel failover-timeout mymaster 18000
故障转移超时时间,默认为3分钟,此处改为18秒
3) 启动 sentinel
systemctl start redis-sentinel
查看日志:
4) 连接至 sentinel
redis-cli -h 172.16.253.96 -p 26379
sentinel masters 主节点信息
sentinel slave mymaster 从节点信息
主动down掉 主节点
sentinel failover mymaster
之后 会自动提升一个从节点 为主节点
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。