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

三菱FX3U系列PLC编程学习笔记 指令表(IL)类似汇编语言,容易书写,不形象梯形图(LAD)类似继电线路的一种编程语言,直观,易接受顺序功能图(SFC)以功能为主线,条理清晰便于用户理解,弥补梯形图不能顺序动作的缺陷功能块语言(FBD)以功能快为单位,直观,通用于规模大,控制逻辑关系复杂的系统结构化文本语言(ST)类似BASIC语言或C语言,主要用于其他编程语言较难实现程序编制对操作人员要求较高,直观性差输入继电器(X):X000~八进制数编号输出继电器(Y):Y0000~八进制编号。 阅读详情

前言

只有光头才能变强

redis

最近在学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 store, used as a database,cache and message broker.”

Redis是一个开源的,基于内存的数据结构存储,可用作于数据库、缓存、消息中间件。

  • 从官方的解释上,我们可以知道:Redis是基于内存,支持多种数据结构。
  • 从经验的角度上,我们可以知道:Redis常用作于缓存。

就我个人认为:学习一种新技术,先把握该技术整体的知识(思想),再扣细节,这样学习起来会比较轻松一些。所以我们先以“内存”、“数据结构”、“缓存”来对Redis入门。

1.1为什么要用Redis?

从上面可知:Redis是基于内存,常用作于缓存的一种技术,并且Redis存储的方式是以key-value的形式。

我们可以发现这不就是Java的Map容器所拥有的特性吗,那为什么还需要Redis呢?

  • Java实现的Map是本地缓存,如果有多台实例(机器)的话,每个实例都需要各自保存一份缓存,缓存不具有一致性
  • Redis实现的是分布式缓存,如果有多台实例(机器)的话,每个实例都共享一份缓存,缓存具有一致性。
  • Java实现的Map不是专业做缓存的,JVM内存太大容易挂掉的。一般用做于容器来存储临时数据,缓存的数据随着JVM销毁而结束。Map所存储的数据结构,缓存过期机制等等是需要程序员自己手写的。
  • Redis是专业做缓存的,可以用几十个G内存来做缓存。Redis一般用作于缓存,可以将缓存数据保存在硬盘中,Redis重启了后可以将其恢复。原生提供丰富的数据结构、缓存过期机制等等简单好用的功能。

参考资料:

1.2为什么要用缓存?

如果我们的网站出现了性能问题(访问时间慢),按经验来说,一般是由于数据库撑不住了。因为一般数据库的读写都是要经过磁盘的,而磁盘的速度可以说是相当慢的(相对内存来说)

数据库撑不住了

如果学过Mybaits、Hibernate的同学就可以知道,它们有一级缓存、二级缓存这样的功能(终究来说还是本地缓存)。目的就是为了:不用每次读取的时候,都要查一次数据库。

有了缓存之后,我们的访问就变成这样了:

有了缓存提高了并发和性能

二、Redis的数据结构

本文不会讲述命令的使用方式,具体的如何使用可查询API。

Redis支持丰富的数据结构,常用的有string、list、hash、set、sortset这几种。学习这些数据结构是使用Redis的基础!

“Redis is written in ANSI C”–>Redis由C语言编写

首先还是得声明一下,Redis的存储是以key-value的形式的。Redis中的key一定是字符串,value可以是string、list、hash、set、sortset这几种常用的。

redis数据结构

但要值得注意的是:Redis并没有直接使用这些数据结构来实现key-value数据库,而是基于这些数据结构创建了一个对象系统。

  • 简单来说:Redis使用对象来表示数据库中的键和值。每次我们在Redis数据库中新创建一个键值对时,至少会创建出两个对象。一个是键对象,一个是值对象。

Redis中的每个对象都由一个redisObject结构来表示:


typedef struct redisObject{
	
	// 对象的类型
	unsigned type 4:;

	// 对象的编码格式
	unsigned encoding:4;

	// 指向底层实现数据结构的指针
	void * ptr;

	//.....


}robj;


数据结构对应的类型与编码

简单来说就是Redis对key-value封装成对象,key是一个对象,value也是一个对象。每个对象都有type(类型)、encoding(编码)、ptr(指向底层数据结构的指针)来表示。

以值为1006的字符串对象为例

下面我就来说一下我们Redis常见的数据类型:string、list、hash、set、sortset。它们的底层数据结构究竟是怎么样的!

