Redis知识总结

Redis知识总结

什么是Redis

Redis 是开源的在内存中的数据结构存储系统,可以用作数据库,缓存,消息中间件
基于C语言开发,运行时在内存中,运行速度很快
redis可以存储键和五种不同类型的值之间的映射。
键的类型只能为字符串,值支持五种数据类型:字符串,列表,集合,散列表,有序集合。
与传统的数据库不同的是Redis的数据是存在内存中的,所以读写速度非常快。

为什么要用Redis

主要是从高性能和高并发这两个点来看待问题
高性能:如果用户第一次访问数据库中的某些资源,这个过程会比较慢,因为是从硬盘上读取的。将该用户访问的数据存在缓存中发,这样下一次在访问这些数据的时候就可以直接从缓存中获取了。操作缓存就是直接操作内存,所以速度相当的快。如果数据库中的对应数据改变之后,同步改变缓存中相应的数据即可,
高并发:直接操做缓存能够承受的请求是远远大于直接访问数据库的,所以我们可以考虑把数据库中的部分数据转移到缓存中去,这样用户的一部分请求会直接到缓存这里而不用经过数据库。
Redis时单进程单线程的

使用redis的优势

  1. 速度快,因为数据存储在内存中,类似于HashMap
  2. 支持丰富的数据类型
  3. 支持事务,操作都是原子性
  4. 丰富的特性:可用于缓存,消息中间件,按key设置过期时间,过期后自动删除

什么是Redis持久化

持久化就是把内存中的数据写到磁盘中去,防止服务宕机了内存数据丢失。

Redis的持久化机制是什么?

Redis提供两种持久化机制 RDB(默认)和 AOF机制:

RDB:是Redis默认的持久化方式。按照一定的时间将内存的数据以快照的形式保存到磁盘中。
存在的问题有:数据安全性低。RDB是间隔一段时间进行持久化,如果持久化之间redis发生故障,会发生数据丢失。所以这种方式更适合数据要求不严谨的时候。

AOF:则是将Redis执行的每次写命令记录到单独的日志文件中,当重启Redis会重新将持久化的日志文件中文件恢复数据。
当两种方式同时开启时,数据恢复Redis会优先选择AOF恢复

如何选择合适的持久化方式

  • 一般来说,如果想达到足以媲美的数据安全性,应该同时使用两种持久化功能。在这种情况下,当Redis重启的时候会优先加载AOF文件来恢复原始的数据,因为在通常情况下AOF文件保存的数据集要比RDB文件保存的数据要完整
  • 如果你非常关心你的数据,但仍然可以承受数分钟以内的数据丢失,那么你可以使用RDB持久化。
  • 有很多用户都只使用AOF持久化,但并不推荐这种方式,因为定时生成的RDB快照非常便于进行数据库备份,并且RDB恢复数据集的速度也要比AOF恢复的速度快,除此之外,使用RDB还可以避免AOF程序的BUG
  • 如果你只希望你的数据在服务器运行的时候存在,你可以不使用持久化

过期键的删除策略

定时过期:每个设置过期时间的key都需要创建一个定时器,到过期时间就会立即清除。该策略可以立即清除过期的数据,对内存很友好;但是会占用大量的CPU资源区处理过期的数据,从而影响缓存的响应时间和吞吐量。

惰性过期:只有当访问一个key时,才会判断该key是否已过期,过期则清除。该策略可以最大化的节省CPU资源,却对内存非常不友好;极端的情况可能会出现大量的key没有再次被访问,从而不会被清除,占用大量内存。

定期过期:每隔一定的时间,会扫描一定数量的数据库中的key,并清除其中已过期的key。该策略时前两者的一个折中方案。通过调整定时扫描的时间间隔和每次扫描的限时耗时,可以在不同情况下是的cpu和内存资源达到最优的平衡效果

Redis中使用了惰性过期和定期过期两种过期策略

Redis内存淘汰策略

Redis的内存淘汰策略的选取并不会影响过期的key的处理,内存淘汰策略用于处理内存不足时的需要申请额外空间的数据。
过期策略用于处理过期的缓存数据

Redis中的内存淘汰策略有哪些

全局的键空间选择性移除

  • noeviction:当内存不足以容纳新写入数据时,新写入操作会报错
  • allkeys-lru:当内存不足以容纳新写入数据时,在键空间中,移除最近最少使用的key(最常用)
  • allkeys-random:当内存不足以容纳新写入数据时,在键空间中,随机移除某个key

设置过期时间的键空间选择性移除

  • volatile-lru:当内存不足以容纳新写入数据时,在设置了过期时间的键空间中,移除最近最少使用的key
  • volatile-random:当内存不足以容纳新写入数据时,在设置了过期时间的键空间中,随机移除某个key
  • volatile-ttl:当内存不足以容纳新写入数据时,在设置了过期时间的键空间中,有更早过期的时间的key先移除

