redis基础

一 缓存

1.是什么:内存级别,读取非常快(阿里使用redis--多级缓存。参考链接:https://www.jianshu.com/p/cc204dbefb74)

2.种类:应用内缓存(hashMap,EH cache)--java第三方库

缓存组件(memached,redis)

 

二 redis基础

1.remote dictionary server(远程字典服务器),它以字典结构存储数据,并允许其他应用通过TCP协议读写字典中的内容,是一种基于key-value的高性能(纯内存+多路复用IO+单线程)分布式存储系统。

2.redis实例提供0-15个数据库-db(16个db就是16个不同类型的数据库,但区分于传统数据库,其实就是命名空间,并没有完全隔离),每个db里放key-value形式的数据,key是string类型,value有5种类型(类型多,区别于memached):已弱化,基本使用默认0数据库

3.redis持久化:虽然是内存级别,但是服务器崩了,会把数据放到硬盘

4.redis可以发布-订阅

redis基础_第1张图片

三 redis数据类型

1.字符串类型:

1.1是什么:最基本的数据类型,它能存储任何形式的字符串(简单字符串,复杂字符串-json,XML),数字(整数,浮点数),和二进制数据(图片,视频,音频)。一个字符类型键允许存储的最大容量是512M 

1.2内部数据结构:int(存放整型数据)/ SDS(simple dynamic string,存放字节/字符串和浮点型数据,使用C语言封装,不同长度的SDS使用不同sdshdr类型(提供5种:sdshdr5,sdshdr8-默认,即存放2的8次方-1的长度,sdshdr16,sdshdr32,sdshdr64))

redis基础_第2张图片

 

1.3 使用场景

a.不同web服务器session共享

b.ip限制和短信验证时间限制:使用incr递增形式

c.命名 key命名重复

d.计数:incr递增形式 

 

 

2.列表list

2.1 是什么:列表类型内部使用双向链表实现,所以向列表两端添加元素的时间复杂度为O(1), 获取越接近两端的元素速度就越 快。如果数据量很大,列表中间的数据读取较慢。

2.2 内部数据结构

redis3.2之前,List类型的value对象内部以linkedlist或者ziplist来实现, 当list的元素个数和单个元素的长度比较小 的时候,Redis会采用ziplist(压缩列表)来实现来减少内存占用。否则就会采用linkedlist(双向链表)结构。

 

redis3.2之后,采用的一种叫quicklist的数据结构来存储list,列表的底层都由quicklist实现。 这两种存储方式都有优缺点,双向链表在链表两端进行push和pop操作,在插入节点上复杂度比较低,但是内存开 销比较大; ziplist存储在一段连续的内存上,所以存储效率很高,但是插入和删除都需要频繁申请和释放内存;

 

quicklist仍然是一个双向链表,只是列表的每个节点都是一个ziplist(有压缩节点ziplist,非压缩节点quicklistLZF),其实就是linkedlist和ziplist的结合,quicklist 中每个节点ziplist都能够存储多个数据元素。

 


redis基础_第3张图片

2.3 应用场景:

a.生产者,消费者场景-分布式队列

b.栈

c.队列

 

3.Hash 哈希

3.1 是什么-hashMap


redis基础_第4张图片

3.2 数据结构

a.ziplist:数据量小

b.hashtable:数据量大

 

dictEntry  

管理一个key-value,同时保留同一个桶中相邻元素的指针,用来维护哈希桶的内部链;

 

dictht  

实现一个hash表会使用一个buckets存放dictEntry的地址,一般情况下通过hash(key)%len得到的值就是buckets的 索引,这个值决定了我们要将此dictEntry节点放入buckets的哪个索引里,这个buckets实际上就是我们说的hash 表。dict.h的dictht结构中table存放的就是buckets的地址

 

dict  

dictht实际上就是hash表的核心,但是只有一个dictht还不够,比如rehash、遍历hash等操作,所以redis定义了 一个叫dict的结构以支持字典的各种操作,当dictht需要扩容/缩容时,用来管理dictht的迁移

 

比如我们要讲一个数据存储到hash表中,那么会先通过murmur计算key对应的hashcode,然后根据hashcode取 模得到bucket的位置,再插入到链表中 

 

4.集合类型 set

4.1 数据结构

a.intset

b.hashtable(key,value(null)),只用key,value为空

 

4.2 使用场景

a. 标签

b. 定点推送

c. diff

 

5.有序集合

5.1 是什么,value会有一个score,用来排序

redis基础_第5张图片

 

5.2 应用场景:

a.排名

b.新闻列表

 

5.3 数据结构

zset类型的数据结构就比较复杂一点,内部是以ziplist或者skiplist+hashtable来实现,这里面最核心的一个结构就 是skiplist,也就是跳跃表 


redis基础_第6张图片

你可能感兴趣的:(----【Java】)