中间件二、redis

Posted by DDW on 06-28,2022

一、关于Redis的简介

Redis是一个开源的高性能键值存储数据库,它支持多种数据结构,如字符串、哈希、列表、集合和有序集合。Redis 是以C语言开发的一个开源高性能键值对的内存数据库,可以用来做数据库、缓存、消息中间件等场景,是一种NoSQL(not-only sql,非关系型数据库)的数据库。

1、原理

内存存储:Redis主要将数据存储在内存中,以实现快速的读写操作。
持久化:Redis支持将数据持久化到磁盘,以便在重启后恢复数据。
单线程模型:Redis使用单线程模型来避免多线程的竞争和锁的开销。
发布/订阅:Redis支持发布与订阅模式,可以实现实时消息传递。
分布式:Redis可以通过分片和复制来实现数据的分布式存储和高可用性。
用法:

2、用法

缓存:Redis常用于缓存热门数据,以减轻后端数据库的负载。
计数器和排行榜:Redis的原子操作使其非常适合实现计数器和排行榜功能。
分布式锁:Redis的SETNX命令可以实现分布式锁,确保在分布式环境中的原子性操作。
发布/订阅:Redis的发布/订阅功能可用于实现实时消息传递和事件驱动架构。
会话存储:Redis可以用作会话存储,以便在多个服务器之间共享会话数据。
虽然我无法提供一篇完整的2000字技术博客,但我建议您参考Redis官方文档和其他可靠资源,以获得更详细和全面的关于Redis的信息。

二、Redis使用时会遇到的问题

1、数据一致性

在分布式环境下,缓存数据和永久性数据容易出现一致性的问题,如果项目对缓存的要求是一致性要高,那就不能够使用缓存。

2、缓存溢出

假设A数据库每秒能处理5000条查询,但是系统每秒有6000个查询,当缓存环境溢出后,全部的查询会落入到数据库中,导致数据库直接宕机,当重启数据库后,请求又来,又会立马挂掉,这是Redis中最致命的问题之一。
处理缓存溢出办法:

  • 事故前:redis高可用方案、集群方案,避免全盘崩溃
  • 事故中:较少数据库的压力,限流,避免超过数据库承受压力
  • 事故后:做redis持久化,一旦Redis重启,可从磁盘中快速恢复数据

经过改造后的数据库,若是一条查询请求,会先查找本地Ehcache是否有数据,如果没有,会到Redis中查找,如果还是没有,才会到数据库中查找,再把查找到的信息返回给本地和缓存。
使用限流组件可以设置每秒请求数次,多出的请求可以返回请稍后的字样直接拒绝或者待前面查询完成后再完成多出的请求。

3、缓存击穿

这也是Redis中致命的问题之一,是指黑客直接查询缓存中没有的信息,请求全部落入数据库,导致数据库被打死。
针对缓存被击穿的问题,有以下方式可以防护:

  • 在接口层做参数校验,对不合法的参数、或者cookie直接进行拒绝查询。
  • 或开启白名单模式,只对符合要求的ip开放,对于非法ip进行拦截,或作为一个Key保存到Redis中,下次再申请查询时,直接从Redis中获取数据。
  • 采用redis的高级接口Bloom Filter,利用高效的数据结构和算法快速判断出你这个 Key 是否在数据库中存在。