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

感谢阅读!

posted @ 2018-07-24 18:31  生生不息.连绵不绝  阅读(452)  评论(0编辑  收藏  举报