zoukankan      html  css  js  c++  java
  • 第九章 数据库

    9.1 服务器中的数据库

      Redis服务器将所有数据库都保存在服务器状态redis.h/redisServer结构的db数组中。

    struct redisServer{
        //一个数组,保存着服务器中的所有数据库
        redisDb *db;
        //服务器的数据库数量
        int denum;
    
    }

      denum属性可配置,默认值为16。

    9.2 切换数据库

      每个Redis客户端有目标数据库,对目标数据库执行读写等操作。可以通过SELECT命令切换目标数据库。Redis目前没有提供查询客户端当前目标数据库的命令。

    9.3 数据库键空间

      服务器中的每个数据库由一个redis.h/redisDb结构表示,其中dict字典保存了数据库中的所有键值对,称这个字典为键空间。

    typedef struct redisDb{
        //数据库键空间,保存所有键值对
        dict *dict;
    
    }

      键空间的键即是数据库的键,每个键对象都是字符串对象。键空间的值是数据库的值,可以是五种对象之一。譬如执行以下命令

    redis>SET message "hello world"
    
    redis>RPUSH alphabet "a" "b" "c"
    
    redis>HSET book name "Redis in Action"
    
    redis>HSET book author "Josiah L. Carlson"
    
    redis>HSET book publisher "Manning"

      所有对数据库的操作,都是通过对键空间字典进行操作实现的。

    9.4 设置键的生存时间或过期时间

      通过EXPIRE(秒)命令或者PEXPIRE(毫秒),设置键值对的生存时间,经过指定时间后,服务器会自动删除生存时间为0的键。类似的EXPIREAT命令或PEXPIREAT命令可以为某个键值对设置过期时间。

      9.4.2 保存过期时间

      redisDb结构的expires字典(过期字典)保存了数据库中所有键的过期时间。

    typedef struct redisDb{
    
        //过期字典,保存键的过期时间
        dict *expires;
    
    }redisDb;

     

      9.4.5 过期键的判定

    • 检查给定键是否存在于过期字典,如果存在,取得键的过期时间。
    • 检查当前UNIX时间戳是否大于键的过期时间,大于则判定为过期键,否则未过期。

    9.5 过期键删除策略

      9.5.1 定时删除

      在替键设置过期时间时,创建一个定时器,由定时器执行最后的键删除操作。

      优点:能及时释放不需要的内存。

      缺点1. 删除键需要占用CPU时间,降低业务吞吐量和服务器的响应时间。2.定时器的实现方式——时间事件,查找事件复杂度较高(O(n))

      9.5.2 惰性删除

      在获取键的同时,检查键是否过期,过期则删除否则返回键

      优点:不会浪费CPU时间去删除无关的键

      缺点:内存不能及时回收,浪费内存,并且当一个过期键不再被访问时,这部分内存将无法回收造成内存泄漏(除非手动执行FLUSHDB)

      9.5.3 定期删除

      每个一段时间,对数据库进行检查,删除过期键

    9.6 Redis的过期键删除策略

      Redis中采用惰性删除和定期删除结合的方式

    9.7 AOF、RDB和复制功能对过期键的处理

      讨论RDB持久化和AOF持久化以及复制功能如何处理数据库中的过期键

      9.7.1 RDB文件

      生成RDB文件时,对数据库中的键进行检查,已过期的键不会被保存到RDB文件中;

      在启动Redis服务器时,如果服务器开启了RDB功能,将载入RDB文件,载入RDB文件时,

    • 当前服务器是主服务器,载入时,会检查键是否已过期,过期键不会载入内存
    • 当前服务器是从服务器,全部载入,当主服务器同步时,清空从服务器数据

      9.7.2 AOF文件写入

      在过期键被删除后,向AOF文件追加一条DEL命令,显示该键已经被删除

      9.7.3 AOF重写

      在AOF重写时,检查如果是过期键不会保存到重写后的AOF文件中

      9.7.5 复制

      从服务器为了保持和主服务器的一致性,从服务器的过期键删除由主服务器控制。当主服务器删除过期键,向从服务器发送一个DEL命令,从服务器才删除这个过期键。当从服务器执行客户端的读命令时,遇到过期键不会执行删除操作。

    9.8 数据库通知

       客户端可以订阅给定的频道或者模式,得知数据库中键的变化,以及数据库中命令的执行情况。

    人生就像蒲公英,看似自由,其实身不由己。
  • 相关阅读:
    scala的泛型浅析
    spark2.0的10个特性介绍
    spark2.0 DataSet操作的一些问题记录
    scala中ClassOf、asInstenceOf、isInstanceOf三个预定义方法分析
    Java 多线程与并发编程专题
    java nio入门
    MySQL索引优化详解
    shiro学习笔记-Subject#login(token)实现过程
    【转】线程八锁
    ReadWriteLock读写锁
  • 原文地址:https://www.cnblogs.com/walker993/p/14444102.html
Copyright © 2011-2022 走看看