redis: remote dictionary server
首先大体理解上,from baidubaike:大概就是一个数据库(key-value的,高性能,原子操作,支持主从同步【from阿毛大叔:redis主要被用在内存中,作用主要有两点:1.可以将数据持久化,作为数据库使用;2.可以作为缓存使用,平台框架啥的已经搭好了,通过API操作就可以啦~】)
MULTI:启动一个事务
EXEC:执行事务,一次性将事务中的所有操作执行完后返回给客户端
WATCH:是一种乐观锁,在EXEC命令执行之前,用于监视指定数量键,如果监视中的某任意键数据被修改,则不在执行该事务。【乐观锁好像经常在src和文档中看到】
Publish/Subscribe: :SUBSCRIBE: 订阅一个或多个队列【不过这个好像不经常用到】
PUBLISH: 向频道发布消息
UNSUBSCRIBE:退订此前订阅的频道
PSUBSCRIBE:模式订阅
Persisitence: RDB和AOF
RDB是一种SNAPSHOT(快照)存储机制,其也是redis默认的存储机制,按照事先定制的策略,周期性地将数据从内存中读取出来保存至磁盘,当到达save
指令指定的时间,redis主进程将fork一个子进程,负责内存中的内容快照并保存到磁盘中。 Linux系统有写时复制机制(copy on write,COW),父进程与子进程会共享相同的物理页面(Physical page),当父进程处理写请求时,操作系统为写的数据创建一个副本,因此子进程保存的数据一定是与时间点一致的数据。当子进程将快照写入临时文件后,会使用临时文件替换旧的文件,然后子进程完成退出 。保存的数据文件默认为dump.rdb
. 如果在SAVE周期之前停电了,会造成部分数据丢失。【是将数据先存储在内存,然后当数据累计达到某些设定的伐值的时候,就会触发一次DUMP操作,将变化的数据一次性写入数据文件(RDB文件)】
客户端也可以显式的使用save和bgsave来启用快照保存机制:
save
: 同步机制,在主线程中保存快照,保存时会阻塞所有客户端请求,每次将完整数据写至dump.rdb文件中,会带来大量的IO压力
bgsave
: 异步保存机制,在后端自动保存,其不会阻塞客户端请求
AOF(Append Only File):
工作原理:
redis以顺序IO的方式附加在文件的尾部,将每一次的写命令操作都通过write函数追加到文件后面,其是比RDB更好的持久化方案,但文件会变得越来越大。当redis重启时,可通过执行文件中的命令在内存中重建数据库
数据保存机制:
bgrewriteaof
: AOF文件重写
,它不会读取正在使用的AOF文件,而是通过将内存中的数据以命令的方式保存至临时文件中,完成之后替换原来的AOF文件,这样可以减少AOF的大小
特点:
一个Master可以有多个Slave,类似数据库的一主多从
master以非阻塞方式同步数据至slave,意味着可同时与多个slave同步