【第22期】观点:IT 行业加班,到底有没有价值?

Redis数据类型、数据库简要记录

原创 2015年11月17日 20:57:05

数据类型

SDS(简单动态字符串)定义:

struct sdshdr{
    int len;         //buf已占用长度
    int free;        //buff剩余可用长度
    char buf[];
}

优点:
1. 获取SDS长度复杂度由O(n)降为O(1)
2. 防止缓冲区溢出(buffer overflow)

strcat(s, “cluster”) 可能会覆盖s后其他的数据 ——>改用sdscat()
带来的问题: 降低内存重分配次数
1. 内存与分配:
扩展SDS空间前,SDS API查free够用否:够用->用,不够用->分配未实用空间 = 修改后的len值(>1M只分1M),再多一字节(‘\0’)
2. 惰性空间释放
当SDS的API需缩短SDS保存的字符串,不立即使用内存重分配会收缩短后多的字节

buf:“字节数组”,不是用来存字符,而是一系列二进制数据,“二进制安全”

字典:

使用哈希表作为底层实现,每个哈希表有多个哈希表节点,每个哈希表节点保存了字典中的一个键值对
哈希表:
typedef struct dictht{
    dictEntry **table;       //哈希表数组
    unsigned long size;
    unsigned long sizemask;        //大小掩码,计算索引值(= size -1)
    unsigned long used;            //已有节点(键值对)的数量
}dictht;

哈希表节点:
typedef struct dictEntry{
    void *key;               //键
    union{                   //值:可为指针or u64 or s64
        void *val;
        uint64_t u64;
        int64_t s64;
    }v;
    struct dictEntry *next;    /*指向下一个哈希表节点,将多个哈希值相同的简直对在一起,解决链冲突问题*/
}dictEntry;

字典;
typedef struct dict{
    dictType *type;           //特定于类型的处理函数
    void *private;            //处理函数的私有数据
    dictt ht[2];              //ht[1]仅在rehash时使用
    int rehashidx;            //记录rehash(渐进式)进度标记,-1:未rehash
}

对象

typedef struct redisObject{
    unsigned type:4;
    unsigned encoding:4;
    void *ptr;                                       //指向实际值的指针
    int refcount;                                  //引用计数  -> 内存回收
    unsigned lru:REDIS_LRU_BITS;        //lrutime对象最后一次被访问的时间(空转时长)
}robj;

对象共享:
Redis初始化服务器时,创建含0–9999整数值,共1万个字符串对象,当用到该值时,共享对象,or创建新对象

eg:

redisObject
type                        (REDIS_STRING)
encoding            (REDIS_ENCODING_INT)
ptr                     (->100)
refcount                (2...

其中服务器程序引用一次,键A引用一次,当键B也引用值100时,refcount变为3

单机数据库的实现

redisDb *db; 一个数组,保存着服务器中的所有数据库,默认创建16个
可用 SELECT 切换目标数据库(默认为0号) 更改的为redisClient中的db指向,redisServer中的db一直指向db[0]
数据库主要由 dict 和 expires 两个字典组成:dict保存键值对,expires保存键的过期时间

    数据库的键:一个字符串对象, 值:任意一种Redis对象类型
    expires中的键:指向数据库中某个键, 值:该键的过期时间

RDB持久化
将内存中的数据库状态保存到磁盘中,or服务器退出就没了
RDB文件结构:

REDIS(5字节)   db_version(4)  databases EOF(1) check_sum(8,无符号,CRC)
保存REDIS5个字符  字符串记录的整数        标识RDB文件正文内容结束
            (0006)RDB文件的版本号

其中databases:

datebase0 datebase3 ...

每个datebase:

SELECTDB        db_number       key_value_pairs
1字节,开始标志    数据库号码         所有键值对

每个key_value_pairs:

不带过期时间的: TYPE           key(字符串对象)           value
带过期时间的:   EXPIRETIME_MS(1字节)     ms(8字节,带符号整数)   TYPE   key   value

AOF持久化:
通过保存Redis服务器所执行的写命令来记录数据库状态
AOF功能打开时:服务器执行完一写命令后,将该命令加至aof_buf缓冲区末尾:

struct redisServer{
    ...
    sds aof_buf;   //AOF缓冲区
    ...
}

AOF重写:(防止过大)

从数据库中读取键现在的值,--> 用一条命令去记录,取代之前多条对这个键值对的命令
AOF后台重写:
    使用子进程进行AOF重写(AOF重写缓冲区)
版权声明:本文为博主原创文章,未经博主允许不得转载。 举报

相关文章推荐

redis数据类型

redis数据类型 Redis - 数据类型 Redis支持5种类型的数据类型,它描述如下的: 字符串 Redis字符串是字节序列。Redis字符串是二进制安全的,这意味着他们有一个已知的长度没有任何特殊字符终止,所以你可以存储任何东西,512兆为上限。 例子 <pre class...

Redis 数据库入门教程

NoSQL数据库(非关系型数据库)一度成为高并发、海量数据存储解决方案的代名词,与之相应的产品也呈现出雨后春笋般的生机。然而在众多产品中能够脱颖而出的却屈指可数,如Redis、MongoDB、Berk...

程序员升职加薪指南!还缺一个“证”!

CSDN出品,立即查看!

03_(B)Redis数据类型

千呼万唤始出来,呵呵(没有犹抱琵琶半遮面)。Redis数据类型第二弹来了! 这次主要是讲解set,sorted set,hash ps:希望大家习惯我的博客风格。我主要是通过操作Redis的常用命令来讲解这个数据库。截图我觉得能更好的说明效果。但是有些网速可能不给力,所以这次除了截图,我也会吧代...

初学redis数据库(三)Redis数据类型之字符串

Redis数据类型之字符串 字符串类型是Redis中最基本的数据类型,它能存储任何形式的字符串,包括二进制数据。可以存储JSON化的对象、字节数组等。一个字符串类型键允许存储的数据最大容量是...

03_(A)Redis数据类型

Redis的数据类型:key,string,list,set,sorted set,hash。 学习这种数据类型最主要的就是实践。你多操作几次就记住了。这次先说明前面三种数据类型常用的命令。(请一定要熟练使用常用的命令,后面你会知道为什么哟……) 还是先启动Redis吧。 启动命令还记得吗? ...
收藏助手
不良信息举报
您举报文章:深度学习:神经网络中的前向传播和反向传播算法推导
举报原因:
原因补充:

(最多只允许输入30个字)