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)结构定义

  1. 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)结构定义

  1. //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)结构定义

  1. // Check in adlist.h
    typedef struct listNode {
    struct listNode *prev;
    struct listNode *next;
    void *value;
    } listNode;
  2.  
  3. typedef struct listIter {
    listNode *next;
    int direction;
    } listIter;
  4.  
  5. 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)结构定义

  1. /* 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;
  2.  
  3. typedef struct zskiplist {
    struct zskiplistNode *header, *tail;
    unsigned long length;
    int level;
    } zskiplist;
  4.  
  5. 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/

Redis五大数据结构的更多相关文章

  1. redis 五大数据结构__常用命令

    linux 下下载redis数据库 apt install redis 如果提示权限不够的话, 直接提权: sudo apt install redis-server linux启用.停止服务 ser ...

  2. redis学习笔记-04:redis五大数据结构类型

    redis的命令大全网站:http://redisdoc.com/ 一.redis五大数据类型 1.String(字符串).Hash(哈希,类似Java里的Map).List(列表).Set(集合)和 ...

  3. Redis学习笔记(4)——Redis五大数据结构介绍以及应用场景

    出处:https://www.jianshu.com/p/f09480c05e42 Redis是典型的Key-Value类型数据库,Key为字符类型,Value的类型常用的为五种类型:String.H ...

  4. Redis第二讲【Redis基本命令和五大数据结构】

    [二.Redis基本命令和五大数据结构] redis的基础知识和命令 redis 是一个单进程(包装epoll函数来对读写事件进行相应) 默认有16个数据库,初始使用的数据库为0号库 默认端口为637 ...

  5. 一文搞定Redis五大数据类型及应用场景

    本文学习知识点 redis五大数据类型数据类型:string.hash.list.set.sorted_set 五大类型各自的应用场景 @TOC 1. string类型 1-1 string类型数据的 ...

  6. Redis基本数据结构总结之STRING和LIST

    Redis基本数据结构总结前言 Redis的特点在于其读写速度特别快,因为是存储在内存中的,其非常适合于处理大数据量的情况:还有一个是其不同于其他的关系型数据库,Redis是非关系型数据库,也就是我们 ...

  7. Redis基本数据结构总结之SET、ZSET和HASH

    Redis基本数据结构总结 前言 Redis的特点在于其读写速度特别快,因为是存储在内存中的,其非常适合于处理大数据量的情况:还有一个是其不同于其他的关系型数据库,Redis是非关系型数据库,也就是我 ...

  8. Redis各种数据结构性能数据对比和性能优化实践

    很对不起大家,又是一篇乱序的文章,但是满满的干货,来源于实践,相信大家会有所收获.里面穿插一些感悟和生活故事,可以忽略不看.不过听大家普遍的反馈说这是其中最喜欢看的部分,好吧,就当学习之后轻松一下. ...

  9. 聊一聊Redis的数据结构

    如果没有记错的话,应该是在两个月前把 我们经常看到此类的文章: Redis的五种数据结构 Redis的数据结构以及对应的使用场景 其实以数据结构这个词去说明Redis的String.Hash.List ...

随机推荐

  1. bzoj 1233

    先要了解一个结论,在多种可行的堆叠方案中,至少有一种能使层数最高的方案同时使得底边最短.即底边最短的,层数一定最高. dp[ i ] = min(sum[j - 1] - sum[i - 1])  j ...

  2. Logback配置解析

    logback优点 比较吸引的几个优点如下: 内核重写,初始化内存加载更小 文档比较齐全 支持自动重新加载配置文件,扫描过程快且安全,它并不需要另外创建一个扫描线程 支持自动去除旧的日志文件,可以控制 ...

  3. java面试 关键字

    1. final关键字有哪些用法? 修饰类.方法和变量. (1) final变量是只读的,不允许改变其引用,与static共用可声明常量.JVM会对final变量进行优化,比如常量折叠. (2) fi ...

  4. django 启动nginx的时候,报端口被占用的问题

    Nginx [emerg] listen() to 0.0.0.0:80, backlog 511 failed (98: Address already in use) Nginx更新后经常遇到这样 ...

  5. JS Function Arguments

    Function arguments在ECMAScript中的行为并不像其他大多数语言中的函数参数. 在ECMAScript中,function 并不关心有多少个参数传入函数中,也不关心传入参数的数据 ...

  6. hash课堂测试补分博客

    题目要求: 开放地址法: 概念: 所谓的开放定址法就是一旦发生了冲突,就去寻找下一个空的散列地址,只要散列表足够大,空的散列地址总能找到,并将记录存入. 它的公式为: 解题过程(在下图中): 拉链法: ...

  7. [POI2017]Sabotaż

    [POI2017]Sabotaż 题目大意: 一棵\(n(n\le5\times10^5)\)个结点的树,初始时有一个未知的黑点,其余全为白点.对于一个点,如果其子树中黑点所占比例超过\(x\),则这 ...

  8. BZOJ 4726 POI 2017 Sabota? 树形DP

    4726: [POI2017]Sabota? Time Limit: 20 Sec  Memory Limit: 128 MBSec  Special JudgeSubmit: 128  Solved ...

  9. Codeforces Round #354 (Div. 2) B. Pyramid of Glasses 模拟

    B. Pyramid of Glasses 题目连接: http://www.codeforces.com/contest/676/problem/B Description Mary has jus ...

  10. UVALive 4426 Blast the Enemy! 计算几何求重心

    D - Blast the Enemy! Time Limit:3000MS     Memory Limit:0KB     64bit IO Format:%lld & %llu Subm ...