2.1SDS简单动态字符串

简单动态字符串(Simple dynamic string,SDS)

Redis中的字符串跟C语言中的字符串,是有点差距的。

Redis使用sdshdr结构来表示一个SDS值:


struct sdshdr{

	// 字节数组,用于保存字符串
	char buf[];

	// 记录buf数组中已使用的字节数量,也是字符串的长度
	int len;

	// 记录buf数组未使用的字节数量
	int free;
}

例子:

SDS例子

2.1.1使用SDS的好处

SDS与C的字符串表示比较

  1. sdshdr数据结构中用len属性记录了字符串的长度。那么获取字符串的长度时,时间复杂度只需要O(1)。
  2. SDS不会发生溢出的问题,如果修改SDS时,空间不足。先会扩展空间,再进行修改!(内部实现了动态扩展机制)。
  3. SDS可以减少内存分配的次数(空间预分配机制)。在扩展空间时,除了分配修改时所必要的空间,还会分配额外的空闲空间(free 属性)。
  4. SDS是二进制安全的,所有SDS API都会以处理二进制的方式来处理SDS存放在buf数组里的数据。

2.2链表

对于链表而言,我们不会陌生的了。在大学期间肯定开过数据结构与算法课程,链表肯定是讲过的了。在Java中Linkedxxx容器底层数据结构也是链表+[xxx]的。我们来看看Redis中的链表是怎么实现的:

使用listNode结构来表示每个节点:




typedef strcut listNode{

    //前置节点
    strcut listNode  *pre;

    //后置节点
    strcut listNode  *pre;

    //节点的值
    void  *value;

}listNode

使用listNode是可以组成链表了,Redis中使用list结构来持有链表:


typedef struct list{

    //表头结点
    listNode  *head;

    //表尾节点
    listNode  *tail;

    //链表长度
    unsigned long len;

    //节点值复制函数
    void *(*dup) (viod *ptr);

    //节点值释放函数
    void  (*free) (viod *ptr);

    //节点值对比函数
    int (*match) (void *ptr,void *key);

}list

具体的结构如图:

2.2.1Redis链表的特性

Redis的链表有以下特性:

  • 无环双向链表
  • 获取表头指针,表尾指针,链表节点长度的时间复杂度均为O(1)
  • 链表使用void *指针来保存节点值,可以保存各种不同类型的值

2.3哈希表

声明:《Redis设计与实现》里边有“字典”这么一个概念,我个人认为还是直接叫哈希表比较通俗易懂。从代码上看:“字典”也是在哈希表基础上再抽象了一层而已。

在Redis中,key-value的数据结构底层就是哈希表来实现的。对于哈希表来说,我们也并不陌生。在Java中,哈希表实际上就是数组+链表的形式来构建的。下面我们来看看Redis的哈希表是怎么构建的吧。

在Redis里边,哈希表使用dictht结构来定义:

	typedef struct dictht{
	    
	    //哈希表数组
	    dictEntry **table;  
	
	    //哈希表大小
	    unsigned long size;    
	
	    //哈希表大小掩码,用于计算索引值
	    //总是等于size-1
	    unsigned long sizemark;     
	
	    //哈希表已有节点数量
	    unsigned long used;
	     
	}dictht

哈希表的数据结构

我们下面继续写看看哈希表的节点是怎么实现的吧:


	typedef struct dictEntry {
	    
	    //键
	    void *key;
	
	    //值
	    union {
	        void *value;
	        uint64_tu64;
	        int64_ts64;
	    }v;    
	
	    //指向下个哈希节点,组成链表
	    struct dictEntry *next;
	
	}dictEntry;

从结构上看,我们可以发现:Redis实现的哈希表和Java中实现的是类似的。只不过Redis多了几个属性来记录常用的值:sizemark(掩码)、used(已有的节点数量)、size(大小)。

同样地,Redis为了更好的操作,对哈希表往上再封装了一层(参考上面的Redis实现链表),使用dict结构来表示:


typedef struct dict {

    //类型特定函数
    dictType *type;

    //私有数据
    void *privdata;
  
    //哈希表
    dictht ht[2];

    //rehash索引
    //当rehash不进行时,值为-1
    int rehashidx;  

}dict;


//-----------------------------------

