• ZK的数据模型

    ZK的数据模型是一种树形结构,具有一个固定的根节点(/),可以在根节点下创建子节点,并在子节点下继续创建下一级节点。 每一层级用/隔开,且只能用绝对路径(get/work/task1)的方式查询ZK节点,而不能用相对路径。 持久节点 将节点创建为持久节点,该数据节点会一直存储在ZK服务器上,即使创建该节点的客户端与服务端的会话关闭了,该节点依然不会被删除,除非显式调用delete函数进行删除操作。 临时节点 如果将节点创建为临时节点,那么该节点数据不会一直存储在ZK服务器上。当创建该临时节点的客户端会话因超时或发生异常而关闭时,该节点也相应在ZK服务器上被删除。也可以主动调用delete删除。 有序节点 有序节点并不算一种单独种类的节点,而是在持久节点和临时节点的基础上,增加一个节点有序的性质。创建有序节点的时候,ZK服务器会自动使用一个单调递增的数字作为后缀,追加到创建的节点后边。例如一个客户端创建了一个路径为works/task-的有序节点,那么ZooKeeper将会生成一个序号并追加到该节点的路径后,最后该节点的路径为works/task-1。 节点内容 一个二进制数组(byte data[]),用来存储节点的数据、ACL访问控制、子节点数据(因为 临时节点不允许有子节点,所以其子节点字段为null),记录自身状态信息的stat。 stat +节点路径可以查看状态信息 czxid:创建节点的事务id mzxid:最后一次被更新的事务id pzxid:子节点最后一次被修改的事务id ctime:创建时间 mtime:最后更新时间 version:版本号、表示的是对节点数据内容,子节点信息或ACL信息的修改次数可以避免并发更新问题,使用之前获取的版本进行CAS操作更新 cversion:子节点版本号 aversion:acl的版本号 ephemeralOwner:创建节点的sessionId,如果是持久节点、值为0 dataLenght:数据内容长度 numChildren:子节点个数 ...

    2023-11-02 155
  • MySQL数据库事务是什么

    什么是事务 数据库的事务是一种机制,一个操作序列,包含了一组操作命令 事务把所有的命令作为一个整体一起向系统提交或撤销操作请求,即这一组数据库命令,要么同时成功,要么同时失败 事务是一个不可分割的工作逻辑单元 为什么需要事务 事务的主要目的是确保数据库操作的一致性和完整性。下面是一个简单的例子来解释为什么需要事务。 假设有一个银行系统,其中有两个账户 A 和 B,当前账户 A 的余额为 1000 元,账户 B 的余额为 2000 元。现在有两个用户同时进行转账操作,一个用户从账户 A 向账户 B 转账 500 元,另一个用户从账户 B 向账户 A 转账 700 元。 如果没有事务的支持,那么这两个转账操作可以并发执行,可能会导致以下问题: 并发问题:在没有事务的情况下,两个用户同时进行转账操作时,可能会出现竞争条件。例如,如果用户 A 首先读取账户 A 的余额为 1000 元,在用户 B 读取账户 B 的余额为 2000 元之前执行转账操作,那么用户 A 的转账操作会以账户 A 余额为 1000 元进行计算,导致账户 A 的余额不正确。 数据不一致:如果两个转账操作不在同一个事务中,当第一个转账操作成功并提交后,而第二个转账操作失败并中止,会导致账户 A 和账户 B 的余额不一致。 数据丢失:如果没有事务支持,当一个转账操作成功时,另一个转账操作发生错误并中止,导致其中一个用户的转账款项丢失。 通过使用事务,可以解决上述问题。事务可以确保这两个转账操作要么全部成功,要么全部失败。 如果其中一个转账操作失败,事务可以回滚到事务开始之前的状态,保证数据的一致性。 同时,事务还可以提供隔离性,使得并发执行的转账操作相互不影响。 事务的四大特性 ...

    2023-11-02 142
  • API key和token有什么区别?

    “计算机科学只存在两个难题:缓存失效和命名。” — Phil KarIton 命名的难度在于如何让变量、常量、函数或类的定义清晰而简洁,而不应有歧义。如果我们不能清楚的看懂某个变量,那么这个变量的命名就不太准确。‍ API key 和 token 就有这种问题,它们都是作为一种身份验证机制。前几天我在一次讨论中,有人提到这两个词可以互换使用。大约两分钟后,我不得不停止谈话并说“你们应该知道它们是不同的,对吧?”‍,说完会上鸦雀无声,显然他们不知道。事实证明,很多人都无法告诉我 API key 和 token 之间的区别。因此文本我将向大家介绍它们之间的区别。 定义 我们可以通过以下定义来区分 API key 和 token。 API key — 通过代码调用 API 时提供的值,用于识别和授权调用者。它旨在以编程方式使用,通常是一长串字母和数字。 token — 代表用户会话或特定权限的一段数据。供个人用户在有限的时间内使用。 生成方式 两者之间的创建方法通常也不同。 API key — 通常通过用户界面创建一次,并且在轮换之前可以一直使用,也可以选择配置为在一定时间后过期。 token — 在成功验证或登录成功时动态生成。通常过期时间较短,但可以刷新较长时间。 权限范围 权限范围是指授权部分或使用提供的身份验证方法时可以执行哪些功能。 API key — 固定的、不变的应用程序功能权限集。谁拥有 API key 就可以访问允许的资源。 token — 仅限于个人有权访问的特定数据或功能。这可能会受到角色或其他业务级别要求的影响。往往更关注数据限制。 安全性 它们的安全性如何?如果 API key 或者 token 被恶意用户泄露或获取,潜在的损害有多严重? API key — 由于这些密钥通常是长期存在的并且不限制对数据的访问,因此如果被泄露,可能会造成毁灭性的后果。通常撤销 API key 是解决问题的唯一手段。应用程序通常需要具有良好的可观察性,以识别受损密钥并找到恶意用户。 token — 设计时考虑到了安全性。通常是短暂的并且很容易被撤销。受损的令牌仅具有用户有权访问的数据范围,并且将自动过期。 使用方式 什么时候你会使用其中一种而不是另一种呢?看起来他们在利弊之间取得了很好的平衡。 API key — 用于服务器到服务器之间的通信,例如访问天气 API 等公共数据、与第三方系统集成。 token — 用于用户身份验证、细粒度访问控制 (FGAC)、授予对资源的临时访问权限、浏览器访问权限以及管理用户会话。 举个例子 现在我们了解了两者之间的区别,让我们看一下使用 Momento JavaScript SDK 的两个实际示例。 API key 上文提到过 API key 通常是在用户界面创建的。考虑到隐私性,我没有可以分享的实际 API key。 不过以下是大家作为用户如何通过 Momento 控制台获取 API 密钥的方法。‍ 大家可以选择所需的权限,设置可选的到期日期,然后点击 Genergate Api Key。 然后我们可以工作流程中使用该 API key。 token 与成功登录时生成的基于用户的一次性 token 进行对比。我们可以采用基于角色的示例,用户可以只读访问日历事件缓存,但可以发布和订阅协作主题的访问权限。 // called on successful login exports.handler = async (event) => { const user = await loadUserMetadata(event.userId); let token; switch(user.role){ case 'data-entry': token = await getDataEntryToken(user.tenantId); break; case 'admin': token = await getAdminToken(user.tenantId); break; default: throw new Error('Role not supported'); } return token; }; const getDataEntryToken = async (tenantId) => { const scope = { permissions: [ { role: 'readonly', cache: 'calendar-events', item: { keyPrefix: tenantId } }, { role: 'publishsubscribe', cache: 'collaboration', topic: `${tenantId}-events` } ] }; const response = await authClient.generateDisposableToken(scope, ExpiresIn.minutes(15)); return { token: response.authToken, expiresAt: response.expiresAt.epoch() }; }; 以在此处看到,我们创建了一个有效期为 15 分钟的令牌,其权限范围是日历功能的只读权限,并且仅允许访问以用户所属的 tenantId 开头的缓存项。 因此,我们根据用户的属性限制了功能和数据。 总结 API key 和 token 各有优缺点,一个并不比另一个更好。 在决定要应用哪种身份验证机制时,请结合你的应用场景来进行选择。 如果是用在用户会话的身份验证场景时,可以使用 token。 如果是给第三方系统提供接口需要身份验证时,可以使用 API key。 ...

    2023-11-02 149
  • 什么是数据复制,有哪些架构

    数据复制是指将数据复制到一个或多个数据容器以确保可用性的过程。 复制的数据通常存储在不同的数据库实例中,即使一个实例发生故障,我们也可以从其他实例获取数据。 一种流行数据复制的实现架构是主从架构。 主从架构 为了理解这个架构,我们举一个例子。 我们有四个客户端,每个客户端都连接到一个负载均衡器。 然后负载均衡器将请求分发到三个应用程序服务器。 每台服务器连接到一个数据库实例。 你能注意到这里有什么问题吗? 我们的数据库存在单点故障。如果它崩溃了,我们的整个系统就会停止工作。 为了避免这种单点故障,我们可以使用另一个数据库(最好是不同的数据库实例)来存储原始数据的副本(一般我们成为从库)。现在如果原始数据库(主库)崩溃,我们可以将请求转到从库。 但是我们如何保持从库与主库同步呢?这有两种方法。 同步复制数据 在这种方法中,数据同时写入主库和从库 数据始终一致。即数据如果写入主库,它也会写入从库 数据库负载较高 异步复制数据 在这种方法中,首先将数据写入主库,并定期将更新写入从库 由于复制以固定间隔进行,因此存在数据丢失和不一致的可能性 数据库负载相对较低 这里我们的一般定义是收到写请求的主库数据库是 master,从库被称为 slaves。 如上图我们的主站也就是 Server2 维护事务日志。他会更新从站中(Server1)的数据,它发送命令,然后从站以相同的顺序执行这些命令。 如果服务器向从站发送写入请求会发生什么? 有两种方法可以处理这种情况 不允许对从站的写请求,从站无法写入数据库,它只能去读从库数据。 允许从站写入数据。我们将允许从站写入数据。然后从站将更改复制到主站。在这种情况下,从站就接替了主站的角色。所以不再是主从架构而是主主架构 主主架构的问题 网络故障可能会导致主主架构中的数据不一致。 让我们用一个例子来理解这一点,假设我们有两个数据库实例 A 和 B。 两人都是 master。 它们之间的路由器出现故障。所以 A 认为 B 离线,B 认为 A 离线。 他们有一个数据项 X,其值最初为 100。 现在用户发送以下请求, X 减去 20,该请求被路由到 A,此时 A 中 X 的值为 80。 X 减去 80,这个请求被路由到 B(因为都是 master,所以写请求可以路由到任何数据库)。现在 B 中 X 的值为 20。“由于存在通信故障,A 和 B 无法同步,它们具有不同的数据值,因此不一致。” 现在,如果用户发出读请求,他/她将获得不同的值,具体取决于他/她将连接到的数据库。 这个问题被称为裂脑问题。 解决裂脑问题 我们可以通过添加第三个节点(数据库实例)来解决裂脑问题。 这里我们假设一个节点崩溃以及其他两个节点之间的路由器崩溃的可能性极小。 让我们考虑三个数据库实例 A、B 和 C。 如果 C 崩溃,A 和 B 是主库并且它们是同步的。所以他们处于一致的状态。当 C 在线时,他们可以读取 A 或 B 的内容。 如果 A 和 B 之间出现通信故障 当 A 收到写入请求时,它将其状态传播到 C。最初状态为 S0,然后转移到 Sx。所以现在 A 和 C 都有 Sx。 当 B 收到写入请求时,它将其状态从 S0 移至 Sy。它尝试将其状态传播到 C,但失败,因为 B 的先前状态不等于 C。现在 B 中止写入请求并将其状态更新为 Sx。现在 B 可以接受写入请求并将更改传播到 C。 这称为分布式共识。多个节点就特定值达成一致。在这种情况下,A、B 和 C 在最终状态上达成一致。 最后 感谢您的阅读,希望本文能对你理解分布式架构中的数据复制有所帮助。 ...

    2023-11-02 167
  • 青海西宁公安机关破获该省首例通过暗网从境外走私运输新型毒品案件

      10月26日下午,西宁市公安局召开西宁市禁毒工作新闻发布会,介绍2022年以来西宁市禁毒工作情况及近年来缉毒执法典型案例。 根据发布会介绍,2022年至今,西宁市共破获各类毒品案件132起,抓获犯罪嫌疑人146名、查获吸毒人员503名,缴获各类毒品5219.02克,先后侦破了全省首例贩卖新型毒品合成大麻素类物质案件、全省首例走私国家一类管制新精神活性药物案、全省首例涉毒洗钱案件,有力斩断了毒品犯罪资金链条,毒品犯罪打击质效不断提升。 值得关注的是,发布会上公布了4起缉毒执法典型案例,其中一起涉及通过暗网贩毒:西宁市公安局城西公安分局破获全省首例从境外非法走私运输新型毒品案件。 该案件的详情为:2022年5月中旬,城西公安分局接到线索得知有人涉嫌通过“暗网” 从境外贩卖大麻及含有合成大麻素、曲马多等新精神活性物质的烟油、巧克力、雪茄等毒品。经2个月的侦查取证,成功将犯罪嫌疑人张某升与刘某松抓获。经鉴定,本案缴获“上头巧克力”中检出苯丙胺、赛络新毒品成分,共计94.68克。目前涉案张某升、刘某松二人已被依法采取强制措施,并移送起诉至检察院依法追究其刑事责任。 一般而言,目前头部的中文暗网交易市场以销售被盗数据、色情视频等虚拟商品为主,在暗网里,如国外暗网市场一样销售毒品的倒不常见,这也进一步证明了,中文暗网市场正在与国际接轨。 虽然“暗网”具有匿名性、隐蔽性等吸引犯罪分子的特点,但中国多地警方曾经表示,“暗网”并不是“法外之地”,也不是“犯罪天堂”。该案件也表明,中国正在积极打击暗网贩毒等各类暗网违法犯罪。 虽然中国国内通过暗网贩毒不是很常见,但由于互联网与物流的相互配合,使得涉毒犯罪形式更加专业化,贩毒团伙年龄层次较低,有职业化倾向, 并且很多毒品买自国外暗网交易市场,往后会越来越多。 网络无国界,对于中国警方而言,必然需要与各国加强法律、制度、技术等方面的国际合作,抓住关键环节,将犯罪分子绳之以法,防止“暗网”成为法外之地。 在该发布会公开的其他三起涉毒案件为: 案例一:****西宁市公安局城东公安分局破获全省首例涉毒洗钱案 今年初,城东公安分局禁毒大队办案民警在侦破一起贩毒案件时,发现该案还存在涉毒洗钱犯罪线索。随即,城东公安分局党委成立专案组。经过三个多月缜密摸排、调查取证,民警全面掌握了涉毒资金来源、性质、用途等方面的证据。经查证,今年1月以来,犯罪嫌疑人牛某,为贩毒嫌疑人掩饰、隐瞒毒品犯罪所得,提供个人账户收取毒资,并按月收取数额不等的“好处费”。经初步核算,涉及洗钱金额达160余万元。在大量证据面前,犯罪嫌疑人牛某如实供述其犯罪事实。目前,犯罪嫌疑人牛某因涉嫌洗钱罪已被公安机关依法执行逮捕,案件在进一步办理中。 案例二:西宁市公安局城北公安分局破获利用网络吸贩毒案 今年4月,城北公安分局禁毒大队在工作中发现,有多名西宁籍、循化籍吸毒前科人员利用互联网虚拟身份,通过网络平台,建立群组,发布隐晦信息及视频,以暗语的形式进行吸贩毒违法犯罪活动。经与循化警方通过近一个月通力协作下,专案组集中对该犯罪团伙进行抓捕,为全链条打击毒品犯罪活动,两地公安机关远赴重庆市进一步开展抓捕工作,最终共计抓获吸毒人员13名,贩卖毒品犯罪嫌疑人4名,破获毒品案件5起。 案例三:西宁市****公安局城中公安分局破获部级目标案件 2020年10月,西宁市公安禁毒部门在公安部禁毒局的指导协调下,在省厅禁毒总队直接指挥以及山东、四川等地警方大力协助下,历时4个月的缜密侦查,成功告破一起辐射全国19个省(区、市)、36个地区,从事毒品贩卖违法犯罪活动的涉及艾滋病、同性恋的部级目标案件。办案人员先后在青海、四川、山东等地采取梯次收网行动,共抓获犯罪嫌疑45人,查处吸毒人员17人,缴获毒品冰毒113.45克、大麻1.76克、辅料28.93克,成功斩断一条由四川向青海、山东、江苏等地贩运毒品的通道。 ...

    2023-11-01 185
  • 暗网里的杀人广告:奥地利警方破获暗网雇佣杀手案件

      一位智商高达142的下奥地利州互联网百万富翁,一直在暗网上寻找一名职业杀手,以杀死他的前女友。他在一个名为“Online Killer Market”的暗网网站上找到了一位化名“Sunnboy”的合同杀手——近日维也纳新城地区法院于周五该案件的真实性。 这位成功的企业家的智商极高,世界人口的0.1%才能拥有这种高智商,除此之外,他还曾在德国警察局工作了20多年。 据称,这位53岁的男子每天通过他别墅的电脑访问“Online Killer Market”的暗网网站,并于2023年2月底至4月初期间在该暗网网站上投放了广告,试图将针对他前女友的谋杀渲染成一场交通事故。为了让他寻找的杀手更容易实施,据说该男子提供了其前女友的许多资料,包括她的照片、她的个人信息和习惯、她的确切家庭住址以及该女子家人的个人信息。 根据起诉书,该广告达到了其目的。据说有人联系了想要实施雇佣杀人的被告。不久之后,双方就谋杀案的报酬金额进行了谈判。最终就9000美元达成协议,该男子于2003年4月底将这笔钱以加密货币比特币的形式转入杀手的虚拟钱包。 下奥地利人于4月30日被警方逮捕。据内政部称,杀人的合同本应该在5月1日进行。此后,被告一直被拘留,他否认这些指控。近日,该男子将因谋杀未遂罪在奥地利维也纳新城地区法院接受审判。如果罪名成立,他将面临10年到20年的监禁,甚至终身监禁。 英国情报部门提供的信息 3月初,英国军情五处发现了该线索,国际刑警组织曼彻斯特(英国)分部向奥地利当局通报了暗网上可能发生的雇佣杀人事件。 不久之后,奥地利联邦刑警局、州刑警局、下奥地利州保护宪法和打击恐怖主义办公室、特种部队局(DSE)和来自英国的东部地区特种作战部队(ERSOU)等部门共有130名调查人员参与了此次行动。 据奥地利内政部称,行动期间采取了广泛的调查和观察措施,特别是针对暗网的秘密调查。...

    2023-11-01 148
  • 适合万圣节发的文案

    ❶ ?? | 不给糖就捣蛋❷ ? ????? ????????? ?❸ ??????*诡异气氛拉满❹ 可爱鬼来了?❺ 女巫集合??‍♀️?❻ ?| 一枚懒鬼❼ ?幽灵觉醒‍‧?❽ ?????? ??? ?★❾ ???‍♀️???????❿ ? :女巫集合??‍♀️? ...

    2023-11-01 175
  • Overskride:一款有趣的Linux蓝牙应用!

    一款适用于 Linux 的新应用已经出现,它可能是满足你所有蓝牙需求的一站式应用。 这款名为 “Overskride” 的开源应用首次发布。尽管它还处于开发阶段,但已经提供了一些不错的功能。 请允许我带你看一下。 Overskride:可以期待什么? Overskride 将会吸引 Rust 爱好者,因为它主要是用 Rust 语言编写的,带有GTK4/libadwaita 风格。 根据开发人员的说法,它是一个简单的蓝牙和 Obex 客户端(未来计划),无论使用什么桌面环境或窗口管理器都可以工作。 一些主要功能包括: 信任/阻止设备。 能够发送/接收文件。 设置连接超时时间。 支持配置适配器。 查看上面的截图,你可以看到自定义蓝牙设备和连接的所有基本选项,包括适配器名称。 当然,考虑到这是该应用的第一次发布,人们不应该抱有太高的期望。因此,还有改进的空间。 以下是 Overskride 的一些预览,以查看它提供的功能。 我在 Ubuntu 22.04 LTS 和 GNOME 42.9 上使用提供的 Flatpak 包进行安装。在此安装上运行似乎没有任何问题。 Overskride 能够检测到我的智能手机,并提供多种配置选项。 你可以将设备添加到受信任列表或阻止列表、重命名并发送文件。 我尝试了文件传输功能,但在此之前,我必须使用Flatseal允许访问用户文件,以便它可以读取我系统上的文件。 我在手机上接受文件传输后,传输开始。速度还可以,文件确实完整地到达那里,没有任何问题。 我必须说,在其首次发布时,开发人员为我们提供了一个有用的实用程序。我很高兴看到其未来版本将提供什么样的改进。 一位 Reddit 用户 询问是否有任何计划支持显示无线耳机的电池百分比。对此,开发人员提到这样做很棘手,因为 每个设备都遵循不同的规范,这使得这一目标更难实现。 ...

    2023-10-25 188
  • Java面试题:如何用Zookeeper实现分布式锁?

    Zookeeper是一个分布式协调服务,可以用来实现分布式锁的功能。 分布式锁是一种控制多个分布式系统之间同步访问共享资源的机制。 Zookeeper实现分布式锁的原理如下:   首先,需要在 Zookeeper 中创建一个持久节点作为锁的根节点,例如 /lock。 然后,每个需要获取锁的客户端都在 /lock 节点下创建一个临时顺序节点,例如 /lock/seq-0000000001。这样可以利用 Zookeeper 的节点唯一性和顺序性特性。 接着,每个客户端都获取 /lock 节点下的所有子节点,并按照序号排序,判断自己创建的节点是否是最小的。如果是,说明获取到了锁,可以执行相关操作。 如果不是最小的,说明没有获取到锁,需要等待。此时,客户端可以监听自己前一个节点的变化(例如删除),一旦监听到事件发生,就重新判断自己是否是最小的节点。 最后,当客户端执行完操作后,需要释放锁,即删除自己创建的临时顺序节点。这样,后面等待的客户端就可以收到通知,继续尝试获取锁。 以上就是 Zookeeper 实现分布式锁的基本原理。 实现方式: 实际开发过程中,可以 curator 工具包封装的API帮助我们实现分布式锁。 <dependency> <groupId>org.apache.curator</groupId> <artifactId>curator-recipes</artifactId> </dependency> 1、客户端想要获取锁,就在 Zookeeper 上创建一个临时的、有序的节点,这个节点相当于一把锁。  2、客户端查看 Zookeeper 上所有的节点,按照顺序排列,看看自己创建的节点是不是最小的。  3、判断是否获得锁,如果是读操作,只要自己前面没有写操作的节点,就可以获取锁,然后开始执行读逻辑。如果是写操作,只有自己是最小的节点,才可以获取锁,然后开始执行写逻辑。  4、如果没有获取到锁,就要等待。如果是读操作,就监听自己前面最近的一个写操作的节点。如果是写操作,就监听自己前面最近的一个节点。一旦监听到这个节点被删除了,就重新判断是否可以获取锁。 Curator 的几种锁方案 : 1、InterProcessMutex:分布式可重入排它锁2、InterProcessSemaphoreMutex:分布式排它锁3、InterProcessReadWriteLock:分布式读写锁下面例子模拟 50 个线程使用重入排它锁 InterProcessMutex 同时争抢锁: 实例: public class InterprocessLock { public static void main(String[] args) { CuratorFramework zkClient = getZkClient(); String lockPath = "/lock"; //通过InterProcessMutex创建分布式锁 InterProcessMutex lock = new InterProcessMutex(zkClient, lockPath); //模拟50个线程抢锁 for (int i = 0; i < 50; i++) { new Thread(new TestThread(i, lock)).start(); } } static class TestThread implements Runnable { private Integer threadFlag; private InterProcessMutex lock; public TestThread(Integer threadFlag, InterProcessMutex lock) { this.threadFlag = threadFlag; this.lock = lock; } @Override public void run() { try { lock.acquire(); System.out.println("第"+threadFlag+"线程获取到了锁"); //等到1秒后释放锁 Thread.sleep(1000); } catch (Exception e) { e.printStackTrace(); }finally { try { lock.release(); } catch (Exception e) { e.printStackTrace(); } } } } private static CuratorFramework getZkClient() { String zkServerAddress = "127.0.0.1:2181"; ExponentialBackoffRetry retryPolicy = new ExponentialBackoffRetry(1000, 3, 5000); CuratorFramework zkClient = CuratorFrameworkFactory.builder() .connectString(zkServerAddress) .sessionTimeoutMs(5000) .connectionTimeoutMs(5000) .retryPolicy(retryPolicy) .build(); zkClient.start(); return zkClient; } } </div> ...

    2023-10-25 176
  • java面试题:为什么JDK 15要废弃偏向锁?

    为什么JDK 15要废弃偏向锁? 要想说清楚这个问题,你得先知道什么是偏向锁,它是在哪里使用的。 这就不得不提到Synchronized的锁升级过程了。 在JDK 1.6及之前的版本中,Synchronized关键字,它可以让一个对象只能被一个线程使用,这样就可以避免多个线程同时修改同一个对象造成的混乱。 但是,这种方式也有一个缺点,就是每次一个线程要使用一个对象时,都要先检查这个对象是否被别的线程占用了,如果是的话,就要等待别的线程用完才能继续。 这个过程会消耗很多时间和资源,影响程序的效率。 为了解决这个问题,Java在后来的1.7 之后对 Synchronized 的实现做了一些改进,让它可以根据不同的情况,采用不同的方式来控制对象的使用。 具体来说,有四种方式: 无锁状态:这是最简单的一种方式,就是没有任何限制,任何线程都可以随时使用对象。 偏向锁状态:这是一种优化的方式,就是假设一个对象只会被一个线程使用,所以当第一个线程使用对象时,就会把自己的标记放在对象上,表示这个对象属于自己。这样,下次这个线程再使用对象时,就不用检查了,直接就可以用。但是如果有别的线程也想用这个对象,就要先把标记去掉,然后再竞争。 轻量级锁状态:这是一种折中的方式,就是当有多个线程想用同一个对象时,不会立刻让它们等待,而是先让它们在自己的内存里复制一份对象的信息,然后各自修改。最后再比较一下谁修改得最快,谁就可以用对象。这样可以减少等待的时间,提高效率。 重量级锁状态:这是最原始的一种方式,就是当有多个线程想用同一个对象时,只能让其中一个线程用,其他的线程都要等待。这样可以保证对象的安全性,但是会降低效率。 在Java中,每个对象都有一个特殊的区域叫做mark word(标记字),它可以记录对象的一些信息。其中有两位或三位是用来表示对象现在处于哪种状态的。具体来说: 如果两位是“01”,表示无锁状态或偏向锁状态。如果第三位是“0”,表示无锁状态; 如果第三位是“1”,表示偏向锁状态。如果两位是“00”,表示轻量级锁状态。 如果两位是“10”,表示重量级锁状态。 但是,在Java 15中 ,偏向锁被取消了 ,所以现在只有三种状态:无锁状态、轻量级锁状态和重量级锁状态。 回到最开始的问题:为什么JDK 15要废弃偏向锁? 取消偏向锁状态的原因是,偏向锁状态在现代的应用场景下已经不再有明显的性能优势,反而会增加虚拟机的复杂度和维护成本。 具体的原因是: 1. 偏向锁状态是一种优化技术,用于减少无竞争情况下的同步开销。 它假设一个对象只会被一个线程使用,所以当第一个线程使用对象时,就会把自己的标记放在对象上,表示这个对象属于自己。 这样,下次这个线程再使用对象时,就不用检查了,直接就可以用。 但是如果有别的线程也想用这个对象,就要先把标记去掉,然后再竞争。 2. 偏向锁状态在过去能够带来很大的性能提升,是因为有些应用会使用很多不必要的同步操作。 比如早期的Java集合类(如Hashtable和Vector),它们每次访问都要同步。 现在的应用一般会使用非同步的集合类(如HashMap和ArrayList)或者更高效的并发数据结构(如ConcurrentHashMap、CopyOnWriteArrayList等)来处理单线程或多线程的情况。 这意味着如果更新代码使用这些新的类,就可以获得更好的性能,而不需要依赖偏向锁状态。 3. 偏向锁状态也有一个缺点,就是当有竞争发生时,需要进行一次代价很高的撤销操作。 所以只有当应用有大量的无竞争的同步操作时,偏向锁状态才有优势。 但是随着硬件和软件的发展,原子操作的代价已经降低了很多,而且现在的应用往往使用线程池和工作队列来处理并发任务,这些场景下偏向锁状态反而会降低性能。 4. 偏向锁状态还给虚拟机带来了很多复杂度和维护难度,只有少数几个最有经验的工程师能够理解和修改它。它也影响了一些新特性的设计和实现。 综上所述,偏向锁状态已经不再适合现代的Java应用,所以在Java 15 之后被废弃。 ...

    2023-10-25 201
  • Java面试题:不使用锁如何实现线程安全的单例?

    面试官问: 不使用锁,如何实现线程安全的单例? 如果不能使用synchronized和lock的话,想要实现单例可以通过饿汉模式、枚举、以及静态内部类的方式实现。 饿汉: 其实都是通过定义静态的成员变量,以保证instance可以在类初始化的时候被实例化。 // 单例模式 // 饿汉式(静态变量) class Singleton { // 1. 构造器私有化 private Singleton() {} // 2. 本类内部创建对象实例 private final static Singleton instance = new Singleton(); // 静态变量 // 3. 提供一个公有的静态方法,返回实例对象 public static Singleton getInstance() { return instance; } } 但是,如果从始至终未使用过这个实例,会造成内存浪费 静态内部类: 这种方式和饿汉方式只有细微差别,只是做法上稍微优雅一点。 // 静态内部类实现 class Singleton { // 构造器私有化 private Singleton() {} // 写一个静态内部类,含一个静态属性Singleton private static class SingletonHolder { private static final Singleton INSTANCE = new Singleton(); } // 提供一个静态的公有方法,直接返回SingleInstance.INSTANCE public static Singleton getInstance() { return SingletonHolder.INSTANCE; } } 原理和饿汉一样。这种方式是Singleton类被装载了,INSTANCE 对象不一定被初始化。 因为SingletonHolder类没有被主动使用,只有显示通过调用getInstance方法时,才会显示装载SingletonHolder类,从而实例化instance 枚举: 借助了 JDK1.5 中添加的枚举来实现单例模式,不仅避免了多线程同步问题,而且还防止反序列化重新创建新的对象 // 枚举实现单例 enum Singleton { INSTANCE; // 属性 } 其实,如果把枚举类进行反编译,你会发现他也是使用了static final来修饰每一个枚举项。 final class Singleton extends Enum { public static final Singleton INSTANCE; private static final Singleton $VALUES[]; public static Singleton[] values() { return (Singleton[])$VALUES.clone(); } public static Singleton valueOf(String name) { return (Singleton)Enum.valueOf(cn/itsource/logweb/utils/Singleton, name); } private Singleton(String s, int i) { super(s, i); } static { INSTANCE = new Singleton("INSTANCE", 0); $VALUES = (new Singleton[] { INSTANCE }); } } 其实,上面三种方式,都是依赖静态数据在类初始化的过程中被实例化这一机制的。 但是,如果真要较真的话,ClassLoader的loadClass方法在加载类的时候使用了synchronized关键字。 也正是因为这样, 除非被重写,这个方法默认在整个装载过程中都是同步的(线程安全的)。 那么,除了上面这三种,还有一种无锁的实现方式,那就是CAS。 public class Singleton { // 使用了 AtomicReference 封装单例对象 private static final AtomicReference<Singleton> INSTANCE = new AtomicReference<Singleton>(); private Singleton() {} public static Singleton getInstance() { while (true) { // 使用 AtomicReference.get 获取 Singleton singleton = INSTANCE.get(); if (null != singleton) { return singleton; } // 使用 CAS 乐观锁进行非阻塞更新 singleton = new Singleton(); if (INSTANCE.compareAndSet(null, singleton)) { return singleton; } } } } 用CAS的好处在于不需要使用传统的锁机制来保证线程安全。  但是我们的实现方式中,用了一个while循环一直在进行重试,所以,这种方式有一个比较大的缺点在于,如果忙等待一直执行不成功(一直在死循环中),会对CPU造成较大的执行开销。 ...

    2023-10-25 184
  • Linux后台执行程序Nohup Screen

    Nohup nohup (no hang up) 用于在系统后台不挂断运行命令,退出终端不会影响程序的运行。 例如某 Python 程序: nohup python -u main.py >> log.out 2>&1 & 2>&1 是一个重定向操作符,它使错误消息也会被写入 log.out 文件。 Screen 会话简单使用 screen 是一个命令行工具,允许在单个 SSH 会话或终端中创建和使用多个会话。 简单来说,Screen 对我最大的好处是即使关闭了终端,会话或执行的程序依然能够继续。 ❝相比于 nohup,screen 的使用更加灵活,用途更广。❞ 安装 Screen。 apt update && apt install screen 以下是 screen 的常用命令。 # 查看当前所有的 Screen 会话 screen -ls # 新建一个 Screen 会话 screen -S [name] # 离开 Screen 会话 # 按 Ctrl + a, 再按 d 分离会话 # 恢复 Screen 会话 screen -r [session ID] # 删除一个 Screen 会话 screen -X -S [session ID] quit 无 root 权限下安装 screen 目前我有一台服务器,但没有 root 和 sudo 权限。 现需要使用 screen,因此采用编译安装。 具体步骤如下: 下载 screen 的源代码。可以从 GNU Screen官方网站找到最新版本的下载链接。 wget https://ftp.gnu.org/gnu/screen/screen-4.9.1.tar.gz 解压源代码包。 tar -xvf screen-4.9.1.tar.gz 进入解压后的目录。 cd screen-4.9.1 配置编译并设置安装路径为用户 home 目录下的 myapps 文件夹。 ./configure --prefix=$HOME/myapps 编译 screen。 make 安装编译好的screen。 make install 添加环境变量。 # 编辑环境变量 vim ~/.bashrc # 将以下内容添加到最后一行 export PATH="$HOME/myapps/bin:$PATH" 检查 screen 是否配置成功: screen -version 刷新环境变量。 source ~/.bashrc </div> ...

    2023-10-24 200
  • 终端基础:Linux终端中的目录切换

    本篇文章作为终端基础教程系列的一部分,介绍如何在 Linux 命令行中,利用绝对路径和相对路径实现目录切换。 Linux 的 cd命令让你可以轻松切换文件夹(即目录)。只需提供你要切换到的文件夹路径即可。 cd path_to_directory 然而对于 Linux 新人来说,可能会在路径的指定上有所困扰。 首先,让我们解决这个问题。 理解 Linux 中的路径 在 Linux 文件系统中,路径是用来追踪文件位置的信息。所有的路径都从根目录开始,然后向下延伸。 你可以通过下面的方式查看当前所在的位置: pwd 结果可能是类似于 /home/username的输出。注意,这里的username将会是你自己的用户名。 你可以注意到,路径是由 /符号和目录名组成的。比如路径/home/abhishek/scripts, 表示scripts是在文件夹abhishek之内,而文件夹abhishek在home文件夹之内。要注意,第一个 ‘/’ 是指根目录(即文件系统的开始处),后面的 ‘/’ 则作为目录的分隔符。 ?️ 在终端中键入 ls /,然后按回车。你将会看到根目录下的所有内容,试试看! 接下来,让我们学习两种常见的路径指定方式:绝对路径和相对路径。 绝对路径:这种路径从根开始,然后一直扩展到你需要的位置。如果一个路径是以/开头,那就说明它是一个绝对路径。 相对路径:这是相对于你文件系统中当前位置的路径。如果我当前位置在/home/abhishek,并且我需要去/home/abhishek/Documents, 我只需要简单地切换到Documents,而不需要指定整个绝对路径/home/abhishek/Documents。 在我演示这两种路径的区别之前,有必要先熟悉两个特殊的目录标识: .(单点)表示当前目录。 ..(双点)表示上一级目录,也就是当前目录的母目录。 这里有一张图形化的表示。 利用 cd 命令变更目录 在你已对路径概念有所了解之后,我们来了解如何切换目录。 ?️ 如果你仅键入 cd并按回车键,无论当前位置在哪,系统都会将你带回主目录。试一试吧。 敲入以下命令,你就能看到主目录里的所有文件夹: ls 这是我看到的情况: abhishek@ituxedo:~$ ls Desktop Downloads Pictures Templates VirtualBoxVMs Documents Music Public Videos 你的情况可能与此类似,但未必完全一样。 假如你希望跳转到 Documents文件夹。由于它就在当前目录下,这里使用相对路径会比较方便: cd Documents ? 注意,大部分 Linux 发行版预设的终端模拟器会在提示符本身显示出当前所在的位置。因此你不必频繁使用 pwd指令来确认自己的位置。 假如你希望切换到位于主目录里的 Templates文件夹。 你可以使用相对路径 ../Templates(..会让你返回到上层目录,即/home/username,然后你就可以进入Templates文件夹了)。 但这次我们尝试使用绝对路径。请把下面的 abhishek替换成你的用户名。 cd /home/abhishek/Templates 此刻你已经在 Templates文件夹里了。如何前往Downloads文件夹呢?这次我们再使用相对路径: cd ../Downloads 下面的图片会回顾一下你刚才学到的所有或有关目录切换的范例。 ? 别忘了你还可以使用终端的 tab键自动补全功能。只需要键入命令或者文件夹名称的前几个字母,然后敲击tab键,系统就会尝试自动地补全命令或文件夹名称,或者给你显示出所有可能的选项。 故障解决 在 Linux 终端操作切换目录的过程中,你可能会遇到一些常见的错误。 文件或目录不存在 如果在你尝试切换目录时,出现类似下面的错误信息: bash: cd: directory_name: No such file or directory 那么你可能在路径或目录名称上犯了误解。这里有几点你需要注意的: 请确定你输入的目录名中没有拼写错误。 Linux 系统对大小写敏感,因此,Downloads和downloads会被识别为不同的目录。 你可能未正确指定路径。可能你所在的位置与你预期的不同?或者你遗漏了绝对路径中的开头的 /字符? 非目录错误 如果你看到像下面这样的错误提示: bash: cd: filename: Not a directory 这表示你尝试使用 cd命令对一个文件进行操作,而不是一个目录(文件夹)。很明显,你不能像进入文件夹那样“进入”一个文件,因此会出现这样的错误。 参数过多 这是 Linux 新手常犯的另一个错误: bash: cd: too many arguments cd命令只接受一个参数。也就是说,你只能对命令指定一个目录。 如果你指定了超过一个的参数,或者在路径中误加了空格,你就会看到这个错误。 ?? 如果你输入 cd -,它将会把你带到前一个目录。当你在两个相隔较远的地方切换时非常方便,可以避免再次输入长路径。 特殊目录符号 在结束这个教程之前,我想快速告诉你关于特殊符号 ~。在 Linux 中,~是用户主目录的捷径。 如果用户 abhi运行它,~就会代表/home/abhi,如果用户prakash运行,~就意味着/home/prakash。 总结一下你在这个基础教程系列中学到的所有特殊目录标识: 符号 描述 . 当前目录 .. 上级目录 ~ 主目录 - 前一个目录 测试你的知识 下面是一些简单的练习,用来测试你刚刚学到的关于路径和 cd命令的知识。 移动到你的主目录,并使用这个命令创建一个嵌套的目录结构: mkdir -p sample/dir1/dir2/dir3 然后,一步步来试试这个: 使用绝对路径或相对路径进入 dir3 使用相对路径移动到 dir1 使用你能想象到的最短路径进入 dir2 使用绝对路径切换到 sample目录 返回你的主目录 ? 想知道你是否全都做对了吗?欢迎分享你的答案。 ...

    2023-10-22 165
  • 10月21日,星期六简报,60秒知晓天下事

    2023年10月21日,星期六,农历九月初七,每天60秒知天下 1、各省份经济三季报陆续出炉:四川重庆辽宁等增速高于全国平均;商务部:今年前三季度全国直播电商销售额达1.98万亿,增长60.6%,占网络零售额18.3%; 2、2024国考报名人数已突破100万,国家知识产权局一职位竞争最激烈,竞争比高达1117.5:1; 3、传染病防治法拟修订:改进疫情报告制度,禁止干预报告;国家医保局:职工医保、居民医保政策范围内住院费用报销比例达80%和70%左右; 4、国常会:取消调整33个罚款事项,严查以罚代管、过罚失当;慈善法修正草案提请审议:完善公开募捐制度,不得通过虚构事实等方式骗取救助; 5、三亚首发水上旅游管理新规:水上旅游项目应明码标价;民政部:推动会员单位面向高校毕业生发布招聘岗位68万个; 6、网传青岛啤酒三厂员工在原料仓内小便,青岛啤酒回应:警方介入调查,该批麦芽已经全部封存; 7、台风“三巴”致广东茂名多地受灾,全市转移危险区域人员9910人;中央气象台:台风“三巴”减弱停编,广东西南部、海南岛东北部等地仍有较强降雨; 8、天津一儿童遭“开门杀”后被公交车碾压死亡,警方通报:刑拘小客车司机; 9、内蒙古一在建厂房屋顶坍塌,致3死8伤,官方回应:厂房仅一层,是钢结构建筑,坍塌面积三千余平方米; 10、美方发布《中国军力报告》炒作“中国有超500枚核弹头”,中方驳斥:报告罔顾事实,充满偏见,坚决反对;美媒:俄撤销批准《全面禁止核试验条约》数小时后,美进行高爆试验; 11、外媒:伊拉克和叙利亚多处美军基地接连遭袭,有军人受轻伤;美国国务院向海外美国人发布全球安全警示:警惕极端主义袭击; 12、美媒:美众院议长选举第三轮投票仍无果;此前越界入朝美士兵已被美军方拘留,面临逃兵罪等多项指控; 13、韩媒:拉夫罗夫与朝鲜外相会谈后,韩国政府表态:愿无条件与朝鲜对话;美B-52战略轰炸机首降韩国,朝中社警告:应当是朝鲜第一个“消灭对象”; 14、法媒:法国多地学校和机场拉响炸弹警报,执法部门48小时内进行18次逮捕;法国酿酒商在高速公路上示威,拦截来自西班牙的卡车,抗议进口西班牙葡萄酒; 15、以色列公布对加沙地带的作战计划和目标:彻底消灭哈马斯,并在加沙建新政权;以色列政府批准法规:紧急状态期间可暂停外国新闻频道在以运营; 【每日金句】如果你第一步不迈出,就永远不知道你的梦想是多么容易实现。    ...

    2023-10-21 184
  • 揭秘南方与北方的互联网圈子的信息差

    本文适合互联网行业从业者/创业者,自媒体内容创作者、互联网项目工作室进行阅读。一篇文章,彻底帮你解决互联网圈子里的“信息差”问题! 本文大纲: 前言:什么是互联网圈子里的信息差? 01、南方地区与北方地区的信息差的区别? 02、有效降低信息差的方法 03:核心重点的总结 先说一些关于我个人经历过的“信息差”的故事吧! 2021年,脱离了直播带货行业,回到老家江苏徐州,重新开始创业。在这2年里,身边有不少朋友都在劝我说:“Tiktok那么火,你为什么不去搞Tiktok项目?”对于我个人而言,做了14年的互联网,也操盘过很多互联网相关的项目,我深知很多项目能否赚钱的关键点,不是在于你做的早与晚,而在于“信息差”!我在江苏徐州,一个北方城市,如果操盘Tiktok项目,铁定要被割一刀。 当然,我也可以靠着自己一张老脸,从朋友团队那里,拿到了一些玩法。即便如此,也会出现这么一种情况,那就是一开始靠着这个玩法,赚到了一些小钱,没过多久,因为平台迭代或者算法规则的调整,势必会出现玩法过时的情况发生! 那么,什么地区?适合去操盘这类项目呢?答案也很简单,就是南方地区,也就是我们所说的深圳、广州一带。 如果你不理解,为什么南方的互联网圈子比北方更适合操盘这类项目?那么,接下来,我就会告诉你,南方与北方地区的互联网圈子,它们之间的“信息差”究竟会有多大! 01南/北两地的“信息差” 1.南/北地区的现状 北方地区的团队,往往是看到别人在搞什么赚钱,而选择跟风的居多,就以直播带货为例,当北方团队还处在为直播间没有流量而头疼的时候,南方地区的互联网团队,早已经研究出了各种快速起号的直播带货的打法,也跑出来了标准化的SOP,甚至已经开始利用各种黑科技来进行起盘! 除此之外,从工作效率上来说,北方团队每天苦逼加班熬夜18个小时不停的干,而南方团队每天喝喝茶,打打牌,洗洗澡,轻轻松松的就把项目推上了正轨。 2.南/北地区的差异点 南方地区的互联网团队,善于对平台底层逻辑进行研究,很多你想不到,甚至觉得不可思议的玩法,在南方地区实属“常规操作”!再加上南方地区做生意的习惯就是抱团,关系好的团队之间,在技术层面互通有无。所以,他们信息交换的周期和时间也很短!喝茶可以交换信息、打牌可以交换信息、洗完澡上个三楼还能交换信息! 反观北方地区,团队和团队之间缺乏交流。张三是做互联网的,李四也是做互联网,大家互相之间就像防贼一样互相提防着,甚至还有看到对方赚钱,恨不得对方明天出门被车撞的见上帝的!因此,信息的传递上就出现了问题!闭门造车的努力结果就是:倒头来才恍然醒悟,原来是最开始的方法或者方向就出错了! 可悲的是,这就是大多数北方地区互联网行业的现状。更可悲的是,北方团队落后的不仅是做项目的方法,还有做项目的思维模式! 02有效降低“信息差”的方法 不得不说,并不是所有北方地区的互联网行业的现状都是如此的糟糕。湖北的武汉、河南的郑州、山东的临沂/济南,这些地区的互联网的发展还是有目共睹的!当然,这主要还是来源于他们降低信息差的方法。 以郑州这座城市举例,郑州有很多大大小小的互联网工作室或者公司,他们降低信息差的方式,就是抱团!三五个工作室成为一个小圈子,比如:某个团队从外面打听到了一种引流的新玩法,那么,他会把玩法公开,由这个小圈子里的工作室,各自测试一个方向,最终大家把测试结果进行汇总复盘, 就可以很轻松的突破这个引流玩法的技术壁垒! 当然,关于降低信息差的方法还有很多。在这里,我用自己的亲身经历来说一说,我是如何在北方地区降低信息差的问题。 第一:摆正自己! 7年前,郑州互联网行业的一个大佬,告诉我这么一句话“真诚才是最大套路”!当你想要从别人身上获取什么时?你要先想好,你能为别人付出什么价值?在北方地区,这样搞的结果必然是:吃亏较多!但长期坚持下去,你总会收获到一些真心实意和你相处的团队! 第二:到处走走! 我们团队每年的七八月份,都会抽出1-2周的时间,出去摆放各种同行,其目的就是交换信息,学习交流。当然,还有混吃混喝~。不过,这的确是一个可以有效降低信息差的方法,但前提是你需要遇到愿意跟你价值互换的团队。 第三:礼尚往来! 中国社会到处充满了人情世故,平时邮寄一些家乡的土特产,都是很好拉近彼此关系的方式方法! 第四:多加社群! 筛选出一些不错的社群,尽量是付费类型社群,进群之后,千万别干无脑加人的事情!倒不如在社群里,多分享一些价值干货,总会吸引一些志同道合的人群! 第五:直接付费! 在项目操盘的过程中,总会遇到一些棘手的问题,但这些棘手的问题,往往都会在更高的圈层里,被轻松解决,有时候简单粗暴,也是最有效降低信息差的方法! 03 核心重点的总结 2020年年底,我们从一位南方朋友那里,了解到了AB链的玩法。虽然当时仅仅只操作了1个多礼拜,但实打实的赚了16万多。如果不是因为平台更改了规则,我感觉我能撸出一个“世界”。这样的事情,在我的14年互联网从业过程中,还有很多,主要得益于“信息差”的降低! 如上文所提到的一样,北方地区的互联网团队,在人员基础、技术迭代、思维模式、工作习惯等方面,就比南方地区的团队要差上不止一个档次,闷声的闭门造车,是不可取的!而我们作为北方团队,也应该正视这些不足! 最后,一定要注意的是,上述所有内容都是针对如何降低信息差获取难度的方式!但是想要信息差的价值发挥最大效率,只有第一时间的执行。 作者:谢雨轩 </div>...

    2023-10-20 160
  • 简述Kafka架构设计

    Consumer Group:消费者组,消费者组内每个消费者负责消费不同分区的数据,提高消费能力。逻 辑上的一个订阅者。 Topic:可以理解为一个队列,Topic 将消息分类,生产者和消费者面向的是同一个 Topic。 Partition:为了实现扩展性,提高并发能力,一个Topic 以多个Partition的方式分布到多个 Broker 上,每个 Partition 是一个 有序的队列。一个 Topic 的每个Partition都有若干个副本(Replica),一个 Leader 和若干个 Follower。生产者发送数据的对象,以及消费者消费数据的对象,都是 Leader。Follower负责实时从 Leader 中同步数据,保持和 Leader 数据的同步。Leader 发生故障时,某个 Follower 还会成为新的 Leader。 Offset:消费者消费的位置信息,监控数据消费到什么位置,当消费者挂掉再重新恢复的时候,可以从 消费位置继续消费。 Zookeeper:Kafka 集群能够正常工作,需要依赖于 Zookeeper,Zookeeper 帮助 Kafka 存储和管理 集群信息。 ...

    2023-10-20 142
  • 2023年暗网统计数据

      暗网是互联网的一个重要的组成部分,不被搜索引擎索引,并需要特定软件才能访问。一般认为,暗网与犯罪活动息息相关,从销售被盗数据到贩卖毒品和武器。然而,暗网也被用于合法目的,如安全通信。 由于暗网的匿名性和隐蔽性,暗网里的数据很难收集。根据近期的暗网分析报告,暗网的每日活跃用户约为250万,只占互联网用户的一小部分。在北美和欧洲,拥有最多的暗网用户,但在亚洲和其他地区,占比相对较少。 认识暗网 暗网是互联网的一部分,它被有意地隐藏在正常搜索引擎的范围之外。访问该网络需要一些特殊的浏览器,如Tor浏览器。许多非法活动,如贩卖毒品、窃取数据和武器交易,都与暗网有关。另一方面,这个平台对政治异见者、记者和举报者分享信息起到了有效作用。 暗网的测量难以完成,相比其他网页,它的规模较小,可见性较低。根据WebsiteBuilder.org的数据,2023年,最受欢迎的暗网浏览器是Tor,拥有超过200万的每日活跃用户。大多数暗网网站提供在Tor网络上,而其他暗网,如I2P和Freenet,使用者比较少。 暗网经常与深网相比较,深网指的是互联网上不被搜索引擎索引的任何部分。这些还包括许多私人数据库和学术期刊,不一定是公共消费所需的内容。尽管深网比暗网大得多,但它不一定非法或危险。 暗网的隐秘性是其主要特点之一。访问网站时无需透露个人的IP地址或其他可识别的信息。因此,执法机构发现很难找到违法者或关闭非法网站。于是,由于其匿名性,它成了黑客、骗子和其他网络犯罪分子的天堂。 总的来说,暗网是互联网的一个复杂且经常被误解的方面。尽管暗网是非法活动的中心,但它还有着合法的用途,如分享知识和实现匿名通信。 暗网的优点和缺点 暗网是互联网的一部分,不受搜索引擎索引,只能通过Tor等专门浏览器访问。尽管它具有一些优点,但也存在一些与使用暗网相关的缺点。 优点 匿名性:暗网提供隐私的能力是其最重要的特点之一。用户可以在不透露真实身份的情况下浏览,这对于希望在不担心遭受攻击的情况下进行连接的活动家、记者和举报者非常有益。 多样性:在暗网上可以找到非法药物、枪支和假冒商品等各种商品。这并不总是暗网的积极方面,但至少可以让你获得其他情况下很难或无法找到的东西。 隐私性:暗网旨在为用户提供安全和隐私。加密货币经常用于交易,提供了更高级别的隐私。 缺点 犯罪活动:暗网以为非法犯罪提供服务而闻名,如窃取数据、贩卖毒品和武器。参与这些活动的用户面临着被执法部门逮捕的风险。 病毒木马和恶意软件:许多恶意软件和木马病毒可以在暗网上找到。粗心的用户可能会不经意间电脑被感染,这可能会导致他们的设备损害或个人数据被窃取。 欺诈和诈骗:暗网目前存在许多欺诈和诈骗。冲动购买的用户极其容易被骗,骗子以提供非法产品或服务的承诺来说服他们,然后带着他们的钱消失。 总之,虽然暗网提供了一些优点,但使用时必须注意与其使用相关的风险和缺点。用户在使用暗网时应谨慎行事,并采取措施保护他们的隐私和安全。 暗网带来的经济影响 暗网已经演变成为犯罪活动的中心,对经济产生了巨大的影响。根据Chainalysis的研究,2023年,暗网市场预计将在2023年产生价值340亿美元加密货币的交易流水,几乎所有这些交易都使用比特币进行。 暗网市场提供了各种非法产品和服务,如武器、毒品、被盗的数据和伪造身份证明文件。这些产品和服务通常以溢价销售。同时,勒索软件经济也受到暗网的显著影响。勒索软件是一种由网络犯罪分子用来勒索钱财的应用程序,他们要求被害人支付解密密钥。这些交易中的许多都发生在暗网上,已经成为网络犯罪分子的利润丰厚的行业。 暗网对经济产生了重大社会影响。它使犯罪分子能够匿名操作并避免被法律部门识别。随之而来,全球网络犯罪增加,这对整体经济产生了影响。 因此,暗网对经济产生了巨大的影响,并对政府和安全机构构成了更大的问题。对于这个匿名网络,保持警惕并采取措施打击非法活动至关重要。 暗网带来的安全隐患 暗网以其作为犯罪活动中心的声誉而产生了许多安全隐患。网络犯罪分子参与一系列非法活动,如洗钱、贩毒和武器交易。全球执法机构密切关注暗网里的各类网站,以防止此类犯罪行为。 黑客攻击风险是与这个网站相关的主要安全隐患之一。众所周知,访问暗网网站的用户都存在着电脑被恶意软件、间谍软件和其他有害软件的感染的风险。 暗网的欺诈和骗局趋势进一步引发了安全担忧。许多非法的暗网网站旨在吸引用户,提供伪造商品、虚假评级和虚假卖家。这可能导致巨大的经济损失,使人们更难以信任他们使用的网站。 最后,暗网的重点是网络犯罪。黑客和其他网络犯罪分子购买和交易的被盗取数据包括信用卡号码和登录凭据,这些数据可用于身份盗用、金融欺诈和其他形式的网络犯罪。 暗网对网络安全的影响 网络安全受到暗网的重大影响。暗网为网络犯罪分子提供了他们犯罪活动的庇护,使其难以被执法机关和IT安全专家找到和跟踪。以下是暗网如何影响网络安全的一些方式。 增加了网络攻击 网络犯罪活动,包括购买和窃取个人数据、恶意软件和其他非法行为,已经使暗网成为一个重要渠道。因此,勒索软件、网络钓鱼和身份盗用网络攻击的威胁显著增加。根据Statista的分析,2023年,网络攻击预计增加15%。 提高了网络威胁的检测难度 暗网的匿名性使网络安全专家更难以识别和阻止在线攻击。网络犯罪分子使用加密和其他有效技术来隐藏他们的活动,使其难以找到。 提升了网络安全专业人员的需求 由于网络犯罪活动的增加,网络安全专业人员的需求也在增加。根据Cybersecurity Ventures公司的预测,2023年将有420万个网络安全职位空缺。因此,网络安全专家的薪水正在增加,人们对网络安全职业产生了兴趣。 反对暗网活动的立法措施 各国政府迄今已经采取的最重要措施之一是加强对暗网上非法活动的执法工作。执法机关一直在努力追踪、定位和调查涉及暗网非法活动的人。 各国政府还试图加强全球合作,以制止暗网上的活动。各国还实施了旨在应对暗网上行动的立法。例如,为了打击暗网上的性贩卖,美国于2018年批准了《允许各州和受害者打击网络性贩卖法案》(FOSTA)和《制止性贩卖者帮助性贩卖行为法案》(SESTA)。 全球各国采取了多种策略来打击暗网上的犯罪活动,这些方法包括立法、公众意识活动和加强执法活动,尽管没有一种方法能够完全阻止它。美国成立了一个专门的特别小组,负责调查和逮捕暗网网站的用户。德国和英国是另外两个开始类似计划的国家。 尽管如此,仍然有许多国家以与暗网相关的犯罪活动而闻名。例如,俄罗斯以拥有大量的暗网市场而闻名,这些暗网交易市场大量的销售毒品和被盗数据等非法商品。 总之,虽然各国政府已经采取了多种方法来打击暗网上的非法活动,但是仍然没有一种方法能够完全解决问题。 暗网的统计数据 各国在使用暗网方面有不同的情况。例如在欧美国家,截至2023年,美国有约831,911名参与暗网非法活动的用户,美国也是暗网用户数量最多的国家;德国排名第二,占暗网总用户的7.16%;其次是荷兰,占暗网总用户的6.92%;再其次是法国,占暗网总用户的3.29%。 虽然具体的年龄和性别分布数据不太可靠,但据估计,18至35岁之间的男性占用户比例的最大部分。这一观点的背后是,与年轻男性相关的非法活动,如贩卖毒品和销售武器,通常在暗网上进行。 关于用户的教育和收入背景的准确信息再次缺乏。然而,人们普遍认为大多数用户是有工作并至少完成了高中学历的。这是基于非法活动通常需要一定水平的技术知识和资金。 尽管难以确定暗网用户的统计数据,但似乎全球范围内有数百万人使用该网络,并且由于其商品价格实惠和隐私性,匿名互联网已成为寻求进行非法交易的用户的理想目的地。 暗网的市场份额 由于暗网是一个私密的平台,暗网的市场份额更难以估计。根据Statista的报告,2023年,非法网络活动的60%发生在暗网上。到2025年底,预计将达到15亿美元。 暗网市场占整个互联网市场的一部分,包括各种产品和服务类别。根据WebTribunal的估计,这个网站约占互联网电子商务市场的0.1%份额。不幸的是,暗网的匿名性使得很难准确确定市场份额。 大多数非法活动,包括非法物品的销售、枪支、窃取的信息和其他虚假产品,都发生在暗网市场上。根据Chainalysis报告分析,预计该网站的市场份额将在2023年底达到431.95亿美元,其中比特币占据了大部分交易。该研究还强调了更多合法商品和服务的增加,包括应用程序、电子书和数字商品,已经进入了暗网领域。 各个暗网市场之间竞争激烈,它们相互竞争以吸引用户。DarkMarket、White House Market和Empire Market曾经是最知名的暗网市场。与传统的电子商务平台类似,这些市场允许商家销售他们的商品,并允许用户提供评价。 目前可以说,与电子商务行业相比,暗网的市场份额微不足道。然而,在最近的几年里,数十亿美元的交易已经在暗网中使用加密货币中完成。这是非法活动的主要用途,但它已经扩展到包括更多合法商品和服务。 暗网的使用趋势 随着更多的人正在尝试访问这个互联网的隐藏网络,也许明年,每天将有超过450万名访问暗网的用户。 截至2023年,美国拥有最多的暗网用户,占每日用户数量的34.81%。其次是俄罗斯和德国,分别占11.46%和7.16%。总共,这三个国家约占总日常用户数量的50%。 在暗网使用趋势中的一个重要趋势是非法毒品需求的持续增加。根据Statista的数据,毒品占了暗网销售总额的70%以上。预计2023年,非法网站上的交易将达到42亿美元的加密货币,其中毒品是最大的贡献者。 最近,勒索软件攻击的数量激增,这是另一个不同的现象。勒索软件是一种应用程序,由网络犯罪分子用来勒索人们和公司的钱财。根据WebTribunal的报告,2023年,暗网上记录了大约4000起勒索软件攻击,预计攻击数量将大幅增加。 此外,非法暗网交易市场正变成销售被盗数据的主要市场。根据Statista的数据,约17%的所有销售都是在暗网上窃取的。窃取的信息包括银行帐号号码、借记卡和信用卡号码,以及帐号密码。 总的来说,暗网上的更多普及凸显了勒索软件攻击的增加、非法毒品需求的增加以及被盗信息销售的增加。这些趋势可能会在2024年继续发展,但人们和企业应采取措施,以保护自己免受与非法网站相关的潜在风险。 结论 Chainalysis声称,2023年,暗网市场预计将在加密货币中获得42亿美元的交易额,这是一个创纪录的金额,而且,比特币仍然是最常用的加密货币,自2017年以来,交易量已增加了300%以上。 尽管暗网以用于非法犯罪目的而闻名,但暗网上并非所有内容都是非法的。实际上,随着互联网用户数量的增加,一些群体,如记者和活动人士,必须出于隐私和安全原因使用暗网。 未来,非法犯罪活动可能会越来越多,因此全球各国的人们必须行动起来,采取有效的保护措施,保护自己的私人账户、信息和文件。...

    2023-10-19 253
  • 暗网勒索软件团伙Ransomed称正在与Breachforums合作,但Breachforums管理员Baphomet否认该说法

    近日,暗网里的口水战比较多,”Kirin博客“注意到最近比较活跃的新勒索软件团伙Ransomed.VC宣称与专注于共享数据的网站Breachforums达成合作协议,但BreachForums的负责人断然否认了与 Ransomed.VC合作的情况。 10月7日,暗网勒索软件团伙Ransomed.VC在其暗网网站发布一篇公告形式的博客文章”与Breachforums合作“,该文章公布了Breachforums的暗网与明网网址,并写道,其组织决定与一个他们最初并不相信的论坛(Breachforums)合作,他们曾以为这个项目已经死了,但结果它居然并没有死。 Partnership With Breachforums Our group has decided to partner with a forum we did not really believe into first. We had thoughts the project is dead, but wait, It ISNT. Our team has seen breachforums is keeping their operation way more serious than ever, this means our team will and would use their forum to share. We had a lot of issues finding a forum that wont ban us because the attention it can bring to us. Ransomed在文章里说,他们的团队看到,Breachforums比以往任何时候都更加认真地开展工作,这意味着Ransomed团队将使用Breachforums进行分享。 Ransomed称,他们在寻找一个不会禁止他们的论坛时遇到了很多问题,因为这会给他们带来很多关注。 但是,很快Breachforums网站的管理员Baphomet在网站上专门发布一个主题公告,名为”澄清与本论坛的伙伴关系“,其表示”我想发布这个消息,因为我认为有些媒体对RansomedVC最近发布的消息有误解“。 Baphomet在公告里说,RansomedVC宣布他们已与Breachforums合作,但事实并非如此,Breachforums目前没有与任何团体、论坛等合作。 Baphomet在公告里解释了RansomedVC发布这篇博客文章的背景:在他与RansomedVC的运营者进行了一些交流讨论之后,得知RansomedVC希望在Breachforums社区中活跃起来,但由于RansomedVC团体对Breachforums社区进行了持续的攻击,因此目前还未被允许这样做。Baphomet说,在他们的讨论中,他明确表示,如果要考虑让RansomedVC加入其论坛,RansomedVC就必须真正支持Breachforums,而不是一直攻击。作为回应,RansomedVC发表了一篇博客文章,宣布建立合作伙伴关系,以证明他们是真心实意地积极参与Breachforums的社区活动。背景就是这样的。从RansomedVC向其澄清的情况来看,他们发表博文是为了表明他们有兴趣积极参与Breachforums的社区活动,因为他们在其他几个社区(包括之前在Breachforums社区)都遭到了封禁。 Baphomet在公告里接着表示,他们的社区不是勒索软件社区,他们明确不允许RansomedVC利用他们的论坛进一步勒索/骚扰受害者。Breachforums社区是用来共享数据的,这样人们就可以了解哪些信息被泄露,并相应地使用这些信息。Baphomet称将继续与不同的团体进行交流,看看他们是否适合Breachforums社区,这就是他们应该从中得到的所有启示。他们一直在重新评估他们的论坛应该允许哪些人和哪些事,这类讨论只是其中的一部分。 Baphomet总结说,所以还是那句话,Breachforums与RansomedVC之间没有合作关系。只是讨论Breached是否会考虑允许RansomedVC成为其社区的一部分,尽管Breachforums曾与RansomedVC有过合作。 从Breachforums网站管理员Baphomet的回应看,Baphomet应是希望Breachforums社区能够长远的发展,而不想与勒索软件团伙发生太多的关系。近年来,活跃的勒索软件团伙一直是各国执法机构的眼中钉,并已经有数十人被FBI、国际刑警组织、欧洲刑警组织抓获。 更多暗网新闻动态,请关注“Kirin博客”。...

    2023-10-17 190
  • 什么是IP地址,IPv4和IPv6有什么区别?

    IP地址是用于在网络中唯一标识一台设备的地址,由一串数字组成。 IPv4是当前广泛使用的IP地址协议,使用32位地址,能够表示大约42亿个不同的IP地址。 IPv6是下一代IP地址协议,使用128位地址,能够表示更多的IP地址,但由于目前IPv6的普及率较低,IPv4仍是网络中广泛使用的IP地址协议。 ...

    2023-10-17 177
  • 漏洞分析 | WordPress 插件权限提升漏洞(CVE-2023-32243)

    漏洞概述 Essential Addonsfor Elementor是一款功能强大、易于使用的WordPress插件,为使用Elementor建立网站的用户提供了众多额外的功能和组件,使得用户能够更轻松地创建各种网站元素,并且还提供了许多预设计样式和高级功能,使得用户能够更好地管理和定制网站。此外,通过WordPress官方统计(https://api.wordpress.org/plugins/info/1.0/essential-addons-for-elementor-lite.json)可知,它的安装量超过百万。 近期,其密码重置功能存在授权问题,允许未经认证的远程攻击者实现权限提升。 受影响版本 受影响版本:5.4.0 <= Essential Addons for Elementor <= 5.7.1 漏洞分析 问题关键在于Essential Addons for Elementor的密码重置功能没有验证密码重置密钥,就直接改变了指定用户的密码,也就是说攻击者只需知道用户名,就有可能进行密码重置,并获得对应账户的权限。 这里我们采用打补丁前的最新版本(5.7.1)进行分析,具体链接如下:https://downloads.wordpress.org/plugin/essential-addons-for-elementor-lite.5.7.1.zip 先从includes/Classes/Bootstrap.php看起,这段代码是在WordPress中添加一个动作,当网站初始化时触发该动作,调用login_or_register_user() 该函数位于includes/Traits/Login_Registration.php 它的作用是处理登录和注册表单的提交数据,并根据提交的数据调用相应的方法。正如漏洞概述所说,问题关键在于密码重置,所以我们继续跟进reset_password(),它做的第一步操作就是检查page_id和widget_id是否为空,若为空则返回”xxx ID is missing”,用作后续的错误处理,所以我们首先要做的就是给这两个id赋值: 接着代码就会检查eael-resetpassword-nonce的值是否为空,若不为空则通过wp_verify_nonce()进行验证。 那么问题来了,nonce是什么?如何获取? 在 WordPress 中,nonce 是一个随机字符串,用于防止恶意攻击和跨站请求伪造(CSRF)攻击,它通常与表单一起使用,在表单提交时添加一个随机值,以确保表单只能被特定的用户或请求使用。而关于nonce如何获取,wp_create_nonce()可以做到这一点。 function wp_create_nonce( $action = -1 ) { $user = wp_get_current_user(); $uid = (int) $user->ID; if ( ! $uid ) { /** This filter is documented in wp-includes/pluggable.php */ $uid = apply_filters( 'nonce_user_logged_out', $uid, $action ); } $token = wp_get_session_token( $action ); $i = wp_nonce_tick( $action ); return substr( wp_hash( $i . '|' . $action . '|' . $uid . '|' . $token, 'nonce' ), -12, 10 ); } 但需要注意的是,攻击者无法通过本地生成的 nonce 绕过受害者站点的wp_verify_nonce() 验证,因为他们不能在本地生成与受害者站点相同的 nonce。不过还有一种方法来获取nonce,直接访问主页即可在localize里找到它。 至于原因,则是它被includes/Classes/Asset_Builder.php::load_commnon_asset()设置在localize_object内: 跟踪localize_object不难发现,它被两个函数调用过: 先看add_inline_js(),它用于加载内联js代码和变量。在前端页面加载时,浏览器将加载该代码,并在js中创建名为 localize 的变量,该变量的值就是localize_objects 数组经wp_json_encode()转换的json字符串。 显然,我们刚才直接访问主页发现的localize就是以json格式呈现的。再看frontend_asset_load(),它用于加载前端资源。 最终上述两个函数都会被init_hook()调用,add_inline_js() 被添加到 wp_footer 中,优先级为100,以便在 WordPress 前端页面的页脚中加载内联js代码和变量。而frontend_asset_load() 被添加到 wp_enqueue_scripts 中,优先级为100,以便在 WordPress 前端页面加载时加载所需的前端资源。 之后就是给eael-pass1、eael-pass2赋值,设置新密码了: 当我们满足了上述前提条件以后,再通过rp_login设置想要攻击的用户即可。此时,代码就会借助get_user_by() function get_user_by( $field, $value ) { $userdata = WP_User::get_data_by( $field, $value ); if ( ! $userdata ) { return false; } $user = new WP_User(); $user->init( $userdata ); return $user; } 按我们给定的字段,也就是用户名去检索用户信息: 如果这是真实存在的用户,就调用reset_password() 进行密码重置操作: 漏洞复现 通过以上分析,我们仅需知道用户名以及nonce值,再向受害站点发送满足漏洞触发条件的请求体,即可进行漏洞利用。 当然,之前也提到了受影响的版本,所以漏洞利用之前,需要优先进行版本探测,有两个方法: 第一,由于frontend_asset_load()调用了wp_enqueue_style()来加载css文件,WordPress就会自动将版本号添加到url中,这是为了确保浏览器能够正确缓存css文件,以便在文件更新时将旧文件替换为新文件: function wp_enqueue_style( $handle, $src = '', $deps = array(), $ver = false, $media = 'all' ) { _wp_scripts_maybe_doing_it_wrong( __FUNCTION__, $handle ); $wp_styles = wp_styles(); if ( $src ) { $_handle = explode( '?', $handle ); $wp_styles->add( $_handle[0], $src, $deps, $ver, $media ); } $wp_styles->enqueue( $handle ); } 第四个参数即代表指定样式表的版本号的字符串,如果它有的话,它将作为一个查询字符串添加到URL中,以达到破坏缓存的目的。如果版本号被设置为false,则会自动添加一个与当前安装的WordPress版本相同的版本号。如果设置为null,则不添加版本号。最终生成这样一条url:https://example.com/front-end/css/view/general.min.css?ver=x.x.x 第二,我们也可以通过/wp-content/plugins/essential-addons-for-elementor-lite/readme.txt进行版本探测。 确认受影响的版本以后,就是搜寻真实用户名。同样有多种方式进行探测: 使用 WordPress 的 rss feed 来提取用户名。这是一种用于发布和传递 WordPress 内容的标准格式,包含了站点的最新文章、页面、评论等内容,以及发布时间、作者、分类、标签等相关信息。这些信息可以被其他站点或应用程序订阅和使用,增加当前站点的曝光度。而其中dc:creator标签就包含了作者名称; 使用 WordPress 的 rest api 来获取用户名; 使用了 Yoast 插件提供的站点图来获取用户名。它较于第一种方法的优势在于只能获取到站点中已发布文章的作者信息。如果站点中还有其他用户没有发布文章,那么这些用户的信息是不会被获取的。 除此之外,WordPress也存在默认用户名(admin),这也是该漏洞最常利用的用户名之一。 做完上述信息收集以后,构造报文即可成功重置任意用户密码: 修复方案 在Essential Addons for Elementor(5.7.2)中,进行reset_password()操作之前,先去做了rp_key的校验。补丁如下:   ...

    2023-10-16 223

联系我们

在线咨询:点击这里给我发消息

QQ交流群:KirinBlog

工作日:8:00-23:00,节假日休息

扫码关注