SpringBoot学习总结(五)-详解Redis

61 阅读5分钟

开启掘金成长之旅!这是我参与「掘金日新计划 · 2 月更文挑战」的第 6 天,点击查看详情

在文章(二)中笼统描述了Redis整合与缓存相关知识,本文将详细描述redis在我的项目中都做过什么以及自己对redis的理解内容;

redis知识点:

Redis速度为啥这么快:redis是存在内存中的Key-Value操作,CPU速度远比内存速度要快,性能瓶颈取决于设备内存与网络带宽,同时使用单线程操作,避免在线程上下文切换影响效率,redis的单线程是指网络请求模块使用单线程处理所有网络请求,其他同样是使用多线程,使用非阻塞IO-IO多路复用也大大提高了效率;

关于非阻塞IO与IO多路复用的理解:非阻塞IO是指在多个连接建立完成时redis并不会等待建立完成之后才会处理相关操作,而是探测哪个建立好的连接已经接收到了请求数据,这里是单线程操作,完成操作返回结果后在执行探寻,处理操作,这样IO操作时间会节省很多,内存处理事件也非常快; 图片.png

IO复用是为了解决非阻塞IO导致CPU占用过高的问题,使用多个网络连接复用一个线程,实现了一个线程监听多个文件句柄,当某个文件句柄就绪后通知程序完成对应操作,当没有文件句柄就绪时会阻塞应用程序,达到降低CPU占用目的;

图片.png

Redis数据结构详细解释:

String:redis中最基础的数据类型(Key-Value),由于底层使用C语言char[]实现,可以存储图片,json对象等各种格式数据,支持get,set,del操作;最大容量为512M;可以通过String类型实现分布式锁,计数器等功能;

Hash:hash支持key-field-value存储,更加适合存储对象信息,并且支持单独获取或更改单个value;支持Hset,Hget,Hdel,HgetAll操作;

图片.png

list:list支持存储多个有序的字符串,按插入顺序排序,可以添加元素到列表头部或尾部,底层为链表结构,越接近两端速度越快,支持Lpush,Rpush,Lindex等操作

图片.png

Set:String类型的无序集合,通过哈希表实现,存储不重复的值的集合,没有顺序,通过SADD,SMEMBERS等命令进行操作;

图片.png

Zset:sortedSet,和set一样为String类型的有序集合,不允许重复,本质是每个元素会关联一个double类型的分数,通过该分数来进行排序,可以ZADD,ZRANGE,ZREM等命令进行操作,常用来存储积分排行类数据,不常用;

图片.png

Redis过期策略

redis中可以设置过期时间是众所周知的事情,可以通过设置过期时间来适应许多应用场景,例如短信验证码的过期时间,登录状态定时清除,通过过期监听完成订单倒计时等等场景,那么删除时是如何完成的?

redis支持主要两种过期测策略:定期删除,惰性删除,定期删除时redis会每隔100ms随机抽取一些过期时间的key判断是否过期,过期则删除,随机获取可以减轻CPU负载压力;惰性删除是因为定期删除可能过期的key到时间之后并没有被删除掉,当你获取key时会进行检查是否需要删除;但是即使两种过期策略可以覆盖绝大多数key,如果数据库本身存储的数据量十分巨大,一定会有一定量的数据过期之后定期删除没有完成删除,在很长时间内也没有进行访问,会导致大量无用数据保留下来,占用内存,这时redis有一种缓存淘汰策略;

redis一共提供了8中缓存淘汰策略
noeviction:不淘汰数据,当缓存被写满时直接返回错误信息;
volatile-ttl:设置过期时间的数据中移除即将过期的键值对;
volatile-random:设置过期时间的数据中随机移除;
volatile-lru:设置过期时间的数据中移除最少使用的数据;
volatile-lfu:设置过期时间的数据中移除最近最不频繁使用的数据;
allkeys-random:在所有数据中随机移除;
allkeys-lru:在所有数据中移除最少使用的数据;
allkeys-lfu:在所有数据中移除最近最不频繁使用的数据;
Redis持久化策略

redis作为一个内存数据库,当坐在服务器发生断点或者服务器宕机时,会发生丢失数据的问题,redis同样提供了两种持久化的方案;

AOF:(append only file)AOF做的是保存客户端写操作命令的日志,加在appendonly.aof文件末尾,在redis重启时,会加载该文件达到恢复缓存数据的目的;该方式默认不开启,需要配置文件追加配置开启;开启之后可以设定是否自动修复缓存数据,或者手动触发修复操作;该方式数据安全性高,文件可读,但是保留日志会耗费内存,速度较慢;

RDB:(Redis Database)存储快照数据,在指定时间间隔将内存数据写入到磁盘中,与AOF同样需要到配置文件进行配置开启,开启后会保存快照信息到指定的文件中,还可以手动通过命令来触发存储快照操作,配置好文件的存放路径重启服务,会将文件中的数据加载进内存,该方式数据恢复快,体积较AOF也小,但是无法做到实时持久化,会丢失最后一次时间间隔内的数据信息,保存的文件是二进制文件,不能读取;