新闻资讯  快讯  焦点  财经  政策  社会
互 联 网   电商  金融  数据  计算  技巧
生活百科  科技  职场  健康  法律  汽车
手机百科  知识  软件  修理  测评  微信
软件技术  应用  系统  图像  视频  经验
硬件技术  知识  技术  测评  选购  维修
网络技术  硬件  软件  设置  安全  技术
程序开发  语言  移动  数据  开源  百科
安全防护  资讯  黑客  木马  病毒  移动
站长技术  搜索  SEO  推广  媒体  移动
财经百科  股票  知识  理财  财务  金融
教育考试  育儿  小学  高考  考研  留学
您当前的位置:首页 > IT百科 > 数据库 > Redis

你真的懂了redis的数据结构吗?

时间:2019-06-11 13:50:49  来源:  作者:

redis有哪些数据结构?

字符串String、字典Hash、列表List、集合Set、有序集合SortedSet。

很多人面试时都遇到过这种场景吧?

其实除了上面的几种常见数据结构,还需要加上 数据结构HyperLogLog、Geo。

可是很多人不知道redis 不仅有上面的几种数据结构,还内藏了内部的数据结构。即redis可以分为外部数据结构和内部数据结构。

1. 如何查看redis的数据结构?

1.1 如何查看redis的外部数据结构?

可以使用type命令,返回key的类型,如 string , list , set , zset , hash 和 stream,实例如下:

redis> SET key1 "value"
"OK"
redis> LPUSH key2 "value"
(integer) 1
redis> SADD key3 "value"
(integer) 1
redis> TYPE key1
"string"
redis> TYPE key2
"list"
redis> TYPE key3
"set"
redis>

1.2 如何查看redis的内部数据结构

可以通过Object命令来查看。object命令允许从内部察看给定 <tt class="docutils literal" style="box-sizing: border-box;">key</tt> 的 Redis 对象。

它通常用在除错(debugging)或者了解为了节省空间而对 <tt class="docutils literal" style="box-sizing: border-box;">key</tt> 使用特殊编码的情况。

当将Redis用作缓存程序时,你也可以通过它命令中的信息,决定 <tt class="docutils literal" style="box-sizing: border-box;">key</tt> 的驱逐策略(eviction policies)。

2.redis数据结构的定义redisObject

内部数据类型server.h

typedef struct redisObject {
unsigned type:4;
unsigned encoding:4;
unsigned lru:LRU_BITS; /* LRU time (relative to global lru_clock) or
* LFU data (least significant 8 bits frequency
* and most significant 16 bits access time). */
int refcount;
void *ptr;
} robj;

其中,type为redis的外部数据结构,encoding为redis的内部数据结构实现

type的值如下:

/*-----------------------------------------------------------------------------
* Data types
*----------------------------------------------------------------------------*/
/* A redis object, that is a type able to hold a string / list / set */
/* The actual Redis Object */
#define OBJ_STRING 0 /* String object. */
#define OBJ_LIST 1 /* List object. */
#define OBJ_SET 2 /* Set object. */
#define OBJ_ZSET 3 /* Sorted set object. */
#define OBJ_HASH 4 /* Hash object. */
/* The "module" object type is a special one that signals that the object
* is one directly managed by a Redis module. In this case the value points
* to a moduleValue struct, which contains the object value (which is only
* handled by the module itself) and the RedisModuleType struct which lists
* function pointers in order to serialize, deserialize, AOF-rewrite and
* free the object.
*
* Inside the RDB file, module types are encoded as OBJ_MODULE followed
* by a 64 bit module type ID, which has a 54 bits module-specific signature
* in order to dispatch the loading to the right module, plus a 10 bits
* encoding version. */
#define OBJ_MODULE 5 /* Module object. */
#define OBJ_STREAM 6 /* Stream object. */
encoding的值如下:server.h
/* Objects encoding. Some kind of objects like Strings and Hashes can be
* internally represented in multiple ways. The 'encoding' field of the object
* is set to one of this fields for this object. */
#define OBJ_ENCODING_RAW 0 /* Raw representation */
#define OBJ_ENCODING_INT 1 /* Encoded as integer */
#define OBJ_ENCODING_HT 2 /* Encoded as hash table */
#define OBJ_ENCODING_ZIPMAP 3 /* Encoded as zipmap */
#define OBJ_ENCODING_LINKEDLIST 4 /* No longer used: old list encoding. */
#define OBJ_ENCODING_ZIPLIST 5 /* Encoded as ziplist */
#define OBJ_ENCODING_INTSET 6 /* Encoded as intset */
#define OBJ_ENCODING_SKIPLIST 7 /* Encoded as skiplist */
#define OBJ_ENCODING_EMBSTR 8 /* Embedded sds string encoding */
#define OBJ_ENCODING_QUICKLIST 9 /* Encoded as linked list of ziplists */
#define OBJ_ENCODING_STREAM 10 /* Encoded as a radix tree of listpacks */

