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/

时间: 2024-08-05 06:49:40

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

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

[二.Redis基本命令和五大数据结构] redis的基础知识和命令 redis 是一个单进程(包装epoll函数来对读写事件进行相应) 默认有16个数据库,初始使用的数据库为0号库 默认端口为6379 select :切换数据库 dbsize:查看当前库的key的个数 flushdb:清空当前库 flushall:清空所有库 redis的五大数据类型 key键 keys *:查看当前所有库的key 127.0.0.1:6379> keys * 1) "k1" 2) "

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

很对不起大家,又是一篇乱序的文章,但是满满的干货,来源于实践,相信大家会有所收获.里面穿插一些感悟和生活故事,可以忽略不看.不过听大家普遍的反馈说这是其中最喜欢看的部分,好吧,就当学习之后轻松一下. Redis各种数据结构性能数据对比 测试工具:perf4j 性能指标:平均值,最小值,最大值,方差 对比将814条数据按单条插入到哈希MAP和哈希SET: 对比从814条数据的哈希MAP和哈希SET中判断一个元素是否存在(map的hasKey和set的isMember): 大量数据插入哈希MAP,运

redis五大类型用法

Redis五大类型:字符串(String).哈希/散列/字典(Hash).列表(List).集合(Set).有序集合(sorted set)五种Controller:@Resource RedisTemplate<String, String> redisTemplate;总括:redisTemplate.opsForValue();//操作字符串redisTemplate.opsForHash();//操作hashredisTemplate.opsForList();//操作listredi

2017-4-20/Redis的数据结构及应用场景

1. 谈谈你对redis的理解,它的应用场景. Redis是一个key-value存储系统,它支持存储的value类型包括string字符串.list链表.set集合.sorted Set有序集合和hash哈希等数据类型.这些数据类型都支持push/pop.add/remove及取交集并集和差集及更丰富的操作,而且这些操作都是原子性的,支持各种不同方式的排序.为了保证效率,Redis将数据都缓存在内存中,并周期性的把更新的数据写入磁盘或者把修改操作写入追加的记录文件,在此基础上实现master-

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

Redis基本数据结构总结 前言 Redis的特点在于其读写速度特别快,因为是存储在内存中的,其非常适合于处理大数据量的情况:还有一个是其不同于其他的关系型数据库,Redis是非关系型数据库,也就是我们常说的NoSQL,其并不需要一开始去创建好表结构,可以存储自定义的数据:还有Redis是分布式的,其可以主从分离,主从复制,比如说我们不可能只用一台Redis服务器来处理客户端的请求,因为这样毕竟是存在风险,如果服务器挂掉了,那么其数据就会丢失,而且无法找回,所以存在这么一种方案:多个主服务器用来

redis内部数据结构深入浅出

最大感受,无论从设计还是源码,Redis都尽量做到简单,其中运用到的原理也通俗易懂.特别是源码,简洁易读,真正做到clean and clear, 这篇文章以unstable分支的源码为基准,先从大体上整理Redis的对象类型以及底层编码. 当我们在本文中提到Redis的“数据结构”,可能是在两个不同的层面来讨论它. 第一个层面,是从使用者的角度,string,list,hash,set,sorted set 第二个层面,是从内部实现的角度,属于更底层的实现,   ht(dict),raw,em

Redis学习——数据结构介绍(四)

一.简介 作为一款key-value 的NoSQL数据库,Redis支持的数据结构比较丰富,有:String(字符串) .List(列表) .Set(集合) .Hash(哈希) .Zset(有序集合),相对于其他四种数据结构,Zset 是Redis独有的数据结构,作为有序的集合来使用还是十分方便的,下面我来介绍这集中数据结构: 数据类型 描述 set 无序.不重复的字符串集合 list 字符串链表 string 字符串.整型.浮点型 hash key和value都是无序的hashtable zs

Redis基本数据结构

Redis基本数据结构 Redis(REmote DIctionary Server)是一个开源的使用ANSI C语言编写.遵守BSD协议.支持网络.可基于内存亦可持久化的日志型.Key-Value数据库,并提供多种语言的API Redis通常被称为数据结构服务器,因为值(value)可以使字符串(String),哈希(Map),列表(list),集合(Set),和有序集合(sorted sets)等类型 Redis 哈希(Hash) Redis Hash是一个string类型的field和va

redis 基础数据结构实现

参考文献 redis数据结构分析 Skip List(跳跃表)原理详解 redis 源码分析之内存布局 Redis 基础数据结构与对象 Redis设计与实现-第7章-压缩列表 在redis中构建了自己的底层数据结构:动态字符,双端链表,字典,压缩列表,整数集合和跳跃表等.通过这些数据结构,redis构造出字符串对象,列表对象,哈希对象,集合对象和有序集合对象这5种我们常用的数据结构.接下来将从底层数据结构开始,一步步介绍redis的数据结构的实现 动态字符串 在redis中并没有使用c语言原生的