zoukankan      html  css  js  c++  java
  • Redis五大数据结构

    1、Redis介绍

    Redis是REmote DIctionary Server的缩写,作者定位于一个内存KV存储数据库(In-memory key-value Store),让Redis自豪的并不是那每秒10K的读写速度,而是它那可以应对很多情况的数据结构,我这里就简单的介绍一下它五大数据结构,也可以方便的让自个翻翻API,并给以后翻阅源码打下一个基础。

    2、Strings

    1)简介

    String是Redis最基本的数据结构,它的String是二进制安全的,即String中可以存放任意的二进制数据,比如说JPG图片、序列化对象等。String值长度最大可到512mb。

    2)结构定义

    struct sdshdr{  
    long len;
    long free;
    char buf[];
    }

    3)支持命令

    APPENDGETGETBITGETRANGEGETSETSTRLEN

    MGETMSETMSETNXSETSETBITSETEXSETNXSETRANGE

    INCRINCRBYDECRDECRBY

    3、Hashes

    1)简介

    Hashes中存放了多个键值对(field/value),所以Hash结构可方便的表示一个对象。如:

    HMSET user:00001 username wikie password gender male

    一个Hash可以存放2^32 – 1个键值对。Hash对象是用zipmap存储的,查找、删除均为O(n),但一般来说对象的field对象不会大多,所以说操作评价还是近似O(1)。如果field/value的大小超过一定限制后,Redis会在内部自动将zipmap替换成正常的Hash实现,可在配置文件中指定:

    hash-max-zipmap-entries 64 # 字段最多64个

    hash-max-zipmap-value 512 # value最大为512字节

    2)结构定义

    //Please check in dict.h  
    typedef struct dictht {
    dictEntry table;
    unsigned long size;
    unsigned long sizemask;
    unsigned long used;
    } dictht;

    3)支持命令

    HDELHEXISTSHGETHGETALLHINCRBYHKEYSHLEN

    HMGETHMSETHSETHSETNXHVALS

    4、Lists

    1)简介

    Lists是一个简单的strings类型的双向链表,按照插入顺序排序。

    最大长度支持2^32-1,可以通过命令从头部或者尾部添加删除元素,即可很方便的实现栈与队列操作。List还可以阻塞,很容易就实现了一个工作队列,而不用轮询。

    2)结构定义

    // Check in adlist.h  
    typedef struct listNode {
    struct listNode *prev;
    struct listNode *next;
    void *value;
    } listNode;

    typedef struct listIter {
    listNode *next;
    int direction;
    } listIter;

    typedef struct list {
    listNode *head;
    listNode *tail;
    void *(*dup)(void *ptr);
    void (*free)(void *ptr);
    int (*match)(void *ptr, void *key);
    unsigned int len;
    } list;

    3)支持命令

    BLPOP 、BRPOP 、BRPOPLPUSHLINDEXLINSERTLLEN

    LPOPLPUSHLPUSHXLRANGELREMLSETLTRIM

    RPOPRPOPLPUSHRPUSHRPUSHX

    5、Sets

    1)简介

    与数学的中的集合概念类似,没有重复的值,对其有添加删除操作,可对都个结合求交、并等操作,key理解为集合的名字。新浪微博中的:“我和她都关注了”只需要一个SINTER命令就可以实现。

    Sets通过Hash Table实现,添加删除的时间复杂度均为O(n),HashTable会随着添加或者删除自动调整大小。需要注意的是,调整HashTable大小需要同步(获取写锁)阻塞读写操作,后期可能会采用SkipList(无序如何使用SkipList?)实现。

    和其它类型一样,最大支持2^32-1个元素。

    2)结构定义

    与Hashes中的dict一致。

    3)支持的方法

    SADDSCARSDIFFSDIFFSTORESINTERSISMEMBER

    SMEMBERSSMOVESPOPSRANDMEMBERSREM

    SUNIONSUNIONSTORE

    6、ZSets

    1)简介

    ZSets为Set的升级版本,即排序的Sets,在Set的基础之上增加了顺序(Score)属性,每次插入均需要指定,且会自动重新调整值的顺序。Score为double类型,ZSets实现为SkipList与HashTable的混合体。

    元素到Score的映射是添加在HashTable中的,所以给定一个元素获取Score开销为O(1),Score到元素的映射则为SkipList。

    2)结构定义

    /* ZSETs use a specialized version of Skiplists */
    typedef struct zskiplistNode {
    robj *obj;
    double score;
    struct zskiplistNode *backward;
    struct zskiplistLevel {
    struct zskiplistNode *forward;
    unsigned int span;
    } level[];
    } zskiplistNode;

    typedef struct zskiplist {
    struct zskiplistNode *header, *tail;
    unsigned long length;
    int level;
    } zskiplist;

    typedef struct zset {
    dict *dict; // Value to Score
    zskiplist *zsl; // Score to Value
    } zset;

    3)支持命令

    ZADDZCARDZCOUNTZINCRBYZINTERSTORE

    ZRANGEZRANGEBYSCOREZRANKZREM

    ZREMRANGEBYRANKZREMRANGEBYSCOREZREVRANGE

    ZREVRANGEBYSCOREZREVRANKZSCOREZUNIONSTORE

    参考资料:

    Redis.io

    The Little Redis Book

    from: http://yihongwei.com/2012/03/redis-data-strutrue/

  • 相关阅读:
    HashMap、ConcurrentHashMap红黑树实现分析
    分布式系统ID
    分布式事务
    LRU算法实现
    Redis 深入
    分库分表利器——sharding-sphere
    Java常用的八种排序算法
    浅析Tomcat
    Kafka
    如何选择分布式事务形态
  • 原文地址:https://www.cnblogs.com/GarfieldEr007/p/7077862.html
Copyright © 2011-2022 走看看