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中的5种数据结构

这里的数据结构指的是key-value中value的数据结构,分别为string、hash、list、set、sorted set。每种数据结构都有相关的命令,比如set命令表示使用string来存储...
  • imred
  • imred
  • 2016年04月22日 22:24
  • 4639

Redis系列----(二)redis中的数据结构类型

一.前言 redis并不是简单的key-value数据容器,不能将其理解为静态存储数据,它是动态交互的数据结构服务器,可以被用作缓存,高性能k-v数据库等。 它支持很多种类型的数据结构,不仅支持str...
  • u013035972
  • u013035972
  • 2016年09月11日 21:54
  • 7829

redis的五种数据结构

reids官方命令集查询: http://redis.io/commands redis整合各种语言案例查询: https://github.com/josiahcarlson/redis-in...
  • fan510988896
  • fan510988896
  • 2017年05月12日 15:17
  • 655

redis常用数据结构解析

Redis是一个开源的Key-Value存储引擎,它支持string、hash、list、set和sorted set等多种值类型。由于其卓越的性能表现、丰富的数据类型及稳定性,广泛用于各种需要k/v...
  • yueqian_zhu
  • yueqian_zhu
  • 2016年01月17日 16:48
  • 2201

Redis几种数据结构的应用场景

String [html] view plaincopy 1、String   常用命令:   除了get、set、incr、decr mget等操...
  • nyist327
  • nyist327
  • 2015年08月28日 14:14
  • 2348

Redis内部数据结构的实现

还有两个多月就找工作了,决定把之前看的一些东西整理一下,做个记录,也整理一下最近的思路。 Redis 作为一个基于key=>value的内存数据库,使用ANSI C语言实现,以其高性能和支持丰富的数...
  • a6833916180
  • a6833916180
  • 2016年06月06日 15:42
  • 8077

Redis数据结构和内部编码--列表(list)

Redis数据结构和内部编码--列表(list) 一.概念 列表用来存储多个有序的字符串,列表中的每个字符串成为元素,一个列表最多可以存储2^32-1个元素。列表是一种比较灵活的数据结构,它可以充当栈...
  • sunhuiliang85
  • sunhuiliang85
  • 2017年07月02日 20:36
  • 496

【Redis笔记(五)】 Redis数据结构 - set集合

今天到了我们Redis学习笔记的第五篇,今天我们来介绍set集合数据结构。set类型介绍和C++或Java编程语言中的set类型一样,Redis中的set类型也是一种无序集合。...
  • Xiejingfa
  • Xiejingfa
  • 2016年01月27日 15:19
  • 2089

Redis底层数据结构总结

Redis用于存储的存储格式分为5种对象:String对象、List对象、HashTable对象、Set对象和SortedSet。 String字符串,用于保存字符串对象,同时可以作...
  • litoupu
  • litoupu
  • 2015年08月12日 10:05
  • 2038

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

简介 redis[1]是一个key-value存储系统。和Memcached类似,它支持存储的value类型相对更多,包括string(字符串)、list(链表)、set(集合)、zset(sort...
  • hanhuili
  • hanhuili
  • 2013年12月31日 10:55
  • 10973
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:Redis 的数据结构
举报原因:
原因补充:

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