当前位置: 首页 > news >正文

Redis的应用场景

一:缓存——热数据

热点数据(经常会被查询,但是不经常被修改或者删除的数据),首选是使用redis缓存,毕竟强大到冒泡的QPS和极强的稳定性不是所有类似工具都有的,而且相比于memcached还提供了丰富的数据类型可以使用,另外,内存中的数据也提供了AOF和RDB等持久化机制可以选择,要冷、热的还是忽冷忽热的都可选。

结合具体应用需要注意一下:很多人用spring的AOP来构建redis缓存的自动生产和清除,过程可能如下:

  • Select 数据库前查询redis,有的话使用redis数据,放弃select 数据库,没有的话,select 数据库,然后将数据插入redis

  • update或者delete数据库钱,查询redis是否存在该数据,存在的话先删除redis中数据,然后再update或者delete数据库中的数据

上面这种操作,如果并发量很小的情况下基本没问题,但是高并发的情况请注意下面场景:

为了update先删掉了redis中的该数据,这时候另一个线程执行查询,发现redis中没有,瞬间执行了查询SQL,并且插入到redis中一条数据,回到刚才那个update语句,这个悲催的线程压根不知道刚才那个该死的select线程犯了一个弥天大错!于是这个redis中的错误数据就永远的存在了下去,直到下一个update或者delete。

二:计数器

诸如统计点击数等应用。由于单线程,可以避免并发问题,保证不会出错,而且100%毫秒级性能!爽。

命令:INCRBY

当然爽完了,别忘记持久化,毕竟是redis只是存了内存!


三:队列

  • 相当于消息系统,ActiveMQ,RocketMQ等工具类似,但是个人觉得简单用一下还行,如果对于数据一致性要求高的话还是用RocketMQ等专业系统。

  • 由于redis把数据添加到队列是返回添加元素在队列的第几位,所以可以做判断用户是第几个访问这种业务

  • 队列不仅可以把并发请求变成串行,并且还可以做队列或者栈使用


四:位操作(大数据处理)

用于数据量上亿的场景下,例如几亿用户系统的签到,去重登录次数统计,某用户是否在线状态等等。

想想一下腾讯10亿用户,要几个毫秒内查询到某个用户是否在线,你能怎么做?千万别说给每个用户建立一个key,然后挨个记(你可以算一下需要的内存会很恐怖,而且这种类似的需求很多,腾讯光这个得多花多少钱。。)好吧。这里要用到位操作——使用setbit、getbit、bitcount命令。

原理是:

redis内构建一个足够长的数组,每个数组元素只能是0和1两个值,然后这个数组的下标index用来表示我们上面例子里面的用户id(必须是数字哈),那么很显然,这个几亿长的大数组就能通过下标和元素值(0和1)来构建一个记忆系统,上面我说的几个场景也就能够实现。用到的命令是:setbit、getbit、bitcount


五:分布式锁与单线程机制

  • 验证前端的重复请求(可以自由扩展类似情况),可以通过redis进行过滤:每次请求将request Ip、参数、接口等hash作为key存储redis(幂等性请求),设置多长时间有效期,然后下次请求过来的时候先在redis中检索有没有这个key,进而验证是不是一定时间内过来的重复提交

  • 秒杀系统,基于redis是单线程特征,防止出现数据库“爆破”

  • 全局增量ID生成,类似“秒杀”


六:最新列表

例如新闻列表页面最新的新闻列表,如果总数量很大的情况下,尽量不要使用select a from A limit 10这种low货,尝试redis的 LPUSH命令构建List,一个个顺序都塞进去就可以啦。不过万一内存清掉了咋办?也简单,查询不到存储key的话,用mysql查询并且初始化一个List到redis中就好了。


七:排行榜

谁得分高谁排名往上。命令:ZADD(有续集,sorted set)


 

八:求共同好友

  利用Set提供的求交集、并集等函数来处理

 

转载于:https://www.cnblogs.com/lsgspace/p/10465555.html

相关文章:

  • 学习/linux/list.h_双链表实现
  • unknown
  • 3.Jmeter参数化
  • 抓取远程图片到本地,你会用什么函数?
  • ELK 企业内部日志分析系统
  • Handler中的IdleHandler
  • 企业级 SpringBoot 教程 (十七)上传文件
  • bboss v5.5.3 发布,Elasticsearch Rest Client
  • 4.Git文件系统
  • ios监听键盘删除事件
  • 秒懂正则表达式
  • 怎么把GPU上训练的模型转到TPU或者CPU上去?DeepMind发布新工具支招
  • 互联网项目中mysql应该选什么事务隔离级别
  • 转载【阿里员工排查问题的工具清单,总有一款适合你】
  • 一、图书管理系统
  • CEF与代理
  • cookie和session
  • js ES6 求数组的交集,并集,还有差集
  • maya建模与骨骼动画快速实现人工鱼
  • mockjs让前端开发独立于后端
  • React+TypeScript入门
  • thinkphp5.1 easywechat4 微信第三方开放平台
  • 当SetTimeout遇到了字符串
  • 面试遇到的一些题
  • 实现简单的正则表达式引擎
  • 使用API自动生成工具优化前端工作流
  • 王永庆:技术创新改变教育未来
  • 移动端解决方案学习记录
  • 用element的upload组件实现多图片上传和压缩
  • Java总结 - String - 这篇请使劲喷我
  • Spring Batch JSON 支持
  • 京东物流联手山西图灵打造智能供应链,让阅读更有趣 ...
  • 正则表达式-基础知识Review
  • # 安徽锐锋科技IDMS系统简介
  • (1)常见O(n^2)排序算法解析
  • (C语言)二分查找 超详细
  • (八)光盘的挂载与解挂、挂载CentOS镜像、rpm安装软件详细学习笔记
  • (二)PySpark3:SparkSQL编程
  • (附源码)spring boot校园健康监测管理系统 毕业设计 151047
  • (官网安装) 基于CentOS 7安装MangoDB和MangoDB Shell
  • (十二)python网络爬虫(理论+实战)——实战:使用BeautfulSoup解析baidu热搜新闻数据
  • .mysql secret在哪_MySQL如何使用索引
  • .Net 8.0 新的变化
  • .net反编译工具
  • .so文件(linux系统)
  • @FeignClient 调用另一个服务的test环境,实际上却调用了另一个环境testone的接口,这其中牵扯到k8s容器外容器内的问题,注册到eureka上的是容器外的旧版本...
  • @在php中起什么作用?
  • [Android]Android开发入门之HelloWorld
  • [android学习笔记]学习jni编程
  • [Asp.net MVC]Asp.net MVC5系列——Razor语法
  • [DP 训练] Longest Run on a Snowboard, UVa 10285
  • [git] windows系统安装git教程和配置
  • [HTML]Web前端开发技术6(HTML5、CSS3、JavaScript )DIV与SPAN,盒模型,Overflow——喵喵画网页
  • [HTML]Web前端开发技术7(HTML5、CSS3、JavaScript )CSS的定位机制——喵喵画网页
  • [LeetCode] Binary Tree Preorder Traversal 二叉树的先序遍历