typedef struct dictType{

    //计算哈希值的函数
    unsigned int (*hashFunction)(const void * key);

    //复制键的函数
    void *(*keyDup)(void *private, const void *key);
 
    //复制值得函数
    void *(*valDup)(void *private, const void *obj);  

    //对比键的函数
    int (*keyCompare)(void *privdata , const void *key1, const void *key2)

    //销毁键的函数
    void (*keyDestructor)(void *private, void *key);
 
    //销毁值的函数
    void (*valDestructor)(void *private, void *obj);  

}dictType

所以,最后我们可以发现,Redis所实现的哈希表最后的数据结构是这样子的:

从代码实现和示例图上我们可以发现,Redis中有两个哈希表:

  • ht[0]:用于存放真实的key-vlaue数据
  • ht[1]:用于扩容(rehash)

Redis中哈希算法和哈希冲突跟Java实现的差不多,它俩差异就是:

  • Redis哈希冲突时:是将新节点添加在链表的表头。
  • JDK1.8后,Java在哈希冲突时:是将新的节点添加到链表的表尾。

2.3.1rehash的过程

下面来具体讲讲Redis是怎么rehash的,因为我们从上面可以明显地看到,Redis是专门使用一个哈希表来做rehash的。这跟Java一次性直接rehash是有区别的。

在对哈希表进行扩展或者收缩操作时,reash过程并不是一次性地完成的,而是渐进式地完成的。

Redis在rehash时采取渐进式的原因:数据量如果过大的话,一次性rehash会有庞大的计算量,这很可能导致服务器一段时间内停止服务。

