工作中redis相关知识总结

这里写目录标题
-
一、Redis数据持久化概念
-
二、redis数据类型
-
三、redis缓存的应用流程
-
四、什么样的数据适合存放到redis中?
-
- 1、什么情况下,redis中会没有数据?
- 2、redis缓存项目在测试中的注意事项
-
- a、更新缓存
- b、淘汰缓存
-
五、什么是缓存击穿
-
- 1、缓存失效的两种情况
- 2、缓存数据有效期到来的那一瞬间举例
-
六、什么是缓存穿透
-
- 1、如何测试验证?
-
七、缓存雪崩
-
- 1、缓存雪崩的原因
- 2、缓存雪崩风险
- 3、解决方案
-
八、redis 在你们项目中具体的作用,还有哪些常用的功能
-
- 1、权限的数据的特点
- 2、django自动化测试平台以及python开发的平台,需要异步执行任务或者定时执行任务
-
- 1、选择一个broker
- 2、安装redis容器
-
九、涉及redis相关的内容怎么测试?
-
- 1、故障注入
-
十、redis的使用场景
-
十一、Redis的数据是存储在内存当中的,假如断电之后就会造成数据丢失,那怎么对Redis进行数据固化?
-
十二、Redis适合做消息队列吗?为什么?
-
十三、Redis为什么快?
一、Redis数据持久化概念
持久化在Redis中的工作原理就是将你存储在缓存中的数据异步的保存在你的磁盘中实现持久存储。
当电脑或者服务器发生宕机时,我们的内存会被清空,但是存储在磁盘中的数据不会丢失,
当我们再次打开Redis时,磁盘中的数据集就会再次同步到我们的Redis中,也就是从磁盘中再次回到内存中。
二、redis数据类型
String:Redis最基础的数据类型,可以存储字符串、整数或浮点数。
适用场景:字符串是 Redis 最基本的数据结构,适用于各种简单的键值存储场景,如缓存数据、计数器、分布式锁等。也可以存储 JSON 数据 ,实现基本的数据存储和读取。
Hash:包含多个键值对的无序散列表,适合存储对象。
适用场景:适用于存储对象、存储用户属性等复杂数据结构。 例如,将一个对象存储为一个哈希表,对象的字段可以作为哈希表的字段,对应的值可以存储在字段对应的哈希表值中,这样可以方便地对对象进行存取、修改和查询。
List:按插入顺序存储一系列字符串元素,可以通过索引来访问和修改列表中的元素。
适用场景:适用于队列、消息队列、时间序列等有序数据的存储和处理。 例如,用列表实现消息队列,可以存储多个消息,通过列表的插入和弹出操作实现消息的生产和消费。
Set:无序、不重复的字符串集合,支持添加、删除、查找操作。
适用场景:适用于去重操作、判定某个元素是否存在等场景。例如,可以用集合来存储用户的喜好标签,判断某个标签是否存在,或者对多个集合进行交集、并集等操作。
ZSet:与集合类似,每个元素都关联一个分数用于排序,支持按分数范围或成员获取排名。
适用场景:适用于高级排行榜、按照分数进行排序的场景。例如,可以用有序集合存储用户积分排行榜,通过有序集合的分数可以实现用户的排名和快速查询。
三、redis缓存的应用流程

四、什么样的数据适合存放到redis中?
读的频率非常高、更新频率较少的数据
应用程序从redis中微秒获取数据
1、什么情况下,redis中会没有数据?
a、第一次查询,数据需要从数据库查询再缓存起来
b、redis数据过期。数据查询不到了
c、redis挂了。整个服务都访问不了了,只能从数据库里面查询。
2、redis缓存项目在测试中的注意事项
a、更新缓存
缓存操作流程-写(更新缓存)
优点: 基本不会出现cache miss的情况。
缺点: 每次更新数据库都更新缓存,比较影响性能。

b、淘汰缓存
优点: 操作简单,性能比较好。
缺点:至少会出现一个 cache miss。(当大量的请求访问数据库时,数据库压力很很大)

五、什么是缓存击穿
在缓存过期的一瞬间,同时有大量的请求打进来,由于此时缓存过期了,所以请求最终都会走到数据库,造成瞬间数据库请求量大、压力剧增,甚至可能打垮数据库。
1、缓存失效的两种情况
a、高峰期大面积缓存key失效。(所有请求全部访问后端数据库)
b、局部高峰期,热点缓存key失效(导致海量的请求直接击穿数据库)
2、缓存数据有效期到来的那一瞬间举例
- 1、突发重要热点事件
- 2、春节发红包
- 3、电商降价、抢购、促销活动

