最近在深入学习redis,以前只是用过,没有整理过,现在整理一下,方便以后面试时复习。
1.redis是什么?
打开redis的官网(https://redis.io/topics/introduction),可以看到 redis是一款--【开源的(BSD许可)内存数据结构存储,用作数据库,缓存和消息代理。】,是基于内存的数据存储,主要用于缓存,数据库和消息代理三方面。
2.为什么要用redis?他有哪些特色,是非用不可吗?
redis 存储数据的格式是以 **键值对**(key-value)的形式而存在的,这与java的Map类似,但是二者还是有区别的
2.1 缓存分为本地缓存和分布式缓存,Java实现的Map是本地缓存,轻量以及快速,生命周期随着jvm的销毁而结束,并且在多实例的情况下,每个实例都需要各自保存一份缓存,缓存不具有一致性;Redis实现的是分布式缓存,如果有多台实例(机器)的话,每个实例都共享一份缓存,缓存具有一致性。
2.2 Java实现的Map不是专业做缓存的,JVM内存太大容易挂掉的。一般用做于容器来存储临时数据,缓存的数据随着JVM销毁而结束。Map所存储的数据结构,缓存过期机制等等是需要程序员自己手写的。Redis是专业做缓存的,可以用几十个G内存来做缓存。Redis一般用作于缓存,可以将缓存数据保存在硬盘中,Redis重启了后可以将其恢复。原生提供丰富的数据结构、缓存过期机制等等简单好用的功能。具体以下
2.2.1 Redis 可以用几十 G 内存来做缓存,Map 不行,一般 JVM 也就分几个 G 数据就够大了
2.2.2Redis 的缓存可以持久化,Map 是内存对象,程序一重启数据就没了
2.2.3 Redis 可以实现分布式的缓存,Map 只能存在创建它的程序里
2.2.4 Redis 可以处理每秒百万级的并发,是专业的缓存服务,Map 只是一个普通的对象
2.2.5 Redis 缓存有过期机制,Map 本身无此功能
2.2.6 Redis 有丰富的 API,Map 就简单太多了
3.为什么要用到缓冲?
现在的网站或者app,随着用户访问量的增大,导致后台响应越来越慢,此时很可能的原因就是我们的数据服务器撑不住了,不停的IO读写操作,还是不足以支撑系统的快速反响。此时就需要用到缓冲了,缓存数据暂时存放在内存中,而数据库的IO操作是基于磁盘的操作,操作响应时间长,所以引入缓冲,能极大的提高系统的响应速度已经提高并发。
4.redis的数据结构
Redis支持丰富的数据结构,常用的有string、list、hash、set、sortset这几种。学习这些数据结构是使用Redis的基础!
首先还是得声明一下,Redis的存储是以key-value的形式的。Redis中的key一定是字符串,value可以是string、list、hash、set、sortset这几种常用的。
5.Redis中数据结构的对象
5.1字符串(stirng)对象
在上面的图我们知道string类型有三种编码格式:
int:整数值,这个整数值可以使用long类型来表示
如果是浮点数,那就用embstr或者raw编码。具体用哪个就看这个数的长度了
embstr:字符串值,这个字符串值的长度小于32字节
raw:字符串值,这个字符串值的长度大于32字节
embstr和raw的区别:
raw分配内存和释放内存的次数是两次,embstr是一次
embstr编码的数据保存在一块连续的内存里面
编码之间的转换:
int类型如果存的不再是一个整数值,则会从int转成raw
embstr是只读的,在修改的时候回从embstr转成raw
5.2列表(list)对象
在上面的图我们知道list类型有两种编码格式:
ziplist:字符串元素的长度都小于64个字节&&总数量少于512个
linkedlist:字符串元素的长度大于64个字节||总数量大于512个
编码之间的转换:
原本是ziplist编码的,如果保存的数据长度太大或者元素数量过多,会转换成linkedlist编码的。
5.3哈希(hash)对象
在上面的图我们知道hash类型有两种编码格式:
ziplist:key和value的字符串长度都小于64字节&&键值对总数量小于512
hashtable:key和value的字符串长度大于64字节||键值对总数量大于512
编码之间的转换:
原本是ziplist编码的,如果保存的数据长度太大或者元素数量过多,会转换成hashtable编码的。
5.4集合(set)对象
在上面的图我们知道set类型有两种编码格式:
intset:保存的元素全都是整数&&总数量小于512
hashtable:保存的元素不是整数||总数量大于512
编码之间的转换:
原本是intset编码的,如果保存的数据不是整数值或者元素数量大于512,会转换成hashtable编码的。
5.5有序集合(sortset)对象
在上面的图我们知道set类型有两种编码格式:
ziplist:元素长度小于64&&总数量小于128
skiplist:元素长度大于64||总数量大于128
编码之间的转换:
原本是ziplist编码的,如果保存的数据长度大于64或者元素数量大于128,会转换成skiplist编码的
5.6Redis对象一些细节
(1:服务器在执行某些命令的时候,会先检查给定的键的类型能否执行指定的命令。
比如我们的数据结构是sortset,但你使用了list的命令。这是不对的,服务器会检查一下我们的数据结构是什么才会进一步执行命令
(2:Redis的对象系统带有引用计数实现的内存回收机制。
对象不再被使用的时候,对象所占用的内存会释放掉
(3:Redis会共享值为0到9999的字符串对象
(4:对象会记录自己的最后一次被访问时间,这个时间可以用于计算对象的空转时间。