SDS

细谈Redis五大数据类型

守給你的承諾、 提交于 2019-11-30 12:28:59
文章原创于公众号:程序猿周先森。本平台不定时更新,喜欢我的文章,欢迎关注我的微信公众号。 上一篇文章有提到,Redis中使用最频繁的有5种数据类型:String、List、Hash、Set、SortSet。上一篇文章只是单纯介绍了下这5种数据类型使用到的指令以及常用场景,本篇文章会谈谈5种数据类型的底层数据结构以及各自常用的操作命令来分别进行解析。Redis作为目前最流行的Key-Value型内存数据库,不仅数据库操作在内存中进行,并且可定期的将数据持久化到磁盘中,所以性能相对普通数据库高很多,而在Redis中,每个Value实际上都是以一个redisObject结构来表示: typedef struct redisObject{ unsigned type:4; unsigned encoding:4; void *ptr; int refCount; unsigned lru: } 我们可以看看这几个参数分别的含义: type:对象的数据类型,一般情况就是5大数据类型。 encode:redisObject对象底层编码实现,主要编码类型有简单动态字符串,链表,字典,跳跃表,整数集合及压缩列表。 *ptr:指向底层实现数据结构的指针。 refCount:计数器,当引用计数值为0将会释放对象。 lru:最后一次访问本对象的时间。 String数据类型 String 数据结构是简单的

细谈Redis五大数据类型

北战南征 提交于 2019-11-30 12:28:21
文章原创于公众号:程序猿周先森。本平台不定时更新,喜欢我的文章,欢迎关注我的微信公众号。 上一篇文章有提到,Redis中使用最频繁的有5种数据类型:String、List、Hash、Set、SortSet。上一篇文章只是单纯介绍了下这5种数据类型使用到的指令以及常用场景,本篇文章会谈谈5种数据类型的底层数据结构以及各自常用的操作命令来分别进行解析。Redis作为目前最流行的Key-Value型内存数据库,不仅数据库操作在内存中进行,并且可定期的将数据持久化到磁盘中,所以性能相对普通数据库高很多,而在Redis中,每个Value实际上都是以一个redisObject结构来表示: typedef struct redisObject{ unsigned type:4; unsigned encoding:4; void *ptr; int refCount; unsigned lru: } 我们可以看看这几个参数分别的含义: type:对象的数据类型,一般情况就是5大数据类型。 encode:redisObject对象底层编码实现,主要编码类型有简单动态字符串,链表,字典,跳跃表,整数集合及压缩列表。 *ptr:指向底层实现数据结构的指针。 refCount:计数器,当引用计数值为0将会释放对象。 lru:最后一次访问本对象的时间。 String数据类型 String 数据结构是简单的

Redis基本结构

六月ゝ 毕业季﹏ 提交于 2019-11-30 05:47:50
 之前看了《Redis设计与实现》这本书,对Redis的认识加深了一些,便做了一些总结,同时也记录下自己的一些想法。  这节先介绍Redis提供的基本结构,主要分为底层的基本结构和以对象形式包装的Object结构。 1.SDS  C字符串在redis中主要用于无须对字符串值进行修改的地方,对于需要修改字符串的场景,则使用SDS(简单动态字符串)。 SDS的结构如下示:  其中buff是字符串缓冲区,用于存放字符串,len为buf数组中已使用字节的数量,free为buf数组中未使用字节的数量。注意,buff中存放的是二进制数据,使用len属性来判断字符串是否结束,保留’\0’符号是为了兼容部分C函数。  同C字符串相比,由于SDS记录了相关的使用情况,因而能够以常数复杂度获取字符串长度,并且能够杜绝缓冲区溢出。同时,通过使用空间预分配和惰性空间释放两种策略,能够减少修改字符串时带来的内存重分配次数。  所谓空间预分配是指,当对SDS进行修改的时候,并且需要对SDS空间进行扩展的时候,程序不仅会为SDS分配修改所需要的空间,还会为SDS分配额外的未使用空间。其分配策略是如下定义的:如果对SDS修改后的长度小于1MB,那么程序分配和len属性同样大小的未使用空间;如果对SDS修改后的长度大于等于1MB,那么程序会分配1MB的未使用空间。通过空间预分配策略