六、什么是缓存穿透
访问一个redis缓存和数据库都不存在的key,此时会直接打到数据库上,并且查不到数据,没法写到redis缓存,所以下一次同样会打到数据库上。
缓存起不到作用,流量大时数据库可能会被打挂,此时缓存就好像被穿透了一样,起不到任何作用。
1、如何测试验证?
使用Jmeter等压测工具进行模拟测试
七、缓存雪崩
缓存雪崩是指缓存失效后导致服务大面积崩溃的后果
1、缓存雪崩的原因
缓冲击穿、缓存穿透、缓存服务不可用
2、缓存雪崩风险
因为缓存服务器挂掉或者热点缓存失效,从而导致海量请求去查询数据库,导致数据库连接不够用或者数据库处理不过来,从而导致整个系统不可用。
数据库服务器压力大,依赖数据库的其他系统就会面临崩溃风险。
3、解决方案
缓存击穿
- 过期事件打散:高峰期大面积的key不要全部一起失效;或者直接不失效。
- 热点数据不过期:针对单个热点数据。
- 互斥锁:万一实在是拿不到缓存了,并发控制。
- 缓存降级:redis服务器挂了,缓存备份,数据兜底。
缓存穿透
- 业务规则校验:日期范围、业务规则校验不符合直接返回。
- 数据格式校验:ID(特意设计)、前16位表示事件,中间3位表示业务分类代码,后面3位表示随机数
- 布隆过滤器:把大批量的请求参数的真实值,压缩放到过滤器里,每次请求的时候,通过过滤器进行验证。
- IP黑名单限流:禁止访问。
八、redis 在你们项目中具体的作用,还有哪些常用的功能
1、权限的数据的特点
需要去数据库中频繁的读和写,为了项目提高效率,可以把用户的权限在每次登录的时候都缓存到redis中。这样的话,权限判断的中间件就可以方便的从redis中得到当前用户的所有权限,从而判断。
对于那些数据量大,并且需要频繁的读写,一定需要做缓存的
详细的实现过程请查看博客:<>
2、django自动化测试平台以及python开发的平台,需要异步执行任务或者定时执行任务
1、选择一个broker
使用celery首先需要选择一个消息队列。安装任意你熟悉的前面提到的celery支持的消息队列。
2、安装redis容器
因为redis默认没有密码,使用云服务器部署redis容器时需要设置密码。新建配置文件/root/redis.conf编写如下配置:
requirepass pythonvip
python
然后如下命令创建容器:
sudo docker run -d -p 9000:6379 -v /home/ubuntu/redis.conf:/usr/local/etc/redis/redis.conf --name myredis redis:alpine redis-server /usr/local/etc/redis/redis.conf
python
redis的连接url格式如下
redis://:password@hostname:port/db_number
python
详细的实现过程请查看博客:<>
九、涉及redis相关的内容怎么测试?
1、故障注入
- redis故障降级测试
- 将redis中的数据清空。
- 获取某个数据,看能否击穿redis去数据中获取到数据。
- 检测获取到数据是否又保存到数据库中了。
- 启动redis,恢复数据了,测试能否从redis中获取到正确的数据
- redis崩溃了,能否从数据库中获取到数据
十、redis的使用场景
String(字符串):缓存、计数器限流
Hash(哈希):存储对象数据、统计类数据
List(列表):文章列表
Set(无序集合):标签、点赞、签单
Zset(有序集合):排行榜
十一、Redis的数据是存储在内存当中的,假如断电之后就会造成数据丢失,那怎么对Redis进行数据固化?
RDB持久化 :RDB持久化会在指定的时间间隔内生成一个快照文件(Snapshot),将数据集的内容写入一个压缩的二进制文件中。RDB持久化方式适合数据集较大,但不要求数据丢失太多的场景。可以通过配置文件设置快照生成的条件和时间间隔。
AOF持久化 :AOF持久化是以日志的方式记录每个写操作的命令,在Redis重启时重新执行这些命令来恢复数据。AOF持久化方式保证了每个写操作的数据一致性和持久性,但相比RDB会更占用磁盘空间和对性能有一定影响。
十二、Redis适合做消息队列吗?为什么?
Redis确实可以用作消息队列,而且在某些场景下非常适合。以下是几个原因:
高性能 :Redis是一个内存数据库,读写速度非常快 。由于消息队列通常需要快速地入队和出队操作,Redis作为消息队列可以提供高性能的队列操作,处理大量消息时效率高。
持久化支持 :Redis支持持久化,可以确保即使服务重启也不会丢失数据。通过配置RDB持久化或AOF持久化,可以保证重要消息的持久性。
丰富的数据结构 :Redis支持丰富的数据结构,如列表(List)、集合(Set)、有序集合(Sorted Set) 等,能够满足不同场景下的消息队列需求。
发布订阅功能 :Redis的发布订阅功能可以用来实现消息的广播和订阅,在一些场景下非常有用。
简单易用 :Redis的操作简单直观,易于部署和维护。使用Redis作为消息队列可以减少开发和维护成本。
十三、Redis为什么快?
Redis之所以快主要有以下几个原因:
数据存储在内存 :Redis是一个基于内存的数据库系统,大部分操作都在内存中进行,内存的读写速度远远快于磁盘读写,因此可以极大提升数据访问的速度。
单线程模型 :Redis采用单线程模型,避免了多线程之间的上下文切换和锁竞争,减少了系统的开销。单线程模型可以避免多线程之间的锁竞争和线程切换带来的开销,同时也降低了系统复杂度。
高效的数据结构:Redis支持多种高效的数据结构,如字符串、列表、集合、有序集合等,使得数据存储和查询更加高效。例如,使用有序集合可以快速地进行范围查询和排名操作。
事件驱动:Redis采用事件驱动模型,采用非阻塞IO,可以处理大量的并发连接而不会阻塞,提高了系统的并发性能。
持久化机制:虽然Redis将数据存储在内存中,但它提供了多种持久化机制,可以将数据持久化到磁盘中,确保数据在重启或断电后不会丢失。这种设计使得在数据持久化和内存操作之间找到了平衡。