Redis具体是rehash时这么干的:

  • (1:在字典中维持一个索引计数器变量rehashidx,并将设置为0,表示rehash开始。
  • (2:在rehash期间每次对字典进行增加、查询、删除和更新操作时,除了执行指定命令外;还会将ht[0]中rehashidx索引上的值rehash到ht[1],操作完成后rehashidx+1。
  • (3:字典操作不断执行,最终在某个时间点,所有的键值对完成rehash,这时将rehashidx设置为-1,表示rehash完成
  • (4:在渐进式rehash过程中,字典会同时使用两个哈希表ht[0]和ht[1],所有的更新、删除、查找操作也会在两个哈希表进行。例如要查找一个键的话,服务器会优先查找ht[0],如果不存在,再查找ht[1],诸如此类。此外当执行新增操作时,新的键值对一律保存到ht[1],不再对ht[0]进行任何操作,以保证ht[0]的键值对数量只减不增,直至变为空表。

2.4跳跃表(shiplist)

跳跃表(shiplist)是实现sortset(有序集合)的底层数据结构之一!

跳跃表可能对于大部分人来说不太常见,之前我在学习的时候发现了一篇不错的文章讲跳跃表的,建议大家先去看完下文再继续回来阅读:

Redis的跳跃表实现由zskiplist和zskiplistNode两个结构组成。其中zskiplist保存跳跃表的信息(表头,表尾节点,长度),zskiplistNode则表示跳跃表的节点。

按照惯例,我们来看看zskiplistNode跳跃表节点的结构是怎么样的:


typeof struct zskiplistNode {
        // 后退指针
        struct zskiplistNode *backward;
        // 分值
        double score;
        // 成员对象
        robj *obj;
        // 层
        struct zskiplistLevel {
                // 前进指针
                struct zskiplistNode *forward;
                // 跨度
                unsigned int span;
        } level[];
} zskiplistNode;

zskiplistNode的对象示例图(带有不同层高的节点):

带有不同层高的节点

示例图如下:

跳跃表节点的示例图

zskiplist的结构如下:

typeof struct zskiplist {
        // 表头节点,表尾节点
        struct skiplistNode *header,*tail;
        // 表中节点数量
        unsigned long length;
        // 表中最大层数
        int level;
} zskiplist;


最后我们整个跳跃表的示例图如下:

跳跃表示例图

2.5整数集合(intset)

整数集合是set(集合)的底层数据结构之一。当一个set(集合)只包含整数值元素,并且元素的数量不多时,Redis就会采用整数集合(intset)作为set(集合)的底层实现。

整数集合(intset)保证了元素是不会出现重复的,并且是有序的(从小到大排序),intset的结构是这样子的:


typeof struct intset {
        // 编码方式
        unit32_t encoding;
        // 集合包含的元素数量
        unit32_t lenght;
        // 保存元素的数组
        int8_t contents[];
} intset;

intset示例图:

intset示例图

说明:虽然intset结构将contents属性声明为int8_t类型的数组,但实际上contents数组并不保存任何int8_t类型的值,contents数组的真正类型取决于encoding属性的值:

  • INTSET_ENC_INT16
  • INTSET_ENC_INT32
  • INTSET_ENC_INT64

从编码格式的名字我们就可以知道,16,32,64编码对应能存放的数字范围是不一样的。16明显最少,64明显最大。

如果本来是INTSET_ENC_INT16的编码,想要存放大于INTSET_ENC_INT16编码能存放的整数值,此时就得编码升级(从16升级成32或者64)。步骤如下:

  • 1)根据新元素类型拓展整数集合底层数组的空间并为新元素分配空间。
  • 2)将底层数组现有的所以元素都转换成与新元素相同的类型,并将类型转换后的元素放到正确的位上,需要维持底层数组的有序性质不变。
  • 3)将新元素添加到底层数组。

另外一提:只支持升级操作,并不支持降级操作。

2.6压缩列表(ziplist)

压缩列表(ziplist)是list和hash的底层实现之一。如果list的每个都是小整数值,或者是比较短的字符串,压缩列表(ziplist)作为list的底层实现。

压缩列表(ziplist)是Redis为了节约内存而开发的,是由一系列的特殊编码的连续内存块组成的顺序性数据结构。

压缩列表结构图例如下:

压缩列表的组成部分

下面我们看看节点的结构图:

压缩列表从表尾节点倒序遍历,首先指针通过zltail偏移量指向表尾节点,然后通过指向节点记录的前一个节点的长度依次向前遍历访问整个压缩列表。

三、Redis中数据结构的对象

再次看回这张图,觉不觉得就很好理解了?

数据结构对应的类型与编码

3.1字符串(stirng)对象

在上面的图我们知道string类型有三种编码格式:

  • int:整数值,这个整数值可以使用long类型来表示
    • 如果是浮点数,那就用embstr或者raw编码。具体用哪个就看这个数的长度了
  • embstr:字符串值,这个字符串值的长度小于39字节
  • raw:字符串值,这个字符串值的长度大于39字节

embstr和raw的区别:

  • raw分配内存和释放内存的次数是两次,embstr是一次
  • embstr编码的数据保存在一块连续的内存里面

编码之间的转换:

  • int类型如果存的不再是一个整数值,则会从int转成raw
  • embstr是只读的,在修改的时候回从embstr转成raw

3.2列表(list)对象

在上面的图我们知道list类型有两种编码格式:

  • ziplist:字符串元素的长度都小于64个字节&&总数量少于512个
  • linkedlist:字符串元素的长度大于64个字节||总数量大于512个

ziplist编码的列表结构:

	redis > RPUSH numbers 1 "three" 5
	(integer) 3 

ziplist的列表结构

linkedlist编码的列表结构:

linkedlist编码的列表结构

编码之间的转换:

  • 原本是ziplist编码的,如果保存的数据长度太大或者元素数量过多,会转换成linkedlist编码的。

3.3哈希(hash)对象

在上面的图我们知道hash类型有两种编码格式:

  • ziplist:key和value的字符串长度都小于64字节&&键值对总数量小于512
  • hashtable:key和value的字符串长度大于64字节||键值对总数量大于512

ziplist编码的哈希结构:

ziplist编码的哈希结构1
ziplist编码的哈希结构2

hashtable编码的哈希结构:

hashtable编码的哈希结构

编码之间的转换:

  • 原本是ziplist编码的,如果保存的数据长度太大或者元素数量过多,会转换成hashtable编码的。

3.4集合(set)对象

在上面的图我们知道set类型有两种编码格式:

  • intset:保存的元素全都是整数&&总数量小于512
  • hashtable:保存的元素不是整数||总数量大于512

intset编码的集合结构:

intset编码的集合结构

hashtable编码的集合结构:

hashtable编码的集合结构

编码之间的转换:

  • 原本是intset编码的,如果保存的数据不是整数值或者元素数量大于512,会转换成hashtable编码的。

3.5有序集合(sortset)对象

在上面的图我们知道set类型有两种编码格式:

  • ziplist:元素长度小于64&&总数量小于128
  • skiplist:元素长度大于64||总数量大于128

ziplist编码的有序集合结构:

ziplist编码的有序集合结构1

ziplist编码的有序集合结构2

skiplist编码的有序集合结构:

skiplist编码的有序集合结构

有序集合(sortset)对象同时采用skiplist和哈希表来实现:

  • skiplist能够达到插入的时间复杂度为O(logn),根据成员查分值的时间复杂度为O(1)

编码之间的转换:

  • 原本是ziplist编码的,如果保存的数据长度大于64或者元素数量大于128,会转换成skiplist编码的。

3.6Redis对象一些细节

  • (1:服务器在执行某些命令的时候,会先检查给定的键的类型能否执行指定的命令。
    • 比如我们的数据结构是sortset,但你使用了list的命令。这是不对的,服务器会检查一下我们的数据结构是什么才会进一步执行命令
  • (2:Redis的对象系统带有引用计数实现的内存回收机制。
    • 对象不再被使用的时候,对象所占用的内存会释放掉
  • (3:Redis会共享值为0到9999的字符串对象
  • (4:对象会记录自己的最后一次被访问时间,这个时间可以用于计算对象的空转时间。

最后

本文主要讲了一下Redis常用的数据结构,以及这些数据结构的底层设计是怎么样的。整体来说不会太难,因为这些数据结构我们在学习的过程中多多少少都接触过了,《Redis设计与实现》这本书写得也足够通俗易懂。

至于我们在使用的时候挑选哪些数据结构作为存储,可以简单看看:

  • string–>简单的key-value
  • list–>有序列表(底层是双向链表)–>可做简单队列
  • set–>无序列表(去重)–>提供一系列的交集、并集、差集的命令
  • hash–>哈希表–>存储结构化数据
  • sortset–>有序集合映射(member-score)–>排行榜

如果大家有更好的理解方式或者文章有错误的地方还请大家不吝在评论区留言,大家互相学习交流~~~

参考博客:

参考资料:

  • 《Redis设计与实现》
  • 《Redis实战》

一个坚持原创的Java技术公众号:Java3y,欢迎大家关注

原创技术文章导航:

HP SPP download 是一个全面的系统软件和固件更新解决方案,以单个ISO映像的形式提供。该解决方案使用智能更新管理器(SUM)作为部署工具。 阅读详情

相关推荐

vc formal实例

gui 方式启动命令,

weixin_45077935的博客 682

三菱fx3u中文手册_一文教会你三菱FX3UPLC的输入接线

大家好,我是工控老冯,今天教大家三菱FX3UPLC如何接线。首先,我们拿到任何一款PLC都要先看铭牌,弄清楚它的具体型号。然后参照手册上面的命名规格弄清楚型号每一位代表什么意思。如图为三菱FX3UPLC的型号说明。三菱FX3U型号说明可见这款PLC的输入分别支持源型和漏型,我们看如下具体的接线图。漏型输入:S/S端子接+24V,电流从PLC内部通过输入端子流出PLC,再回到0V。漏型输入接线示意图...

weixin_39598941的博客 1万+

QtNodeEditor实战:构建高效可视化编程环境的完整指南

本文是QtNodeEditor实战的完整指南,详细介绍了如何利用这一基于Qt框架的可视化编程工具构建高效节点编辑器。内容涵盖从快速集成、自定义节点模型到深入理解MVC数据流架构,并提供了样式定制、场景序列化、动态端口等高级功能的实现方法,帮助开发者快速搭建灵活、可维护的可视化编程环境。

lemon的博客 701

FX3U_硬件接线

FX3U-32MT/ES-A

Enjoy 2万+

从零开始:Basler相机与pylon Viewer的工业视觉入门指南

本文详细介绍了Basler相机与pylon Viewer在工业视觉系统中的入门指南,涵盖硬件连接、软件安装、核心功能解析及实战案例。通过pylon Viewer的全面控制和参数调整功能,帮助新手快速掌握工业视觉检测技术,提升生产效率。

julia4scientist的博客 1136

mos管结电容等效模型_MOS管的防冲击防反接电路

MOS管的反接和抑制冲击一:原理分析MOS管由于生产工艺等因素,会产生相应的寄生电容,体二极管等。Mos管的寄生电容如图1所示,可以看到其具有三个寄生电容:G和S的电容Cgs;G和D的电容:Cgd,也称为反向传输电容、米勒电容、Crss;D和S的电容Cds。D和S之间的体二极管D1.图 1:MOS管等效模型寄生电容的数值可以从元器件的datasheet中得到,如图2,图3:Ciss(输入电容)=C...

weixin_29179583的博客 1858

FX3U-4DA模拟量输出模块

可指定输出电压/电流。可将BFM中保存的数值转换成模拟量。用于变频器(电磁阀、流量计等)进行平滑调速。从PLC右边记起的第1个特殊模块编号为0,不论中间隔有多少个IO扩展模块。FX3U系列PLC最多扩展8台特殊模块。

BUG7073的博客 1万+

别再用图片水印了!5种你可能不知道的文本隐写术实战

本文介绍了5种高效的文本隐写术,帮助创作者在不影响内容可读性的情况下嵌入版权信息。从零宽度字符到同形字替换,再到标点符号变形和行尾空格编码,这些技术为数字内容提供了轻量级版权保护方案,特别适用于社交媒体和电子合同等场景。

k8l9m0n的博客 225

485通讯接线图_三菱FX3U485无协议通讯程序详解(含程序)

三菱FX2N PLC串行通讯指令(FNC 80 RS)串行通讯指令(FNC 80 RS)1、指令格式:[RS D0 K8 D10 K8]发送数据帧起始地址和数目 ↓接收数据帧起始地址和数目2、功能和动作:※ RS指令是为使用RS232C、RS-485功能扩展板及特殊适配器,进行发送和接收串行数据的指令。※传送的数据格式在后面讲述的特殊寄存器D8120设定。RS指令驱动时即使改变D8120...

weixin_39639174的博客 1万+

FPGA实现串口升级及MultiBoot(五)通过约束脚本添加IPROG实例

上一篇文章种总结了MultiBoot 关键技术,分为:一个指令、二种位流、三种方式、四样错误。针对以上四句话我们接下来详细分析。在开始解析之前我们先准备两个文件,一个是控制LED闪烁的文件,通过更换引脚约束可以控制不同LED,这样就可以指示是启动MultiBoot位流还是Golden位流。还有一个文件就是uart发送文件,会指示启动的位流格式和启动地址。文件都比较简单,就不列举了,文件详见文后的链接。对于 IPROG 指令目前有三种实现方式,分别为:1)通过约束脚本添加;2)通过ICAPE2原语

OpenFPGA的博客 2105

Orin 10G PHY网络分析

由于调试用的10G PHY,所以整理下分析过程; 1.从Orin devkit 丝印来看RJ45 对应J17 通过搜索 MGBE_PHY_A_N 找到连接的10G PHY, 原理图上标明了MDIO address 为0x0, 使用的PHY 芯片为 Marvel 的AQR113C, 主要特性: 架构: 关键特征: MDC 连接了GPIO26_XFI0_MDC; MDIO 连接了GPIO25_XFI0_MDIO; 通过pinmux_config映射表也可以..

乐于分享 5657

redis 用中文做key_【3y】从零单排学Redis【青铜】

前言只有光头才能变强redis最近在学Redis,我相信只要是接触过Java开发的都会听过Redis这么一个技术。面试也是非常高频的一个知识点,之前一直都是处于了解阶段。秋招过后这段时间是没有什么压力的,所以打算系统学学Redis,这也算是我从零学习Redis的笔记吧。本文力求讲清每个知识点,希望大家看完能有所收获。一、介绍一下Redis首先,肯定是去官网看看官方是怎么介绍Redis的啦...

weixin_39880615的博客 770

记录Android Studio连接华为(nova)手机鸿蒙系统踩过的坑

鸿蒙系统的华为老机子比较麻烦,坑有点多,兄弟们加油!

沉迷单车的追风少年 7922

redis中value大小_【3y】从零单排学Redis【青铜】

前言只有光头才能变强redis最近在学Redis,我相信只要是接触过Java开发的都会听过Redis这么一个技术。面试也是非常高频的一个知识点,之前一直都是处于了解阶段。秋招过后这段时间是没有什么压力的,所以打算系统学学Redis,这也算是我从零学习Redis的笔记吧。本文力求讲清每个知识点,希望大家看完能有所收获。一、介绍一下Redis首先,肯定是去官网看看官方是怎么介绍Redis的啦...

weixin_33911375的博客 211

visio安装包

Microsoft Office Visio 是一款专业的制图软件。利用经过更新的形状、协作工具和数据链接图表,创建专业级图表以简化复杂的信息。

IMSL CNL 7.0.0 (x86-64)Crack

IMSL CNL 7.0.0 (x86-64)Crack intel的算法库破解文件,这是C++版本的破解文件

网易Android提前批笔试备考指南:从基础到工程实践一次讲透

校招笔试是进入大厂的第一道门槛,尤其对于Android开发岗位,它并不追求你写出完整App,而是通过基础题和场景题筛选基本功扎实、具备工程思维的候选人。大厂笔试背后有一套通用逻辑:从Java/Kotlin语言特性、Handler消息机制、Binder跨进程通信,到自定义View与性能优化,再到算法与项目经验,层层递进考察技术深度和落地能力。理解这些原理不仅能应对选择题和编程题,更能在简答题中展现系统性思考。掌握JVM、协程、R8混淆等高频考点,并熟悉Android系统机制与工程化工具链,是提升竞争力的有效路

weixin_34314962的博客 386

ET2012新版免狗免安装绿色软件

ET2012新版免狗免安祖昂绿色软件。,新界面,新视觉,

java象保存到redis_从零单排学Redis「青铜」

原文地址:https://dwz.cn/q8kob902作者:Java3y前言只有光头才能变强最近在学Redis,我相信只要是接触过Java开发的都会听过Redis这么一个技术。面试也是非常高频的一个知识点,之前一直都是处于了解阶段。秋招过后这段时间是没有什么压力的,所以打算系统学学Redis,这也算是我从零学习Redis的笔记吧。本文力求讲清每个知识点,希望大家看完能有所收获。一、介绍一下Red...

weixin_33374400的博客 179

rodert单排学习redis进阶【青铜】

redis之青铜 文章目录前言1.再谈Redis2.为什么要用Redis3.为什么要使用缓存?4.Redis数据结构4.1.SDS简单动态字符串4.1.1.SDS简单动态字符串4.1.2.SDS简单动态字符串好处4.2.Redis 链表和链表节点4.2.2.Redis 链表重点4.3.Redis 字典4.3.1.哈希表4.3.2.Redis rehash(重新散列)4.3.3.重点4.4.跳跃表4.4.1.跳跃表4.4.2.重点4.5.整数集合4.6.压缩列表4.6.1.前言4.6.2.Redis 压缩列

JavaPub 812

从零单排学Redis【黄金】

前言 只有光头才能变强 好的,今天我们要上黄金段位了,如果还没经历过青铜和白银阶段的,可以先去蹭蹭经验再回来: 从零单排学Redis【青铜】 从零单排学Redis【白银】 看过相关Redis基础的同学可以知道Redis是单线程的,很多面试题也很可能会问到“为什么Redis是单线程的还那么快”。 这篇文章来讲讲单线程的内部的原理。 文本力求简单讲清每个知识点,希望大家看完能有所收获 一、基础...

3y 644

从零单排学Redis【白银】

前言 只有光头才能变强 今天继续来学习Redis,上一篇从零单排学Redis【青铜】已经将Redis常用的数据结构过了一遍了。如果还没看的同学可以先去看一遍再回来~ 这篇主要讲的内容有: Redis服务器的数据库 Redis对过期键的处理 Redis持久化策略(RDB和AOF) 本文力求简单讲清每个知识点,希望大家看完能有所收获 一、Redis服务器中的数据库 我们应该都用过MySQL,M...

3y 647

从零单排学Redis【铂金一】

前言 只有光头才能变强 好的,今天我们要上铂金段位了,如果还没经历过青铜和白银和黄金阶段的,可以先去蹭蹭经验再回来: 从零单排学Redis【青铜】 从零单排学Redis【白银】 从零单排学Redis【黄金】 这篇文章主要讲的是Redis主从复制。因为Redis集群的知识点有点多,所以铂金上分得要好几篇~ 文本力求简单讲清每个知识点,希望大家看完能有所收获 一、主从架构 1.1为什么要主从架...

3y 614
上一篇: 【Java】几道常见的秋招面试题
下一篇: COW奶牛!Copy On Write机制了解一下
Java3y
Java3y 领域专家: 后端开发技术领域 领域专家: 后端开发技术领域
博客等级 码龄9年 1万+粉丝 509原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值