Redis数据库
Redis:
- KV cache and store
in-memory 持久化 主从(借助于sentinel实现一定意义上的HA) Clustering(分布式)
- 数据结构服务器:
String, List, Hash, Set, Sorted Set, Bitmap, HyperLoglog
- 存储系统有三类:
RDBMS NoSQL: KV NoSQL:redis Column Family NoSQL: HBase Documentation NoSQL: MongoDB Graph NoSQL: Neo4j NewSQL
- Redis的组件:
redis.io
- Redis守护进程:
监听端口:6379/tcp
数据操作:
- Strings:
SET key value [EX #] [NX|XX] ex:过期时间 nx:不存在是才创建并设定值,否则不会设定 xx:存在是才创建并设定值,否则不会设定 APEEND:在字符中追加字符串 GET:获取字符串的值 INCR:值自加 DECR:值自减 EXIST
- Lists:
RPUSH:右新加元素 LPUSH:左新加元素 LPOP:左边弹出一个元素 RPOP:右边弹出一个元素 LIDEX:查看列表元素 LSET l1 1 fri:修改列表下标为1的值为新值
- Sets:
SINTER:求交集 SMEMBERS:获取所有元素 SADD:定义集合 SUNION:求并集 SISMEMBER:查看是否还有该元素
- Sorted Sets:
ZADD:定义有序集合 ZADD weekday1 1 mon 2 tue 3 wed ZCARD:获取元素个数 ZRANK:查看元素的索引 ZRANK weekday1 tue (integer) 1 ZSCORE:返回成员member的score值 ZSCORE weekday1 wed "3" ZRANGE:获取指定范围内的元素 RANGE weekday1 0 2 1) "mon" 2) "tue" 3) "wed"
- Hashes:
HSET:创建一个哈希 HSET h1 a mon HSETEX:创建一个哈希,并设置过期时间 HGET:获取一个键值 HGET h1 a HGETALL:获取所有字段和值 HKEYS:获取所有可用的键 HVALS:获取所有值 HDEL:删除键
- Bitmaps, HyperLogLog
认证实现方法:
(1) 修改配置文件redis.conf
requirepass PASSWORD
(2) 客户端启动后,需要认证
redis-cli AUTH PASSWORD
清空数据库:
FLUSHDB:清空当前库 FLUSHALL:清空所有库
事务:
通过MULTI, EXEC, WATCH等命令实现事务功能;将一个或多个命令归并为一个操作提请服务器按顺序执行的机制;不支持回滚操作;
- MULTI:启动一个事务
- EXEC: 执行事务
事务:一次性将事务中的所有操作执行完成后返回给客户端
- WATCH:乐观锁;在EXEC命令执行之前,用于监视指定数量键;如果监视中的某任意键数据被修改,则服务器拒绝执行事务
Connection相关的命令:
AUTH ECHO PING QUIT SELECT
Server相关的命令:
CLIENT SETNAME connection-name:设置当前链接的名称 CLIENT GETNAME:获取当前链接的名称 CLIENT KILL ip:port:杀死客户端链接 CONFIG GET:获取当前conf配置 CONFIG RESETSTAT:重置info显示的信息 CONFIG SET parameter value:设置键的新值 CONFIG REWRITE:把设置的新值同步到配置文件中去 DBSIZE BGSAVE SAVE LASTSAVE
发布与订阅(publish/subscribe)
频道:消息队列
- SUBSCRIBE: 订阅一个或多个队列;
- PUBLISH: 向频道发布消息;
- UNSUBSCRIBE:退订此前订阅的频道;
- PSUBSCRIBE:模式订阅(支持正则表达式)
Redis的持久化:
RDB和AOF
- RDB: snapshot,二进制格式;按事先定制的策略,周期性地将数据保存至磁盘;数据文件默认为dump.rdb
客户端也可显式使用SAVA或BGSAVE命令启动快照保存机制 SAVE: 同步,在主线程中保存快照;此时会阻塞所有客户端请求 BGSAVE:异步
- AOF:Append Only File
记录每一次写操作至指定的文件尾部实现持久化;当redis重启时,可通过重新执行文件中的命令在内存重建数据库 BGREWRITEAOF:AOF文件重写 不会读取正在使用AOF文件,而通过将内存中的数据以命令的方式保存到临时文件中,完成之后替换原来的AOF文件
RDB:
- 启用RDB的配置
SAVE 900 1 # 900s 有一个键发生变化做一次快照 SAVE 300 10 # 300s 有十个键发生变化做一次快照 SAVE 60 10000 # 60s 有一万个键发生变化做一次快照
- 其他配置说明
stop-writes-on-bgsave-error yes :bgsave报错时停止备份 rdbcompression yes:是否压缩 rdbchecksum yes:是否对rdb文件做校验码 dbfilename dump.rdb:文件名 dir /var/lib/redis:文件保存目录
AOF:
- 重写过程:
redis主进程通过fork创建子进程 子进程根据redis内存中的数据创建数据库重建命令序列于临时文件中 父进程继续client的请求,并会把这些请求中的写操作继续追加至原来AOF文件;额外地,这些新的写请求还会被放置于一个缓冲队列中 子进程重写完成,会通知父进程;父进程把缓冲中的命令写到临时文件中 父进程用临时文件替换老的aof文件
- 相关参数:
appendonly no appendfilename "appendonly.aof" appendfsync {always|everysec|no} always:每次有写命令即写入磁盘。everysec:每秒做写一次 no-appendfsync-on-rewrite no:做重写操作时,不调用sync auto-aof-rewrite-percentage 100:当前文件是上一次重写文件2倍大时,除非一次重写 auto-aof-rewrite-min-size 64mb:最小64M以后才触发文件2倍大重写操作(避免文件过小时频繁重写)
注意:持久本身不能取代备份;还应该制定备份策略,对redis数据库定期进行备份
RDB与AOF同时启用
BGSAVE和BGREWRITEAOF不会同时执行 在Redis服务器启动用于恢复数据时,会优先使用AOF
复制:
- 特点
一个Master可以有多个Slave 支持链式复制 Master以非阻塞方式同步数据至slave
slave: > SLAVAOF MASTER_IP MASTER_PORT
注意:如果master使用requirepass开启了认证功能,从服务器要使用masterauth <PASSWORD>来连入服务请求使用此密码进行认证
sentinel:
- 用于管理多个redis服务实现HA
监控 通知 自动故障转移 流言协议,投票协议
- 程序:
redis-sentinel /path/to/file.conf redis-server /path/to/file.conf --sentinel (1) 服务器自身初始化,运行redis-server中专用于sentinel功能的代码 (2) 初始化sentinel状态,根据给定的配置文件,初始化监控的master服务器列表 (3) 创建连向master的连接
- 专用配置文件:/etc/redis-sentinel.conf
(1) sentinel monitor <master-name> <ip> <redis-port> <quorum> 票数 sentinel monitor mymaster 127.0.0.1 6379 2 (2) sentinel down-after-milliseconds <master-name> <milliseconds> 主服务器不在线的时间 sentinel down-after-milliseconds mymaster 30000 (3) sentinel parallel-syncs <master-name> <numslaves> 新主服务器刚启动时,运行几个从服务器进行链接 sentinel parallel-syncs mymaster 1 (4) sentinel failover-timeout <master-name> <milliseconds> 故障转移的超时时间 sentinel failover-timeout mymaster 180000
- 主观下线,客观下线:
主观下线:一个sentinel实例判断出某节点下线 客观下线:多个sentinel节点协商后判断出某节点下线
- 专用命令:
SENTINEL masters:列出所有监视的主服务器 SENTINEL slaves <master name>:获取知道主服务器的从节点 SENTINEL get-master-addr-by-name <master name>:根据名字获取地址 SENTINEL reset:重置操作 SENTINEL failover <master name>:手动执行故障转移,并指明新的服务器
Clustering:
分布式数据库,通过分片机制进行数据分布,clustering内的每个节点仅数据库的一部分数据
每个节点持有全局元数据,但仅持有一部分数据