Redis为何这么快--数据存储角度

走远了吗. 提交于 2019-11-29 11:42:51
本文内容思维导图如下: 一、简介和应用 Redis是一个由ANSI C语言编写,性能优秀、支持网络、可持久化的K-K内存数据库 , 并提供多种语言的API。它常用的类型主要是 String、List、Hash、Set、ZSet 这5种 Redis在互联网公司一般有以下应用: String:缓存、限流、计数器、分布式锁、分布式Session Hash:存储用户信息、用户主页访问量、组合查询 List:微博关注人时间轴列表、简单队列 Set:赞、踩、标签、好友关系 Zset:排行榜 再比如电商在大促销时,会用一些特殊的设计来保证系统稳定,扣减库存可以考虑如下设计: 上图中,直接在Redis中扣减库存,记录日志后通过Worker同步到数据库,在设计同步Worker时需要考虑并发处理和重复处理的问题。 通过上面的应用场景可以看出Redis是非常高效和稳定的,那Redis底层是如何实现的呢? 二、Redis的对象redisObject 当我们执行set hello world命令时,会有以下数据模型: dictEntry: Redis给每个key-value键值对分配一个dictEntry,里面有着key和val的指针,next指向下一个dictEntry形成链表,这个指针可以将多个哈希值相同的键值对链接在一起, 由此来解决哈希冲突问题(链地址法)。 sds: 键key“hello

Redis数据结构

百般思念 提交于 2019-11-29 07:52:58
Redis数据结构 Redis作为内存数据库,被用于分布式缓存首选。作为一个coder,没有想必刚踏入职场第一天就了解了这玩意儿吧。这家伙是个单线程的,但是为什么很快?我们通常自定义缓存的时候,用map结构的比较多。那这玩意儿都用了什么数据结构来实现呢?这货的底层实现是c,对于c我们就不多解释了(不做源码分析,别想多了),开始来看看这货的数据结构吧。 SDS(Simple Dynamic String) Redis没有直接使用C语言的传统字符串表示,而是使用了自己构建的一种简单动态字符串SDS.那既然用了,肯定有其优势。 定义 // sds.h/sdshdr struct sdshdr { // 记录buf数组中已使用的字节数量 // 也就是SDS已保存的字符串的长度 int len; // 记录buf数组中未使用的字节数量 int free; //字节数组,用于保存字符串 char buf[]; } 优点1: 可以复用一部分C字符串库函数里面的函数 c中以空字符'\0'表示字符串结束。SDS遵循C字符以空字符结尾的惯例,保存空字符的1字节空间不计算在SDS的len属性里面。使用这种惯例可以让SDS可以直接使用一部分C字符串函数库里面的函数。 如图所示:Redis字符串长5个字节,len=5,free=0,空字符\0不会计入sds的len属性。 优点2: 常数时间获取字符串长度

Java程序员5面阿里终获offer,感慨:原来阿里面试这么严

社会主义新天地 提交于 2019-11-29 06:28:57
坊间传言的阿里P6招聘需求 感觉面试还是主要围绕简历来问的,所以不熟悉的东西最好不要随便写上去。项目和基础都很重要,项目中最好有难点,能够体现自己解决问题的过程和思路。 电话面: 自我介绍 事务的特性 ACID , 数据库的死锁发生的情景 死锁的四个必要特性, 非共享, 持有并等待, 非抢占, 循环等待 死锁避免 死锁预防 线程的状态 , 新建,就绪,running, wait, blocked, terminated sleep 和 wait 的区别, 类的不同,是否会释放持有的锁,monitor JDK 可重入锁, 读写锁 , 底层 AQS,抽象队列同步器的机制 悲观锁和乐观锁, 概念上,JDK 中的类, CAS的缺点, 空转,ABA问题。使用pause指令, AtomicStampedReference 讲一讲Servlet, web.xml 配置路径到servlet的映射, init, service, destroy 可以看一看Tomcat容器的过程 ,Connector和 Context容器两大部分。完成从socket到 request和Response对象的构造 SpringMVC的 dispatcher-servlet的请求解析过程 redis介绍, 系统中的角色,作为缓存, 分布式session服务器 redis的 性能,可用性,主从复制+哨兵,

