谈谈Redis
Redis是一个基于内存的非关系型数据库,以键值对的形式存储数据,可以用作分布式缓存、消息队列、分布式锁,也可以搭建高可用集群。
Redis的基础数据有哪些
- String 场景:存储普通的字符串、不经常变动的对象、计数器、分布式锁。
- List 场景: 有序可重复的,可作为消息队列,适合存储一对多关系的数据。
- Hash 场景:能够很好的处理对象属性映射关系,适合存储经常变动的信息。
- Set 场景: 无需不可重复的,可用作并集、交集、差集,朋友圈点赞等。
- ZSet 场景: 可以多存储一个分值用作排序,适用于排行榜。
Redis的全局指令
- keys (查看所有的键)
- del (删除键值对)
- flushall (删除所有信息)
- expired (设置过期时间)
- save (RDB形式持久化保存)
- type (查看键值对类型)
Redis中过期数据的删除策略
惰性删除
惰性删除指的是,不会主动检查数据是否过期,会在每次访问的时候查看数据是否过期,若过期则删除,那么如果过期数据很久都没有被访问,则会一直存在于内存中,是一个问题。
定时删除
定期删除指的是,每隔一段时间都会主动检查部分数据是否过期,若过期则删除。
缓存中都有遇到什么问题,都如何解决?
缓存穿透
缓存穿透指的是,缓存中没有改请求数据的缓存,从而让请求直接打到数据库中,而数据库中也不存在改数据也无从缓存,如果有大量的这类请求,会给数据库造成极大压力甚至冲垮。
缓存穿透-解决方案
- 对参数校验,拦截不合法的请求,比如商品id为负数,购买数量为为负数。
- 分布式锁缓存null,根据业务设置过期时间。
- 布隆过滤器。
缓存击穿
缓存击穿指的是,某一热点数据在某一时刻失效,此时有大量并发请求进入数据库,对数据库造成极大压力甚至冲垮。
缓存击穿-解决方案
- 热点数据不过期。
- 分布式锁查询数据并做缓存。
- 循环依赖。
缓存雪崩
缓存雪崩指的是,某一时刻有大量的缓存数据同时失效,导致有大量并发请求进入数据库造成冲击。
缓存雪崩-解决方案
- 设置随机过期时间。
- 分布式锁查询数据并做缓存。
- 热电数据不过期。
Redis的持久化方式你了解吗?
持久化方式分为RDB、AOF
RDB具体说说
RDB是以一种快照(二进制)的形式存储数据,比如每5秒或者每1000条数据进行一次持久化缓存。优点:可以很便捷的根据时间查询持久化的数据。缺点:如果服务突然关闭,最多会损失4.59秒的数据。
AOF具体说说
AOF存储方式会将每次执行的写命令追加到一个文件夹的后面,服务重启时会自动读取该文件夹中的命令并且执行来恢复数据,如果不小心执行了flushall,在这种持久化方式下,只需要关闭服务,找到对应文件将末尾的fluashall命令删除重启启动服务即可。优点:数据不易丢失。缺点:更占用空间。
Redis常用的系统架构设计
- 一主一丛
- 一主多从
- 一主多从从
部署集群时,Redis的数据同步方式
Redis同步方式分为全量同步、增量同步。
全量同步
全量同步发生在Slave第一次连接Master时,同步过程:
- Slave第一次连接Master。
- Master执行bgsave,对数据持久化。
- 主节点将.rdb文件发送给从节点。
- 从节点根据.rdb文件进行恢复数据。
可能存在的问题:
- 当Master生成.rdb文件发送给Slave、Slave恢复数据这段时间,Master有可能还在接受新的请求,那么这可能导致主节点从节点数据不一致。
- 如果.rdb文件过大,同步到Slave时,因网络阻塞或中断,还可能导致部分数据丢失。
增量同步
增量同步出现了中断或着全量同步之后,Master又有了写操作,此时会触发增量同步,同步过程:
- 从节点发送同步请求。
- 主节点基于数据同步请求写指令同步到从节点。
- 从节点执行指令将数据进行同步。
Redis主从架构可能遇到的问题
如果主节点故障的话,就需要手动的将从节点升级为主节点,解决方案:哨兵模式,监控Redis数据节点,然后进行故障自动转移,实现高可用。