Redis的内存用完了会发生什么

如果达到设置的上限,Redis写命令会返回错误信息(但是读命令还可以正常返回)
或者可以配置内存淘汰机制,当Redis达到内存上限时会冲刷掉旧的内容。

什么是事务

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

事务是一个原子操作:事务中的命令要么全部执行,要么全部都不执行

Redis中的事务

支持一次执行多个命令,一个事务中所有的命令都会被序列化。
Redis事务就是一次性,顺序性,排他性的执行一个队列中的一系列命令。
Redis不支持回滚

Redis事务的三个阶段

1.事务开始
2.命令入队
3.事务执行

Redis事务保证原子性吗,支持回滚吗

Redis中,单个命令是原子性执行的,但事务不保证原子性,且没有回滚。事务中任意命令执行失败,其余的命令仍会被执行。

集群方案

Redis分片

特点:实现动态内存扩容
数据存储机制:redis节点根据IP:端口 + 算法(Hash算法)

Hash一致性

1.均衡性 : 尽可能均匀分片节点中的数据
2.单调性 : 实现数据的动态迁移
3.分散性 : 由于分布式原因,导致不能获取全部节点信息,使得一个key有多个位置
4.负载 : 是分散性另一种表现形式。表现为一个位置有多个key

Redis哨兵机制

功能:实现redis的高可用
机制:心跳检测机制
主要功能:

  1. 集群监控
  2. 消息通知
  3. 故障转移
  4. 配置中心

方案说明:

  1. 通过哈希的方式,将数据分片,每个节点均分存储一定哈希槽(哈希值)区间的数据,默认分配了16384个槽位
  2. 每份数据分片会存储在多个互为主从的多节点上
  3. 数据写入先写主节点,再同步到从节点(支持配置为阻塞同步)
  4. 同一分片多个节点间的数据不保持一致性
  5. 读取数据时,当客户端操作的key没有分配在该节点上时,redis会返回转向指令,指向正确的节点
  6. 扩容时需要把旧节点中的数据迁移一部分到新节点

Redis哨兵机制原理说明

1.首先启动Redis哨兵,由哨兵监控整个Redis主从状态,主要监控M主机,同时获取其从机的信息
2.哨兵利用心跳检测机制(PING-PANG)的方式监控主机是否宕机,如果连续3次主机没有响应,则哨兵判断主机宕机,之后开始进行选举
3.根据从主机中获取的从机信息,之后利用选举机制算法,挑选新的主机
4.之后将剩余的redis修改为当前主机的从,并且修改配置文件

Redis集群

分片可以实现Redis内存数据的扩容,可以存储海量的内存数据,但分片机制并没有实现高可用,如果分片中一个节点宕机,则直接影响整个服务的运行。

哨兵可以实现Redis的高可用,但是Redis中的数据不能实现内容的扩容。

集群中全部节点相互之间互相通讯。在Redis内部实现高可用。redis集群是分片和哨兵的集合体

缓存异常

缓存雪崩

是指在高并发环境下,缓存同一时间大面积的失效,所以,后面的请求都会落在数据库上,造成数据库短时间内承受大量请求而崩掉

解决方案:

  1. 缓存数据的过期时间设置随机,防止同一时间大量数据过期现象发生
  2. 一般并发量不是特别多的时候,使用最多的是加锁排队

缓存穿透

是指在高并发环境下,缓存和数据库中都没有的数据,导致所有的请求都落在数据库上,造成数据库短时间内承受大量请求二崩掉

解决方案:

  1. API网关
  2. 限定IP访问次数

缓存击穿

是指在高并发环境下,缓存中没有数据但数据库中有的数据(一般是指缓存时间到期),这时由于并发用户特别多,同时缓存没读到数据,有同事到数据库中取数据,引起数据库压力瞬间增大,造成过大压力。和缓存雪崩不同的是,缓存击穿指并发查同一条数据,缓存雪崩是不同数据都过期了,很多数据都查不到从而查数据库。

解决方案:

  1. 设置热点数据永不过期
  2. 加互斥锁

缓存预热

就是系统上线后,将相关的缓存数据直接加载到缓存系统。这样就可以避免在用户请求的时候,先查数据库,然后在将数据缓存的问题!用户直接查询是鲜卑预热的缓存数据

Redis回收使用的是什么算法

LRU算法
即最近使用最少,是一种常见的页面置换算法,选择最近最少使用的页面予以淘汰。
该算法赋予每个页面一个访问字段,用来记录一个页面自上次被访问以来所经历的时间t
当须淘汰一个页面时,选择选优页面中t值最大的,即最近使用最少的页面予以淘汰。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值