一: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安装即可

redis的RedisTemplate切换索引源_redis

redis的RedisTemplate切换索引源_redis_02

监听端口:6379/tcp

二:连接至Redis

1:本机连接:

在未给redis配置账号密码时。仅支持本地连接

redis-cli :即可连接至redis

redis的RedisTemplate切换索引源_数据_03

2: 远程连接:

redis-cli -h 172.16........ –p 端口 -a 密码

redis的RedisTemplate切换索引源_redis主从切换 java_04

三:命令概述

redis 默认有16个数据库,使用数字标识。

select:切换数据库

redis的RedisTemplate切换索引源_数据_05

help 查看 帮助命令的具体使用

redis的RedisTemplate切换索引源_数据_06

四: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:

设定 获取 追加的使用

redis的RedisTemplate切换索引源_redis_07

数值: 设定 自增 自减 自增多少 自减多少

redis的RedisTemplate切换索引源_数据_08

五:list—列表 数组

redis的RedisTemplate切换索引源_redis_09

设定: 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

redis的RedisTemplate切换索引源_redis主从切换 java_10

redis的RedisTemplate切换索引源_redis主从切换 java_11

redis的RedisTemplate切换索引源_数据库_12

六:hash—映射 关联数组

redis的RedisTemplate切换索引源_redis_13

设定:HSET key field value

HMSET key field value [field value ...] 一次 给一个key 设定多个值

查看信息HKEYS key

查看值 HVALS key

删除信息:HDEL key field [field ...]

redis的RedisTemplate切换索引源_redis主从切换 java_14

redis的RedisTemplate切换索引源_数据库_15

七: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 ...]

redis的RedisTemplate切换索引源_redis主从切换 java_16

redis的RedisTemplate切换索引源_数据_17

redis的RedisTemplate切换索引源_数据_18

八:sorted_set—有序集合

与无序集合 相比 。多了元素的下标

添加: ZADD key [NX|XX] [CH] [INCR] score member [score member ...]

集合内元素的个数:ZCARD key

指定范围内元素的个数:ZCOUNT key min max

获取元素的下标:ZSCORE key member

获取元素的索引:ZRANK key member

redis的RedisTemplate切换索引源_数据_19

redis的RedisTemplate切换索引源_redis主从切换 java_20

列出集合内的元素:ZRANGE key start stop [WITHSCORES]

当向集合内添加元素时,内部默认会给每个元素增加一个内部的index

redis的RedisTemplate切换索引源_数据库_21

九:pubsub—订阅

订阅:PSUBSCRIBE pattern [pattern ...]

订阅子频道

发布信息:PUBLISH channel message

获取状态:PUBSUB subcommand [argument [argument ...]]

取消订阅:PUNSUBSCRIBE [pattern [pattern ...]]

订阅:SUBSCRIBE channel [channel ...]

redis的RedisTemplate切换索引源_数据库_22

十: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

redis的RedisTemplate切换索引源_数据_23

2)重启redis服务

3)连接 redis-cli

不输入密码登录时 是不可以 输入命令的

redis的RedisTemplate切换索引源_redis_24

4)认证

redis的RedisTemplate切换索引源_redis_25

十二:server

help @server 查看server端的命令

1)主要命令:info

info: server

client

replication 从节点的相关信息

redis的RedisTemplate切换索引源_数据库_26

info client

redis的RedisTemplate切换索引源_redis主从切换 java_27

info cpu

info memory

redis的RedisTemplate切换索引源_redis主从切换 java_28

redis的RedisTemplate切换索引源_redis_29

2)其他指令

2)flushdb

清空某个数据库

3) CLIENT LIST

列出当前登录的客户端

redis的RedisTemplate切换索引源_数据库_30

三:配置文件

一:配置文件

核心配置: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

网络配置项:

bind IP

port PORT

protected-mode

tcp-backlog

unixsocket

timeout:连接的空闲超时时长;

bind: 监听在本机哪个网卡的ip网络地址上

