Redis 的数据结构

原创 2015年07月09日 10:20:19

一、Redis数据库的优势

Redis是一个先进的Key-Value键值存储数据库,通常作为数据结构服务器。
支持strings, hashes, lists, sets, sorted sets, bitmaps 和hyperloglogs

二、Redis数据结构

1,string - 字符串

Redis的字符串为SDS(Simple Dynamic String)可以存储任何东西,最大长度可达515兆。

#redis-cli.exe
127.0.0.1:6379> set name 'cbb'
OK
127.0.0.1:6379> get name
"cbb"

SDS的数据结构如下:

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

常用命令:set, get

2,Hash - 哈希值

Redis的哈希值是字符串字段和字符串值之间的映射,所有它们被用来表示对象。

#redis-cli.exe
127.0.0.1:6379> HMSET user:1 username ccc password 123 age 20
OK
127.0.0.1:6379> HGETALL user:1   //取所有key
1> "username"
2> "ccc"
3> "passwrod"
4> "123"
5> "age"
6> "20"

127.0.0.1:6379> hget user:1 username  //取一个key
"ccc"

上面的Hash数据类型,用于存储用户的基本信息,user:1是键。

  • hash解决了用户信息对象的存储:如用户ID为key,value为姓名name,年龄age,生日birthday等。
    用普通的key/value结构存储:
    • a,set u001 “张三, 18, 20010101”
      这种方式的缺点是增加了序列化/反序列化的开销,并且在需要修改其中一项信息时,需要把整个对象取回,并且修改操作需要对并发进行保护,引入CAS等复杂问题。
    • b,mset user:001:name “李三” user:001:age 18 user:001:birthday “20010101”
      这种方法是用户信息对象有多少个成员就存成多少个key-value对儿,虽然省去了序列化开销和并发问题,但是用户ID为重复存储,如果存在大量这样的数据,内存浪费严重。

常用命令:hmset, hset, hget, hgetall

3,List - 列表

列表是简单的字符串列表,排序插入顺序。可以添加元素到Redis列表的头部或尾部。

#redis-cli.exe
127.0.0.1:6379> lpush tutor redis
<integer> 1
127.0.0.1:6379> lpush tutor mongodb
<integer> 2
127.0.0.1:6379> lpush tutor rabitmq
<integer> 3
127.0.0.1:6379> lrange tutor 0 10
1> "rabitmq"
2> "mongodb"
3> "redis"

节点的定义:

typedef struct listNode {
    // 前置节点
    struct listNode *prev;
    // 后置节点
    struct listNode *next;
    // 节点的值
    void *value;
} listNode;

List的定义

typedef struct list {
    // 表头节点
    listNode *head;
    // 表尾节点
    listNode *tail;
    // 链表所包含的节点数量
    unsigned long len;
    // 节点值复制函数
    void *(*dup)(void *ptr);
    // 节点值释放函数
    void (*free)(void *ptr);
    // 节点值对比函数
    int (*match)(void *ptr, void *key);
} list;

补充:

  • 链表被广泛用于实现 Redis 的各种功能, 比如列表键, 发布与订阅, 慢查询, 监视器, 等等。
  • 因为链表表头节点的前置节点和表尾节点的后置节点都指向 NULL , 所以 Redis 的链表实现是无环链表。
  • 通过为链表设置不同的类型特定函数, Redis 的链表可以用于保存各种不同类型的值。

常用命令:lpush, rpush, lpop, rpop, lrange等

4,Set - 集合

Set是字符串的无序集合。在Redis中可以添加、删除和测试值是否存在。

#redis-cli.exe
127.0.0.1:6379> sadd total 123
<integer> 1
127.0.0.1:6379> sadd total 234
<integer> 1
127.0.0.1:6379> sadd total 345
<integer> 1
127.0.0.1:6379> smembers total
1> "123"
2> "234"
3> "345"

常用命令:sadd, srem, spop, sdiff, smembers, sunion等

5,Sort Set - 有序集合

与Set类似,字符串不重复,但其是有序的
常用命令:zadd, zrange,zrem,zcard等

6,Pub/Sub - 消息订阅

发布(Publish)和订阅(Subscribe)

~两客户端之间~
client1:
client1

client2:
client2

当一个key值上进行了消息发布后,所有订阅它的客户端都会收到相应的消息。
这一功能最明显的用法是作为实时消息系统,比如普通的即时聊天,群聊等功能。

参考:
http://blog.csdn.net/gaogaoshan/article/details/41039581

相关文章推荐

十五分钟介绍 Redis数据结构.pdf

  • 2017年03月04日 16:04
  • 695KB
  • 下载

Redis数据结构和对象(六)

一,压缩列表。 1,用途:列表键和哈希键的底层实现之一。当一个列表键只包含少量列表项,并且列表项要么是小整数值,要么是长度比较短的字符串。 2,数据结构。 1)压缩列表的构成。2)压缩列表节点的构成...

深入理解Redis:底层数据结构

简介 redis[1]是一个key-value存储系统。和Memcached类似,它支持存储的value类型相对更多,包括string(字符串)、list(链表)、set(集合)、zset(sort...

redis 数据结构之和对象---简单动态字符串SDS(simple dynamic string)

1.介绍: reids 没有直接使用C语言传统的字符串表示(以空字符结尾的字符数组)而是构建了一种名为简单动态字符串的抽象类型,并为redis的默认字符串表示,因为C字符串不能满足redis对字符串...
  • i_bruce
  • i_bruce
  • 2014年11月08日 16:19
  • 780

Redis与Java - 数据结构

Redis与Java标签 : Java与NoSQL Redis(REmote DIctionary Server) is an open source (BSD licensed), in-mem...

Redis数据结构详解之Zset(五)

序言 Zset跟Set之间可以有并集运算,因为他们存储的数据字符串集合,不能有一样的成员出现在一个zset中,但是为什么有了set还要有zset呢?zset叫做有序集合,而set是无序的,zse...

Redis 3.0 源码解析---底层数据结构分析(1)

引言:今天开始边看编写redis的源码分析,以前只利用c写过简单的小程序,还从来没有利用c来做过一个完成的工程,作为程序员,学的第一门编程语言,惭愧的是,现在用的却不怎么多,借此,也好好的复习一下自己...

Redis内部数据结构详解之简单动态字符串(SDS)

Redis没有直接使用C语言传统的字符串表示(以空间字符结尾的字符串数组,一下简称C字符串),而是自己构建了一种名为简单动态字符串的抽象类型,并将SDS 用作 Redis 的默认字符串表示。下面我们就...

Redis内部数据结构详解之字典(dict)

本文所引用的源码全部来自Redis2.8.2版本。 Redis中字典dict数据结构与API相关文件是:dict.h, dict.c。 本文讲解的不是很详细,可以同时参考Redis实现与设计一书中...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:Redis 的数据结构
举报原因:
原因补充:

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