Open loadlj opened 6 years ago
redis默认情况下会创建16个db,并使用0号数据库,可以通过select语句切换数据库。是通过切换redisClient里面的redisDb指针来实现的
redisClient
过期算法有三种:
RDB是将数据库状态保存为文件,RDB可以手动执行,也可以在redis定期执行。有两个命令可以保存RDB文件,save和bgsave。save命令会阻塞redis服务进程,直到RDB文件创建完成,在这个期间服务器不能处理其它命令。bgsave会fork一个子进程,子进程负责RDB文件的写入,主线程负责处理请求。
AOF持久化是通过保存redis的所执行的写命令来保存数据状态的,包括命令追加,文件写入,文件同步三个步骤 AOF的更新频率比RDB高,所以
当服务器执行完一个写命令后,会把协议追加到aof_buf的缓冲区里头
redis在eventloop中执行完了写函数之后,都会调用flushAppendOnlyFile考虑是否将aof_buf的内容写到文件中,flushAppendOnlyFile由配置文件中的appendfsync来控制。appendfsync有三个选项
AOF的载入与还原:redis服务端创建一个不带网络连接的伪客户端,从aof文件读取命令,使用伪客户端执行命令
当数据库某个键已经过期,AOF不会因为这个过期键产生影响,当被删除之后,会向AOF文件apped一条del命令。在AOF重写的时候的过程中会去检查过期的键,已过期的键不会被写入AOF文件
AOF重写(BGREWRITEAOF)会去除一些冗余的写命令,重写后会用新的AOF文件去覆盖旧的。AOF重写是在子进程中进行的,在服务器处理完写操作后,会把命令同时追加到AOF缓冲区和AOF重写缓冲区。
redis复制的步骤:
redis集群通过槽节点分片实现,集群的整个数据库被分为16384个槽节点,数据库中每个键都属于这些槽节点中。redis本身并不支持一致性hash,可以用twemproxy方案解决。 在集群中执行命令的时候如果键所在的槽正好指派给了该节点,则该节点执行命令。若不在该节点,节点返回一个moved错误,客户端指引到正确的节点,再次发送该命令。
redis发布与订阅由publish,subscribe,psubcribe命令组成 psubcribe是用来订阅一个或者多个发布者的,用*作为匹配符
redis通过multi,exec,watch实现事务功能,在事务执行期间,服务器不会中断事务去执行其他客户端的请求。事务由multi开始,exec提交给服务器。
当一个客户端处于非事务状态时,发送的命令会被立即执行 当一个客户端处于事务状态时
watch是一个乐观锁,可以在exec执行之前监控任意数量的数据库键,并在exec执行的时候,检查被监控的键是否修改过,如果是的话则拒绝事务 redis的事务是不支持回滚的,事务只会因为语法的错误而失败
redis相关
数据库
redis默认情况下会创建16个db,并使用0号数据库,可以通过select语句切换数据库。是通过切换
redisClient
里面的redisDb指针来实现的过期算法有三种:
持久化
RDB
RDB是将数据库状态保存为文件,RDB可以手动执行,也可以在redis定期执行。有两个命令可以保存RDB文件,save和bgsave。save命令会阻塞redis服务进程,直到RDB文件创建完成,在这个期间服务器不能处理其它命令。bgsave会fork一个子进程,子进程负责RDB文件的写入,主线程负责处理请求。
AOF持久化
AOF持久化是通过保存redis的所执行的写命令来保存数据状态的,包括命令追加,文件写入,文件同步三个步骤 AOF的更新频率比RDB高,所以
AOF命令追加
当服务器执行完一个写命令后,会把协议追加到aof_buf的缓冲区里头
AOF写入和同步
redis在eventloop中执行完了写函数之后,都会调用flushAppendOnlyFile考虑是否将aof_buf的内容写到文件中,flushAppendOnlyFile由配置文件中的appendfsync来控制。appendfsync有三个选项
AOF的载入与还原:redis服务端创建一个不带网络连接的伪客户端,从aof文件读取命令,使用伪客户端执行命令
AOF文件写入
当数据库某个键已经过期,AOF不会因为这个过期键产生影响,当被删除之后,会向AOF文件apped一条del命令。在AOF重写的时候的过程中会去检查过期的键,已过期的键不会被写入AOF文件
AOF重写(BGREWRITEAOF)会去除一些冗余的写命令,重写后会用新的AOF文件去覆盖旧的。AOF重写是在子进程中进行的,在服务器处理完写操作后,会把命令同时追加到AOF缓冲区和AOF重写缓冲区。
复制
redis复制的步骤:
集群
redis集群通过槽节点分片实现,集群的整个数据库被分为16384个槽节点,数据库中每个键都属于这些槽节点中。redis本身并不支持一致性hash,可以用twemproxy方案解决。 在集群中执行命令的时候如果键所在的槽正好指派给了该节点,则该节点执行命令。若不在该节点,节点返回一个moved错误,客户端指引到正确的节点,再次发送该命令。
发布与订阅
redis发布与订阅由publish,subscribe,psubcribe命令组成 psubcribe是用来订阅一个或者多个发布者的,用*作为匹配符
事务
redis通过multi,exec,watch实现事务功能,在事务执行期间,服务器不会中断事务去执行其他客户端的请求。事务由multi开始,exec提交给服务器。
事务执行
当一个客户端处于非事务状态时,发送的命令会被立即执行 当一个客户端处于事务状态时
watch是一个乐观锁,可以在exec执行之前监控任意数量的数据库键,并在exec执行的时候,检查被监控的键是否修改过,如果是的话则拒绝事务 redis的事务是不支持回滚的,事务只会因为语法的错误而失败