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)支持命令

APPEND、GET、GETBIT、GETRANGE、GETSET、STRLEN

MGET、MSET、MSETNX、SET、SETBIT、SETEX、SETNX、SETRANGE

INCR、INCRBY、DECR、DECRBY

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)支持命令

HDEL、HEXISTS、HGET、HGETALL、HINCRBY、HKEYS、HLEN

HMGET、HMSET、HSET、HSETNX、HVALS

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 、BRPOPLPUSH、LINDEX、LINSERT、LLEN

LPOP、LPUSH、LPUSHX、LRANGE、LREM、LSET、LTRIM

RPOP、RPOPLPUSH、RPUSH、RPUSHX

5、Sets

1)简介

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

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

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

2)结构定义

与Hashes中的dict一致。

3)支持的方法

SADD、SCAR、SDIFF、SDIFFSTORE、SINTER、SISMEMBER

SMEMBERS、SMOVE、SPOP、SRANDMEMBER、SREM

SUNION、SUNIONSTORE

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)支持命令

ZADD、ZCARD、ZCOUNT、ZINCRBY、ZINTERSTORE

ZRANGE、ZRANGEBYSCORE、ZRANK、ZREM

ZREMRANGEBYRANK、ZREMRANGEBYSCORE、ZREVRANGE

ZREVRANGEBYSCORE、ZREVRANK、ZSCORE、ZUNIONSTORE

参考资料:

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五大数据结构应用场景落地

    Redis缓存数据结构,数据同步问题(双删策略),缓存雪崩,缓存穿透,热点缓存重构,缓存失效,哨兵机制,持久化,redis 淘汰机制 熟悉掌握Redis数据结构的使用场景,熟悉Redis缓存高并发的使 ...

  3. Redis五大数据结构的类型的使用

    Redis 关于键的操作 keys *查看当前库所有key (匹配:keys *1) exists key判断某个key是否存在 0为不存在 1为存在 type key 查看你的key是什么类型 de ...

  4. Redis中五大数据结构的底层实现

    来自:DBAplus社群 作者介绍 田兆壮,新炬网络开发工程师.具备扎实的Java.Scala开发经验,熟练使用Python和Shell等脚本语言:具备前后端开发能力,熟练使用关系型数据库和非关系型数 ...

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

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

  6. Redis:07---Redis数据结构

    一.五大数据结构 Redis可以存储键与5种不同数据结构类型之间的映射,这5种数据结构类型分别为: STRING:字符串 LIST:列表 SET:集合 HASH:散列 ZSET:有序集合 TYPE命令 ...

  7. Redis五大数据类型常用命令

    Redis五大数据类型 Redis-Key 1.查看当前数据库的key keys * #返回当前数据库下的所有key 2.设置key set key value 3.获取key的value get k ...

  8. Redis底层数据结构详解(一)

    Redis底层数据结构 一.简单动态字符串SDS 1. SDS 2. 为什么Redis没用C语言原生字符串? 2.1 C语言中的字符串 2.2 使用SDS的好处 二.链表linkedlist 三.压缩 ...

  9. Redis面试题-Redis底层数据结构

    本文参考 嗨客网 Redis面试题 Redis底层数据结构 Redis 的五大数据类型也称五大数据对象,即分别为 string. list. hash. set 和 zset,但 Redis 并没有直 ...

最新文章

  1. Android官方开发文档Training系列课程中文版:OpenGL绘图之应用投影与相机视图
  2. 函数的初识;函数的返回值;函数的传参
  3. h5+ 获取当前位置 并获取当前天气
  4. tensor_proto.raw_data().empty() || !tensor_proto.float_data().empty() || !tensor_proto.double_data()
  5. gslang——原生golang/RPC描述语言简介
  6. php mysql 开发微博_php+mysql基于Android的手机微博应用开发
  7. ubuntu 命令行torrent种子下载
  8. js获取当前页面的地址和端口_url
  9. python如何把控制台输出保存到文件中_如何用10行代码完成目标检测
  10. git日志 每天导出 shell脚本
  11. 正切函数半角定理推导
  12. 你理解的精益可能是错的!——从源头重新解读精益
  13. Unity 获取文件夹下所有文件夹/文件
  14. Windows11图片密码的设置方法(用喜欢的图片作为开机密码)
  15. 网易云音乐歌单可视化,有多少是你收藏过的呢
  16. 网关 Spring Cloud Zuul 自定义过滤器认证转换 Token
  17. 常见问题汇总:FLUENT文件导出为CAS或MSH
  18. 李清云,256岁成为世界最长寿的人,长寿之王
  19. 每日一享(工作心态对自己成长的影响?)
  20. 第一部用计算机虚拟现实,“通过计算机虚拟现实﹐而不去进行昂贵的度假"是利用了40个发明原理中的( ) 。...

热门文章

  1. 学习笔记(十八)——MongoDB(CRUD)与Python交互
  2. 学习笔记(十五)——MySQL(查询)
  3. java8 LocalDate 日期比较大小
  4. android 两个竖排listview,Android布局 – 在ListView行内垂直堆叠两个TextView
  5. 2020-12-03 matlab 反馈函数 feedback
  6. Angular特殊的选择器:host,:host-context,::ng-deep
  7. java多线程中方法_java中多线程 - 多线程中的基本方法
  8. 运用神经网络方法找寻集成学习中的最优权重
  9. Spring IOC 容器源码分析系列文章导读
  10. String hashCode 方法为什么选择数字31作为乘子