01_为什么要用缓存
-
减轻数据库的压力
缓存一般是内存存储数据,所以查询速度快,相比较数据直接冲数据库获取要快很多,可以更快的释放线程,让单位时间内的吞吐量更大,可以大大降低数据库的访问压力。 -
提升请求速度
在目前绝大多数的大型网站中,普遍的使用Redis和MemCache作为数据库缓存,缓存可以替数据库承担一部分请求和压力,提升数据的访问速度从而提升了Web服务器的吞吐量。
- Redis缓存和mybatis二级缓存有什么区别?
mybatis
mybatis缓存是一个项目内部缓存,是不可共享的缓存,在分布式项目中,缓存就没有办法做到共享,会导致每一个服务器都会存一份一模一样的缓存数据,从而导致内存的额外的开销。
Redis
Redis缓存时独立于项目的缓存,可以做到多个项目共享缓存,可以充分利用缓存数据。
02_Redis是什么
Redis是用c语言开发的、基于键值对存储的、高性能的、单线程的(多路复用技术)、非关系型NoSQL数据库(非关系型的数据库),适用于分布式的一种最快缓存技术之一。
- Redis特点:
- Redis的数据存储是基于内存的(速度快),同时也支持持久化(可以将内存的数据存储在文件中)
- Redis虽然是基于Key-Value存储的,但是存储的值支持多种数据结构(key value Map结构)
- Redis支持集群,支持主从模式(master-slave)的数据备份
-
优点:
- redis是基于内存的,性能极高 ,读的速度110000次/s(11 W次/s),写的速度是81000次/s(8.1W次/秒)
- redis虽然存储的是键值对,但是值可以是多种类型
- redis所有的操作都是原子性,同时也可以对多个操作进行合并—原子性操作(Redis事务)
-
缺点:
- 缓存与数据库的数据必须通过两次写操作保持一致性
- 使用缓存会存在缓存穿透、缓存击穿及缓存雪崩等问题
关系:表与表之间的关系 对象和表之间的映射关系
非关系型数据库:不存在表与表之间的关系 也不存在 对象和表之间的关系
03_Redis基本数据结构
Redis中数据是以key-value形式进行存储的,value可以支持多种数据类型
- Redis常用的数据结构有5种:
- 字符串—string
字符串集合 - Map—hash
用来存储Java中的一个完整的自定义对象的对象集合。 - 列表—list
采用的链表结构进行数据存储(左进右出 右进左出) - 无序集合—set
存入set集合中的数据是唯一的,不能有重复的数据。 - 有序集合—zset
如果存入重复数据,则后一个数据会覆盖原有数据。
- 字符串—string
- 三种不常用的的数据结构:
- 计算近似值
- 地理位置: GEO
- 字节数组: BIT
Redis基本数据结构命令:【Redis】Redis基本使用命令及连接Java简单使用.
04_Redis持久化
-
Redis是一个基于内存操作的数据库,当系统重启的时数据会发生丢失,redis提供了2种持久化策略(方案):
-
RDB(默认开启的)
AOF(默认是没有开启的)
-
RDB持久化策略
-
RDB(Redis DataBase):
-
默认持久化策略,即使不配置 那么这个Redis的持久化依然存在,在redis中的操作达到某个条件就会触发自动持久化将redis内存中的数据生成快照存储到rdb文件
- 900s 1次 — 如果操作次数小于10次,大于等于1次,则15分钟才会进行持久化
- 300s 10次 — 如果操作次数小宇10000次,大于等于10次,则5分钟会触发持久化
- 60s 10000次 — 如果操作次数大于等于10000次,则1分钟就会触发持久化
-
默认持久化策略,即使不配置 那么这个Redis的持久化依然存在,在redis中的操作达到某个条件就会触发自动持久化将redis内存中的数据生成快照存储到rdb文件
RDB策略分析
- 如果系统突然崩溃,存在丢失数据的风险(丢失上一次RDB之后的数据)
- RBD数据库默认的持久化模式-----又称为快照模式是采用数据快照进行持久化,不适合实时性持久化,但是数据量小的情况下,执行速度比较快
- 这个模式是将内存的数据内容 直接保存到 dump.rdb这样的一个二进制文件中的,因为保存的是二进制文件、所以做数据的恢复是相当的快的—适合于做数据的备份
- 如果数据量巨大,会导致RDB创建子进程进行持久化时间过长,导致redis卡顿,所以save参数不宜设置过短(也可在redis空闲时手动save)
- 由于RBD是将数据快照文件进行保存,所以可通过复制快照文件轻松实现redis数据移植
-
AOF持久化策略
AOF(Append only File):- Redis默认是没有开启AOF,AOF模式是在redis1.1的版本的时候增加的一种持久化模式。
- AOF在使用的时候保存的不是数据而是操作时的命令,只要使用Redis,那么使用过程中产生的每一个成功命令都会被记录到AOF文件(文件只记录的是操作的命令 ,不记录实际的数据)。
- Redis重启时开始AOF模式的数据恢复,因为要将记录的写操作从头到尾执行一次,所以还原时效率并不高 ,因此数据恢复的话采用rdb文件恢复是最快的,当我们继续成功完成redis的写操作,AOF文件中只做增量保存。
AOF策略分析
- 可通过拷贝aof文件实现数据的移植
- redis官方建议同时开始RDB和AOFd 混合持久化策略
- 如果RDB和AOF文件同时存在,AOF优先即使AOF配置成功,
- 但redis使用频率特别低的情况下依然会使用RDB
05_缓存的淘汰策略
-
缓存的淘汰策略:
redis中的内存已满,现要保证内存中数据一定是最新,那么这时就需要配置淘汰策略。 -
淘汰策略配置属性
maxmemory-policy volatile-lru 这个就是配置缓存的淘汰策略- maxmemory < bytes > :
配置Redis的缓存的大小 - noeviction:
只要缓存满了,就不继续服务器里面的写的请求,读的请求是可以完成的
这种模式缓存里面的所有数据 都不会丢失、但会导致参与Redis的业务会失败 - volatile-lru:
优先淘汰掉设置了过期时间的key,其次淘汰掉使用的比较少的key - allkeys-lfu:
淘汰的是过期时间的key和使用的比较少的key(不分先后) - volatile-ttl:
淘汰key剩余的寿命的ttl值,ttl值越小越先被淘汰 - allkeys-random:
淘汰随机的key
- maxmemory < bytes > :
06_Redis分布式应用
-
当redis发生高并发请求时,一台redis服务器难以满足要求,因此可以通过读写分离来分流redis的访问压力:
- 读写分离中存在最大的问题就是要保证读库数据与写库数据的一致性,我们可以通过主从配置来实现将,写库定义为主库(master),将读库定义为从库(slave),在主从配置中,我们可以配置一主一从,也可以配置一主多从。
-
主从备配置下主库务器发生宕机情况,则会导致参与Redis的业务会失败,为避免此类情况发生,可通过哨兵模式选举主库:
- 哨兵(2n+1个哨兵)监视主库,确认主库是否宕机宕机,倘若宕机则会启动选举,获得最多票数的服务器将选为主库。
-
Redis集群是使用多对Redis一主一从进行负载均衡访问,如果其中一对主库宕机则会用从库当做主库。
-
集群优点:
- 无中心结构
- 数据按照slot存储分布在多个节点,节点间的数据可共享,可以动态调整数据分布;
- 可扩展性强,可扩展至1000+个节点,节点可以动态添加和删除
- 高可用性,部分节点不用时不影响整个集群的可用性;通过slave做数据备份保证数据完整性,也可通过sentinel模式实现主备选举
配置参考:【Linux】Redis安装及分布式配置
07_Redis事务
Redis中的事务具备隔离性和原子性。
-
隔离性:
- 事务在执行过程中不会被其他请求所打断执行。 原子性:
- 要么全部成功、要么全部失败(跟关系型数据的事务原子性有一定理解上的差异。Redis的事务不存 在回滚机制,所以这句话跟传统意义的效果有一定的差异)。
multi //开启事务
exec //结束事务
Redis事务 是没有事务回滚概念。因为Redis语法简单, 不会出现运行异常,即使出现语法异常是不会导致事务回滚。
08_发布订阅模式
这个功能实际上就是MQ的功能,在开发中几乎不用
subscribe 订阅的频道的名称
publish 频道名字 内容
Redis官网简介: https://redis.io/topics/introduction/
Redis官网集群教程: https://redis.io/topics/cluster-tutorial