why
使用redis,主要是从两个角度去考虑:性能和并发。当然,redis还具备可以做分布式锁等其他功能,但是如果只是为了分布式锁这些其他功能,完全还有其他中间件(如zookpeer等)代替,并不是非要使用redis。因此,这个问题主要从性能和并发两个角度去答。
性能
(一)纯内存操作
(二)单线程操作
并发
在大并发的情况下,所有的请求直接访问数据库,数据库会出现连接异常。这个时候,就需要使用redis做一个缓冲操作,让请求先访问到redis,而不是直接访问数据库。
what
数据类型
(一)String
这个其实没啥好说的,最常规的set/get操作,value可以是String也可以是数字。
(二)hash
这里value存放的是结构化的对象,比较方便的就是操作其中的某个字段。
(三)list
使用List的数据结构,可以做简单的消息队列的功能。
(四)set
因为set堆放的是一堆不重复值的集合。所以可以做全局去重的功能。
(五)sorted set
sorted set多了一个权重参数score,集合中的元素能够按score进行排列。
快
(一)纯内存操作
避免大量访问数据库,减少直接读取磁盘数据,redis 将数据储存在内存里面,读写数据的时候都不会受到硬盘 I/O 速度的限制,所以速度快;
(二)单线程操作
避免了不必要的上下文切换和竞争条件,也不存在多进程或者多线程导致的切换而消耗 CPU,不用去考虑各种锁的问题,不存在加锁释放锁操作,没有因为可能出现死锁而导致的性能消耗;
(三)采用了非阻塞I/O多路复用机制
IO多路复用模型是建立在内核提供的多路分离函数select基础之上的,使用select函数可以避免同步非阻塞IO模型中轮询等待的问题。
举个栗子:你是一个老师,你需要检查30个学生的作业
第一种:从1到30一次检查作业,如果其中某个学生没有做完,需要等待其做完后再向后检查作业
第二种:再找其他老师,一个老师检查一个学生
第三种:你在讲台上坐着,哪个学生做完作业之后,举手示意,你去检查,其他没有检查的学生依次排队等待检查(多路复用)
持久化
为什么要做持久化?
因为redis会存在内存里面,而存在内存文件中的数据会因为断点而丢失数据,所以需要做持久化
一、RDB
对内存中的数据做快照,保存的是数据
RDB 在恢复大数据集时的速度比 AOF 的恢复速度要快。
二、AOF
对每一条命令进行保存,保存的是命令,对比RDB明显需要保存的内容变少了
内存回收
随着redis的使用,可用内存也会一直减少,Redi s 也会因为内存不足而产生错误 , 也可能因为回收过久而导致系统长期的停顿,因此掌握执行回收策略十分有必要。
过期删除分为两种
消极:被访问时发现过期了,删除
积极:轮询删除,随机抽取20个进行删除。。
导图
一起交流,共同进步!