Redis
一、概念
- ACID:原子性、一致性、隔离性、持久性
- noSQL:non SQL, Not Only SQL,特性:数据量大、数据变化非常快(数据增长快、流量分布变化大、数据间耦合结构变化快)、数据源很多
- CAP:一个分布式系统不可能同时满足C、A、P三个特性,最多可同时满足其中两者;对于分布式系统满足分区容错性几乎是必须的
- C:多个数据节点上的数据一致;
- A:用户发出请求后的有限时间范围内返回结果;
- P:network partition,网络发生分区后,服务是否依然可用;
- BASE:BA,S,E,基于CAP演化而来
- BA:Basically Available,基本可用;
- S:Soft state,软状态/柔性事务,即状态可以在一个时间窗口内是不同步的;
- E:Eventually consistency,最终一致性;
- 分布式一致性协议:Paxos,Raft等
Key Value / Tuple Store:DynamoDB, redis
Wide Column Store / Column Families:列式数据库, hbase
Document Store:文档数据库,mongodb,Elastic
Graph Databases:图式数据库,Neo4j
Time Series / Streaming Databases:时间序列存储
二、Redis简介
Redis:REmote DIctionary Server 远程数据结构服务器
Redis是一个开源的,以内存作为存储的,可以作为数据库,缓存,消息(掮客)队列服务器
支持的数据结构:字符串、列表、集合、hash(关联数组)、有序集合(支持范围查询)、位图、空间索引(支持辐射查询)
特性:
- 内建的复制功能(主从复制)
- Lua脚本引擎
- LRU的内存淘汰机制
- 支持事务
- 不同级别的基于磁盘的持久机制
- 基于Sentinel所实现的高可用
- 3.0以后内建支持集群功能
- 单进程,不会因为CPU出现瓶颈
- 持久化:snapshotting(默认)和AOF(Apend Only File)
安装:# yum install redis -y
基于epel仓库
配置文件:/etc/redis.conf
服务:/usr/lib/systemd/system/redis.service
主程序:/usr/bin/redis-server
命令行客户端:/usr/bin/redis-cli
主配文件简单简述:
[root@redis ~]# grep "^###" /etc/redis.conf
################################## INCLUDES ###################################
################################## NETWORK ####################################网络属性
################################# GENERAL #####################################通用配置
################################ SNAPSHOTTING ################################快照持久
################################# REPLICATION #################################主从复制
################################## SECURITY ###################################安全认证
################################### LIMITS ####################################资源限制
############################## APPEND ONLY MODE ###############################AOF持久
################################ LUA SCRIPTING ###############################LUA脚本
################################ REDIS CLUSTER ###############################集群配置
################################## SLOW LOG ###################################慢日志
################################ LATENCY MONITOR ##############################延迟监控器
############################# EVENT NOTIFICATION ##############################事件通知
############################### ADVANCED CONFIG ###############################高级配置
简单配置:
[root@redis ~]# vim /etc/redis.conf
bind 0.0.0.0
port 6379
[root@redis ~]# systemctl start redis
[root@redis ~]# redis-cli -h 192.168.0.13
redis-cli命令:
- -h:指定主机
- -p:指定端口
- -a:指定密码
- -n:指定几号数据库,0-15
192.168.0.13:6379> help
To get help about Redis commands type:
"help @<group>" to get a list of commands in <group>
"help <command>" for help on <command>
"help <tab>" to get a list of possible help topics
"quit" to exit
三、Redis数据库操作命令
支持的数据结构:字符串、列表、字典、集合、有序集合、发布/订阅队列
- @string:字符串
SET [EX|NX|XX] #设定键的值
GET #获取键的值
EXISTS #判定指定键是否存在
INCR #增加相关的键的值
DECR #降值
SETNX #已存在就不会改变键的值
SETEX #设定键的过期时间
INCRBYFLOAT #以浮点的方式自增
MGET #获取多个键的值
MSET #设定多个键的值
STRLEN #获取键有几个字符
APPEND #在一个键后追加新的内容
- @list:列表
LPUSH #左进
RPUSH #右进
LPOP #左出
RPOP #右出
LPUSHX #仅当列表存在时入栈
RPUSHX #仅当列表存在才从右侧新增元素
LRANGE #取指定范围内的键
LINDEX #获取指定索引的值
LSET #改其中一个元素的值
LTRIM #删除指定范围内的键
LREM #移除指定范围的元素
- @hash:字典
HSET #设定键值
HMSET #设定多个键值
HGET #获取键的值
HMGET #获取多个键的值
HKEYS #获取指定键的所有字段
HVALS #获取指定键的所有值
HDEL #删除字段
HGETALL #获取键的所有字段和值
HSTRLEN #获取指定键的值的长度
- @set:集合
SADD #添加
SPOP #弹出
SREM #删除指定的元素
SRANDMEMBER #
SINTER #求交集
SUNION #求并集
SCARD #列出集合中的所有元素个数
SMEMBERS #列出集合中的所有元素
- @sorted_set:有序集合
ZADD #增加 > ZADD z1 100 tom 90 jerry 80 maria
ZCARD #
ZCOUNT #
ZRANK #获取指定成员的索引信息
...
- @pubsub:发布/订阅
PUBLISH #发布消息
SUBSCRIBE #订阅某个队列
UNSUBSCRIBE #取消订阅
PSUBSCRIBE #基于正则表达式订阅某些个队列
PUNSUBSCRIBE #基于正则表达式取消订阅
- @connection:连接相关
PING #探测服务
AUTH password #认证
SELECT index #切换数据库
KEYS pattern #列出数据库中的键
QUIT #退出
FLUSHDB #清空当前数据库
FLUSHALL #清空所有数据库
- Server相关的命令
CLIENT GETNAME #获取客户端名称
CLIENT LIST #列出所有连接的客户端
CLIENT SETNAME local #设置当前连接的名称
CLIENT KILL #关闭客户端
SHUTDOWN #关闭服务器
CONFIG GET requirepass #获取配置
CONFIG SET #修改配置
CONFIG REWRITE #将内存中的配置覆盖文件中的配置
INFO #获取状态信息和统计信息
四、Redis的配置
- 通用配置项:
daemonize no #是否运行为守护进程
supervised no
pidfile /var/run/redis_6379.pid
loglevel notice #日志级别
logfile /var/log/redis/redis.log
databases 16 #定义最大16个数据库,-1:不作限制
- 网络配置项:
bind 127.0.0.1 #监听的地址
protected-mode yes #保护模式,没有定义bind指令,而且又没有配置密码则激活保护模式
port 6379 #监听的端口
tcp-backlog 511 #tcp后援队列
unixsocket /tmp/redis.sock
timeout 0 #如果客户端长时间没有操作则断开连接,0为不端口连接
tcp-keepalive 300 #tcp连接的超时时长
- 安全配置:
requirepass <PASSWORD> #设定密码
rename-command <COMMAND> <NEW_CMND_NAME> #命令重命名,在AOF或Replication环境中,不推荐使用
- 资源限制:
maxclients 10000 #最大并发连接数
maxmemory <bytes> #存储内存设置,单位字节,如果不设定则使用所有的内存,如果内存耗尽则会被OOM(Out Of Memory),内核将自动杀死最“吃”内存资源的进程
maxmemory-policy noeviction #一旦内存到达maxmemory时的内存淘汰机制
volatile-lru #只对有过期时间的键基于LRU淘汰
allkeys-lru #对所有的键都基于LRU的算法淘汰
volatile-random #只对有过期时间的键随机淘汰
allkeys-random #对所有的键都基于随机淘汰
volatile-ttl #对有过期时间的键基于幂序淘汰
noeviction #不淘汰任何键,如果没有空间则返回错误
maxmemory-samples 5 #采样范围,5个接近真实,10无限接近真实,3个非常快但不是太精准
- 慢查询日志配置:
slowlog-log-slower-than 10000 #慢日志标准,10000微秒=0.1秒
slowlog-max-len 128 #SlowLog记录的日志最大条目
- 高级配置:定义各中数据结构最大容纳的数据量
hash-max-ziplist-entries 512 #字典的每个键中的字段最大512个
hash-max-ziplist-value 64 #单个字段的值最大64字节
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> #软限制
<soft-limit seconds> #软限制超出多少时间清空
五、Redis的持久化存储
1、RDB:snapshotting
二进制格式;按事先定制的策略,周期性地将数据从内存同步至磁盘,数据文件默认为dump.rdb
客户端显式使用SAVE或BGSAVE命令来手动启动快照保存机制;
SAVE:同步,即在主线程中保存快照,此时会阻塞所有客户端请求;
BGSAVE:异步;backgroud
dbfilename dump.rdb #二进制文件名
dir /var/lib/redis
rdbchecksum yes #校验
rdbcompression yes #压缩存放
stop-writes-on-bgsave-error yes #如果有错误则停止写入操作
save 900 1
save 300 10 #在300秒内,有10次数据修改操作,则立即触发快照
save 60 10000 #在60秒内,有10000次数据修改操作,则立即触发快照
2、AOF
记录每次写操作至指定的文件尾部实现的持久化,当redis重启时,可通过重新执行文件中的命令在内存中重建出数据库
BGREWRITEAOF:AOF文件重写;不会读取正在使用AOF文件,而是通过将内存中的数据以命令的方式保存至临时文件中,完成之后替换原来的AOF文件
appendonly no
appendfilename "appendonly.aof"
auto-aof-rewrite-percentage 100 #发生变化的内容占原来数据的100%,则触发自动重写
auto-aof-rewrite-min-size 64mb #当数据大于64M时才启动以上自动重写策略
appendfsync everysec #多长时间同步内存到磁盘中,一秒一次
aof-load-truncated yes #是否修剪残缺数据
注意:持久机制本身不能取代备份;应该制订备份策略,对redis库定期备份;
RDB与AOF同时启用:
(1) BGSAVE和BGREWRITEAOF不会同时进行;
(2) Redis服务器启动时用持久化的数据文件恢复数据,会优先使用AOF;
六、主从复制
################################# REPLICATION #################################
slave-serve-stale-data yes #如果主节点宕机,从节点是否可以将不新鲜的数据提供给客户端
slave-read-only yes #将从节点设置为只读
repl-diskless-sync no #向多个从节点同时发送
repl-diskless-sync-delay 5 #等待5s发送
repl-ping-slave-period 10 #探测从节点存活性
repl-timeout 60
repl-disable-tcp-nodelay no
slave-priority 100 #从服务器的优先级
# min-slaves-to-write 3
# min-slaves-max-lag 10 #如果集群中有10个从节点,有3存活才可以正常工作
master配置:
[root@master ~]# vim /etc/redis.conf
bind 0.0.0.0
requirepass dongfei
Disk-backed:将数据写到磁盘上,适合互联网
Diskless:直接发送到内存缓存区,适合内网
slave配置:
[root@node01 ~]# vim /etc/redis.conf
bind 0.0.0.0
requirepass dongfei
slaveof 192.168.0.13 6379
masterauth dongfei
查看状态:
[root@master ~]# redis-cli -a dongfei
127.0.0.1:6379> INFO replication
# Replication
role:master
connected_slaves:1
slave0:ip=192.168.0.14,port=6379,state=online,offset=99,lag=0
master_repl_offset:99
repl_backlog_active:1
repl_backlog_size:1048576
repl_backlog_first_byte_offset:2
repl_backlog_histlen:98
命令配置slave:
[root@node02 ~]# vim /etc/redis.conf
bind 0.0.0.0
requirepass dongfei
[root@node02 ~]# systemctl start redis
[root@node02 ~]# redis-cli -a dongfei
127.0.0.1:6379> SLAVEOF 192.168.0.13 6379
127.0.0.1:6379> CONFIG SET masterauth dongfei
127.0.0.1:6379> CONFIG GET masterauth
1) "masterauth"
2) "dongfei"
127.0.0.1:6379> KEYS *
1) "z1"
2) "stus"
3) "n"
4) "class"
5) "stu1"
6) "newkey"
127.0.0.1:6379> CONFIG REWRITE
[root@node02 ~]# tail -3 /etc/redis.conf
# Generated by CONFIG REWRITE
slaveof 192.168.0.13 6379
masterauth "dongfei"
七、sentinel高可用集群
主要完成三个功能:监控、通知、自动故障转移
[root@master ~]# vim /etc/redis-sentinel.conf
bind 0.0.0.0
sentinel monitor mymaster 192.168.0.13 6379 2
sentinel auth-pass mymaster dongfei
sentinel down-after-milliseconds mymaster 10000
sentinel parallel-syncs mymaster 2
sentinel failover-timeout mymaster 180000
logfile /var/log/redis/sentinel.log
[root@master ~]# scp /etc/redis-sentinel.conf 192.168.0.14:/etc/
[root@master ~]# scp /etc/redis-sentinel.conf 192.168.0.15:/etc/
[root@master ~]# systemctl start redis-sentinel
[root@node01 ~]# vim /etc/redis-sentinel.conf
删除:sentinel myid xxxx
[root@node01 ~]# systemctl start redis-sentinel
[root@node01 ~]# redis-cli -p 26379
127.0.0.1:26379> SENTINEL masters
1) 1) "name"
2) "mymaster"
3) "ip"
4) "192.168.0.13" #被监控地址
127.0.0.1:26379> SENTINEL slaves mymaster
1) 1) "name"
2) "192.168.0.15:6379"
2) 1) "name"
2) "192.168.0.14:6379"
[root@node02 ~]# vim /etc/redis-sentinel.conf
删除:sentinel myid xxxx
[root@node02 ~]# systemctl start redis-sentinel
SENTINEL failover <MASTER_NAME>
SENTINEL get-master-addr-by-name <MASTER_NAME>
八、分布式扩展:Cluster集群相关的配置
配置过程:
(1) 设置配置文件,启用集群功能;
(2) 启动redis后为每个节点分配slots;
CLUSTER ADDSLOTS
注意:每个slot要独立创建;可用范围是0-16383,共16384个;
(3) 设定集群成员关系;
CLUSTE MEET
[root@node01 ~]# vim /etc/redis.conf
bind 0.0.0.0
requirepass dongfei
################################ REDIS CLUSTER ###############################
cluster-enabled yes
cluster-config-file nodes-6379.conf
cluster-node-timeout 15000
cluster-slave-validity-factor 10
[root@node01 ~]# scp /etc/redis.conf 192.168.0.14:/etc/
[root@node01 ~]# scp /etc/redis.conf 192.168.0.15:/etc/
[root@node01 ~]# systemctl start redis
[root@node02 ~]# systemctl start redis
[root@node03 ~]# systemctl start redis
[root@node01 ~]# redis-cli -a dongfei -h 192.168.0.13 -c cluster addslots {0..5499}
[root@node01 ~]# redis-cli -a dongfei -h 192.168.0.14 -c cluster addslots {5500..10999}
[root@node01 ~]# redis-cli -a dongfei -h 192.168.0.15 -c cluster addslots {11000..16383}
[root@node01 ~]# redis-cli -a dongfei
127.0.0.1:6379> CLUSTER MEET 192.168.0.14 6379
127.0.0.1:6379> CLUSTER MEET 192.168.0.15 6379
127.0.0.1:6379> CLUSTER NODES
2e2905d38d25706f3f78b70aa8763e4faf5d592e 192.168.0.14:6379 master - 0 1532428013117 1 connected 5500-10999
e512ceda75fecd864fa101a4be23789828d4aaac 192.168.0.15:6379 master - 0 1532428014119 0 connected 11000-16383
ce6a7525e403171d1ff02443820bda71812d10ac 192.168.0.13:6379 myself,master - 0 0 2 connected 0-5499
感谢阅读!