# 测试同学需要了解的redi的常见使用场景




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的具体使用方式。




原始封面

![课程图片](https://images.unsplash.com/photo-1484591974057-265bb767ef71?w=300)