内部类型总结

你真的懂了redis的数据结构吗?

 

3.数据结构的限制server.h

/* Zipped structures related defaults */
#define OBJ_HASH_MAX_ZIPLIST_ENTRIES 512
#define OBJ_HASH_MAX_ZIPLIST_VALUE 64
#define OBJ_SET_MAX_INTSET_ENTRIES 512
#define OBJ_ZSET_MAX_ZIPLIST_ENTRIES 128
#define OBJ_ZSET_MAX_ZIPLIST_VALUE 64
#define OBJ_STREAM_NODE_MAX_BYTES 4096
#define OBJ_STREAM_NODE_MAX_ENTRIES 100
/* HyperLogLog defines */
#define CONFIG_DEFAULT_HLL_SPARSE_MAX_BYTES 3000

4.实例

4.1 字符串String

int :8个字节的长整型

embstr:小于44个字节的字符串(目前),3.0以前的版本为39

raw:大于39个字节小于512MB的字符串

object.c
/* Create a string object with EMBSTR encoding if it is smaller than
* OBJ_ENCODING_EMBSTR_SIZE_LIMIT, otherwise the RAW encoding is
* used.
*
* The current limit of 44 is chosen so that the biggest string object
* we allocate as EMBSTR will still fit into the 64 byte arena of jemalloc. */
#define OBJ_ENCODING_EMBSTR_SIZE_LIMIT 44

验证一下:

Connected.
local:0>object encoding test1
"int"
local:0>object encoding test2
"embstr"
local:0>object encoding test3
"raw"
local:0>get test1
"10000"
local:0>get test2
"hello world!"
local:0>get test3
"Redis is not a plain key-value store, it is actually a data structures server, supporting different kinds of values. What this means is that, while in traditional key-value stores you associated string keys to string values, in Redis the value is not limited to a simple string, but can also hold more complex data structures. The following is the list of all the data structures supported by Redis, which will be covered separately in this tutorial:"
local:0>

4.2 哈希hash

当filed的个数少于512,且没有value大于64字节时,内部编码为ziplist

当filed的个数大于512,或者value大于64字节时,内部编码为hashtable

Connected.
local:0>hmset hashtest1 field1 value1 field2 value2 field3 value3
"OK"
local:0>object encoding hashtest1
"ziplist"
local:0>hset hashtest2 field1 "Redis modules can access Redis built-in data structures both at high level, by calling Redis commands, and at low level, by manipulating the data structures directly."
"1"
local:0>object encoding hashtest2
"hashtable"
local:0>

4.3 列表list

redis 3.2 之前

当列表list中的元素个数少于512,且没有value大于64字节时,内部编码为ziplist

当列表list中的元素个数大于512,或者value大于64字节时,内部编码为linkedlist

redis 3.2 之后

都使用quicklist

Connected.
local:0>rpush listtest1 value1 value2 value3 value4 value5
"5"
local:0>object encoding listtest1
"quicklist"
local:0>rpush listtest2 "Redis modules can access Redis built-in data structures both at high level, by calling Redis commands, and at low level, by manipulating the data structures directly."
"1"
local:0>object encoding listtest2
"quicklist"
local:0>

4.4 集合set

