redis数据库的结构其实是一个大的hash表,key-value,保存的都是引用,key的引用指向字符串对象?。而value的引用指向各种数据结构:字符串,链表,跳跃表,hash表等等。
redis中的数据结构
-----简单字符串:一个对象,保存有字符串长度,可用长度,并提前分配多余内存(也叫惰性空间,是为了用空间换取字符串改变时候的消耗的时间)。之所以保存字符串长度,是为了获取长度的时候高效。
-----链表,关键字:双向,无环,list对象保存listnode的指针,保存节点个数。为列表list的实现之一。
-----hash表:和hashmap的数据结构一样。
-----跳跃表:
-----整数集合:
rdb持久化:保存的是键值对,按一定频率自动保存,所以有一定概率丢失数据,可以用master-slave模式,减小数据丢失,save会阻塞主进程,besave 新开一个进程不阻塞。
AOF持久化:保存redis的写命令,appendfsync决定什么时候把内核缓冲区的页刷新到磁盘中,always:每个loop(事件循环)都保存,persec和no:每秒和不自动保存。所以丢失数据的概率由小到大,然后效率由低到高。AOF重写:比如对一个key修改n次,那么需要保存n个命令,不如只保存存入这个key的命令。所以要定期重新写新的aof,再用原子的命令替换掉当前aof。在重写新aof的时候,旧的aof会有写的命令,那么让它写两份,一份新,一份旧,所以新的aof其实还有一部分可以优化,不过已经是很小一部分了。
redis的网络io模式和netty的是不一样的,netty是两个线程池,多个线程select,redis只有一个selector,每一个select出来的key处理完毕之后再处理下一个。因为都是在内存中操作,所以响应时间比较快,又不用处理并发、加锁等等。