SDS

总结一波 Redis 面试题,收藏起来!

半世苍凉 提交于 2020-12-30 23:37:07
本文的面试题如下: Redis 持久化机制 缓存雪崩、缓存穿透、缓存预热、缓存更新、缓存降级等问题 热点数据和冷数据是什么 Memcache与Redis的区别都有哪些? 单线程的redis为什么这么快 redis的数据类型,以及每种数据类型的使用场景,Redis 内部结构 redis的过期策略以及内存淘汰机制【~】 Redis 为什么是单线程的,优点 如何解决redis的并发竞争key问题 Redis 集群方案应该怎么做?都有哪些方案? 有没有尝试进行多机redis 的部署?如何保证数据一致的? 对于大量的请求怎么样处理 Redis 常见性能问题和解决方案? 讲解下Redis线程模型 为什么Redis的操作是原子性的,怎么保证原子性的? Redis事务 Redis实现分布式锁 Redis 持久化机制 Redis是一个支持持久化的内存数据库,通过持久化机制把内存中的数据同步到硬盘文件来保证数据持久化。当Redis重启后通过把硬盘文件重新加载到内存,就能达到恢复数据的目的。 实现:单独创建fork()一个子进程,将当前父进程的数据库数据复制到子进程的内存中,然后由子进程写入到临时文件中,持久化的过程结束了,再用这个临时文件替换上次的快照文件,然后子进程退出,内存释放。 RDB是Redis默认的持久化方式。按照一定的时间周期策略把内存的数据以快照的形式保存到硬盘的二进制文件

Redis内部编码

廉价感情. 提交于 2020-12-28 23:10:21
如果想查看一个键的内部编码 方式可以使用 OBJECT ENCODING 命令 typedef struct redisObject { // 类型 unsigned type:4; // 编码 unsigned encoding:4; // 对象最后一次被访问的时间 unsigned lru:REDIS_LRU_BITS; /* lru time (relative to server.lruclock) */ // 引用计数 int refcount; // 指向实际值的指针 void *ptr; } robj; /* Object types */ #define REDIS_STRING 0 #define REDIS_LIST 1 #define REDIS_SET 2 #define REDIS_ZSET 3 #define REDIS_HASH 4 #define REDIS_ENCODING_RAW 0 /* Raw representation */ #define REDIS_ENCODING_INT 1 /* Encoded as integer */ #define REDIS_ENCODING_HT 2 /* Encoded as hash table */ #define REDIS_ENCODING_ZIPMAP 3 /* Encoded as

Java中高级核心知识全面解析——Redis(简介、基本数据结构、跳跃表【简介、实现】)上

丶灬走出姿态 提交于 2020-12-24 15:57:59
目录 一、5种基本数据结构 1.Redis简介 1)Redis 的优点 2)Redis 的安装 3) 测试本地 Redis 性能 2.Redis五种基本数据结构 1)字符串 string ①、SDS 与 C 字符串的区别 ②、对字符串的基本操作 ③、设置和获取键值对 ④、批量设置键值对 ⑤、过期和 SET 命令扩展 ⑥、计数 ⑦、返回原值的 GETSET 命令 2)列表list ①、链表的基本操作 ②、list 实现队列 ③、list 实现栈 3)字典 hash ①、渐进式 rehash ②、扩缩容的条件 ③、字典的基本操作 4)集合 set ①、集合 set 的基本使用 5)有序列表 zset ①、有序列表 zset 基础操作 二、跳跃表 1.跳跃表简介 1)为什么使用跳跃表 2)本质是解决查找问题 3)更进一步的跳跃表 2.跳跃表的实现 1)随机层数 2)创建跳跃表 3)插入节点实现 第一部分:声明需要存储的变量 第二部分:搜索当前节点插入位置 第三部分:生成插入节点 第四部分:重排前向指针 第五部分:重排后向指针并返回 4)节点删除实现 5)节点更新实现 6)元素排名的实现 一、5种基本数据结构 1.Redis简介 “ Redis is an open source (BSD licensed), in-memory data structure store, used as

深入学习Redis(1):Redis内存模型

