Redis持久化Redis为键值对提供了持久化功能,并且有两种持久化方式,分别是 ,RDB和AOF方式 RDB保存在Redis中有两个命令可以生成RDB文件,SAVE和BGSAVE。 SAVE命令会阻塞Redi服务器进程,直到RDB文件创建完毕为止,在服务器阻塞期间不能处理任何请求。 BGSAVE命令则不会阻塞Redis服务器进程,它会fork一个子进程来执行持久化操作,然后父进程继续处理请求命令。 对于SAVE命令,会拒绝掉所有的其他服务器命令,包括SAVE,BGSAVE。 BGSAVE虽然不会阻塞Redis服务器进程,但是它也会拒绝掉过来的SAVE和BGSAVE命令,如果有AOFREW ...
Redis对象
对象在Redis中,包含有5中对象,分别是字符串对象,列表对象,哈希对象,集合对象和有序集合对象。每种对象都对应于一种或多中数据结构。这些数据结构就是上一篇文章讲集中底层的数据结构。 通过这五种不同类型的对象,Redis在执行命令前,会根据对象的类型来判断一个对象是否可以执行给定的命令。并且使用这些对象,可以针对不同的使用场景来为对象设置不同的底层数据结构,以提供更好的效率。 此外,Redis的对象系统实现了基于引用计数的内存回收机制,当程序不在使用使用某个对象的时候,对象占用的内存会被自动释放掉,并且通过引用计数法实现了对象共享机制,就是让多个键共享一个对象来节约内存,例如Redis ...
Redis数据库
数据库Redis中的数据库是保存在一个redisServer结构中的db数组中的。db数组的每一项都是一个redisDb结构,每个结构代表着一个数据库。struct redisServer{ //... // 数组,保存着服务器中的所有数据库 redisDb *db; // 服务器的数据库数量 int dbnum; //...} dbnum属性的值未服务器 包含的数据库的数量,由服务器配置决定,默认为16个数据库。 并且在服务器内部,客户端状态redisClient结构的db属性记录了当前客户端的目标数据库,这个属性是一个redisDb结 ...
Redis集群与哨兵
SentinelSentinel(哨兵)是Redis的高可用的一个解决方案。有一个或多个Sentinel实例组成的Sentinel系统。用来监视任意多个主服务器和从服务器。 实现使用Sentinel的时候,会启动Sentinel用来监视主服务器或者从服务器,应该在Sentinel配置文件中配置要监视的主服务器,之后Sentinel会从和主服务器之间的信息交换中获得主服务器的从服务器的信息。 每个Sentinel都又一个SentinelState结构来表示,通过这个结构来保存所有此Sentinel用到的数据。此Sentinel会保存所有监视的主服务器的信息(从配置文件知道监视哪些主服务器) ...
Redis数据结构
SDS在redis中,自己实现了一套字符串数据结构,使用一个sdshdr来表示一个字符串:struct sdshdr{ // 用来记录buf数组中已使用字节的数量 int len; // 记录buf数组中未使用字节的数量 int free; // 用来保存字符串 char buf[];} 至于redis为什么要这么设计,首先是有三个好处: 结构体中记录了字符串的长度,可以在O(1)时间内获取长度。如果只使用char数组来保存,得需要O(n)的时间 结构体内有free类型,减少了因为修改字符串所带来的内存重分配次数。 二进制安全。 ...
Java wait,join,notify解析
wait()wait()方法只能在对象上调用,比如 obj.wait(),表明将当前线程阻塞,直到有其他线程调用此对象的notify()或notifyAll()方法.线程才会继续执行. 或者有其他线程中断了此线程,将会抛出一个中断异常. wait(long timeout)和wait()方法类似,但是此等待是有超时限制的,当等待的时间到了,也会自动被唤醒 wait(long timeout,int nanos)此方法就有点意思了,看名字好像等待超时时间的控制精确到了纳秒级别,但是看看源码就了解到了,事实并不是如此.public final void wait(long timeout, int ...
InnoDB实例恢复
InnoDB实例恢复在InnoDB引擎中,存在redo log用来做数据的恢复操作. 但是了解了redo log的原理之后发现,redo log中日志并不只是在事务提交的时候才会写入磁盘,而是在事务的进行中就可能已经写入磁盘了,并且一个redo log中的一个log块可能包含多个事务redo log. 当时当一个事务做了一系列事情之后,还未提交,但是数据库宕机了,并且redo log中某些操作已经写回了磁盘,这个时候把数据库恢复到之前的状态,将会有存在某些未提交的数据.主要是redo log中不仅保存数据修改的日志,还会保存undo log日志信息.在数据库启动的时候,会首先使用redo lo ...
InnoDB事务的实现
事务数据库的事务有四大特性,即:原子性,隔离性,一致性和持久性.要保证这四个特性,InnoDB存储引擎做了一系列的操作,下面来看一下InnoDB是怎么保证数据库事务的这四个特性的. 隔离性隔离性是当多个用户并发访问数据库时,比如操作同一张表时,数据库为每一个用户开启的事务,不能被其他事务的操作所干扰,多个并发事务之间要相互隔离。 隔离性就很好说了,在InnoDB中,如果想要访问某一行记录的话,首先需要获取到它的锁,之后才能继续访问.通过锁,就能很好的实现了事务的隔离性. InnoDB默认的访问级别是Read Repeatable级别,避免了脏读,不可重复读等特性,并且在行锁的基础上又加上了ga ...
InnoDB存储引擎之锁的实现
InnoDB锁在一般的数据库中为了保证数据库事务的四个特性,不可避免的要使用到锁.而InnoDB为我们提供了一个很好的行级锁,即锁定的是数据行,而不是整张表.,当然了,在某些情况下也会直接锁表,而不是行锁.下面来探讨一下InnoDB的行级锁. 锁的类型InnoDB存储引擎为我们提供了两种标准的行级锁. 共享锁(S Lock),允许事务读取一行数据 排它锁(X Lock),允许事务删除或更新一条数据. 正如名称所描述的,共享锁就是能够共享的,就是说在一个事务获取了共享锁之后,另一个事务依旧可以获取共享锁.排它锁是不共享的,当有一个事务获取排它锁之后,则不允许其他任何事务获取任何锁. 在Inn ...
Netty之EventLoop
EventLoopNetty线程模型是被精心设计的,提升了框架的并发性能,并且在很大程度上避免锁.下面来讲一下Netty中的线程模型和它的EventLoop. 线程模型一说到线程模型,很容易能够想到Reactor线程模型.Reactor又有单线程模型,多线程模型和主从多线程模型. 单线程模型单线程模型,显而易见就是只有一个线程,即所有的I/O操作都在同一个NIO线程模型.对于此I/O模型的职责则有很多: 作为服务端,接受TCP连接 作为客户端,发起TCP连接 读取通信对端的请求和应答消息 向通信对端发送请求或应答消息 这种模型由于只有一个线程处理I/O,因此当并发量提高之后,一个线程很 ...