在上一篇文章《Redis数据结构探究》中,对Redis的五种数据结构和它们的底层实现进行了分析,这篇文章主要结合近期应用Redis的经历,对Redis的使用场景做出分析。

在上篇文章中,简单总结了Redis有以下应用场景:

1、缓存服务

这是Redis应用最广泛的部分,用于减小数据库访问压力,提高系统并发量,逻辑也比较简单。

  • select时,如redis中无此数据,则查询数据库并插入redis,如redis中有此数据,则直接返回。
  • update时,先更新数据库,如redis中包含此数据,则更新redis。

2、SESSION服务器

用户的登录session数据一般是存储在数据库或单独的session服务器上,以便用户在访问集群应用时不会受到影响,而使用Redis来作为session存储方式的好处是:

  • 存取速度快。
  • 支持持久化。
  • 可以查看实时用户数量。
    其中,支持持久化是比较重要的一点,因为部分系统比如购物网站会将购物车信息存储在session中,如不支持持久化可能会发生数据丢失。

3、消息队列

Redis提供的list可以很方便地提供push/pop操作,可以很容易实现消息队列,在以下应用场景应用较多:

  • 对某些操作作异步处理,使用生产者消费者模式进行通信。
  • 分布式系统中使用消息队列进行调度,实现应用解耦。
  • 高并发情况下使用消息队列对请求流量削峰,将并发请求串行化,拒绝重复请求。
  • 日志操作中使用消息队列解决多线程环境下日志操作的并发问题。

4、排行榜

Redis中的set是一个有序集合,有序集合的键是成员,而值是分值。这样既可以根据成员来访问元素,又可以根据分值来顺序访问元素结构。这样在实现排行榜功能时,向集合内插入元素就可以形成一个有序的集合,只要自定义分值来源,就可以实现排行榜功能,而不用每次进行排序。其他需要频繁排序的操作也可以使用,比如优先级队列等。

5、列表/时间轴

一些新闻网站/博客/微博等往往在首页需要一个时间排序的列表或时间轴,每次在生成时间轴时往往需要一个select order操作,请求时间较长且消耗性能,如果在redis中构建一个list,通过将数据不断push的方式,构建一个时序列表。
在微博系统中,个人feed流页和评论首页是通过这种方式存储的,可以显著地提升系统响应速度,并且减小数据库压力。

6、秒杀系统

在秒杀系统中,一般会有以下问题:

  • 短时间内大量并发
  • 并发读写时冲突严重,或产生错误。如果使用Mysql的行级锁,可能某些请求无法获取到锁,数据库负载过大时会导致宕机。
  • 请求失败重复发送,有效请求少,耗费系统性能

使用Redis,可以解决这些问题,有如下方式。

  • 过滤重复请求,以ip,参数,URL等记录请求,过滤一定时间内的客户端重复请求。
  • 使用list记录请求,将请求顺序执行,并记录请求数量,如果有数量限制则拒绝超出数量外的请求。
  • 不直接在数据库中扣减内存,而是将订单记录在list中,后续操作异步执行,并及时持久化到硬盘,防止内存数据丢失。
  • 通过原子操作保证全局唯一id

7、标签操作

系统中一般会有标签、收藏等聚合操作,这类操作具有使用频率高,历史数据变动小的特性,一般我们不会给记录这类操作的不重要的字段添加索引,所以在查询时比较耗费性能,而使用Redis的set就可以解决这类问题,前几天给系统中的标签功能引入了索引,去掉了select * group by 这条查询。

  • 用户标记某条数据时,将数据id存入标签id的set中
  • 取消标记时,从set里移除该数据
  • 查询时,直接取出set

8、计数器

上篇文章中说到了string类型可以存储字符串和浮点数,存储浮点数时可以进行自增操作,使用INCRBY可以保证原子递增,使用getset可以重置。可以用来记录访问次数,订单id等。另外,由于有过期时间,也可以实现黑名单等功能。

最近在使用Redis时,总结了一些技巧,比如可以利用Redis的主从复制特性搭建集群,像数据库分库一样将数据分实例存放,利用redis的多个库实现命名空间作用,而不是通过key或前缀。在进行查询时,因为redis访问需要网络io,可以利用hmget等方式一次获取多条数据,而不是单条单条地获取。合理设置value的大小。
本文对redis的使用场景进行了简单的总结,实际中会发现redis的使用能显著提升系统性能,应用也十分广泛,是后端开发的必备神器。


参考资料:
1、《Redis应用实战》
2、https://www.cnblogs.com/wajika/p/6625129.html
3、https://blog.csdn.net/bemavery/article/details/77448589