当集合set中的元素都是整数且元素个数小于512(默认时)使用intset

其它条件使用hashtable

local:0>sadd settest1 1 2 3
"3"
local:0>object encoding settest1
"intset"
local:0>sadd settest2 "hello world!"
"1"
local:0>object encoding settest2
"hashtable"
local:0>

4.5 有序集合zset

当有序集合zse中的元素个数少于128(默认),且没有value大于64字节时,内部编码为ziplist

当有序集合zse中的元素个数大于128(默认),或者value大于64字节时,内部编码为skiplist

Connected.
local:0>zadd zsettest1 10 value1 20 value2 30 value3
"3"
local:0>object encoding zsettest1
"ziplist"
local:0>zadd zsettest2 60 "Redis modules can access Redis built-in data structures both at high level, by calling Redis commands, and at low level, by manipulating the data structures directly."
"1"
local:0>object encoding zsettest2
"skiplist"
local:0>

4.6 Geo

Connected.
local:0>GEOADD Sicily 13.361389 38.115556 "Palermo" 15.087269 37.502669 "Catania"
"2"
local:0>object encoding Sicily
"ziplist"
local:0

4.7 HyperLogLog

Connected.
local:0>PFADD hll a b c d e f g
"1"
local:0>object encoding h11
null
local:0>object encoding hll
"raw"
local:0>

5 总结

  1. 外部数据结构类型可以通过type来查看
  2. 内部数据结构类型可以通过object来查看
  3. 理解内部数据结构的实现有助于我们深入理解redis
  4. 可以复习一下数据结构及其实现


