本文作者:cjinhuo,未经授权禁止转载。
背景
接着上一个系列的前端监控平台系列:JS SDK(已开源),这篇的主要目的讲下服务端的功能设计与实现
技术栈
nestjs
nestjs对TS支持较好,有丰富的装饰器以及开箱即用的依赖注入容器
redis
redis.hash
由于错误上报是一个经常性的操作,如果每次都查询数据库比较浪费资源,所以用来存放apikey
与项目间的联系等一些需要常用的数据,全部都存在一个hash
中是为了跟别的项目区分开,相当于一个命名空间的作用(hash
中的key
不能设置过期时间)
redis.string
用来存放用户id信息、项目id信息以及一些高频使用数据,但是切记要设置过期时间,不然一些长期没有用的数据就会残留在redis
中
redis.list
用来实现类似RabbitMQ的功能,用于批量计算入库,下文有介绍
redis.bitmap
bitmap
用来统计某个标签的数量不仅速度快、支持高并发、占的内存特别少,因为是用二进制来存储每个对应标签的值,首先来了解下bit(位)、byte(字节)、word(字)
Bit&Byte&Word
Bit = Binary digIT = 0 or 1
Byte = a sequence of 8 bits = 00000000, 00000001, ..., or 11111111
Word = a sequence of N bits where N = 16, 32, 64 depending on the computer
场景一:比如我现在需要统计全公司所有人(有10万个员工)的一年内365天的签到记录:
- 用数据库来存储,建一张包含时间、员工id,每次有人签到就直接在对应表中
insert
,缺点:如果人数很多并且同时签到,会造成数据库连接池爆炸,不能实时更新。优点:存有明细数据,可以查询某一天的某个时刻签到的 - 用每天的日期当做
bitmap
的key
,value
是userId
,一个userId
在内存中占了二进制位(bit),比如连续自增userId
10万个人签到在内存中占了(12500B ≈ 12K,如果换成hash
表,相当与用word
来存储,内存至少大了16倍),判断一个人是否签到只需要判断当前userId
所处的二进制位是否被占。缺点:需要自己在内存中额外建一个map来对应明细数据,比如用户在某天签到的具体时间。优点:运行内存速度快、支持高并发,实时查询、插入、更改
常见问题FAQ
- 免费下载或者VIP会员专享资源能否直接商用?
- 本站所有资源版权均属于原作者所有,这里所提供资源均只能用于参考学习用,请勿直接商用。若由于商用引起版权纠纷,一切责任均由使用者承担。更多说明请参考 VIP介绍。
- 提示下载完但解压或打开不了?
- 找不到素材资源介绍文章里的示例图片?
- 模板不会安装或需要功能定制以及二次开发?
发表评论
还没有评论,快来抢沙发吧!