西安网站制作有限公司,网站建设远程工作,石家庄做手机网站建设,网站运营推广这么做对于一名前端工程师#xff0c;想要进阶成为全栈工程师#xff0c;redis技术是我们一定需要掌握的。作为当前非关系型数据库Nosql中比较热门的key-value存储系统#xff0c;了解redis的原理和开发是极其重要的。本文我会循序渐进的带领大家一步步认识redis#xff0c;使用r…对于一名前端工程师想要进阶成为全栈工程师redis技术是我们一定需要掌握的。作为当前非关系型数据库Nosql中比较热门的key-value存储系统了解redis的原理和开发是极其重要的。本文我会循序渐进的带领大家一步步认识redis使用redis并结合前端watchtower监控平台进行需求开发相信读者阅读到最后的话一定会收获满满滴~目录本文会从四个角度进行介绍Redis是什么概述应用场景以及在前端监控平台的应用Redis是什么--典型的Nosql数据库1.Nosql发展背景1.1 单机Mysql的年代纵观历史互联网的发展最开始就是单机Mysql的年代。图中的APP可以看作是网站应用它不是直接访问我们的mysql,它会通过一些方法也就是DAL数据库访问层之后才会进入我们Mysql的实例。这是我们最早的一个模型。90年代一个基本的网站访问量一般不会太大单个数据库完全足够大家可以想一下那个时候用互联网的人一共才有有多少呢。那个时候人们更多的去使用静态网页html~例如 http://www.hao123.com/ 网站我觉得大家一定知道hao123的网站吧hao123并不是一个大型网站而是一个导航网站它把所有网站的链接聚焦起来形成一个平台。所以说这样的网站服务器根本没有太大的压力单机Mysql就足够用了思考一下这种情况下网站的瓶颈是什么1数据量如果太大一个机器放不下了况且现在是大数据的时代2数据的索引我们知道mysql的索引单表超过300万就一定要建立索引了不建立索引的话相对来说查询会比较慢。索引太多的话一个机器的内存也放不下。3数据库的访问量比较大最开始是读写混合的它是一体的会造成性能问题服务器承受不了只要我们的网站出现了上面的三种情况之一我们就一定要晋级升级1.2 Memcached缓存 Mysql 垂直拆分读写分离的方式就是说一台服务器不够用了以图中举例这里我们变成三台服务器。首先我们要保证三台服务器数据是一致的我们2号数据库负责来写文件1号和3号数据库负责把2号数据库写的内容同步过去。说白了就是把所有写的操作都放在2号数据库上我们的1和3只是为了数据的同步那么我们真正要读的时候就从1和3中去读这就叫读写分离。然后我们得知道一种现象网站80%的情况都是在读每次都要去查询数据库的话就会十分的麻烦举个最简单的例子比如说张三去查1号商品李四又来查这个1号商品本来就是同一个sql我两次都去执行。效率会特别低下。那么我们就想哈在1号商品不变的情况下能不能做一份缓存用户去调用的话我们直接从缓存中取出来。所以说我们希望减轻数据的压力可以通过使用缓存来保证效率图中的cache缓存我们用什么技术都无所谓我们重点是要知道在这里加一层缓存来解决这个问题。1.3 分库分表 水平拆分 Mysql集群之后又演变成了分库分表因为库装不下了一个表数据太多了所以要分库分表。然后水平拆分说白了就是mysql集群。那么集群是怎么实现的呢举个例子说哈我要查一个用户信息用户进来先从缓存中去查缓存没有的话就从集群里去查。图中一共有三个集群每个集群放用户的三分之一的数据加起来就是一个完整的用户数据。通过集群的机制我们就知道数据存在哪个地方从而提高效率。1.4 如今的年代在如今的年代从2010-2020十年之间世界已经发生了翻天覆地的变化。就比如说定位它其实是一种数据再比如说音乐抖音热榜微博热榜也是一种动态实时的刷新非常快速的数据。那么再来想一下这些还能在这些最基础的mysql集群中来做么是不是就很费劲了呀。这里我再举个例子有的文章浏览量直接爆款10万他们是如何做到这一点的呢你会认为用户每一次浏览完都会写进mysql关系型数据库里么或者持久化到本地么这肯定是不可能的。他们做的第一件事情就肯定是把它放到缓存里面过一段固定的时间比如说1个小时两个小时再把它持久化一下这样可以保证更安全滴。否则刷个文章都能把人家服务器给刷崩了。所以说Mysql等关系型数据库就不够用了因为现在数据量很大且变化很快。但如果能有一类数据库专门能处理这些数据的话是不是就会分担Mysql的压力了呢那么下面就到了Nosql闪亮登场了~2.什么是NosqlNosql不仅仅是sql,泛指非关系型数据库。关系型数据库大家知道比如说表格有行和列。但是有很多的数据类型例如上面提到的用户的个人信息社交网络地理位置等。这些数据类型的存储不需要一个固定的格式也就是说不需要多余的操作就可以横向扩展的。这也就接下来我这边提到的Nosql的三大特点第一个就是方便扩展数据之间没有关系很好扩展。第二个特点大数据量高性能后面要讲解的Redis一秒写8万次读11万次。第三个特点数据类型是多样性的后面也会介绍到比如说redis有五大基础数据类型三大特殊类型。它不需要像mysql那样事先设计数据库可以随取随用Redis概述-- 特性、安装和数据类型1.什么是RedisRedis也叫Remote Dictionary Server即远程字典服务那么redis都有哪些特性呢第一个是内存存储与 memcached一样为了保证效率数据都是缓存在内存中。区别的是Redis会周期性的把更新的数据写入磁盘或者把修改操作写入追加的记录文件。第二个是持久化的能力因为Redis是内存数据库如果不将内存中的数据库状态保存到磁盘那么一旦服务器的进程退出服务器中的数据库状态也会消失。所以便提供了持久化的功能在指定的时间间隔内将内存中的数据集快照写入磁盘。第三个就是支持多种数据类型五种常用的数据类型字符串列表Set集合Hash哈希和Zset有序集合。三种新数据类型BitmapsHyperLogLog去重的数据类型Geographic关于地理位置的数据类型。2.Redis的安装启动3.Redis数据类型字符串因为后面会讲到通过分布式锁来解决高并发的问题这里最底层也就是用到了Redis数据类型字符串这个其实非常简单大家先自行看一下~先通过redis-cli连接上用到的指令如下set keyvalue添加键值对**.keys *查看当前库所有 keyget key查询对应键值Redis应用场景-- 分布式锁1.分布式锁是什么首先给大家解释一下分布式锁是什么它能解决什么问题我给大家说明一下。锁是什么其实非常好理解就好比代码中的lock代码中加了一层lock判断运行的时候自然就不会运行被lock包裹的代码。只有达到某种条件把lock锁释放掉了被lock包裹的代码才可以重新运行。大家接下来来看我图中的这段描述原本我们都用单体单机进行部署比如我们之前操作中加入一个锁里面其他操作会进行等待等我这个锁释放之后其他操作就可以进行了。但是随着我们业务的发展咱们的单机应用往往变成了分布式或者集群的系统。那在分布式或者集群系统中就有问题了比如说我们现在有三个集群现在我们给第一个机器加了一把锁。那么这个锁只针对当前机器其他这两把机器并不能得到这把锁。所以说这把锁对于其他机器并不是都有效。这也是里面我描述到的单体应用中我们设置锁可以生效当你是分布式集群之后这个锁不能生效这里边我们的JVM不能跨系统进行锁的控制。现在就需要一把锁让所有系统机器都认识也就是我们通俗说的共享锁。不知道大家理解没有说白了就是一把共享锁所有机器都生效。当我上锁之后无论你下一个操作是在当前机器还是其他那两个机器识别出来都只能等待。只有把锁释放之后其他操作才能进行。这就是分布式锁2.基于Redis实现分布式锁接下来我们聊一下分布式锁在redis中最简单的使用这里我们可以通过一个不是很恰当的例子来说明一下比如说你去上厕所你打开门进入是不是得上把锁啊外面再有人来看见上锁是不是得等待啊你解决完之后开锁出去其他人进来也得再上锁就这样以此类推的这个过程。也就是我们这实现的原理。这个时候思考一下这种实现方式有什么问题么就比如说这个人去上厕所他把锁锁上了但是不小心他在里面睡着了睡了得有1 - 2天这个锁是不是一直锁着啊别人就一直进入不了。那么这就是一个不正确的场景。那么我们怎么解决呢大家可以想一下3.优化分布式锁其实很简单我们在给锁上锁之后给锁设置一个过期时间在这个人去厕所的期间如果5分钟以内没有反应可以做一些特殊操作比如自动释放锁等把人弹出来这种。然后我通过指令的方式给大家演示一下这个过程中里面其实还有一个问题给大家提一个新概念叫原子操作什么是原子操作就是两个指令一起进行。大家想一下如果我在设置expire过期时间之前服务器突然挂掉了那咱的过期时间是不是就不能设置了呀。这样是不是就会出现问题了呢。解决办法其实也很简单就是上锁的时候同时设置过期时间让他们同步进行就可以解决了。这就是我们对分布式进行了一系列优化的操作这么听下来这个底层原理是不是还蛮简单的接下来就是在实战项目前端监控平台watchtower中我们通过这个redis的分布式锁原理来解决高并发请求的问题。Redis在前端监控平台的应用-- 分布式锁解决高并发请求1.Watchtower -- PV统计页面需求这个页面是一个关于具体指定的项目在一段时间内的pv统计折现图当前指定的项目在具体某一天用户进来访问一次当天的pv统计数量就会加一。整体实现还是很清晰的用户每访问一次会调用一次接口后台会根据接口取出对应数据库里的值并加一。但是这时会有一个问题倘若在某一时刻用户大量并发访问当前取数据加数据的操作一定会出现问题那么我们又是如何去解决的呢2.流程图和代码演示这个时候我们就采用上面介绍的Redis的分布式锁来处理这种高并发的问题保证数据的正常统计。首先定义一个redis的key由项目id和日期组成确保key的唯一性。之后通过getLock来确认key是否被占用如果锁被占用则等待一秒循环调用。如果锁没被占用再来判断定义的key是否还存在即有没有过期。如果key存在则取出数据库的数据加1倘若不存在则通过key初始化值为1且设置好过期时间。最后再统一释放锁。注意这里用的jimbClient是我们京东内部的一个redis的包大家使用的话可以使用redis的npm包详细地址参考 https://github.com/redis/node-redis结束语本文通过nosql到redis再到具体的项目应用带大家认识到了redis最常用的分布式锁的方法。其实对于redis还有其他很多好玩以及好用的功能得靠大家自己先一点点去摸索前进后续我也会给大家持续分享的。这里还是得提一下之前分享给大家的一句话学习技术的过程是从接纳和记忆知识开始的但绝不仅仅是接纳和记忆知识而是需要深入思考并自己总结和沉淀的。最后希望大家的技术都可以突飞猛进参考资料https://redis.io/docs/getting-started/https://www.kuangstudy.com/bbs?searchKeyrediscidpageNo1pageSize15