zoukankan      html  css  js  c++  java
  • Redis小记(二)

    1、redis数据库

    redis数据库属于内存数据库,若不将数据存到磁盘中,服务器进程退出,数据也会消失

    redis所有数据库都保存在redisServer结构的db数组中,db数组的每一项都是一个redisDb结构,每一个redisDb结构代表一个数据库

    初始化服务器时,redis服务会根据dbnum属性来决定创建多少个数据库,dbnum属性有服务器配置的database选项决定,默认为16

    通过select num 命令来切换数据库,因为客户端状态结构redisClient结构的db属性记录当前客户端目标数据库,通过修改redisClient.db的指针来切换数据库

    expire <key> <ttl> 将键key的生存时间设置为ttl秒

    pexpire <key> <ttl> 将键key的生存时间设置为ttl毫秒秒

    expireat <key> <timestamp> 将键key的过期时间设置为timestamp指定的秒数

    pexpireat <key> <timestamp> 将键key的过期时间设置为timestamp指定的毫秒数

    过了时间,服务器会自动删除键

    persist 命令移除一个键的过期时间,在过期字典查找给定的键,解除键和过期字典的关联

    TTL返回键剩余秒数,PTTL返回键剩余毫秒数

    通过过期字典判断键是否过期:(1)检查键是否存在于过期字典,若存在获取键的过期时间

                  (2)获取当前操作系统的时间戳并与键的过期时间进行对比,大于,键过期,小于,键未过期

    删除过期键的策略:定时删除,设定定时器,键即将过期时进行删除,占用大量CPU资源,影响服务器响应和吞吐量

             惰性删除,每次取键时判断是否过期,过期则删除,未过期返回键,浪费内存,容易发生内存泄漏

               定期删除,每过一段时间,检查字典,删除过期键,需要根据服务器情况,定制删除策略

    2、RDB持久化

    RDB持久化生成一个经过压缩的二进制的RDB文件,可以把数据存到磁盘中,避免数据丢失,通过RDB文件可以还原数据库

    RDB持久化可以手动执行,也可以根据服务器配置选项定期执行

    SAVE命令会阻碍服务器进程,直到RDB文件生成完毕才放开进程,阻塞期间服务器不能处理任何命令要求

    BGSAVE命令会单启动一个子进程,由子进程创建RDB文件,服务器(父进程)继续处理命令

    Redis服务载入RDB文件是自动进行的,当Redis服务器启动时检测到存在RDB文件,就会自动载入RDB文件

    dirty属性,记录服务器上次持久化到这次持久化期间的操作次数

    lastsave属性,记录服务器上次执行SAVE或BGSAVE的时间

    RDB文件结构:REDIS,长度5字节,保存REDIS这五个字符,在程序载入文件时可以通过这个部分判断是否是RDB文件

           db_version,长度4字节,值是字符串保存的整数值,记录RDB文件版本号

             database,保存多个数据库以及其中的键值对数据

             EOF,长度1字节,标志RDB文件结束

            check_sum,长度8字节,无符号整数,保存校验和,程序通过对REDIS、db_version、database、EOF四部分的内容计算得出,可以用来判断RDB文件是否有损坏

    database部分用来保存数据库数据,分为selectdb(1字节)、db_number(1-5字节,数据库号码)、key_value_pairs(键值对数据)三部分

    key_value_pairs可以分为但部分TYPE、KEY、VALUE

    3、AOF持久化

    AOF持久化通过保存redis服务器所执行的命令来记录数据

    AOF实现三步骤:命令追加,服务器执行完一个命令后,会以协议格式将命令追加到服务器状态的aof_buf缓冲区末尾

    文件写入、文件同步,调用flushAppendOnlyFile函数,将aof_buf缓冲区的命令写入保存到AOF文件中,flushAppendOnlyFile函数的配置由配置文件的appendfsync属性来决定,默认为everysec

    AOF文件载入过程:

     AOF重写,可以解决AOF文件体积太大的问题,通过重写,创建一个新的AOF文件替换现有文件,两个文件保存状态相同的数据库,因为新文件不包含冗余命令,所以体积要小很多

    AOF重写本质是通过读数据库键值对来实现,程序无需对现有的AOF进行写入、分析等操作

    3、Redis事件

    Redis服务器是一个事件驱动程序,redis事件分为两类:文件事件(服务器对套接字操作的抽象)、时间事件(服务器对定时操作的抽象)

    套接字(socket)是一个抽象层,应用程序可以通过它发送或接收数据,可对其进行像对文件一样的打开、读写和关闭等操作。套接字允许应用程序将I/O插入到网络中,并与网络中的其他应用程序进行通信。网络套接字是IP地址与端口的组合

    文件事件,基于Reactor模式开发的网络事件处理器,又称文件事件处理器,文件处理器使用I/O多路复用程序同时监听多个套接字,根据套接字目前执行的任务来为套接字关联不同的处理器

    文件事件处理器分为套接字、I/O多路复用程序、文件事件分派器、事件处理器四部分,事件类型分为AE_READABLE和AE_WRITABLE,AE_READABLE优先级大于AE_WRITABLE,事件处理器分为连接应答处理器、命令请求处理器、命令回复处理器

    时间事件,主要由id(标识号)、when(操作系统时间戳,毫秒)、timeProc(时间事件处理器,一个函数),时间类型分为定时事件(返回值为AE_nomore,一次时间到后会删除)、周期性事件(返回值为非AE_nomore,周期执行)

    服务器将时间时间存放到无序链表中,时间事件应用实例,serverCron函数,主要负责信息统计、清理过期键值对、清理失效客户端连接、尝试进行AOF和RDB持久化、对从服务器定期同步、对集群进行定期同步和连接测试

    事件调度负责对文件事件和时间事件进行调度分配,由aeProcessEvents函数来实现

    时间事件的实际处理事件会比设定时间晚一些

    4、客户端与服务器

    客户端分为普通客户端和伪客户端两种,类型由fd属性决定,fd=-1,伪客户端,反之普通客户端

    服务器处理命令过程:客户端给服务器发送命令、服务器解析命令,获得命令参数、根据参数找到执行函数,执行函数并回复、服务端将命令回复给客户端

    服务器自启动到执行客户端命令需要经过初始化服务器状态、载入服务器配置、初始化服务器数据结构、还原数据库状态、执行事件循环

    5、其它

    AOF更新频率高于RDF,服务器会优先载入AOF文件,只有AOF持久化关闭时,服务器才会使用RDB文件还原数据库

              

  • 相关阅读:
    【科普杂谈】计算机按下电源后发生了什么
    【VS开发】使用WinPcap编程(1)——获取网络设备信息
    【VS开发】使用WinPcap编程(1)——获取网络设备信息
    微信公众平台消息接口PHP版
    编码gbk ajax的提交
    mysql 查询
    js cookie
    js同域名下不同文件下使用coookie
    去掉A标签的虚线框
    jquery切换class
  • 原文地址:https://www.cnblogs.com/carblack/p/12734729.html
Copyright © 2011-2022 走看看