测试同学需要了解的redi的常见使用场景
乙醇 创建于 8 months 之前
最后更新: less than a minute 之前
阅读数: 538
Redis 是速度非常快的非关系型(NoSQL)内存键值数据库,可以存储键和五种不同类型的值之间的映射。
键的类型只能为字符串,值支持五种数据类型:字符串、列表、集合、散列表、有序集合。
Redis 支持很多特性,例如将内存中的数据持久化到硬盘中,使用复制来扩展读性能,使用分片来扩展写性能。
Redis的使用非常广泛,是测试同学需要了解的中间件之一,对我们设计测试场景和定位问题有比较大的帮助。
Redis的基本特点
- 读写速度快: 比一般的数据库快
- 可以持久化: 尽管redis可以持久化,但是不使用其持久化的场景也很多
Redis的数据类型
- STRING: 字符串、整数或者浮点数,对整个字符串或者字符串的其中一部分执行操作,对整数和浮点数执行自增或者自减操作
- LIST: 列表,从两端压入或者弹出元素,对单个或者多个元素进行修剪,只保留一个范围内的元素
- SET: 无序集合
- HASH: 包含键值对的无序散列表
- ZSET: 有序集合,添加、获取、删除元素,根据分值范围或者成员来获取元素,计算一个键的排名,这个是支持排序的
使用场景
计数器:比如某公众号推送一篇文章给几千万的粉丝,我们需要记录阅读量。由于每个用户都会产生一次的阅读记录,假设有上万的用户在同1秒产生了阅读数,那么1秒要写入上万次,对于数据库来说这个写入次数是比较巨大的,会带来比较大的性能压力。这时候就可以把阅读数先保存在redis里面,由于redis的吞吐量比较大,扛住的可能性会更高一些。等数据写入的差不多了在持久化到数据库就好了;
缓存:将热点数据放到内存中,设置内存的最大使用量以及淘汰策略来保证缓存的命中率。比如站点的一些全局配置,每个用户都需要来拉一次,而且内容变化的频率很低,如果放数据库的话会对数据库宝贵的计算资源造成浪费,所以可以放到redis里,用户去redis缓存里读,降低了对数据库的访问量的同学要加速了配置拉取的速度;
查找表:例如 DNS 记录就很适合使用 Redis 进行存储。查找表和缓存类似,也是利用了 Redis 快速的查找特性。但是查找表的内容不能失效,而缓存的内容可以失效,因为缓存不作为可靠的数据来源。
消息队列:List 是一个双向链表,可以通过 lpush 和 rpop 写入和读取消息。比如可以把发送邮件的场景,因为邮件服务器的qps一般来说都不是特别高,如果同时发送很多邮件的话,对邮件服务器可能产生很大的压力。我们可以把邮件发送的消息放到redis里,让邮件服务器从redis一个接一个的读取和处理。不过更专业的消息队列场景最好使用 Kafka、RabbitMQ 等消息中间件。
会话缓存: 可以使用 Redis 来统一存储多台应用服务器的会话信息。应用服务器不再存储用户的会话信息,也就不再具有状态,一个用户可以请求任意一个应用服务器,从而更容易实现高可用性以及可伸缩性。简单来说可以把登录态的一些信息也放redis里。
共同好友: Set 可以实现交集、并集等操作,从而实现共同好友等功能;
排行榜: ZSet 可以实现有序性操作,从而实现排行榜等功能;
限制验证码的发送频率:一般我们收到短信验证码的时候,应用都会限制说60秒之后重新获取,这是为了防止有人恶意刷短信验证码,毕竟发验证码是要花钱的。用redis可以非常方便的实现这个功能。我们可以把用户id记录到redis里,并设置过期时间是60秒,这样60秒内用户再请求发送的时候就会发现该用户的发送记录已存在,60秒以后由于缓存自动过期,那么就可以重新再发送了;
以上是redis的一些非常简单的使用场景了,有兴趣的同学可以跟开发同学再多探讨一下自己业务里redis的具体使用方式。