目录
正文
Redis是一个开源的使用ANSI C语言编写、支持网络、可基于内存亦可持久化的日志型、Key-Value数据库,并提供多种语言的API。
Redis理论基础和基本配置
myql与redis的区别和联系
mysql是持久化存储,存放在磁盘里面,检索的话,会涉及到一定的IO,为了解决这个瓶颈,于是出现了缓存,比如现在用的最多的 memcached(简称mc)。首先,用户访问mc,如果未命中,就去访问mysql,之后像内存和硬盘一样,把数据复制到mc一部分。
redis和mc都是缓存,并且都是驻留在内存中运行的,这大大提升了高数据量web访问的访问速度。然而mc只是提供了简单的数据结构,比如 string存储;redis却提供了大量的数据结构,比如string、list、set、hashset、sorted set这些,这使得用户方便了好多,毕竟封装了一层实用的功能,同时实现了同样的效果,当然用redis而慢慢舍弃mc。
redis和mysql要根据具体业务场景去选型
mysql:数据放在磁盘 redis:数据放在内存
redis既可以用来做持久存储,也可以做缓存,而目前大多数公司的存储都是mysql + redis,mysql作为主存储,redis作为辅助存储被用作缓存,加快访问读取的速度,提高性能,redis查询复杂的表关系时不如mysql,所以可以把热门的数据放redis,mysql存基本数据。redis存储在内存中,如果存储在内存中,存储容量肯定要比磁盘少很多,那么要存储大量数据,只能花更多的钱去购买内存,造成在一些不需要高性能的地方是相对比较浪费的,所以目前基本都是mysql(主) + redis(辅),在需要性能的地方使用redis,在不需要高性能的地方使用mysql。
redis适合放一些频繁使用,比较热的数据,因为是放在内存中,读写速度都非常快,一般会应用在下面一些场景:排行榜、计数器、消息队列推送、好友关注、粉丝等。
NoSQL( Not Only SQL)的一些基本概念
ACID:原子性、一致性、隔离性、持久性;
CAP理论:一个分布式系统不可能同时满足C、A、P三个特性,最多可同时满足其中两者;对于分布式系统满足分区容错性几乎是必须的。
C:多个数据节点上的数据一致;
A:用户发出请求后的有限时间范围内返回结果;
P:network partition,网络发生分区后,服务是否依然可用;
BASE理论:BA、S、E,基于CAP演化而来
BA:Basically Available,基本可用;
S:Soft state,软状态/柔性事务,即状态可以在一个时间窗口内是不同步的;
E:Eventually consistency,最终一致性;
Redis特性及基本架构
It supports data structures such as strings, hashes, lists, sets, sorted sets with range queries, bitmaps, hyperloglogs and geospatial indexes with radius queries.
数据结构:字符串、列表(数组)、hashes(关联数组)、集合、有序集合、bitmaps、hyperloglogs、空间索引;
单进程:CPU并非瓶颈;
持久化:snapshotting、AOF
程序环境:
配置文件:/etc/redis.conf
主程序:/usr/bin/redis-server
端口:6379/tcp
客户端:/usr/bin/redis-cli
Unit File:/usr/lib/systemd/system/redis.service
数据目录:/var/lib/redis
redis:基于k/v即键值的存储方式
key:直接ASCII字符串;value:strings, lists, hashes, sets, sorted sets, bitmaps, hyperloglogs
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
group:@generic, @string, @list, @..
Redis数据结构常用基本操作
@string
View Code
@list
View Code
@set
View Code
@sorted_set
View Code
@hash
View Code
例members -> {name:jerry, age:17,gender:Female}
HKEYS HVALS
@pubsub
View Code
@geo
@hyperloglog
Redies基本命令和配置
redis-cli命令:Usage: redis-cli [OPTIONS] [cmd [arg [arg ...]]]
-h HOST
-p PORT
-a PASSWORD
-n DBID(默认0-15)
与Connection相关命令:help @connection
AUTH <password>
ECHO <message>
PING
QUIT
SELECT dbid
清空当前数据库:FLUSHDB:Remove all keys from the current database
清空所有数据库:FLUSHALL:Remove all keys from all databases
配置和使用Redis:
基本配置项
网络配置项
持久化相关配置
复制相关的配置
安全相关配置
Limit相关的配置
SlowLog相关的配置
INCLUDES
Advanced配置
通用配置项:
daemonize, supervised, loglevel, pidfile, logfile,
databases:设定数据库数量,默认为16个,每个数据库的名字均为整数,从0开始编号,默认操作的数据库为0;
切换数据库的方法:SELECT <dbid>
网络配置项:
bind IP
port PORT
protected-mode
tcp-backlog
unixsocket
timeout:连接的空闲超时时长;
安全配置:
requirepass <PASSWORD>
rename-command <COMMAND> <NEW_CMND_NAME> :在AOF或Replication环境中,不推荐使用;
Limits相关的配置:
maxclients
maxmemory <bytes>
maxmemory-policy noeviction :淘汰策略:volatile-lru, allkeys-lru, volatile-random, allkeys-random, volatile-ttl, 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> <soft-limit seconds>
redis-cli命令:Server相关的命令:
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]
配置参数可运行时修改:
CONFIG GET
CONFIG RESETSTAT
CONFIG REWRITE
CONFIG SET
INFO:服务器状态信息查看;分为多个secion;
INFO [section]
Redis企业级应用
Redis的持久化:
RDB:snapshotting, 二进制格式;按事先定制的策略,周期性地将数据从内存同步至磁盘;数据文件默认为dump.rdb;
客户端显式使用SAVE或BGSAVE命令来手动启动快照保存机制;
SAVE:同步,即在主线程中保存快照,此时会阻塞所有客户端请求;
BGSAVE:异步;backgroud
AOF:Append Only File, fsync 记录每次写操作至指定的文件尾部实现的持久化;当redis重启时,可通过重新执行文件中的命令在内存中重建出数据库;
BGREWRITEAOF:AOF文件重写,不会读取正在使用AOF文件,而是通过将内存中的数据以命令的方式保存至临时文件中,完成之后替换原来的AOF文件;
RDB相关的配置:
*save <seconds> <changes>
save 900 1
save 300 10
save 60 10000
save 5 200000
表示:三个策略满足其中任意一个均会触发SNAPSHOTTING操作;900s内至少有一个key有变化,300s内至少有10个key有变化,60s内至少有1W个key发生变化;
stop-writes-on-bgsave-error yes
dump操作出现错误时,是否禁止新的写入操作请求;
rdbcompression yes
rdbchecksum yes
dbfilename dump.rdb:指定rdb文件名
*dir /var/lib/redis:rdb文件的存储路径
AOF相关的配置
*appendonly no
appendfilename "appendonly.aof"
*appendfsync
Redis supports three different modes:
no:redis不执行主动同步操作,而是OS进行;
everysec:每秒一次;
always:每语句一次;
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库定期备份;
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:从节点延迟时长超出此处指定的时长时,主节点会拒绝写入操作;
sentinel:
主要完成三个功能:监控、通知、自动故障转移
选举:流言协议、投票协议
配置项:vim /etc/redis-sentinel.conf
port 26379
sentinel monitor <master-name> <ip> <redis-port> <quorum>
sentinel auth-pass <master-name> <password>
###<quorum>表示sentinel集群的quorum机制,即至少有quorum个sentinel节点同时判定主节点故障时,才认为其真的故障;###
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> 通知脚本,此脚本被自动传递多个参数;
sentinel的使用:
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>
CLuster
集群相关的配置:
cluster-enabled 是否开启集群配置
cluster-config-file 集群节点集群信息配置文件,每个节点都有一个,由redis生成和更新,配置时避免名称冲突
cluster-node-timeout 集群节点互连超时的阈值,单位毫秒
cluster-slave-validity-factor 进行故障转移时,salve会申请成为master。有时slave会和master失联很久导致数据较旧,这样的slave不应该成为master。这个配置用来判断slave是否和master失联时间过长。
配置过程:
(1) 设置配置文件,启用集群功能;
(2) 启动redis后为每个节点分配slots; CLUSTER ADDSLOTS
注意:每个slot要独立创建;可用范围是0-16383,共16384个;
例:redis-cli -c -h 172.18.64.107 -p 6379 cluster addslots {0..5000}
(3) 设定集群成员关系;
CLUSTE MEET 172.18.64.17
CLUSTE MEET 172.18.64.7