bind 172.16.253.96

安全配置:

requirepass

Limits相关的配置:

maxclients

maxmemory

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

超出 64m后 在60秒内清除

二:配置命令

redis的配置参数 允许 运行时修改

可以不用更改配置文件

CONFIG GET

CONFIG RESETSTAT 重置各种状态

CONFIG REWRITE :利用内存中的设定 重写至 配置文件

CONFIG SET

redis的RedisTemplate切换索引源_redis主从切换 java_31

四:redis持久化

redis是基于内存的存储

redis的所有数据都是在内存中运行

重启服务后,内存中的所有数据将没有。

持久化:将数据保存在磁盘上,但不是基于磁盘提供服务

两种实现方式:

一:RDB

按事先定制的策略,周期性地将数据从内存同步至磁盘;数据文件默认为dump.rdb;

/var/lib/redis/dumo.rdb

客户端显式使用SAVE或BGSAVE命令来手动启动快照保存机制;

SAVE:同步,即在主线程中保存快照,此时会阻塞所有客户端请求;

BGSAVE:异步;后台同步,主程序可以继续向客户端提供请求

RDB相关的配置:

SNPSHOTTING

*save

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文件;

redis的RedisTemplate切换索引源_redis_32

启用AOF:

1) 配置文件 appendonly yes

2)命令行 CONFIG SET appendonly yes

此项启用后会生成 /var/lib/redis/appendonly.aof文件

redis的RedisTemplate切换索引源_redis_33

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 
与主节点相连
redis-cli> CONFIG SET masterauth 
写入与主节点相连的密码
其他配置参数:
配置参数:
*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"

redis的RedisTemplate切换索引源_redis主从切换 java_34

3 97 主机

1)

更改配置文件:实现

vim /etc/redis.conf

slaveof 172.16.253.96

masterauth mashuai

redis的RedisTemplate切换索引源_redis主从切换 java_35

2) 重启redis 服务 测试

4 96主节点

查看连接的从节点

info replication

redis的RedisTemplate切换索引源_数据_36

六:sentinel 主从切换:

主要完成三个功能:监控、通知、自动故障转移

选举:流言协议、投票协议

一:sentinel配置项

1 配置项:

port 26379
sentinel monitor 
sentinel auth-pass 
表示sentinel集群的quorum机制,即至少有quorum个sentinel节点同时判定主节点故障时,才认为其真的故障。 quorum的数值依据redis集群中的节点数来决定;
s_down: subjectively down
o_down: objectively down
sentinel down-after-milliseconds 
监控到指定的集群的主节点异常状态持续多久方才将标记为“故障”;
sentinel parallel-syncs 
指在failover过程中,能够被sentinel并行配置的从节点的数量;
sentinel failover-timeout 
sentinel必须在此指定的时长内完成故障转移操作,否则,将视为故障转移操作失败;故障转移超时时间
sentinel notification-script

通知脚本,此脚本被自动传递多个参数;

2 连接至 sentinel

连接至sentinel端口,查看相关信息

redis-cli -h SENTINEL_HOST -p SENTINEL_PORT
redis-cli>
SENTINEL masters 监听的主节点
SENTINEL slaves 从节点信息
SENTINEL failover 手动down掉主节点
SENTINEL get-master-addr-by-name

二:实现sentinel

主节点故障时,服务切换至从节点

1)95 97 主机 实现认证功能

redis的RedisTemplate切换索引源_数据库_37

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

查看日志:

redis的RedisTemplate切换索引源_redis主从切换 java_38

4) 连接至 sentinel

redis-cli -h 172.16.253.96 -p 26379

sentinel masters 主节点信息

sentinel slave mymaster 从节点信息

redis的RedisTemplate切换索引源_数据库_39

redis的RedisTemplate切换索引源_redis_40

主动down掉 主节点

sentinel failover mymaster

之后 会自动提升一个从节点 为主节点

redis的RedisTemplate切换索引源_redis_41