Redis

189 阅读5分钟

redis分布式缓存

1.什么是缓存(Cache) 定义:就是计算机内存中一段数据

2.内存中数据特点 1.读写快 2.断电立即丢失

3.缓存解决了什么问题?

​ 1.提高网站吞吐量提高网站运行效率 ​ 2.核心解决问题:缓存的存在是用来减轻数据库访问压力

4.既然缓存能提高效率,那项目中所有数据加入缓存岂不是更好?

​ 注意:使用缓存时一定 是数据库中数据极少发生修改,更多用于查询这种情况

5.本地缓存和分布式缓存区别? 本地缓存:存在应用服务器内存中数据称之为本地缓存 (local cache)

​ 分布式缓存:存储在当前应用服务器内存之外数据称之为分布式缓存 (distribute cache)

集群:将同一种服务的多个节点放在一起共同对系统提供服务过程称之为集群

分布式:有多个不同服务集群共同对系统提供服务这个系统称之为分布式系统 (fistribute system)

6.利用mybatis自身本地缓存结合redis实现分布式缓存 a. mybatis中应用级缓存(二级缓存) SqlSessionFactory 级别缓存所有 会话共享 b.如何开启(二级缓存)? 只需要在mapper中加上 标签

​ c.查看Cache标签缓存实现 ​ 结论:mybatis 底层默认使用的是 org. apache. ibatis. cache . imp1.Perpe tualCache 实现

​ d.自定义Rediscache实现 ​ 1.通过mybatis默认cache源码得知可以使用自定义Cache类implements Cache接口并对里面方法进行实现 ​ 2.使用RedisCache实现

redis的优势和特点

  • redis 数据读写速度非常快,因为它把数据都读取到内存当中操作,而且 redis 是用 C 语言编写的,是最“接近“”操作系统的语言,所以执行速度相对较快。
  • redis 虽然数据的读取都存在内存当中,但是最终它是支持数据持久化到磁盘当中。
  • redis 提供了丰富的数据结构。
  • redis 的所有操作都是原子性,支持事务,所谓的原子性就是对数据的更改要么全部执行,要么全部不执行。
  • redis 支持主从复制,主机会自动将数据同步到从机,可以进行读写分离。

Redis 的数据结构

集合(set):

set 是 string 类型的无序集合,不同于 list,set 中的元素不可以重复。

哈希表(hash):

hash 类似于 java 中的 map,是一个键值对集合,在 redis 中可以用来存储对象。

列表(list):

list 是一个链表结构,主要功能是 push、pop 获取一个范围的所有值等等。操作中 key 理解为链表的名字。

有序集合(zset):

zset 和 set 一样,也是 string 类型的元素的集合,不同的是ZSET中的每个元素都会关联一个 double 类型的分数,zset 中的成员都是唯一的,但是所关联的分数可以重复。

字符串(string):

string 是 redis 中最基本的数据类型,redis 中的 string 类型是二进制安全的,即它可以包含任何数据,比如一个序列化的对象甚至一个图片(注意的是 redis 中的字符串大小上限是 512M)。

缓存雪崩

缓存雪崩:

缓存雪崩是指在我们设置缓存时key采用了相同的过期时间,导致缓存在某一时刻同时失效,请求全部转发到DB,DB瞬时压力过重雪崩。

解决:

原有的失效时间基础上增加一个随机值,比如1-5分钟随机,这样每一个缓存的过期时间的重复率就会降低,就很难引发集体失效的事件。

缓存穿透

缓存穿透:

指查询一个一定不存在的数据,由于缓存是不命中,将去查询数据库,但是数据库也无此记录,我们没有将这次查询的null写入缓存,这将导致这个不存在的数据每次请求都要到存储层去查询,失去了缓存的意义

风险:

利用不存在的数据进行攻击,数据库瞬时压力增大,最终导致崩溃

解决:

null结果缓存,并加入短暂过期时间

缓存击穿

缓存穿透:

对于一些设置了过期时间的key,如果这些key可能会在某些时间点被超高并发地访问,是一种非常“热点”的数据。如果这个key在大量请求同时进来前正好失效,那么所有对这个key的数据查询都落到db,我们称为缓存击穿。

解决:

加锁:大量并发只让一个去查,其他人等待,查到以后释放锁,其他人获取到锁,先查缓存,就会有数据,不用去db

Redis事务三特性.

单独的隔离操作 事务中的所有命令都会序列化、按顺序地执行。事务在执行的过程中,不会被其他客户端发送来的命令请求所打断。·

没有隔离级别的概念 队列中的命令没有提交之前都不会实际被执行,因为事务提交前任何指令都不会被实际执行·

不保证原子性· 事务中如果有一条命令执行失败,其后的命令仍然会被执行,没有回滚·

Redis主从复制配置

主从复制:主从复制架构仅仅用来解决数据的冗余备份,从节点仅仅用来同步数据

Redis哨兵机制