Redis应用场景分析相关推荐

  1. DB,Cache和Redis应用场景分析

    最近做一产品,微博方面的.数据存储同时用到了DB(mysql),Cache(memcache),Redis.其实最开始架构设计的时候是准备用MongoDB的,由于学习成本太高, 最终选择放弃了,采用了 ...

  2. 【面试经典】redis 常见数据结构以及使用场景分析

    1.String 常用命令: set,get,decr,incr,mget 等. String数据结构是简单的key-value类型,value其实不仅可以是String,也可以是数字. 常规key- ...

  3. 阿里Java岗二面:Redis了解?说说持久化机制及RDB/AOF应用场景分析

    Redis是一种面向"key-value"类型数据的分布式NoSQL数据库系统,具有高性能.持久存储.适应高并发应用场景等优势.它虽然起步较晚,但发展却十分迅速. 文章主要包含二个 ...

  4. 转载:Redis 应用场景

    2019独角兽企业重金招聘Python工程师标准>>> 1.  MySql+Memcached架构的问题 实际MySQL是适合进行海量数据存储的,通过Memcached将热点数据加载 ...

  5. docker 虚拟机搭建mongodb一主一从一复制_云计算学习路线图素材课件:Docker容器应用场景分析...

    Docker容器是一个开源的应用容器引擎,它能够自动执行重复性任务,例如搭建和配置开发环境,用户可以方便地创建和使用容器,还可以进行版本管理.复制.分享.修改.有很多初学云计算的同学不清楚Docker ...

  6. Redis应用场景(转)

    (来源:http://www.cnblogs.com/shanyou/archive/2012/09/04/2670972.html) Redis常用数据类型 Redis最为常用的数据类型主要有以下五 ...

  7. redis 数据类型详解 以及 redis适用场景场合

    redis 数据类型详解 以及 redis适用场景场合 1. MySql+Memcached架构的问题 实际MySQL是适合进行海量数据存储的,通过Memcached将热点数据加载到cache,加速访 ...

  8. 详解 Redis 应用场景及应用实例

    Redis是一个开源的使用ANSI C语言编写.支持网络.可基于内存亦可持久化的日志型.Key-Value数据库,并提供多种语言的API.从2010年3月15日起,Redis的开发工作由VMware主 ...

  9. Redis 应用场景和应用实例详解

    Redis是一个开源的使用ANSI C语言编写.支持网络.可基于内存亦可持久化的日志型.Key-Value数据库,并提供多种语言的API.从2010年3月15日起,Redis的开发工作由VMware主 ...

最新文章

  1. 奥运年08/07/19我正式加入博客园,开始.net的新征程^-^
  2. [深度学习] 自然语言处理--- 基于Keras Bert使用(上)
  3. linux下collada-dom编译,Building Collada
  4. linux安装 中文乱码怎么解决方法,Linux安装GBK/GB2312程序显示乱码的五种解决方法...
  5. 复合辛普森求积公式原理_辛普森法则:公式及其原理
  6. 使用ISAPI_Rewrite对asp.net实现URL重写伪静态
  7. 开发者的福利,报名即可领取代金券,赢运动手环
  8. IDEA版本控制工具VCS中使用Git,以及快捷键总结(不使用命令)
  9. SDUT 2405 Strange Square(DFS)
  10. springboot pom文件基本配置
  11. 华为网络技术比赛-note(2018)
  12. Unity手游性能优化的经验总结
  13. 内存卡格式化了怎么办?能恢复吗?
  14. 红色警戒2地图编辑器研究
  15. 一个遮罩层怎么遮罩两个图层_遮罩动画只能有两个图层,上面为“遮罩层”,下面为“被遮罩”层。...
  16. NLP会议介绍 2019
  17. 如何修改Nintendo Switch Dock以获得更好的便携性
  18. java springboot安卓多商家校园点餐外卖APP源码
  19. Linux:syscall: entry_SYSCALL_64_after_hwframe
  20. MVC框架的学习总结

热门文章

  1. pydoc命令是用来做什么的
  2. IT忍者神龟之理解回顾面向对象的 JavaScript
  3. world中空白页怎么删也删不掉——解决方案(超简单好用)
  4. html文件路径_HTML文件路径
  5. 廉航特价周期表(1.18更新)
  6. H5 js生成随机数封装
  7. SimpleTex免费好用的图片转latex等公式的软件
  8. Yum 安装、卸载软件
  9. 【matlab】zeros函数的参数以及使用方法
  10. html5视频倍速播放功能