Redis(十五)Bitmap、Hyperloglog、GEO案例、布隆过滤器

文章目录

  • 面试题
  • 常见统计类型
    • 聚合统计
    • 排序统计
    • 二值统计
    • 基数统计
  • Hyperloglog
    • 专有名词
      • UV(Unique Visitor)独立访客
      • PV(Page View)页面浏览量
      • DAU(Daily Active User)日活跃用户量
      • MAU(Monthly Active User)
    • 需求
    • 原理
    • 亿级UV的Redis统计方案
  • GEO
    • 面试题
    • 命令
      • GEOADD
      • 获取某位置的经纬度GEOPOS
      • 返回坐标的Geohash表示GEOHASH
      • 两个位置之间距离GEODIST
      • 半径范围内的坐标GEORADIUS
      • 半径范围内坐标中心点是给定元素GEORADIUSBYMEMBER
  • Bitmap
    • 面试题
    • 作用场景
  • 布隆过滤器BloomFilter
    • 需求
    • 概述
    • 作用
    • 原理
      • 概述原理
      • 添加、查询元素过程
      • 使用步骤
      • 使用场景
    • 手写布隆过滤器案例
      • 优缺点
      • 布谷鸟过滤器:解决布隆过滤器不能删除缺点

面试题

  1. 抖音电商直播,主播介绍的商品有评论,1个商品对应了1系列的评论,排序+展现+取前10条记录
  2. 用户在手机App上的签到打卡信息:1天对应1系列用户的签到记录,新浪微博、钉钉打卡签到,来没来如何统计?
  3. 应用网站上的网页访问信息:1个网页对应1系列的访问点击,淘宝网首页,每天有多少人浏览首页?
  4. 你们公司系统上线后,说一下UV、PV、DAU分别是多少?

记录对集合中的数据进行统计

  1. 在移动应用中,需要统计每天的新增用户数和第2天的留存用户数;
  2. 在电商网站的商品评论中,需要统计评论列表中的最新评论;
  3. 在签到打卡中,需要统计一个月内连续打卡的用户数;
  4. 在网页访问记录中,需要统计独立访客(Unique Visitor,UV)量。

需求
亿级数据的收集+清洗+统计+展现

常见统计类型

亿级系统常见统计方式

聚合统计

统计多个集合元素的聚合结果,就是前面讲解过的交差并等集合统计
在这里插入图片描述
交并差集和聚合函数的应用

排序统计

  • 抖音短视频最新评论留言的场景,请你设计一个展现列表。

在面对需要展示最新列表、排行榜等场景时,如果数据更新频繁或者需要分页显示,建议使用ZSet

二值统计

集合元素的取值就只有0和1两种
在钉钉上班签到打卡的场景中,我们只用记录有签到(1)或没签到(0)
bitmap

基数统计

指统计一个集合中不重复的元素个数
见hyperloglog

Hyperloglog

去重统计估计算法

专有名词

UV(Unique Visitor)独立访客

需要去重考虑

PV(Page View)页面浏览量

不用去重

DAU(Daily Active User)日活跃用户量

登录或者使用了某个产品的用户数(去重复登录的用户)
常用于反映网站、互联网应用或者网络游戏的运营情况

MAU(Monthly Active User)

月活跃用户量

需求

  1. 很多计数类场景,比如 每日注册 IP 数、每日访问 IP 数、页面实时访问数 PV、访问用户数 UV等。
  2. 因为主要的目标高效、巨量地进行计数,所以对存储的数据的内容并不太关心。
  3. 也就是说它只能用于统计巨量数量,不太涉及具体的统计对象的内容和精准性。
  4. 统计单日一个页面的访问量(PV),单次访问就算一次。
  5. 统计单日一个页面的用户访问量(UV),即按照用户为维度计算,单个用户一天内多次访问也只算一次。
  6. 多个key的合并统计,某个门户网站的所有模块的PV聚合统计就是整个网站的总PV。