Redis专题(2):Redis数据结构底层探秘

醉酒当歌 提交于 2019-11-28 09:41:27
前言 上篇文章 Redis闲谈(1):构建知识图谱 介绍了redis的基本概念、优缺点以及它的内存淘汰机制,相信大家对redis有了初步的认识。互联网的很多应用场景都有着Redis的身影,它能做的事情远远超出了我们的想像。Redis的底层数据结构到底是什么样的呢,为什么它能做这么多的事情?本文将探秘Redis的底层数据结构以及常用的命令。 本文知识脑图如下: 一、Redis的数据模型 用 键值对 name:"小明" 来展示Redis的数据模型如下: dictEntry: 在一些编程语言中,键值对的数据结构被称为字典,而在Redis中,会给每一个key-value键值对分配一个字典实体,就是“dicEntry”。dicEntry包含三部分: key的指针、val的指针、next指针 ,next指针指向下一个dicteEntry形成链表,这个next指针可以将多个哈希值相同的键值对链接在一起, 通过链地址法来解决哈希冲突的问题 sds : Simple Dynamic String ,简单动态字符串,存储字符串数据。 redisObject :Redis的5种常用类型都是以RedisObject来存储的,redisObject中的 type 字段指明了值的数据类型(也就是5种基本类型)。 ptr 字段指向对象所在的地址。 RedisObject对象很重要,Redis 对象的类型 、

redis源码分析(2)字符串sds.c

非 Y 不嫁゛ 提交于 2019-11-28 05:51:45
sds是一个char*的类型别名 可以把这个结构体和对应操作函数类比为C++中STL的string类。 这两个函数比较好理解,当传入的sds类型而非普通字符数组时,求sds的现有长度和sds的可用长度。 sdsnewlen 给定一个字符串init和字符串长度initlen,创建一个新的没有预留空间的sds。 可以看到,与字符数组一样,会预留1长度用来存放'\0'。 来源: https://www.cnblogs.com/sunmeng1994/p/11395487.html

redis(一)redis内存模型

六眼飞鱼酱① 提交于 2019-11-27 23:55:15
本文转载自: https://www.cnblogs.com/kismetv/p/8654978.html#t1 redis内存统计 在客户端通过redis-cli连接服务器后(后面如无特殊说明,客户端一律使用redis-cli),通过info命令可以查看内存使用情况: 127.0.0.1:6379> info memory # Memory used_memory:2132344 used_memory_human:2.03M used_memory_rss:5607424 used_memory_rss_human:5.35M used_memory_peak:2275152 used_memory_peak_human:2.17M used_memory_peak_perc:93.72% used_memory_overhead:2075094 used_memory_startup:791264 used_memory_dataset:57250 used_memory_dataset_perc:4.27% allocator_allocated:2134144 allocator_active:2404352 allocator_resident:5029888 total_system_memory:1745100800 total_system_memory

【3y】从零单排学Redis【青铜】

和自甴很熟 提交于 2019-11-27 16:17:39
前言 只有光头才能变强 最近在学Redis,我相信只要是接触过Java开发的都会听过Redis这么一个技术。面试也是非常高频的一个知识点,之前一直都是处于了解阶段。秋招过后这段时间是没有什么压力的,所以打算系统学学Redis,这也算是我从零学习Redis的笔记吧。 本文 力求讲清每个知识点 ,希望大家看完能有所收获。 一、介绍一下Redis 首先,肯定是去官网看看官方是怎么介绍Redis的啦。 https://redis.io/topics/introduction 如果像我一样,英语可能不太好的,可能看不太懂。没事,咱们Chrome浏览器可以切换成中文的,中文是我们的母语,肯定没啥压力了。Eumm... 读完之后,发现中文也就那样了。 一大堆没见过的技术:lua(Lua脚本)、replication(复制)、Redis Sentinel(哨兵)、Redis Cluster(Redis 集群),当然我们也会有看得懂的技术:transactions(事务)、different levels of on-disk persistence(数据持久化)、LRU eviction(LRU淘汰机制).. 至少官方介绍Redis的第一句应该是可以很容易看懂:"Redis is an open source (BSD licensed), in-memory data structure