概念(是什么)
Redis是一个C语言写的非关系型数据库,支持网络,可基于内存,key-value键值对类型的数据库。
redis数据存在内存中,读写超快,广泛用于缓存。
作用(能干什么)
缓存
计数器
排行榜
去重
消息队列
分布式锁
Redis线程模型
6.0之前是单线程;也就是处理用户连接请求与与读写操作都是一个线程完成的
6.0之后是多线程;这里处理用户网络请求采用了多线程,读写操作实质上还是单线程,
所以Redis依然是并发安全的
为什么Redis是单线程模型速度也很快?
1.Redis是基于内存进行操作的,所以性能很高
2.Redis底层是哈希表结构,查找修改速度很快
3.单线程避免了上下文切换,省去了时间与性能上的开销,并且不会发生死锁情况
Redis持久化
1.RDB方式
以快照形式将某一时刻的数据保存到一个rdb文件中,持久化到磁盘。
可以在配置文件(redis.conf)中自行配置 save m n 即在m秒内数据集被修改n次将自动触发rdb持久化,也可以在客户端中通过手动save命令触发rdb持久化。不需要时只需注释掉所有save行。
2.AOF方式
以日志形式将redis执行过的每一条指令记录到一个aof文件中,redis启动时就会读取该文件重新将日志中的指令重新执行一次来实现redis持久化。
启用方式
修改配置文件开启AOF机制(默认关闭)
appendonly no 找到这一行代码将no改成yes
appendfilename appendonly.aof 后面是文件名,可以自行修改
AOF同步机制
appendfsync always 每次修改都会同步,消耗性能
appendfsync eyerysec 每秒进行一次同步操作,有可能会丢失这一秒的数据
Redis和Mysql如何保证数据一致
延时双删
1.先删除redis缓存数据
2.更新mysql数据
3.延时几百毫秒后再次删除redis中的数据
这样就算有线程读取的没有及时更新的mysql中的数据也会在短暂延时后再次删除。
Redis事务
为了保证一组中的多条命令作为一个整体执行,即使在这个整体中有命令执行错误也不会影响其余命令的执行。
举个例子:一个家长让自己的孩子(a,b,c)去食堂吃饭,如果不开启事务,这三个孩子可能不会紧挨着,也就是可能有其他孩子插队(a,x,b,y,c),但是一旦开启事务,那么无论其他孩子怎么插队,也不会改变abc紧挨的队形。
multi(开启事务)
set a 1
set b 2
set c 3
exec(提交事务)
java代码实现事务控制
redisTemplate.multi();//开启redis事务
//命令1
//命令2
//命令3
redisTemplate.exec();//提交redis事务
主从复制
redis集群,就是以其中一台Redis服务器作为主机,剩余的作为从机,将主机数据复制到从机中,主机即为主节点,从机为从节点,数据复制是单向的,只能由主节点到从节点间。
一主多从,实现数据的备份,如果其中一台机器宕机,其余机器还可以正常运转,以保证数据的完整。主机支持读写,从机只能对主机数据进行读取和同步。
主从复制的作用
1.当主节点出现问题时,可以由从节点提供服务,实现快速地故障恢复
2.实现负载均衡,在主从复制的基础上,配合读写分离,由主节点提供写服务,从节点提供读服务,分担服务器负载
哨兵机制
哨兵是redis集群中的一个进程,哨兵机制的原理就是通过哨兵发送命令,等待Redis服务器回应,从而监视多个Redis实例,如果主机出现宕机情况时,哨兵机制会在从机中选举一个从机作为主机。
哨兵集群,redis集群中配置多个哨兵,哨兵监视多个Redis服务器,同时哨兵间互相监视。
KEY过期策略
Redis同时使用以下两种过期策略
1.惰性策略
某个键过期后,不会立刻删除,而是等到下一次被使用时才会删除。缺点是浪费内存,还要维护一个字段记录key是否过期
2.定时策略
每隔一定时间自动扫描一定数量过期的key,通过调整定时扫描的时间间隔和每次扫描的限定时耗,可以使CPU和内存资源达到最优
缓存穿透、缓存击穿、缓存雪崩
1.缓存穿透
数据在mysql中不存在,查询redis没有,还是会查询mysql,从而压垮数据库。
数据库没有,redis也没有
解决办法:
对请求数据进行校验,拦截非法请求
在redis中设置一对key-null,就不会反复去mysql中查找了。
2.缓存击穿
在mysql中存在,在redis中某个时间过期了,就会访问mysql,如果请求量大,就可能把后端数据库压垮
解决办法:
热点数据永远不过期
在第一个请求查询数据库时进行加锁,第一个访问到之后放入缓存,就不会再次查询 数 据库了
3.缓存雪崩
高并发情况下,大量缓存失效,数据库调用量暴增,压垮数据库。
解决办法:
随机设置key的失效时间,避免大量key同时失效
设置定时任务,当缓存快要失效时,重新设置失效时间
不设置过期
集群部署,将数据分布在不同Redis库中