Redis及缓存击穿、穿透、雪崩

news/2024/7/5 1:50:40

目录

优缺点

使用方法

 使用场景

Redis缓存击穿、穿透、雪崩


Redis是一款开源的内存数据结构存储系统,它支持多种数据结构,包括字符串、哈希表、列表、集合、有序集合等。Redis的使用场景非常广泛,以下是一些常见的使用场景:

优缺点

1. 缓存:Redis最常见的使用场景就是作为缓存,将热点数据存储在内存中,以提高读写性能。

2. 计数器:Redis支持原子操作,可以用来实现计数器功能,如网站的PV/UV统计。

3. 分布式锁:Redis的原子操作还可以用来实现分布式锁,保证多个进程或线程之间的互斥访问。

4. 消息队列:Redis支持发布/订阅模式,可以用来实现消息队列功能。

5. 数据存储:Redis支持持久化存储,可以将数据存储到磁盘上,以保证数据的可靠性。

Redis的优点:

1. 高性能:Redis将数据存储在内存中,读写速度非常快。

2. 多种数据结构:Redis支持多种数据结构,可以满足不同的需求。

3. 原子操作:Redis支持原子操作,可以保证多个操作的原子性。

4. 高可用性:Redis支持主从复制和哨兵模式,可以保证高可用性。

Redis的缺点:

1. 内存限制:Redis将数据存储在内存中,受到内存大小的限制。

2. 持久化存储:Redis的持久化存储需要将数据写入磁盘,会影响性能。

3. 单线程:Redis是单线程的,不能充分利用多核CPU的性能。

4. 数据一致性:Redis的主从复制和哨兵模式不能保证数据的强一致性。

使用方法

1. 字符串操作

- SET:设置一个键值对,常用于缓存、计数器等场景。
- GET:获取一个键对应的值。
- INCR/DECR:对一个键对应的值进行加/减操作,常用于计数器场景。
- APPEND:将指定字符串追加到一个键对应的值的末尾,常用于日志记录等场景。

2. 哈希表操作

- HSET:设置一个哈希表中的字段和值。
- HGET:获取一个哈希表中指定字段的值。
- HGETALL:获取一个哈希表中所有字段和值。
- HINCRBY:对一个哈希表中指定字段的值进行加操作,常用于计数器场景。

3. 列表操作

- LPUSH/RPUSH:将一个元素插入到列表的左/右侧。
- LPOP/RPOP:从列表的左/右侧弹出一个元素。
- LINDEX:获取列表中指定下标的元素。
- LLEN:获取列表的长度。

4. 集合操作

- SADD:向集合中添加一个元素。
- SMEMBERS:获取集合中所有元素。
- SISMEMBER:判断一个元素是否在集合中。
- SINTER:获取多个集合的交集。

5. 有序集合操作

- ZADD:向有序集合中添加一个元素。
- ZRANGE:获取有序集合中指定范围的元素。
- ZSCORE:获取有序集合中指定元素的分值。
- ZINCRBY:对有序集合中指定元素的分值进行加操作,常用于排行榜场景。

总的来说,Redis的各个方法都有各自的应用场景,可以根据具体的业务需求选择合适的方法来实现。例如,字符串操作常用于缓存、计数器等场景,哈希表操作常用于存储对象,列表操作常用于队列、栈等场景,集合操作常用于去重、交集等场景,有序集合操作常用于排行榜等场景。

 使用场景

1. SET:设置一个键值对,常用于缓存数据、存储用户会话等场景。

2. GET:获取一个键对应的值,常用于读取缓存数据、获取用户会话等场景。

3. INCR/DECR:对一个键对应的值进行加/减操作,常用于计数器、排名等场景。

4. HSET/HGET:设置/获取一个哈希表中的字段值,常用于存储用户信息、商品信息等场景。

5. LPUSH/RPUSH/LRANGE:向列表中左/右侧添加元素,或者获取列表中的一段元素,常用于消息队列、任务队列等场景。

6. SADD/SMEMBERS:向集合中添加元素,或者获取集合中的所有元素,常用于去重、标签等场景。

7. ZADD/ZRANGE:向有序集合中添加元素,或者获取有序集合中的一段元素,常用于排名、排行榜等场景。

8. EXPIRE:设置一个键的过期时间,常用于缓存数据、限流等场景。 以上是一些常用的Redis方法及其使用场景,实际应用中还有很多其他的方法和场景。需要根据具体的业务需求选择合适的方法和数据结构