问题
如果数据显较大亿级统计,使用bitmaps同样会有问题。

bitmap是通过用位bit数组来表示各元素是否出现,每个元素对应一位,所需的总内存为N个bit。

基数计数则将每一个元素对应到bit数组中的其中一位,比如bit数组010010101(按照从零开始下标,有的就是1、4、6、8)。

新进入的元素只需要将已经有的bit数组和新加入的元素进行按位或计算就行。这个方式能大大减少内存占用且位操作迅速。

但是,假设一个样本案例就是一亿个基数位值数据,一个样本就是一亿
如果要统计1亿个数据的基数位值,大约需要内存100000000/8/1024/1024约等于12M,内存减少占用的效果显著。

这样得到统计一个对象样本的基数值需要12M。
如果统计10000个对象样本(1w个亿级),就需要117.1875G将近120G,可见使用bitmaps还是不适用大数据量下(亿级)的基数计数场景,

但是bitmaps方法是精确计算的。

原理

概率算法
通过牺牲准确率来换取空间,对于不要求绝对准确率的场景下可以使用,因为概率算法不直接存储数据本身。
通过一定的概率统计方法预估基数值,同时保证误差在一定范围内,由于又不储存数据故此可以大大节约内存。
HyperLogLog就是一种概率算法的实现。

只是进行不重复的基数统计,不是集合也不保存数据,只记录数量而不是具体内容。
Hyperloglog提供不精确的去重计数方案
牺牲准确率来换取空间,误差仅仅只是0.81%左右
http://antirez.com/news/75

亿级UV的Redis统计方案

UV的统计需要去重,一个用户一天内的多次访问只能算作一次
淘宝、天猫首页的UV,平均每天是1~1.5个亿左右
每天存1.5个亿的IP,访问者来了后先去查是否存在,不存在加入

