Redis的简介
Redis(Remote Dictionary Server)是用C语言开发的一个开源的高性能键值对数据库。它的所有数据都是保存在内存中的,这也就决定了其读写速度之快,是其它硬盘保存数据的系统所无法匹敌的。
官方曾经给出过一组测试数据,50个并发执行100000个请求: 读的速度是110000次/s,写的速度是81000次/s,正是由于其有着如此高的性能,所以Redis在企业中最大的一个应用是作为缓存服务器使用,当然它也可以作为数据存储和消息中间件来用。
Redis的安装
- 下载安装包并解压:
Reids官网地址:http://redis.io
中文网地址:https://www.redis.net.cn/
GitHub地址:https://github.com/MSOpenTech/redis/tags - 文件介绍
- 启动
- 测试连通性
Redis的存储结构
Redis采用的是键值进行存储的,键只能是String类型,值支持五种数据类型:
- String 字符串
- Hash 哈希 -------- HashMap
- List 列表 -------- LinkedArrayList 有序,可重复的
- Set 集合 -------- HashSet 无序,不可重复的
- ZSet 有序集合 -------- LinkedHashSet 有序,不可重复的
Redis持久化的方式
什么是持久化?
- Rides的数据都是存储在内存之中的,一旦出现宕机,数据势必会出现丢失,因此需要持久化操作,也就是将Redis存储在内存中的数据写到硬盘上进行保存。
- 注意:虽然Redis有持久化操作,但是其本身数据依然存储在内存中,硬盘上的数据是为了安全和备份。
RDB持久化(Redis DataBase)
- 通过配置文件来设置一些特定的条件,一旦Redis满足这些条件便会触发RDB快照机制,将Redis此时刻的数据持久化到磁盘的文件夹当中。
- 工作机制:
当RDB持久化条件满足时,Redis会创建一条子线程专门负责持久化数据(将当前内存中的数据写到磁盘),这个过程中Redis会创建一个rdb备份文件,而不是改变原有的rdb文件,当新的rdb文件备份完毕后,Redis会将旧的文件给替换为新的备份文件
AOF持久化(Append Only File)
- 它采用日志的形式来记录Redis的每个写操作,并追加到文件中。Redis 重启的时候会根据日志文件的内容将写指令从前到后执行一次以完成数据的恢复工作。
- AOF就是redis会记录每次的写操作。但是写操作一般都是有缓冲的,不会立即写入磁盘,但是可以通过调用系统的fsync()函数强制写入。根据这一特性,redis提供了一个配置来决定什么时候来调用系统的fsync()函数.
** - 工作机制:AOF就是记录每次redis的写操作,然后通过指定的条件将记录下来的操作写到磁盘文件中。
两者比较
- RDB使用快照机制保存数据,也就是它的备份文件一定是某一时刻的完整数据,这种文件比较适合做备份使用。但是redis一旦宕机,就会丢失最后一次快照之后的数据。
- AOF可以通过控制刷新模式最大程度的保证数据完整性,但是相同量的数据,aof的备份文件要远大于rdb,而且做数据回复的时候比rdb要慢的多。
什么是缓存穿透?如何解决?
- 缓存穿透:
查询一个一定不存在的数据,缓存中不存在,则会去数据库中查询,数据库中不存在则不会写入缓存,这导致每次查询都会查询数据库,使缓存失去意义。 - 解决方式:
- 可以使用空对象,当查询为空时,设置一个特殊的值,和真正合法数据区分开,要有一个较短的过期时间。
- 使用过滤器,先查缓存,缓存存在key则返回;不存在则查询过滤器,过滤器存在则说明不存在值,直接返回空,否则查询数据库。
什么是缓存雪崩?如何解决?
- 缓存雪崩:
缓存无法使用导致请求全部到达数据库,导致数据库崩溃。 - 解决方式:
缓存高可用,减少缓存不可用时间;数据库限流;服务降级;
什么是缓存击穿?如何解决?
- 缓存击穿:
某个key失效时,大量的请求进入,将数据库瞬间压垮。 - 解决方式:
使用锁,确保只有一个线程去查询数据库;手动过期,不设置过期时间,所有key手动过期。