redis应用场景|8月更文挑战

428 阅读5分钟

这是我参与8月更文挑战的第7天,活动详情查看:8月更文挑战

前言

Redis 作为一种运行速度很快,并发很好的非关系型NoSql数据库,因为其有着读写性能优异、可持久化、数据类型丰富、单线程、数据自动过期、发布订阅、分布式的特性,使得其在web开发中的很多应用场景。

基础

Redis 优点

  • 读写性能优异, Redis能读的速度是110000次/s,写的速度是81000次/s。
  • 支持数据持久化,支持AOF和RDB两种持久化方式。
  • 支持事务,Redis的所有操作都是原子性的,同时Redis还支持对几个操作合并后的原子性执行。
  • 数据结构丰富,除了支持string类型的value外还支持hash、set、zset、list等数据结构。
  • 支持主从复制,主机会自动将数据同步到从机,可以进行读写分离。

Redis 缺点

  • Redis 不具备自动容错和恢复功能,主机从机的宕机都会导致前端部分读写请求失败,需要等待机器重启或者手动切换前端的IP才能恢复。
  • 主机宕机,宕机前有部分数据未能及时同步到从机,切换IP后还会引入数据不一致的问题,降低了系统的可用性。
  • Redis 较难支持在线扩容,在集群容量达到上限时在线扩容会变得很复杂。为避免这一问题,运维人员在系统上线时必须确保有足够的空间,这对资源造成了很大的浪费。

应用

缓存

因为读写性能优异,缓存是redis最常见的应用场景,而且因为redis是支持事务的,能有效保证数据的一致性, 对于热门同时更新频率又不高的数据数据,缓存的意义非常大。例如,分类栏目更新频率不高,但是绝大多数的页面都需要访问这个数据,因此读取频率相当高,可以考虑基于 Redis 实现缓存。

分布式锁

redis和memcached的差异,除了数据结构更丰富以及可以持久化,还有一个redis是单线程。因为redis是单线程的,所以分布式锁也是一个很重要的应用场景,而且因为redis性能的优势,不会成为系统的瓶颈。其实现依赖于setnx、expire及del命令。

时效性

redis的数据都可以设置自动过期时间,这个特性也很实用,自动过期的特性给开发带来了很多的便利,无需去数据库比对时间,例如验证码只有60秒有效期,超过时间无法使用,或者基于 Oauth2 的 Token 只能在 5 分钟内使用一次,超过时间也无法使用。

计数器

数据统计的需求非常普遍,通过原子递增保持计数。例如,应用数、资源数、点赞数、收藏数、分享数等。可以先写入redis,再定时写入mysql。

访问频率

出于减轻服务器的压力或防止恶意的洪水攻击的考虑,需要控制访问频率,例如限制 IP 在一段时间的最大访问量。以访问者的ip和其他信息作为key,使用incr方法,超过次数则禁止访问。

消息队列

Redis 能作为一个很好的消息队列来使用,依赖 List 类型利用 LPUSH 命令将数据添加到链表头部,通过 BRPOP 命令将元素从链表尾部取出。同时,市面上成熟的消息队列产品有很多,例如 RabbitMQ。因此,更加建议使用 RabbitMQ 作为消息中间件。

会话缓存

集群模式下,在应用不多的情况下一般使用容器自带的session复制功能就能满足,当应用增多相对复杂的系统中,一般都会搭建以Redis等内存数据库为中心的session服务,session不再由容器管理,而是由session服务及内存数据库管理。

社交列表

点赞、踩、关注/被关注、共同好友等是社交网站的基本功能,社交网站的访问量通常来说比较大,而且传统的关系数据库类型不适合存储这种类型的数据,Redis提供的哈希、集合等数据结构能很方便的的实现这些功能。

记录用户判定信息

记录用户判定信息的需求也非常普遍,可以知道一个用户是否进行了某个操作。例如,用户是否点赞、用户是否收藏、用户是否分享等。

交集、并集和差集

在某些场景中,例如社交场景,通过交集、并集和差集运算,可以非常方便地实现共同好友,共同关注,共同偏好等社交关系。

热门列表与排行榜

按照得分进行排序,例如,展示最热、点击率最高、活跃度最高等条件的排名列表。

最新动态

按照时间顺序排列的最新动态,也是一个很好的应用,可以使用 Sorted Set 类型的分数权重存储 Unix 时间戳进行排序。

总结

虽然redis和关系性数据库比起来没有索引、没有外键、没有schema,多条件查询需要通过集合内联(sinter,zinterstore)和连接间接实现,在某些场景下操作不便,但是因为其自身有着丰富的出色的特性(读写性能优异、可持久化、数据类型丰富、单线程、数据自动过期、发布订阅、分布式),使得其在web开发中也有着非常多的应用场景,与其他关系性数据库配合使用,很多时候会有奇效。

Redis的47连环炮,试试你能看住几个
Redis常见的应用场景解析