// 用于产生模拟后台访问数据
@Service
@Slf4j
public class HyperLogLogService
{@Resourceprivate RedisTemplate redisTemplate;/*** 模拟后台有用户点击首页,每个用户来自不同ip地址*/@PostConstructpublic void init(){log.info("------模拟后台有用户点击首页,每个用户来自不同ip地址");new Thread(() -> {String ip = null;for (int i = 1; i <=200; i++) {Random r = new Random();ip = r.nextInt(256) + "." + r.nextInt(256) + "." + r.nextInt(256) + "." + r.nextInt(256);Long hll = redisTemplate.opsForHyperLogLog().add("hll", ip);log.info("ip={},该ip地址访问首页的次数={}",ip,hll);//暂停几秒钟线程try { TimeUnit.SECONDS.sleep(3); } catch (InterruptedException e) { e.printStackTrace(); }}},"t1").start();}}
@Api(description = "淘宝亿级UV的Redis统计方案")
@RestController
@Slf4j
public class HyperLogLogController
{@Resourceprivate RedisTemplate redisTemplate;@ApiOperation("获得IP去重后的首页访问量")@RequestMapping(value = "/uv",method = RequestMethod.GET)public long uv(){//pfcountreturn redisTemplate.opsForHyperLogLog().size("hll");}}

GEO

是zset

面试题

外卖软件中附近的美食店铺、打车软件附近的车辆等等。那这种附近各种形形色色的XXX地址位置选择

  1. 查询性能问题,如果并发高,数据量大这种查询是要搞垮mysql数据库的
  2. 一般mysql查询的是一个平面矩形访问,而叫车服务要以我为中心N公里为半径的圆形覆盖。
  3. 精准度的问题,我们知道地球不是平面坐标系,而是一个圆球,这种矩形计算在长距离计算时会有很大误差,mysql不合适

命令

GEOADD

GEOADD city 116.403963 39.915119 "天安门" 116.403414 39.924091 "故宫" 116.024067 40.362639 "长城"

在这里插入图片描述

获取某位置的经纬度GEOPOS

GEOPOS city 天安门 故宫

在这里插入图片描述

返回坐标的Geohash表示GEOHASH

GEOHASH city 天安门 故宫 长城

在这里插入图片描述

两个位置之间距离GEODIST

GEODIST city 天安门 长城 km

m 米
km 千米
ft 英尺
mi 英里
在这里插入图片描述

半径范围内的坐标GEORADIUS

GEORADIUS city 116.418017 39.914402 10 km withdist withcoord count 10 withhash desc
  • WITHDIST: 在返回位置元素的同时, 将位置元素与中心之间的距离也一并返回。 距离的单位和用户给定的范围单位保持一致。
  • WITHCOORD: 将位置元素的经度和维度也一并返回。
  • WITHHASH: 以 52 位有符号整数的形式, 返回位置元素经过原始 geohash 编码的有序集合分值。 这个选项主要用于底层应用或者调试, 实际中的作用并不大
  • COUNT 限定返回的记录数。

半径范围内坐标中心点是给定元素GEORADIUSBYMEMBER

GEORADIUSBYMEMBER city 天安门 km withdist withcoord count 10 withhash desc

在这里插入图片描述

Bitmap

面试题

  1. 日活统计
  2. 连续签到打卡
  3. 最近一周的活跃用户
  4. 统计指定用户一年之中的登陆天数
  5. 某用户哪几天登陆过,哪几天没有登陆,全年中登录的天数共计多少

作用场景

  1. 用户是否登陆过Y、N,比如京东每日签到送京豆
  2. 电影、广告是否被点击播放过
  3. 钉钉打卡上下班,签到统计

布隆过滤器BloomFilter

需求

  1. 现有50亿个电话号码,现有10万个电话号码,如何要快速准确的判断这些电话号码是否已经存在?
  2. 安全连接网址,全球数10亿的网址判断
  3. 黑名单校验,识别垃圾邮件
  4. 白名单校验,识别出合法用户进行后续处理

概述

由一个初值都为零的bit数组和多个哈希函数构成,1用来快速判断集合中是否存在某个元素
本质就是判断具体数据是否存在于一个大的集合中

布隆过滤器是一种类似set的数据结构,国只是统计结果在巨量数据下有点小瑕疵,不够完美

作用

高效地插入和查询,占用空间少,返回的结果是不确定性+不够完美。

重点

  1. 一个元素如果判断结果:存在时,元素不一定存在但是判断结果为不存在时,则一定不存在
  2. 布隆过滤器可以添加元素,但是不能删除元素由于涉及hashcode判断依据,删掉元素会导致误判率增加。

原理

概述原理

布隆过滤器是专门用来解决去重问题的高级数据结构

实质就是一个大型位数组和几个不同的无偏hash函数(无偏表示分布均匀)。由一个初值都为零的bit数组和多个个哈希函数构成,用来快速判断某个数据是否存在。但是跟 HyperLogLog 一样,它也一样有那么一点点不精确,也存在一定的误判概率

添加、查询元素过程

  • 添加key时
    使用多个hash函数对key进行hash运算得到一个整数索引值,对位数组长度进行取模运算得到一个位置,每个hash函数都会得到一个不同的位置,将这几个位置都置1就完成了add操作。

  • 查询key时
    只要有其中一位是零就表示这个key不存在,但如果都是1,则不一定存在对应的key。

结论:有,是可能有 无,是肯定无

举例
当有变量被加入集合时,通过N个映射函数将这个变量映射成位图中的N个点,把它们置为 1(假定有两个变量都通过 3 个映射函数)。
在这里插入图片描述
如果这些点,有任何一个为零则被查询变量一定不在,如果都是 1,则被查询变量很可能存在

  • 为什么说是可能存在,而不是一定存在呢?那是因为映射函数本身就是散列函数,散列函数是会有碰撞的。(见上图3号坑两个对象都1)

缓存穿透解决方案:
正是基于布隆过滤器的快速检测特性,我们可以在把数据写入数据库时,使用布隆过滤器做个标记。当缓缺失后,应用查询数据库时,可以通过查询布降过滤器快速判断数据是否存在。如果不存在,就不用再去据库中查询了。这样一来,即使发生缓存穿透了,大量请求只会查询Redis和布隆过滤器,而不会积压到据库,也就不会影响数据库的正常运行。布降过滤器可以使用Redis实现,本身就能承担较大的并发访问力。

Hash冲突:https://segmentfault.com/a/1190000022553292

使用步骤

  1. 初始化Bitmap
    布隆过滤器 本质上 是由长度为 m 的位向量或位列表(仅包含 0 或 1 位值的列表)组成,最初所有的值均设置为 0
    在这里插入图片描述
  2. 添加对应占位

当我们向布隆过滤器中添加数据时,为了尽量地址不冲突,会使用多个 hash 函数对 key 进行运算,算得一个下标索引值,然后对位数组长度进行取模运算得到一个位置,每个 hash 函数都会算得一个不同的位置。再把位数组的这几个位置都置为 1 就完成了 add 操作。

例如:我们添加一个字符串wmyskxz,对字符串进行多次hash(key) → 取模运行→ 得到坑位
在这里插入图片描述

  1. 判断是否存在
    向布隆过滤器查询某个key是否存在时,先把这个 key 通过相同的多个 hash 函数进行运算,查看对应的位置是否都为 1,
    只要有一个位为零,那么说明布隆过滤器中这个 key 不存在;
    如果这几个位置全都是 1,那么说明极有可能存在;
    因为这些位置的 1 可能是因为其他的 key 存在导致的

例如:在 add 了字符串wmyskxz数据之后,很明显下面1/3/5 这几个位置的 1 是因为第一次添加的 wmyskxz 而导致的;此时我们查询一个没添加过的不存在的字符串inexistent-key,它有可能计算后坑位也是1/3/5
在这里插入图片描述

使用场景

  1. 解决缓存穿透问题:redis结合Bitmap使用

把已存在数据的key存在布隆过滤器中,相当于redis前面挡着一个布隆过滤器。

当有新的请求时,先到布隆过滤器中查询是否存在:
如果布隆过滤器中不存在该条数据则直接返回;
如果布隆过滤器中已存在,才去查询缓存redis,如果redis里没查询到则再查询Mysql数据库
在这里插入图片描述

  1. 黑名单校验
  2. 安全连接网址,亿级数量判断

手写布隆过滤器案例

在这里插入图片描述
初始化白名单用户到布隆过滤器

@PostConstruct
public void init(){//白名单客户预加载到布隆过滤器String uid = "customer:12";//1 计算hashcode,由于可能有负数,直接取绝对值int hashValue = Math.abs(uid.hashCode());//2 通过hashValue和2的32次方取余后,获得对应的下标坑位long index = (long) (hashValue % Math.pow(2, 32));log.info(uid+" 对应------坑位index:{}",index);//3 设置redis里面bitmap对应坑位,该有值设置为1redisTemplate.opsForValue().setBit("whitelistCustomer",index,true);}

布隆过滤器检查

@Component
@Slf4j
public class CheckUtils
{@Resourceprivate RedisTemplate redisTemplate;public boolean checkWithBloomFilter(String checkItem,String key){int hashValue = Math.abs(key.hashCode());long index = (long) (hashValue % Math.pow(2, 32));boolean existOK = redisTemplate.opsForValue().getBit(checkItem, index);log.info("----->key:"+key+"\t对应坑位index:"+index+"\t是否存在:"+existOK);return existOK;}
}

Controller

@RestController
@Slf4j
public class CustomerController
{@Resource private CustomerSerivce customerSerivce;@ApiOperation("数据库初始化2条Customer数据")@RequestMapping(value = "/customer/add", method = RequestMethod.POST)public void addCustomer() {for (int i = 0; i < 2; i++) {Customer customer = new Customer();customer.setCname("customer"+i);customer.setAge(new Random().nextInt(30)+1);customer.setPhone("1381111xxxx");customer.setSex((byte) new Random().nextInt(2));customer.setBirth(Date.from(LocalDateTime.now().atZone(ZoneId.systemDefault()).toInstant()));customerSerivce.addCustomer(customer);}}@ApiOperation("单个用户查询,按customerid查用户信息")@RequestMapping(value = "/customer/{id}", method = RequestMethod.GET)public Customer findCustomerById(@PathVariable int id) {return customerSerivce.findCustomerById(id);}@ApiOperation("BloomFilter案例讲解")@RequestMapping(value = "/customerbloomfilter/{id}", method = RequestMethod.GET)public Customer findCustomerByIdWithBloomFilter(@PathVariable int id) throws ExecutionException, InterruptedException{return customerSerivce.findCustomerByIdWithBloomFilter(id);}
}

Service

@Service
@Slf4j
public class CustomerSerivce
{public static final String CACHA_KEY_CUSTOMER = "customer:";@Resourceprivate CustomerMapper customerMapper;@Resourceprivate RedisTemplate redisTemplate;@Resourceprivate CheckUtils checkUtils;/*** 写操作* @param customer*/public void addCustomer(Customer customer){int i = customerMapper.insertSelective(customer);if(i > 0){//mysql插入成功,写进redisCustomer result = customerMapper.selectByPrimaryKey(customer.getId());//redis缓存keyString key = CACHA_KEY_CUSTOMER+customer.getId();//写进redisredisTemplate.opsForValue().set(key,result);}}public Customer findCustomerById(Integer customreId){Customer customer = null;//缓存redis的key名称String key = CACHA_KEY_CUSTOMER+customreId;customer = getCustomer(customreId, key);return customer;}/*** 白名单:whitelistCustomer*/public Customer findCustomerByIdWithBloomFilter (Integer customerId){Customer customer = null;//缓存key的名称String key = CACHA_KEY_CUSTOMER + customerId;//布隆过滤器check,无是绝对无,有是可能有//===============================================if(!checkUtils.checkWithBloomFilter("whitelistCustomer",key)){log.info("白名单无此顾客,不可以访问: "+key);return null;}//===============================================//1 查询rediscustomer = getCustomer(customerId, key);return customer;}private Customer getCustomer(Integer customreId, String key) {Customer customer;//1 先去redis查询customer = (Customer) redisTemplate.opsForValue().get(key);//2 redis有直接返回,没有再进去查询mysqlif (customer == null) {// 3 再去查询我们的mysqlcustomer = customerMapper.selectByPrimaryKey(customreId);// 3.1 mysql有,redis无if (customer != null) {//3.2 把mysq查询出来的数据回写redis,保持一致性redisTemplate.opsForValue().set(key, customer);}}return customer;}
}

优缺点

优点
高效地插入和查询,内存占用bit空间少
缺点

  1. 不能删除元素。
  2. 因为删掉元素会导致误判率增加,因为hash冲突同一个位置可能存的东西是多个共有的你删除一个元素的同时可能也把其它的删除了。
  3. 存在误判,不能精准过滤:有,是很可能有;无,是肯定无。

布谷鸟过滤器:解决布隆过滤器不能删除缺点

为了解决布隆过滤器不能删除元素的问题,布谷鸟过滤器横空出世。

论文:
《Cuckoo Filter:Better Than Bloom》

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://xiahunao.cn/news/2803574.html

如若内容造成侵权/违法违规/事实不符,请联系瞎胡闹网进行投诉反馈,一经查实,立即删除!

相关文章

人工智能 — 数字图像

目录 一、图像1、像素2、图像分辨率3、RGB 模型4、灰度5、通道6、对比度7、RGB 转化为 Gray8、RGB 值转化为浮点数9、二值化10、常用视觉库11、频率12、幅值 二、图像的取样与量化1、数字图像2、取样3、量化 三、上采样与下采样1、上采样&#xff08;upsampling&#xff09;2、…

Encoder-decoder 与Decoder-only 模型之间的使用区别

承接上文&#xff1a;Transformer Encoder-Decoer 结构回顾 笔者以huggingface T5 transformer 对encoder-decoder 模型进行了简单的回顾。 由于笔者最近使用decoder-only模型时发现&#xff0c;其使用细节和encoder-decoder有着非常大的区别&#xff1b;而huggingface的接口为…

解决SpringAMQP工作队列模型程序报错:WARN 48068:Failed to declare queue: simple.queue

这里写目录标题 1.运行环境2.报错信息3.解决方案4.查看解决之后的效果 1.运行环境 使用docker运行了RabbitMQ的服务器&#xff1a; 在idea中导入springAMQP的jar包&#xff0c;分别编写了子模块生产者publisher&#xff0c;消费者consumer&#xff1a; 1.在publisher中运行测试…

Excel Ctrl + E快捷键 批量合并提取数据

目录 一. 合并数据二. 提取数据 Ctrl L 只是快捷键&#xff0c;在数据面板中有快速填充的按钮。 一. 合并数据 &#x1f914;有如图所示的数据&#xff0c;现在想批量的把姓名和电话合在一起 &#x1f9d0;先把要处理的数据手动复制到一起&#xff0c;然后按下 Ctrl E 就可以…

Element table 实现表格行、列拖拽功能

安装包 npm install sortablejs --save <template><div class"draggable" style"padding: 20px"><el-table row-key"id" :data"tableData" style"width: 100%" border><el-table-columnv-for"(it…

【C++私房菜】面向对象中的多重继承以及菱形继承

文章目录 一、多重继承1、多重继承概念2、派生类构造函数和析构函数 二、菱形继承和虚继承2、虚继承后的构造函数和析构函数 三、has-a 与 is-a 一、多重继承 1、多重继承概念 **多重继承&#xff08;multiple inheritance&#xff09;**是指从多个直接基类中产生派生类的能力…

Stable Diffusion 模型分享:AstrAnime(Astr动画)

本文收录于《AI绘画从入门到精通》专栏&#xff0c;专栏总目录&#xff1a;点这里。 文章目录 模型介绍生成案例案例一案例二案例三案例四案例五 下载地址 模型介绍 AstrAnime 是一个动漫模型&#xff0c;画风色彩鲜明&#xff0c;擅长绘制漂亮的小姐姐。 条目内容类型大模型…

uniapp实现全局悬浮框

uniapp实现全局悬浮框(按钮,页面,图片自行设置) 可拖动 话不多说直接上干货 1,在components新建组件(省去了每个页面都要引用组件的麻烦) 2,实现代码 <template><view class"call-plate" :style"top: top px;left: left px;" touchmove&quo…

【目标检测新SOTA!v7 v4作者新作!】YOLO v9 思路复现 + 全流程优化

YOLO v9 思路复现 全流程优化 提出背景&#xff1a;深层网络的 信息丢失、梯度流偏差YOLO v9 设计逻辑可编程梯度信息&#xff08;PGI&#xff09;&#xff1a;使用PGI改善训练过程广义高效层聚合网络&#xff08;GELAN&#xff09;&#xff1a;使用GELAN改进架构 对比其他解法…

V2X与ETC到底有什么不同?

作者介绍 新春假期刚刚结束&#xff0c;大家在返程路上是否会因为堵车发愁&#xff1f;尤其是在假期结束后高速不再免费&#xff0c;人工收费口大排长队&#xff0c;这时大家是否会感慨ETC&#xff08;Electronic Toll Collection&#xff0c;电子不停车收费&#xff09;技术为…

如何在Shopee平台上优化饰品类目选品?

在Shopee这样竞争激烈的电商平台上&#xff0c;针对饰品类目进行选品是一项需要精心策划和执行的任务。卖家们需要通过深入的市场分析和精准的策略&#xff0c;才能在激烈的竞争中脱颖而出&#xff0c;提高产品的曝光度和销售业绩。下面将介绍一些在Shopee平台上优化饰品类目选…

【高德地图】Android搭建3D高德地图详细教

&#x1f4d6;Android搭建3D高德地图详细教程 &#x1f4d6;第1章 高德地图介绍✅了解高德地图✅2D地图与3D地图 &#x1f4d6;第2章 搭建3D地图并显示✅第 1 步&#xff1a;创建 Android 项目✅第 2 步&#xff1a;获取高德Key✅第 3 步&#xff1a;下载地图SDK✅第 4 步&…

发现了一个超赞的办公利器!ONLYOFFICE 文档 8.0 强势登场!

迎接 ONLYOFFICE 文档 v8.0发布后的全新升级&#xff01;现在&#xff0c;适用于 Linux、Windows 和 macOS 的免费 ONLYOFFICE 桌面应用程序更加强大&#xff01;全新的 RTL 界面、本地界面主题、与 Moodle 的集成等实用功能&#xff0c;让你的办公体验更加出色&#xff01;全新…

system V 共享内存

1.共享内存的原理 要理解共享内存的原理&#xff0c;首先我们得记起进程间通信的前提&#xff1a;必须让不同的进程看到同一份资源&#xff08;必须由OS提供&#xff09; 我们都知道进程都会有自己的进程地址空间&#xff0c;然后都会通过页表与物理内存进行映射&#xff0c;…

springboot214基于springboot的多媒体素材库的开发与应用

多媒体素材库的设计与实现 摘要 近年来&#xff0c;信息化管理行业的不断兴起&#xff0c;使得人们的日常生活越来越离不开计算机和互联网技术。首先&#xff0c;根据收集到的用户需求分析&#xff0c;对设计系统有一个初步的认识与了解&#xff0c;确定多媒体素材库的总体功…

vue源码分析之nextTick源码分析-逐行逐析-错误分析

nextTick的使用背景 在vue项目中&#xff0c;经常会使用到nextTick这个api&#xff0c;一直在猜想其是怎么实现的&#xff0c;今天有幸研读了下&#xff0c;虽然源码又些许问题&#xff0c;但仍值得借鉴 核心源码解析 判断当前环境使用最合适的API并保存函数 promise 判断…

SD-WAN组网:打造跨国企业无缝网络连接体验

在数字化转型的时代&#xff0c;越来越多的企业迈向国际化&#xff0c;然而&#xff0c;由于自建网络架构的限制和跨域网络的复杂性&#xff0c;企业在不同地理位置的站点之间难以实现高效的数据互通和协作。这就是为什么SD-WAN成为跨国企业组网的理想选择的原因。 跨国企业常见…

你真的了解nsight compute中的Roofline Charts吗?

此文章是之前看nsight-compute官网的时候做的笔记。因为这个记笔记的时候使用的文档记录下来会更直观好看&#xff0c;所以本次的笔记采用了截图的方式。中英文是方便沟通记忆&#xff0c;概念对齐。

HashMap 源码学习-jdk1.8

1、一些常量的定义 这里针对MIN_TREEIFY_CAPACITY 这个值进行解释一下。 java8里面&#xff0c;HashMap 的数据结构是数组 &#xff08;链表或者红黑树&#xff09;&#xff0c;每个数组节点下可能会存在链表和红黑树之间的转换&#xff0c;当同一个索引下面的节点超过8个时…

网安播报 | AI生成代码对组织和软件供应链构成了重大风险

1、AI生成代码对组织和软件供应链构成了重大风险 根据Veracode最新发布的软件安全报告&#xff0c;42%的应用程序和71%的组织中普遍存在软件安全债务&#xff0c;而AI生成代码的激增将导致安全债务问题恶化并对软件供应链构成重大风险。更令人担忧的是&#xff0c;46%的组织持续…