Redis缓存击穿、穿透、雪崩

Redis是一种常用的缓存技术,但是在使用过程中,可能会遇到以下三种缓存问题:

1. 缓存穿透:指查询一个不存在的key,由于缓存中没有对应的数据,每次查询都会穿透到数据库,导致数据库压力过大。攻击者可以通过构造恶意的key来攻击系统,造成系统瘫痪。

解决方案:
- 布隆过滤器:在缓存层和数据库层之间增加一个布隆过滤器,用于过滤掉不存在的key,减少对数据库的访问。
- 缓存空对象:在缓存中存储一个空对象,表示该key对应的数据不存在,下次查询时直接返回空对象,不再访问数据库。
- 设置短期过期时间:对于查询不存在的key,设置一个短期的过期时间,避免大量的请求同时穿透到数据库。

2. 缓存雪崩:指缓存中大量的key同时过期失效,导致大量的请求直接访问数据库,造成数据库压力过大,甚至导致系统崩溃。

解决方案:
- 设置不同的过期时间:对于相同类型的数据,设置不同的过期时间,避免大量的key同时失效。
- 加入随机时间:在缓存中设置随机的过期时间,避免大量的key同时失效。
- 使用分布式锁:在缓存中设置分布式锁,避免多个请求同时访问数据库。

3. 缓存击穿:指某个热点key失效,导致大量的请求直接访问数据库,造成数据库压力过大,甚至导致系统崩溃。

解决方案:
- 设置永不过期:对于热点数据,可以设置永不过期,避免缓存失效。
- 加入互斥锁:在缓存中设置互斥锁,避免多个请求同时访问数据库。
- 使用异步更新:在缓存中设置异步更新,避免大量的请求同时访问数据库。


http://lihuaxi.xjx100.cn/news/1207766.html

相关文章

Vue3.0 为什么采用 Proxy

Object.defineProperty() 作用:在一个对象上定义一个新属性,或者修改一个对象的现有属性,并返回这个对象。 1. 基本使用 语法:Object.defineProperty(obj, prop, descriptor) 参数: 要添加属性的对象 要定义或修改…

ABC304F Shift Table

ABC304F Shift Table 题目大意 小 T T T和小 A A A要做 n n n天的工作。 小 T T T的工作表表示为字符串 S S S,其中“#”表示当天要工作,“.”表示当天不需要工作。 你需要安排小 A A A的工作,步骤如下 选择一个 n n n的约数 m m m&…

JavaSE进阶(day13,复习自用)

单元测试、反射、注解、动态代理 单元测试单元测试概述单元测试快速入门单元测试常用注解 反射反射概述反射获取类对象反射获取构造器对象反射获取成员变量对象反射获取方法对象反射的作用-绕过编译阶段为集合添加数据反射的作用-通用框架的底层原理 注解注解概述自定义注解元注…

哈希Hash

HashMap是Java中常用的数据结构之一,它提供了高效的键值对存储和检索功能。下面是HashMap底层的详细原理介绍: 1. 数据结构:HashMap底层使用数组和链表(或红黑树)的组合实现。它通过哈希算法将键转换为数组索引&#…

【计算机组成原理·笔记】存储器概述

存储器概述 存储器分类 按存储介质分类 半导体存储器: TTL,MOS 小电源消失,信息丢失(易失) 磁表面存储器:硬盘磁芯存储器:光盘存储器: 按存取方式分类 存取方式与物理地址无关(…

chatgpt赋能python:Python均值函数介绍

Python均值函数介绍 Python是一种高级编程语言,非常适合数据处理和分析。在数据分析中,均值通常被用来代表一组数据的平均水平。Python提供了多种方式来计算均值,其中最常用的是使用均值函数来计算。 什么是均值函数? 均值函数…

JS回调函数(callback)

在使用Jquery的时候,用到Callback(),回调函数的概念。并且不少。javascript 好比:html $.ajax({url:"test.json",type: "GET",data: {username:$("#username").val()},dataType: "json",beforSend…

包扫描工具实现(详解)

文章目录 前言包扫描实现思路(需求分析): 具体实现完整代码 前言 注解在 Java 是一个非常重要的存在,而且它出现的非常频繁。 在一个工程下可能有许多的包或者Jar包,为了结合注解可以准确的定位到一个需要的类上&…