Tags:redis   点击:()  评论:()
声明:本站部分内容来自互联网,内容观点仅代表作者本人,如有任何版权侵犯请与我们联系,我们将立即删除。
▌相关评论
发表评论 共有条评论
用户名: 密码:
验证码: 匿名发表
▌相关推荐
Redis没有直接使用C语言传统的字符串表示,而是自己构建了一种名为简单动态字符串(simple dynamic string, SDS)的抽象类型,并将SDS用作Redis的默认字符串表示。...【详细内容】
2019-12-26   redis  点击:(1)  评论:(0)  加入收藏
单机的 redis,能够承载的 QPS 大概就在上万到几万不等。对于缓存来说,一般都是用来支撑读高并发的。因此架构做成主从(master-slave)架构,一主多从,主负责写,并且将数据复制到其...【详细内容】
2019-12-26   redis  点击:(1)  评论:(0)  加入收藏
连接数据库$redis = new Redis();$redis->connect(&#39;127.0.0.1&#39;,6379);//链接redis服务// 参数// `host: string`,服务地址// `port: int`,端口号// `timeout: float`...【详细内容】
2019-12-25   redis  点击:(3)  评论:(0)  加入收藏
添加maven依赖,使用springboot2.x版本 <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-data-redis</artifactId> </dependenc...【详细内容】
2019-09-26   redis  点击:(1)  评论:(0)  加入收藏
Redis的 list 数据结构常用来作为 异步消息队列 使用,使用 rpush/lpush 操作 入队 ,使用 lpop/rpop 来操作 出队 > rpush my-queue apple banana pear(integer) 3> llen my-qu...【详细内容】
2019-12-25   redis  点击:(1)  评论:(0)  加入收藏
作者:GrimMjx目录 开发语言 纯内存访问 单线程 非阻塞多路I/O复用机制前言Redis是一种基于键值对(Key-Value)的NoSQL数据库,Redis的Value可以由String,hash,list,set,zset,Bitmaps...【详细内容】
2019-12-19   redis  点击:(1)  评论:(0)  加入收藏
前言Redis 是如今互联网技术架构中,使用最广泛的缓存。支持复杂的数据结构,支持持久化,支持主从集群,支持高可用,支持较大的value存储... 同时, Redis 也是中高级后端工程师技术面...【详细内容】
2019-12-25   redis  点击:(5)  评论:(0)  加入收藏
为什么要在 Java 分布式应用程序中使用缓存?在提高应用程序速度和性能上,每一毫秒都很重要。根据谷歌的一项研究,假如一个网站在3秒钟或更短时间内没有加载成功,会有 53% 的手机用户会离开。...【详细内容】
2019-12-23   redis  点击:(1)  评论:(0)  加入收藏
一、Redis雪崩、穿透、并发等5大难题解决方案缓存雪崩数据未加载到缓存中,或者缓存同一时间大面积的失效,从而导致所有请求都去查数据库,导致数据库CPU和内存负载过高,甚至宕机...【详细内容】
2019-12-19   redis  点击:(13)  评论:(0)  加入收藏
本篇主要讲述如何使用基本的注解 @Cacheable @CachePut @CacheEvict 操作缓存1.我们导入Redis的依赖<!--这里Redis我给了版本--> <dependency> <groupId>org.springframewor...【详细内容】
2019-12-18   redis  点击:(9)  评论:(0)  加入收藏
知识点 基于 Server-Sent Event 工作方式,Web 即时通信 Redis 包 发布订阅功能的使用 flask 快速入门,常用对象实例方法函数 Vuejs 列表页面自动渲染效果图 代码段 app.py 主...【详细内容】
2019-12-13   redis  点击:(11)  评论:(0)  加入收藏
之前本人在找工作面试时在Redis相关问题上可栽了跟头。在面试前按常规套路准备了一下,比如 Redis 的常用5种数据结构,Redis持久化策略,Redis实现分布式锁,简单发布订阅等等都准...【详细内容】
2019-12-12   redis  点击:(10)  评论:(0)  加入收藏
Redis在国内各大公司都很热门,比如新浪、阿里、腾讯、百度、美团、小米等。Redis也是大厂面试最爱问的,尤其是Redis客户端、Redis高级功能、Redis持久化和开发运维常用问题探...【详细内容】
2019-12-11   redis  点击:(16)  评论:(0)  加入收藏
前言当结束Java和数据库的学习以后,你就会接触到Redis这个词,我第一次听到的时候脑海里就会浮现这两个问题:什么是Redis?为什么我们要用Redis?我了解完以后,写出来帮助大家能够更...【详细内容】
2019-12-10   redis  点击:(12)  评论:(0)  加入收藏
Redis是一个开源的使用ANSI C语言编写、支持网络、可基于内存亦可持久化的日志型、Key-Value数据库,并提供多种语言的API。Redis是一个高性能的key-value数据库。Redis的出现...【详细内容】
2019-12-10   redis  点击:(15)  评论:(0)  加入收藏
SCAN cursor [MATCH pattern] [COUNT count]SCAN 命令及其相关的 SSCAN 命令、 HSCAN 命令和 ZSCAN 命令都用于增量地迭代(incrementally iterate)一集元素(a collection of...【详细内容】
2019-12-09   redis  点击:(13)  评论:(0)  加入收藏
redis事务任何数据库都要有一套自己的事务控制机制,redis事务是一次可以执行多个命令,它的本质是一组命令的集合。一个事务中所有的命令都会被序列化,在事务执行的过程中会按照...【详细内容】
2019-07-16   redis  点击:(10)  评论:(0)  加入收藏
一、Sentinel介绍Sentinel是Redis的高可用性(HA)解决方案: 由一个或多个Sentinel实例组成的Sentinel系统可以监视任意多个主服务器,以及这些主服务器属下的所有从服务器,并在被...【详细内容】
2019-12-06   redis  点击:(17)  评论:(0)  加入收藏
key 操作 删除 key:del key 批量删除key:redis-cli -a(密码)keys “QXJ_*”| xargs redis-cli -a(密码)del 查看所有的 key(一次性遍历整个数据库,生产上慎重使用):keys [pattern] 利...【详细内容】
2019-12-04   redis  点击:(14)  评论:(0)  加入收藏
Redis 是内存数据库,数据都是存储在内存中,为了避免进程退出导致数据的永久丢失,需要定期将 Redis 中的数据以数据或命令的形式从内存保存到本地磁盘。当下次 Redis 重启时,利用...【详细内容】
2019-12-02   redis  点击:(15)  评论:(0)  加入收藏
最新更新
栏目热门
栏目头条