丶灬走出姿态 提交于 2020-12-24 09:02:06
原文链接:https://www.cnblogs.com/kismetv/p/8654978.html#!comments 前言 Redis是目前最火爆的内存数据库之一,通过在内存中读写数据,大大提高了读写速度,可以说Redis是实现网站高并发不可或缺的一部分。 我们使用Redis时,会接触Redis的5种对象类型(字符串、哈希、列表、集合、有序集合),丰富的类型是Redis相对于Memcached等的一大优势。在了解Redis的5种对象类型的用法和特点的基础上,进一步了解Redis的内存模型,对Redis的使用有很大帮助,例如: 1、估算Redis内存使用量。目前为止,内存的使用成本仍然相对较高,使用内存不能无所顾忌;根据需求合理的评估Redis的内存使用量,选择合适的机器配置,可以在满足需求的情况下节约成本。 2、优化内存占用。了解Redis内存模型可以选择更合适的数据类型和编码,更好的利用Redis内存。 3、分析解决问题。当Redis出现阻塞、内存占用等问题时,尽快发现导致问题的原因,便于分析解决问题。 这篇文章主要介绍Redis的内存模型(以3.0为例),包括Redis占用内存的情况及如何查询、不同的对象类型在内存中的编码方式、内存分配器(jemalloc)、简单动态字符串(SDS)、RedisObject等;然后在此基础上介绍几个Redis内存模型的应用。

Redis:从应用到底层,一文帮你搞定

£可爱£侵袭症+ 提交于 2020-12-23 10:47:25
Python实战社群 Java实战社群 长按识别下方二维码, 按需求添加 扫码关注添加客服 进Python社群▲ 扫码关注添加客服 进Java社群 ▲ 作者丨sowhat1412 来源丨sowhat1412(ID:sowhat9094) 高清思维导图已同步Git:https://github.com/SoWhat1412/xmindfile,关注公众号sowhat1412获取海量资源 总感觉哪里不对,但是又说不上来 1、基本类型及底层实现 1.1、String 用途: 适用于简单key-value存储、setnx key value实现分布式锁、计数器(原子性)、分布式全局唯一ID。 底层 :C语言中String用char[]数组表示,源码中用 SDS (simple dynamic string)封装char[],这是是Redis存储的 最小单元 ,一个SDS最大可以存储512M信息。 struct sdshdr{ unsigned int len; // 标记char[]的长度 unsigned int free; //标记char[]中未使用的元素个数 char buf[]; // 存放元素的坑 } Redis对SDS再次封装生成了 RedisObject ,核心有两个作用: 说明是5种类型哪一种。 里面有指针用来指向 SDS。 当你执行 set name sowhat

redis源码之SDS

心不动则不痛 提交于 2020-12-17 00:56:53
#1:SDS介绍 我们在redis中执行命令 set key name 的时候,key和name都是字符串类型,而且字符串(string)在redis中是会经常用到的类型,那redis是如何保存字符串的呢?我们接下来往下看 众所周知,redis是c写的,在c中使用char来保存字符串,并且用\0作为字符串的结尾,但是redis不是这样保存的,redis是使用一种叫SDS的结构来保存字符串的。结构如下(redis3.2以前) struct sdshdr{ int len; int free; char buf[]; } 那么问题来了,redis为什么 会用SDS的结构,而不直接用c语言的字符串,我们来看看他们的区别 ###1:计算字符串长度的区别 对于c来说,计算字符串的长度的方式就是遍历,遇到\0就停止,所以复杂对是O(n),而SDS直接保存了字符串的长度,复杂度是O(1) ###2:保证二进制的安全 因为SDS并不是以\0为结尾的标志,自然就保证了二进制的安全 ###3:内存管理策略(预分配内存和惰性空间释放策略) redis是一个高速的缓存数据库,需要频繁的对字符串进行操作,如果内存分配错误,会导致很严重的后果,就算内存分配没问题,频繁的内存分配也是非常耗费时间的,所以这些都是应该去避免的 #####惰性空间释放策略 在SDS中首先用到了惰性空间释放策略

Redis 2.8.9源码

谁都会走 提交于 2020-12-17 00:45:42
本文为作者原创,转载请注明出处: http://my.oschina.net/fuckphp/blog/269167 在C中子字符串的实现都是用 char *来实现的,用起来很不方便,而且容易出现内存泄露,并且效率不高,在Redis内部,字符串采用了 sds 的方式进行了封装,似的字符串在Redis中可以方便、高效的使用,Redis字符串的实现如要依赖一下两个数据类型和结构(以下代码可以在 src/sds.h中找到): typedef char *sds; sds 存放了字符串的具体值 struct sdshdr { int len; //字符串对象已经使用的内存数量 int free; //字符串对象剩余的内存数量 char buf[]; //字符串对象的具体值(其实就是sds字符串) }; sdshdr 实现了字符串对象 这样设计的好处有很多,比如使得Redis在获取字符串长度的时候可以达到o(1)的复杂度,在进行追加等字符串操作的时候,可以减少内存分配(提高性能),sdshdr的结构使得根据sds字符串获取对应的sds对象的时候可以非常方便的获取。 创建字符串 init 为需要初始化的字符串值。initlen表示为初始化字符串的长度,该函数创建一个sds字符串对象并返回sds字符串 (以下代码可以在 src/sds.c中找到): sds sdsnewlen(const

