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)支持命令
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五大数据结构相关推荐
- redis 五大数据结构__常用命令
linux 下下载redis数据库 apt install redis 如果提示权限不够的话, 直接提权: sudo apt install redis-server linux启用.停止服务 ser ...
- 【高级开发进阶】Redis五大数据结构应用场景落地
Redis缓存数据结构,数据同步问题(双删策略),缓存雪崩,缓存穿透,热点缓存重构,缓存失效,哨兵机制,持久化,redis 淘汰机制 熟悉掌握Redis数据结构的使用场景,熟悉Redis缓存高并发的使 ...
- Redis五大数据结构的类型的使用
Redis 关于键的操作 keys *查看当前库所有key (匹配:keys *1) exists key判断某个key是否存在 0为不存在 1为存在 type key 查看你的key是什么类型 de ...
- Redis中五大数据结构的底层实现
来自:DBAplus社群 作者介绍 田兆壮,新炬网络开发工程师.具备扎实的Java.Scala开发经验,熟练使用Python和Shell等脚本语言:具备前后端开发能力,熟练使用关系型数据库和非关系型数 ...
- Redis第二讲【Redis基本命令和五大数据结构】
[二.Redis基本命令和五大数据结构] redis的基础知识和命令 redis 是一个单进程(包装epoll函数来对读写事件进行相应) 默认有16个数据库,初始使用的数据库为0号库 默认端口为637 ...
- Redis:07---Redis数据结构
一.五大数据结构 Redis可以存储键与5种不同数据结构类型之间的映射,这5种数据结构类型分别为: STRING:字符串 LIST:列表 SET:集合 HASH:散列 ZSET:有序集合 TYPE命令 ...
- Redis五大数据类型常用命令
Redis五大数据类型 Redis-Key 1.查看当前数据库的key keys * #返回当前数据库下的所有key 2.设置key set key value 3.获取key的value get k ...
- Redis底层数据结构详解(一)
Redis底层数据结构 一.简单动态字符串SDS 1. SDS 2. 为什么Redis没用C语言原生字符串? 2.1 C语言中的字符串 2.2 使用SDS的好处 二.链表linkedlist 三.压缩 ...
- Redis面试题-Redis底层数据结构
本文参考 嗨客网 Redis面试题 Redis底层数据结构 Redis 的五大数据类型也称五大数据对象,即分别为 string. list. hash. set 和 zset,但 Redis 并没有直 ...
最新文章
- Android官方开发文档Training系列课程中文版:OpenGL绘图之应用投影与相机视图
- 函数的初识;函数的返回值;函数的传参
- h5+ 获取当前位置 并获取当前天气
- tensor_proto.raw_data().empty() || !tensor_proto.float_data().empty() || !tensor_proto.double_data()
- gslang——原生golang/RPC描述语言简介
- php mysql 开发微博_php+mysql基于Android的手机微博应用开发
- ubuntu 命令行torrent种子下载
- js获取当前页面的地址和端口_url
- python如何把控制台输出保存到文件中_如何用10行代码完成目标检测
- git日志 每天导出 shell脚本
- 正切函数半角定理推导
- 你理解的精益可能是错的!——从源头重新解读精益
- Unity 获取文件夹下所有文件夹/文件
- Windows11图片密码的设置方法(用喜欢的图片作为开机密码)
- 网易云音乐歌单可视化,有多少是你收藏过的呢
- 网关 Spring Cloud Zuul 自定义过滤器认证转换 Token
- 常见问题汇总:FLUENT文件导出为CAS或MSH
- 李清云,256岁成为世界最长寿的人,长寿之王
- 每日一享(工作心态对自己成长的影响?)
- 第一部用计算机虚拟现实,“通过计算机虚拟现实﹐而不去进行昂贵的度假"是利用了40个发明原理中的( ) 。...
热门文章
- 学习笔记(十八)——MongoDB(CRUD)与Python交互
- 学习笔记(十五)——MySQL(查询)
- java8 LocalDate 日期比较大小
- android 两个竖排listview,Android布局 – 在ListView行内垂直堆叠两个TextView
- 2020-12-03 matlab 反馈函数 feedback
- Angular特殊的选择器:host,:host-context,::ng-deep
- java多线程中方法_java中多线程 - 多线程中的基本方法
- 运用神经网络方法找寻集成学习中的最优权重
- Spring IOC 容器源码分析系列文章导读
- String hashCode 方法为什么选择数字31作为乘子