![](https://img-blog.csdnimg.cn/20210314100345846.png?x-oss-process=image/resize,m_fixed,h_224,w_224)
Redis
文章平均质量分 97
Redis全系列的教程,包括基础系列、核心系列以及原理系列
存在morning
乐于了解新技术,善于复盘总结,不是很聪明,但能够持续进步。
展开
-
【Redis系统性知识】Redis看这一篇就够了
本文的全部内容来自我个人在Redis学习过程中整理的博客,是该博客专栏的精华部分。在书写过程中过滤了流程性的上下文,例如部署环境、配置文件等,而致力于像读者讲述其中的核心部分,如果读者有意对过程性内容深入探究,可以移步MaoLinTian的Blog,在这篇索引目录里找到答案分布式技术相关专栏索引,需要注意的是,本文的内容学习来源来自于书籍《Redis的设计与实现》及《黑马程序员-Redis视频教程》,特作相关说明。Redis的基本概念及背景首先我们要知道什么是NoSQL,什么又是Redis,为什么需要用原创 2020-12-20 11:03:55 · 911 阅读 · 1 评论 -
【Redis基础知识 一】Redis基本概念
NoSql概述为什么需要NoSQL,web1.0,是基于浏览器,用户通过浏览器获取内容信息;web2.0是基于1.0,增加了用户与系统的交互,使用者既是网络内容的获取者,也是网络数据的制造者,例如:论坛、博客、微博等相关社交类型的平台。在web2.0需要依据用户个性化需要高并发读写,关系型数据库读还可以,写就很难做到了。社区海量数据的高效率存储和访问,类似facebook,对于数据库...原创 2019-06-17 22:15:18 · 733 阅读 · 2 评论 -
【Redis基础知识 二】Redis数据结构概述
上一篇博客讲了Redis的概要,本篇内容主要学习下Redis的数据结构和一些常用命令,以及这些数据结构在上一篇里的应用场景有哪些,为什么这个数据结构比较适用于该场景。五种常用数据结构Redis是高性能键值对数据库,支持的键值数据类型:字符串类型 ,散列类型,列表类型 ,集合类型,有序集合类型 , 这些类型的操作方式和结构需要详细了解下。Redis 字符串(String)字符串的操作命令有很...原创 2019-06-23 17:58:46 · 647 阅读 · 0 评论 -
【Redis基础知识 三】Redis五种常用数据结构应用场景
距离上一次对redis的学习【Redis从入门到放弃系列 三】数据结构居然已经过去一年多了,还是自己没有坚持下去吧,今年刚好在学中间件,那么还是继续顺着学下去吧,但是总要复习一下并且更好的总结提升,那么本篇blog在既往的三篇之上做好总结并且有更深入的探索,方便后续的学习。按照如下的目录去组织:Redis的基本概念与特点:Redis的基本概念是什么,有什么特点Redis的安装与使用:windows版本的服务端与客户端的安装Redis的应用场景:总体的应用场景有哪些,为什么有Reids的需求Redi原创 2020-09-19 16:22:25 · 1684 阅读 · 0 评论 -
【Redis基础知识 四】Redis五种数据对象的底层实现和特性
有时候会好奇,为什么redis的string类型的字符串可以实现自增1,还可以实现一些数字相关的计算,而zset又可以实现打分和排名,如果它们仅仅是键值对的形式,还能这么方便的进行操作么?正如List的底层数据结构是双向链表设计一样,redis的所有数据结构也都是基于我们基础数据结构或基础数据结构的封装而实现的。今天这篇blog就来学习下redis的数据结构底层实现。底层数据结构:https://segmentfault.com/a/1190000020770894?utm_source=tag-newe原创 2020-12-08 09:34:45 · 301 阅读 · 0 评论 -
【Redis基础知识 五】Redis底层数据编码之动态字符串
什么是动态字符串,我们嘴边常挂的SDS就是动态字符串,在Redis里是一种数据编码方式,会用在Redis的String类型的数据对象里。SDS的数据结构SDS的数据结构如下,包含三部分属性,len、free以及buf数组,用来描述一个SDS的结构体:struct sdshdr { unsigned int len; //记录buf数组中已使用字节数量,也即SDS所保存字符串长度 unsigned int free; //记录buf数组中未使用字节数量 char buf[];原创 2020-12-08 23:04:03 · 280 阅读 · 0 评论 -
【Redis基础知识 六】Redis底层数据编码之链表
链表提供了高效的节点重排能力,以及顺序性的节点访问方式,并且可以通过增删节点来灵活地调整链表的长度,但是由于C语言没有链表的数据结构,所以Redis的链表是自己定义的结构。链表的数据结构链表单节点的数据结构如下,包含三部分属性,prev、next以及value,用来描述一个链表单节点的结构体:typedef struct listNode{ // 前置节点 struct listNode *prev; // 后置节点 struct listNode *next; // 节点的值原创 2020-12-08 23:31:11 · 231 阅读 · 0 评论 -
【Redis基础知识 七】Redis底层数据编码之字典
字典,又称为符号表(symbol table)、关联数组(associative array)或映射(map),是一种用于保存键值对(key-value pair)的抽象数据结构,字典中的每个键都是独一无二的,程序可以在字典中根据键查找与之关联的值,或者通过键来更新值,又或者根据键来删除整个键值对Redis数据库就是一个字典模型,key和value组成同时hash对象的底层实现之一也包括字典总而言之,字典有较为广泛的用途,但是同链表一样,C语言没有字典这种数据结构,所以Redis自己实现了这种结构原创 2020-12-27 23:16:11 · 246 阅读 · 0 评论 -
【Redis基础知识 八】Redis底层数据编码之跳跃表
什么是跳跃表,跳跃表是一种有序的数据结构,它通过在每个节点中维持多个指向其他节点的指针,从而达到快速访问节点的目的。跳跃表定义对于一个单链表来讲,即便链表中存储的数据是有序的,如果我们要想在其中查找某个数据,也只能从头到尾遍历链表。这样查找效率就会很低,时间复杂度会很高,是 O(n)如果我们想要提高其查找效率,可以考虑在链表上建索引的方式。每两个结点提取一个结点到上一级,我们把抽出来的那一级叫作索引:如果有了一个索引的层级,那么只需要从索引层级上逐级向下定位:在数据量特别大的时候效率有明显提原创 2020-12-27 23:16:34 · 243 阅读 · 0 评论 -
【Redis基础知识 九】Redis底层数据编码之整数集合
整数集合(intset)是集合键的底层实现之一,当一个集合只包含整数值元素,并且这个集合的元素数量不多时,Redis就会使用整数集合作为集合键的底层实现整数集合数据结构整数集合(intset)是Redis用于保存整数值的集合抽象数据结构,它可以保存类型为int16_t、int32_t或者int64_t的整数值,并且保证集合中不会出现重复元素//每个intset结构表示一个整数集合typedef struct intset{ //编码方式 uint32_t encoding;原创 2020-12-27 23:16:46 · 216 阅读 · 0 评论 -
【Redis基础知识 十】Redis底层数据编码之压缩列表
压缩列表(ziplist)是列表键和哈希键的底层实现之一,都是在存储元素内容较少的时候发挥作用:当一个列表键只包含少量列表项,并且每个列表项要么就是小整数值,要么就是长度比较短的字符串,那么Redis就会使用压缩列表来做列表键的底层实现当一个哈希键只包含少量键值对,比且每个键值对的键和值要么就是小整数值,要么就是长度比较短的字符串,那么Redis就会使用压缩列表来做哈希键的底层实现压缩列表是Redis为了节约内存而开发的,是由一系列特殊编码的连续内存块组成的顺序型数据结构。一个压缩列表可以包含任意原创 2020-12-27 23:16:58 · 398 阅读 · 2 评论 -
【Redis基础知识 十一】Redis的高级数据结构
除了五种基本的Redis结构【Redis从入门到放弃系列 四】数据结构应用场景,我们这里总共聊三种:Bitmaps原创 2020-10-31 13:28:42 · 516 阅读 · 0 评论 -
【Redis基础知识 十二】Redis通用指令
学习完Redis的常用数据结构之后,再来了解下Redis的通用命令,什么是通用命令呢?我理解就是数据结构无关的命令,只是把这些数据结构构造的redis都看做一个个redis。key通用命令key是一个固定的string类型,通过key可以获取redis实际存储的数据。判断key自身状态相关操作的常用命令为:DEL:删除指定的key及其对应的value,时间复杂度O(N),N为删除的key数量EXISTS:判断指定的key是否存在,返回1代表存在,0代表不存在,时间复杂度O(1)TYPE:返回原创 2020-09-20 15:56:13 · 325 阅读 · 0 评论 -
【Redis基础知识 十三】Jedis的使用
在了解了Redis的基础数据结构以及一些特性和操作指令之后呢,和kafka及ES系列一样,我们不可能用指令去编程和完成业务逻辑,还是需要代码去操作指令的,java也封装了相关的代码,统一叫做Jedis,接下来本篇blog就来了解下Jedis的使用:Jedis简介:简单介绍下Jedis是什么,能干什么Jedis环境搭建:创建相关Java项目,完成第一个Jedis代码编写Jedis操作Redis:Jedis对Redis的一些操作指令Jedis综合案例实现:Jedis实现我们之前提到的综合案例Jedi原创 2020-09-21 01:28:52 · 507 阅读 · 0 评论 -
【Redis核心知识 一】Linux中搭建Redis环境
今天恰逢1024盛事,为了共襄盛举,决定把Redis相关知识梳理一下,纪念一波这个节日。之前的学习都是基于windows做的简单的数据结构、指令的一些学习,从今天开始学习下Redis的高级用法。Redis的Linux安装其实安装起来很简单,之前我就搭建过分布式的Centos7的虚拟机集群,感兴趣的朋友可以参见之前的一篇blog,详细介绍了如何按照、配置和操作虚拟机【分布式集群搭建 一】虚拟机配置(VMware+Centos7+SecureCRT+AppNode),这里就不再赘述。有了Linux的虚拟机环原创 2020-10-24 11:41:09 · 479 阅读 · 0 评论 -
【Redis核心知识 二】Redis持久化策略
上一篇blog在linux中安装了Redis,并且对Redis进行了启动和操作。本篇blog主要学习下Redis的持久化策略。什么是持久化呢?举个最简单的例子,就是内存中的数据如果突然遭遇断电,将会丢失,那么为了保证数据不丢失,内存中的数据要持久化到硬盘里来,利用永久性存储介质将数据进行保存,在特定的时间将保存的数据进行恢复的工作机制称为持久化。持久化的作用就是防止数据的意外丢失,确保数据安全性!也就是为什么我们每写会儿文档就要保存一次的原因。因为Redis本质上也是个数据库,所以也面临持久化的问题,R原创 2020-10-24 21:36:09 · 603 阅读 · 0 评论 -
【Redis核心知识 三】Redis的事务机制
其实和Mysql一样,Redis虽然作为一个非关系的K-V结构数据库,也是存在事务的,当然事务并不会有Mysql那么强,关于Mysql的数据库事务,可以看下我三年前一篇blog的介绍【数据库策略 二】数据库事务,关于事务的ACID四大特性、并发的常见问题和事务的隔离级别事务简介当多个客户端对同一个Key执行set操作的时候,客户端的get预期是会有偏差的,那么依赖于Redis的单线程特性,我们处理Redis的问题比Mysql的要简单一些。Redis 事务的本质是一组命令的集合。事务支持一次执行多个命令原创 2020-10-25 11:03:05 · 471 阅读 · 0 评论 -
【Redis核心知识 四】Redis分布式锁实战
最近在公司做的一个功能是这样的,异步的方式进行导入任务处理也即:客户机生产消息,将消息通过RabbitMQ服务器分发到部署有消费代码的服务端机器进行并发处理,这样做保证了消息的异步处理,但是可能大消息量会对机器有较大的压力,所以所有通过RabbitMQ传递的消息在传递到消费端后首先要被放置到一个缓存队列里排队,然后每台机器再有条不紊的启用线程来消费队列里的消息。这样貌似很完美,但是在使用的过程中遇...原创 2019-11-14 10:08:59 · 507 阅读 · 0 评论 -
【Redis核心知识 五】Redis的删除策略
其实同ElasticSearch的延迟删除【在段合并的时候才真正删除数据】【ElasticSearch从入门到放弃系列 九】Elasticsearch原理机制探索一样,Redis也不是马上删除数据,而是先进行标记,让其在内存中再多呆一会儿,等到满足一定条件的时候再进行统一删除。什么是过期数据当我们执行del删除redis数据以及expire过期的 ,过期数据:Redis是一种内存级数据库,所有数据均存放在内存中,内存中的数据可以通过TTL指令获取其状态:127.0.0.1:6379> clea原创 2020-10-25 16:19:57 · 740 阅读 · 1 评论 -
【Redis核心知识 六】Redis集群之主从复制模式
学习完了Redis的linux安装、Redis的事务机制、Redis的持久化策略、Redis的删除策略和Redis的高级数据模型或结构之后呢,高级部分就暂告一段落,今天正式进入Redis集群的学习中,Redis集群这里先学习下先导内容,Redis的主从复制机制。主从复制架构在之前的分布式文章中一再提到过分布式系统的三高架构:高并发、高性能和高可用,Kafka和ElasticSearch的集群中都提供了副本或分片来提高服务器的安全性和稳定性,Redis也不例外,所以在聊主从复制之前先了解下高可用的真正定义原创 2020-11-01 11:28:41 · 474 阅读 · 2 评论 -
【Redis核心知识 七】Redis集群之哨兵模式
在主从复制架构这篇blog里聊到了哨兵模式,在复杂的多主复合架构里,哨兵是必不可少的,所以这篇blog来详细解读下什么是哨兵模式,以及哨兵模式是怎么运行的。哨兵模式概述了解哨兵之前先了解一个概念,主从复制里的主从切换。主从切换技术主从切换技术的方法是:当主服务器宕机后,需要手动把一台从服务器切换为主服务器,这就需要人工干预,费事费力,还会造成一段时间内服务不可用。这不是一种推荐的方式,更多时候,我们优先考虑哨兵模式。哨兵模式为了解决主从切换的各种问题,Redis使用了哨兵模式来进行处理。哨兵原创 2020-11-01 17:31:46 · 820 阅读 · 0 评论 -
【Redis核心知识 八】Redis集群之Cluster模式及集群搭建
Cluster集群简介Cluster集群结构设计数据结构设计每个机器分为若干个槽slot,加机器和减机器都可以通过动态调整槽来实现Cluster内部通讯设计1,key先经过CRC算法进行计算2,计算结果%16384得到一个槽编号3,如果直接访问一次命中就直接取,否则就由客户端直接去目标机器找Cluster集群搭建...原创 2020-11-14 14:38:21 · 1051 阅读 · 1 评论 -
【Redis核心知识 九】Redis企业级解决方案【缓存预热、热备、雪崩、击穿、穿透】
缓存预热https://blog.csdn.net/kongtiao5/article/details/82771694https://www.cnblogs.com/franklehoo/p/9153439.htmlhttps://www.cnblogs.com/xichji/p/11286443.htmlhttps://baijiahao.baidu.com/s?id=1619572269435584821&wfr=spider&for=pc现象重启服务器的时候Redis服原创 2020-11-14 22:54:14 · 418 阅读 · 0 评论 -
【Redis原理机制 一】Redis高性能原因、单线程模型及多路复用技术
为什么Redis快呢,其实在学习完了应用场景和集群等模式后可以回归本源了,用Redis的本质原因到底是什么?Redis的设计方式有什么好处,这是向更深处探索的第一步。Redis为什么快因为Redis是基于内存的一个数据库,所以第一点可想而知,内存当然比IO快啊,其次就是两个不常见的点:redis是基于内存的,内存的读写速度非常快, 数据存放在内存中,内存的响应时间大约是 100纳秒 ,这是Redis每秒万亿级别访问的重要基础。redis是单线程的,省去了很多上下文切换线程的时间,单线 避免了线程切原创 2020-11-30 13:10:29 · 579 阅读 · 0 评论 -
【Redis原理机制 二】Redis内存优化
Redis所有的数据都在内存中,而内存又是非常宝贵的资源。对于如何优化内存使用一直是Redis用户非常关注的问题。本文让我们深入到Redis细节中,学习内存优化的技巧,本文内容转载自Redis的内存优化:RedisObject对象的优化,通过调整redisObject的使用来达到内存的优化。缩减键值对象,降低Redis内存使用最直接的方式就是缩减键(key)和值(value)的长度共享对象池,对象共享池指Redis内部维护[0-9999]的整数对象池。字符串优化,通过SDS的预分配机制和重构编码转载 2020-11-30 15:37:11 · 325 阅读 · 0 评论 -
【Redis原理机制 三】Redis常见延迟问题定位与分析
Redis作为内存数据库,拥有非常高的性能,单个实例的QPS能够达到10W左右。但我们在使用Redis时,经常时不时会出现访问延迟很大的情况,如果你不知道Redis的内部实现原理,在排查问题时就会一头雾水。很多时候,Redis出现访问延迟变大,都与我们的使用不当或运维不合理导致的。这篇文章我们就来分析一下Redis在使用过程中,经常会遇到的延迟问题以及如何定位和分析。使用复杂度高的命令如果你的业务经常使用O(N)以上复杂度的命令,例如sort、sunion、zunionstore,或者在执行O(N)命令转载 2020-11-30 13:36:12 · 441 阅读 · 0 评论 -
【Redis原理机制 四】基于Redis实现延时任务
背景介绍如果《忍者必须死3》玩儿的比较多的话,你会经常需要每隔4H给自己的坐骑喂食一次,通过喂食来升级。一次喂食后,坐骑需要花4个小时吃完。现在有个新需求,可以使用道具卡来丰富玩法。道具卡有两种,一种是加速卡,一种是自动喂食卡。加速卡会使吃食的时间缩短两个小时,自动喂食卡可以在坐骑吃完当前喂食食物后系统帮助其自动喂食一次【自动延时操作】。基于Zset的实现方式Redis实现延时任务,是通过其数据结构ZSET来实现的。ZSET会储存一个score和一个value,可以将value按照score进行排序。原创 2020-11-30 15:55:23 · 463 阅读 · 0 评论 -
【Redis原理机制 五】BloomFilter的实现原理及优化
其实在之前的文章中提到过bitmaps这种数据结构,【Redis从入门到放弃系列 十三】Redis的高级数据结构,其实有一种比bitmaps还要狠的方式,就是布隆过滤器。有如下场景可能需要用到:邮箱系统的垃圾邮件过滤?现有50亿个电话号码,现有10万个电话号码,如何要快速准确的判断这些电话号码是否已经存在?1亿个用户,判断1000个黑名单用户解决缓存穿透问题,判断key是否存在诸如此类的大数问题。布隆过滤器基本概念布隆过滤器(Bloom Filter)是由Howard Bloom在1970原创 2020-11-30 16:27:56 · 486 阅读 · 0 评论 -
【Redis原理机制 六】Redis分布式锁深入、改进策略及RedLock算法
之前聊过Redis的分布式锁并且基于理论【Redis从入门到放弃系列 十】Redis的事务机制进行过代码实践【Redis从入门到放弃系列 十一】Redis分布式锁实战,但是其实只是对分布式锁的一个简单理解,对于其中可能的问题并没有过多讨论,甚至对于真实企业场景中的分布式锁,之前的那个也许只是个玩具,存在诸多问题...原创 2020-11-15 20:53:24 · 623 阅读 · 4 评论