一 缓存
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.字符串类型:
1.1是什么:最基本的数据类型,它能存储任何形式的字符串(简单字符串,复杂字符串-json,XML),数字(整数,浮点数),和二进制数据(图片,视频,音频)。一个字符类型键允许存储的最大容量是512M
1.2内部数据结构:int(存放整型数据)/ SDS(simple dynamic string,存放字节/字符串和浮点型数据,使用C语言封装,不同长度的SDS使用不同sdshdr类型(提供5种:sdshdr5,sdshdr8-默认,即存放2的8次方-1的长度,sdshdr16,sdshdr32,sdshdr64))
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都能够存储多个数据元素。
2.3 应用场景:
a.生产者,消费者场景-分布式队列
b.栈
c.队列
3.Hash 哈希
3.1 是什么-hashMap
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,用来排序
5.2 应用场景:
a.排名
b.新闻列表
5.3 数据结构
zset类型的数据结构就比较复杂一点,内部是以ziplist或者skiplist+hashtable来实现,这里面最核心的一个结构就 是skiplist,也就是跳跃表