• redis数据结构和底层实现


    redis数据类型:

      String (字符串类型):

        String是redis最基本的类型,你可以理解成与Memcached一模一样的类型,一个key对应一个value。

        String类型是二进制安全的。意思是redis的string可以包含任何数据。比如jpg图片或者序列化的对象 。

        String类型是Redis最基本的数据类型,一个键最大能存储512MB。

        Redis自己构建了一种名叫Simple dynamic string(SDS)的数据结构,他分别对这几个问题作了处理。我们先来看看它的结构源码:

    struct sdshdr{
         //记录buf数组中已使用字节的数量
         //等于 SDS 保存字符串的长度
         int len;
         //记录 buf 数组中未使用字节的数量
         int free;
         //字节数组,用于保存字符串
         char buf[];
    }
    

        再来说说它的优点:

      1. 开发者不用担心字符串变更造成的内存溢出问题。

      2. 常数时间复杂度获取字符串长度len字段

      3. 空间预分配free字段,会默认留够一定的空间防止多次重分配内存。

      Hash(哈希):

        Redis hash 是一个键值对集合。

         Redis hash是一个string类型的field和value的映射表,hash特别适合用于存储对象。

         

    哈希表:
    typedef struct dictht {
        // 哈希表数组
        dictEntry **table;
        // 哈希表大小
        unsigned long size;
        // 哈希表大小掩码,用于计算索引值
        // 总是等于 size - 1
        unsigned long sizemask;
        // 该哈希表已有节点的数量
        unsigned long used;
    } dictht;
    Hash表节点: typedef struct dictEntry { // 键 void *key; // 值 union { void *val; uint64_t u64; int64_t s64; } v; // 指向下个哈希表节点,形成链表 struct dictEntry *next; // 单链表结构 } dictEntry;
    字典: typedef struct dict { // 类型特定函数 dictType *type; // 私有数据 void *privdata; // 哈希表 dictht ht[2]; // rehash 索引 // 当 rehash 不在进行时,值为 -1 int rehashidx; /* rehashing not in progress if rehashidx == -1 */ } dict;

       List(列表):

        Redis 列表是简单的字符串列表,按照插入顺序排序。你可以添加一个元素导列表的头部(左边)或者尾部(右边)。

        列表最多可存储 232 - 1元素 (4294967295, 每个列表可存储40多亿)。

      Set(集合):

        Redis的Set是string类型的无序集合。

        集合是通过哈希表实现的,所以添加,删除,查找的复杂度都是O(1)。

        sadd 命令:添加一个string元素到,key对应的set集合中,成功返回1,如果元素以及在集合中返回0,key对应的set不存在返回错误。

      Zset(有序集合):

        Redis zset 和 set 一样也是string类型元素的集合,且不允许重复的成员。不同的是每个元素都会关联一个double类型的分数。redis正是通过分数来为集合中的成员进行从小到大的排序。

        zset的成员是唯一的,但分数(score)却可以重复。

        zadd 命令:添加元素到集合,元素在集合中存在则更新对应score

  • 相关阅读:
    发布Hessian服务作为服务内部基础服务
    关于项目中的DAL数据接入层架构设计
    分享Spring Scheduled定时器的用法
    如何在两个月的时间内发表一篇EI/SCI论文-我的时间管理心得
    分享一个SqliteHelper类
    C++调用存储过程
    “扒项目”的历程(二):系统分析
    “扒项目”的历程一(业务分析)
    学习WebSocket一(WebSocket初识)
    局域网多人对战飞行棋的实现
  • 原文地址:https://www.cnblogs.com/lihongjunjava/p/12697658.html
Copyright © 2020-2023  润新知