reids的入门学习1

最近在深入学习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:对象会记录自己的最后一次被访问时间,这个时间可以用于计算对象的空转时间。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值