Redis字符串类型内部编码剖析

谁都会走 提交于 2020-12-16 10:42:11
概述 我们平时用 Redis都是处于用户层面,我们可能会不加思索地操作一个 key-value 对来方便地存取数据,感觉方便之至。但你知道这些数据在背后是如何存储以及编码的吗? 了解清楚了这个问题,将对我们更加高效地使用 Redis具有指导意义。本文开始我们将结合 Redis源码来逐个探讨Redis五大数据类型的内部编码机制。 实验环境:Redis 4.0.10 注: 本文首发于 My Personal Blog ,欢迎光临 小站 Redis数据类型内部编码概况 对于 Redis的常用 5 种数据类型(String、Hash、List、Set、sorted set),每种数据类型都提供了 最少两种 内部的编码格式,而且每个数据类型内部编码方式的选择 对用户是完全透明的 ,Redis会根据数据量自适应地选择较优化的内部编码格式。 如果想查看某个键的内部编码格式,可以使用 OBJECT ENCODING keyname 指令来进行,比如: 127.0.0.1:6379> 127.0.0.1:6379> set foo bar OK 127.0.0.1:6379> 127.0.0.1:6379> object encoding foo // 查看某个Redis键值的编码 "embstr" 127.0.0.1:6379> 127.0.0.1:6379> Redis

redis支持的数据结构

断了今生、忘了曾经 提交于 2020-12-13 10:40:09
redis支持的数据结构 个人读书笔记 简单动态字符串 (String) 链表(list) 字典 跳跃表 整数集合 压缩列表 对象 sds(简单动态字符串) 定义: //记录buf数组中已使用字节的数量 int len //记录buf数组中未使用字节的数量 int free //字节数组 用于保存字符串 char buf [] 使用sds的好处是:1.方便获取当前字符串的长度 2.杜绝缓冲区溢出 3.减少字符串修改带来的内存重分配次数.修改之后的空间,预分配的字空间大小和已 使用的空间大小相等.但是最大为1M. 4.二进制安全.redis api读进去的是一系列二进制 2.链表 链表提供了高效的节点重排能力,以及顺序性的节点访问方式,并且可以通过只能删节点来灵活的调整链表的长度. 3.字典 字典又称为符号表.,关联数组活映射(map),是一中用于保存键值对的抽象数据结构. 字典的底层是由哈希表实现的,一个哈希表里面可以有很多个哈希表节点,而每个哈希表节点就保存了字典表中的一个键值对. 1.1.哈希表 结构定义: table:哈希表数组.数组中的每个元素都是一个指向dictEntry结构的指针,每个dictEntry结构保存着一个键值对 size:哈希表大小 sizemask:哈希表掩码,用于计算索引值.总是等于size-1 used:该哈希表已有节点的数量 1.2.哈希表节点

Gartner发布首个超融合软件魔力象限,Dell EMC、HPE、Cisco、华为等6厂商出局

≯℡__Kan透↙ 提交于 2020-12-12 05:15:53
12月7日,Gartner发布了2020年超融合(HCI)软件的魔力象限,这个是Gartner第一个HCI软件的魔力象限。 我们先来看一下最新的HCI软件魔力象限长得啥样子。 很清爽有没有?领导者象限只有Nutanix和VMware,而远见者只有Microsoft。挑战者一片空白。而有7个厂商拥挤在利基象限,其中包括国内的深信服和华云数据。 为什么原来的Dell EMC、HPE、Cisco、华为等服务器大厂都不见了呢?因为今年魔力象限只看HCI软件了,入围标准变了。 原来的HCI报告,主要看HCIS,即一体机。 因此,服务器大厂都在里面,但今年只看软件,因此,这些服务器大厂大部分都出局了,因为他们的软件仅仅支持自己的服务器。 对比2019年超融合的魔力象限,我们看发生哪些变化? 有5个厂商出局了,Gartner给出了出局原因: 思科因加入标准的变更而被撤职 ,该准则排除了HCIS解决方案(其他Gartner出版物将涵盖这些解决方案 )。 由于排除标准的更改 (不包括 HCIS解决方案) (包括在其他Gartner出版物中的内容),Dell EMC被删除 。 由于包含标准的更改(不包括HCIS解决方案)(这些将在其他Gartner出版物中介绍),HPE被放弃。 由于加入标准的变更(不包括HCIS解决方案)(这些将在其他Gartner出版物中进行介绍),华为 被放弃。