为何数据库推荐将IPv4地址存储为32位整数而非字符串?
目录
一、IPv4地址在数据库中的存储方式?
二、IPv4地址的存储方式比较
(一)字符串存储 vs 整数存储
(二)IPv4地址"192.168.1.8"说明
三、数据库推荐32位整数存储方式原理
四、存储方式对系统性能的影响
(一)数据准备
(二)查询效率比较
(三)索引性能比较
五、应用层IP转换操作
六、总结
干货分享,感谢您的阅读!
在这个互联网高速发展的时代,IP地址就像每一个网站的身份证,帮助我们在浩瀚的网络海洋中找到方向。但你是否想过,这些数字串究竟是如何被存储的?想象一下,如果把你的家地址写成一串长长的数字,或者把它变成一个32位的整数,这听起来像是科学家在做数学实验,但其实,这却是程序员们为提升数据库性能而进行的“魔法”。
就像在一家餐馆点菜,你可以选择一份诱人的意面(字符串存储),看起来色香味俱全,但吃完后发现胃部撑得慌;或者选择一份精简的沙拉(整数存储),虽然简单但却让你轻松自在,身心舒畅。那么,究竟哪个选择更胜一筹呢?在接下来的内容中,我们将一探究竟,揭秘IP地址存储的“幕后故事”,让你不再是一个无知的网络游民,而是一位懂得选择的智者!准备好了吗?让我们一起踏上这段探索之旅吧!
一、IPv4地址在数据库中的存储方式?
在Java开发过程中,我们通常会使用数据库来存储各种类型的数据,包括IPv4地址。但是,我们应该如何存储这些IP地址才能最大程度地提高系统的性能呢?使用字符串存储IPv4地址可能会更直观,但是否是最佳选择呢?
究竟应该如何存储IPv4地址才能最大程度地提高数据库的性能和系统的效率呢?我们进行探讨下为何数据库推荐将IPv4地址存储为32位整数而非字符串,并从Java开发者的角度分析这种存储方式对系统性能和开发流程的影响。
二、IPv4地址的存储方式比较
(一)字符串存储 vs 整数存储
存储方式 | 优点 | 缺点 |
---|---|---|
字符串存储 | 直观性:更易于人类理解和查看 灵活性:可以存储不同格式的IPv4地址 | 存储空间消耗大:每个IPv4地址需要较大的存储空间 效率低下:字符串比较通常耗时较长 难以进行数学运算和比较:需要额外的格式转换和解析 |
整数存储 | 存储空间效率高:只需较小存储空间 查询效率高:整数比较速度更快,索引和查询效率更高 数学运算方便:可以直接进行数学运算和比较 | 可能丢失部分信息:无法存储IPv6地址等其他地址格式 不直观:整数表示的IPv4地址不易于人类理解和查看 |
(二)IPv4地址"192.168.1.8"说明
当我们将IPv4地址"192.168.1.8"存储为字符串时,以十进制格式显示,类似于我们平时在浏览器中看到的网址,这种表示方法直观而易读。但一般每个IPv4地址都需要15个字符的存储空间(包括3个"."分隔符和4个三位数的表示),当数据量大的时候可能会导致:存储空间的浪费+查询和索引时效率降低。因为数据库系统在处理字符串比较时,需要逐字符比较,这可能会增加查询时间。
当我们将IPv4地址存储为32位整数时,它们会以二进制格式表示,例如:3232235776。这种表示方法可能不太直观,但整数只需要4字节的存储空间,远远小于使用字符串存储所需的空间。这意味着在存储大量IPv4地址时,整数存储方式可以显著节省存储空间,还可以提高数据库查询和索引的效率。因为整数比较速度更快,数据库可以更快地执行查询操作,并且可以更有效地利用索引。
因此,虽然字符串存储方式可能更直观和易读,但整数存储方式在存储空间效率和查询效率方面更具优势,这就是为什么数据库通常推荐将IPv4地址存储为32位整数而不是字符串的原因。
三、数据库推荐32位整数存储方式原理
整数存储IPv4地址的原理非常简单,它是基于IPv4地址的32位二进制表示的。IPv4地址由四个8位组成,每个组都可以表示为一个0到255的十进制数,或者一个0x00到0xFF的十六进制数。因此,将IPv4地址存储为32位整数实际上是将这四个8位的组合表示为一个32位的二进制数。
具体来说,如果将IPv4地址 "192.168.1.8" 转换为32位整数的表示,可以将每个IPv4地址的部分转换为二进制形式。
对于 "192.168.1.8",分别转换为二进制:
- 192 -> 11000000
- 168 -> 10101000
- 1 -> 00000001
- 8 -> 00001000
将这四个二进制数按顺序连接起来(11000000101010000000000100001000),形成一个32位的二进制数。最后,将这个32位的二进制数转换为整数,即为 IPv4 地址 "192.168.1.8" 对应的32位整数。转换后的整数值是:3232235776(以十进制表示)。
四、存储方式对系统性能的影响
(一)数据准备
使用数据库管理工具(如MySQL Workbench、phpMyAdmin等)或者命令行工具(如MySQL的命令行客户端)连接到数据库服务器。
在数据库zyf中创建新表,用于存储IPv4地址,选择将IPv4地址存储为字符串类型或整数类型:
- 如果选择字符串类型,可以使用VARCHAR
- 如果选择整数类型,可以使用INT
具体如下:
-- 创建表,将IPv4地址存储为字符串
CREATE TABLE ip_addresses_string (id INT AUTO_INCREMENT PRIMARY KEY,ip_address VARCHAR(15)
);-- 创建表,将IPv4地址存储为整数
CREATE TABLE ip_addresses_integer (id INT AUTO_INCREMENT PRIMARY KEY,ip_address INT UNSIGNED
);
接着我们生成大量的IPv4地址数据。可以考虑使用随机生成器来生成一系列随机的IPv4地址,以模拟真实环境中的数据。分别向 ip_addresses_string
和 ip_addresses_integer
表中插入生成的IPv4地址数据。具体代码如下:
package org.zyf.javabasic.ipaddresses;import java.util.Random;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.SQLException;/*** @program: zyfboot-javabasic* @description: 简单的Java程序示例,用于生成大量IPv4地址数据并插入到数据库表中* @author: zhangyanfeng* @create: 2024-05-02 23:29**/
public class IPAddressDataGenerator {public static void main(String[] args) {// 数据库连接信息String url = "jdbc:mysql://localhost:3306/zyf";String username = "root";String password = "Zyf2014";// 生成大量IPv4地址数据int numAddresses = 10000; // 要生成的IPv4地址数量String[] ipAddresses = generateIPv4Addresses(numAddresses);// 将数据插入到数据库表中insertData(url, username, password, ipAddresses);}// 生成大量IPv4地址数据private static String[] generateIPv4Addresses(int numAddresses) {String[] ipAddresses = new String[numAddresses];Random rand = new Random();for (int i = 0; i < numAddresses; i++) {// 生成随机的IPv4地址String ipAddress = rand.nextInt(256) + "." + rand.nextInt(256) + "." + rand.nextInt(256) + "." + rand.nextInt(256);ipAddresses[i] = ipAddress;}return ipAddresses;}// 将数据插入到数据库表中private static void insertData(String url, String username, String password, String[] ipAddresses) {try (Connection connection = DriverManager.getConnection(url, username, password)) {// 插入字符串存储的IPv4地址数据insertIPv4Addresses(connection, "ip_addresses_string", ipAddresses);// 将IPv4地址转换为整数存储并插入数据long[] integerAddresses = convertToInteger(ipAddresses);insertIntegerAddresses(connection, "ip_addresses_integer", integerAddresses);} catch (SQLException e) {e.printStackTrace();}}// 插入字符串存储的IPv4地址数据private static void insertIPv4Addresses(Connection connection, String tableName, String[] ipAddresses) throws SQLException {String sql = "INSERT INTO " + tableName + " (ip_address) VALUES (?)";try (PreparedStatement statement = connection.prepareStatement(sql)) {for (String ipAddress : ipAddresses) {statement.setString(1, ipAddress);statement.addBatch();}statement.executeBatch();}}// 将IPv4地址转换为整数存储并插入数据private static void insertIntegerAddresses(Connection connection, String tableName, long[] integerAddresses) throws SQLException {String sql = "INSERT INTO " + tableName + " (ip_address) VALUES (?)";try (PreparedStatement statement = connection.prepareStatement(sql)) {for (long ipAddress : integerAddresses) {statement.setLong(1, ipAddress);statement.addBatch();}statement.executeBatch();}}// 将IPv4地址转换为整数存储private static long[] convertToInteger(String[] ipAddresses) {long[] integerAddresses = new long[ipAddresses.length];for (int i = 0; i < ipAddresses.length; i++) {String[] parts = ipAddresses[i].split("\\.");long ipAddress = 0;for (int j = 0; j < 4; j++) {ipAddress += Long.parseLong(parts[j]) << (24 - (8 * j));}integerAddresses[i] = ipAddress;}return integerAddresses;}
}
(二)查询效率比较
我们对这两种存储方式进行查询,并记录每次查询的时间。最后,我们比较两种存储方式的查询时间,以确定哪种方式的查询效率更高。代码如下:
package org.zyf.javabasic.ipaddresses;import java.sql.*;/*** @program: zyfboot-javabasic* @description: 比较两种存储方式的查询时间,以确定哪种方式的查询效率更高。* @author: zhangyanfeng* @create: 2024-05-02 23:44**/
public class IPAddressStorageComparison {public static void main(String[] args) {// Connect to the databaseConnection connection = null;try {connection = DriverManager.getConnection("jdbc:mysql://localhost:3306/zyf", "root", "Zyf2014");// Query IPv4 addresses stored as stringslong startTimeString = System.currentTimeMillis();Statement statement = connection.createStatement();ResultSet resultSetString = statement.executeQuery("SELECT * FROM ip_addresses_string WHERE ip_address = '192.168.1.1'");long endTimeString = System.currentTimeMillis();long durationString = endTimeString - startTimeString;System.out.println("Query time for string storage: " + durationString + " milliseconds");// Query IPv4 addresses stored as integerslong startTimeInteger = System.currentTimeMillis();ResultSet resultSetInteger = statement.executeQuery("SELECT * FROM ip_addresses_integer WHERE ip_address = 3232235777");long endTimeInteger = System.currentTimeMillis();long durationInteger = endTimeInteger - startTimeInteger;System.out.println("Query time for integer storage: " + durationInteger + " milliseconds");// Close the connectionconnection.close();} catch (SQLException e) {e.printStackTrace();}}
}
具体运行如下:
根据查询时间,可以看出整数存储的查询时间明显短于字符串存储的查询时间。整数存储的查询时间为4毫秒,而字符串存储的查询时间为19毫秒。这表明在这次测试中,整数存储的查询效率要比字符串存储的查询效率高。
(三)索引性能比较
在数据库表中分别为IPv4地址字段创建索引,具体如下:
-- 为字符串存储的IPv4地址字段创建索引
CREATE INDEX idx_ip_address_string ON ip_addresses_string (ip_address);-- 为整数存储的IPv4地址字段创建索引
CREATE INDEX idx_ip_address_integer ON ip_addresses_integer (ip_address);
这个时候在运行上面的代码,输出如下:
根据查询时间结果,可以看出整数存储的索引查询时间明显短于字符串存储的索引查询时间,整数存储的索引查询时间为1毫秒,而字符串存储的索引查询时间为10毫秒。这表明在这次测试中,整数存储的索引查询效率要比字符串存储的索引查询效率更高。
五、应用层IP转换操作
提供一个IPUtils
工具类用于IPv4地址和长整型数值之间的相互转换。通过位运算和位掩码,避免了字符串操作和对象创建,提高转换过程的执行效率:
package org.zyf.javabasic.ipaddresses;/*** @program: zyfboot-javabasic* @description: 使用位运算和位掩码来进行IPv4地址和长整型数值的转换* @author: zhangyanfeng* @create: 2024-05-03 00:08**/
public class IPUtils {public static long ipToLong(String ip) {String[] parts = ip.split("\\.");return (Long.parseLong(parts[0]) << 24) +(Long.parseLong(parts[1]) << 16) +(Long.parseLong(parts[2]) << 8) +Long.parseLong(parts[3]);}public static String longToIp(long longIp) {StringBuilder sb = new StringBuilder();sb.append((longIp >>> 24) & 0xFF).append(".");sb.append((longIp >>> 16) & 0xFF).append(".");sb.append((longIp >>> 8) & 0xFF).append(".");sb.append(longIp & 0xFF);return sb.toString();}public static void main(String[] args) {String ip1 = "10.122.28.76";long ip1ToLong = ipToLong(ip1);System.out.println("IPv4地址 \"" + ip1 + "\" 转换为长整型数值的结果是:" + ip1ToLong);String ip2 = "10.168.0.45";long ip2ToLong = ipToLong(ip2);System.out.println("IPv4地址 \"" + ip2 + "\" 转换为长整型数值的结果是:" + ip2ToLong);long longIp = 197958752L;String longIpToIp = longToIp(longIp);System.out.println("长整型数值 \"" + longIp + "\" 转换为IPv4地址的结果是:" + longIpToIp);}
}
六、总结
探讨在Java开发中存储IPv4地址的最佳方式。通过对比字符串存储和整数存储两种方式的优缺点,我们发现整数存储方式在存储空间效率、查询效率和数学运算方面更具优势。虽然字符串存储方式更直观易读,但在处理大量数据时会浪费存储空间并降低查询效率。
通过具体的示例代码演示了如何生成大量的IPv4地址数据,并将其插入到数据库表中。通过查询和索引效率的比较,我们验证了整数存储方式在性能方面的优势。
相关文章:
为何数据库推荐将IPv4地址存储为32位整数而非字符串?
目录 一、IPv4地址在数据库中的存储方式? 二、IPv4地址的存储方式比较 (一)字符串存储 vs 整数存储 (二)IPv4地址"192.168.1.8"说明 三、数据库推荐32位整数存储方式原理 四、存储方式对系统性能的影响…...
Mybatis框架之责任链模式 (Chain of Responsibility Pattern)
在 MyBatis 框架中,责任链模式 (Chain of Responsibility Pattern) 被广泛应用于多个功能模块中,例如 插件拦截器、SQL 执行流程中的拦截器链、动态 SQL 的解析与处理等。这种设计模式为 MyBatis 提供了高度的扩展性和灵活性,使其能够轻松应对…...
C++ Stack和Queue---单向守护与无尽等待:数据结构的诗意表达
公主请阅 容器适配器容器适配器的特点 栈和队列的模拟实现deque的介绍1. 内存开销较高2.随机访问性能略低于 vector3. 与指针或迭代器的兼容性r4. 不适合用于需要频繁中间插入和删除的场景5. 在特定平台上的实现不一致6. 缺乏shrink_to_fit支持总结 题目 priority_queue 优先级…...
深入理解Java包装类与泛型的应用
今天我将带领大家进入Java包装类和泛型应用的学习。 我的个人主页 我的Java-数据结构专栏 :Java-数据结构,希望能帮助到大家。 一、Java包装类基础 二、Java泛型基础 三、Java包装类与泛型的结合 四、Java泛型进阶 五、Java包装类与泛型实战 一、Ja…...
【机器学习chp4】特征工程
推荐文章1,其中详细分析了为什么L1正则化可以实现特征选择(特征剔除) 【王木头 L1、L2正则化】三个角度理解L1、L2正则化的本质-CSDN博客 推荐文章2,里面详细分析了奇异值分解 【线性代数】矩阵变换-CSDN博客 本文遗留问题&#…...
LeetCode螺旋矩阵
快一个月没刷题了,最近工作有些忙,今天闲下来两小时,刷一道 题目描述 给你一个 m 行 n 列的矩阵 matrix ,请按照 顺时针螺旋顺序 ,返回矩阵中的所有元素。 示例 1: 输入:matrix [[1,2,3],[4…...
第十五届蓝桥杯JAVA的B组题目详情解析
(第一个填空太简单,就不写了,根本不用代码,直接excel计算) 目录 蓝桥杯第二个填空,类斐波那契循环数 蓝桥杯JAVA.b组第三题 -分布式队列(模拟) 食堂(蓝桥杯D题) 编辑 星际旅行(Floyd佛洛依德) 其余的有点变态,感觉学了好像…...
在几分钟内将数据从 Oracle 迁移到 ClickHouse
ClickHouse 是一个开源的面向列的数据库管理系统。它在实时数据处理方面的出色性能显着增强了数据分析和业务洞察力。将数据从 Oracle 迁移到 ClickHouse 可以释放数据在决策中的力量,这是单独使用 Oracle 无法实现的。 本教程介绍如何使用 BladePipe 将数据从 Orac…...
ASP.NET MVC宠物商城系统
该系统采用B/S架构,使用C#编程语言进行开发,以ASP.NET MVC框架为基础,以Visual Studio 2019为开发工具,数据库采用SQL Server进行保存数据。系统主要功能包括登录注册、宠物展示、个人中心、我的订单、购物车、用户管理、宠物类别…...
完整http服务器
目录 背景目标描述技术特点开发环境WWW客户端浏览发展史服务端http发展史http分层概览 背景 http协议被广泛使用,从移动端,pc浏览器,http无疑是打开互联网应用窗口的重要协议,http在网络应用层中的地位不可撼动,是能…...
【专题】2024AIGC创新应用洞察报告汇总PDF洞察(附原数据表)
原文链接:https://tecdat.cn/?p38310 在科技日新月异的今天,人工智能领域正以前所未有的速度发展,AIGC(人工智能生成内容)成为其中最耀眼的明珠。从其应用场景的不断拓展,到对各行业的深刻变革࿰…...
形态学图像处理(Morphological Image Processing)
形态学图像处理(Morphological Image Processing) 前言 本博客为个人总结数字图像处理一课所写,并给出适当的扩展和相应的demo。 写博客跟做 checkpoint 很像,毕竟个人还不能达到那种信手拈来的境界,忘了就是从零开始训练࿰…...
【IDER、PyCharm】免费AI编程工具完整教程:ChatGPT Free - Support Key call AI GPT-o1 Claude3.5
文章目录 CodeMoss 简介CodeMoss 的模型集成如何安装和配置 CodeMossIDER 插件安装步骤 CodeMoss 的实战使用AI 问答功能代码优化与解释优化这段代码解释这段代码 文件上传与对话联网查询与 GPT 助手联网查询GPT 助手 提升开发效率的最佳实践结语更多文献 CodeMoss 简介 CodeM…...
C++11的一些实用特性
1.统一的列表初始化 在C98中,标准允许使用花括号{}对数组或者结构体元素进行统一的列表初始值设定。 //统一的列表初始化 struct Date {int year;int month;int day; };void test1() {Date d1 { 2024,11,14 };int array1[] { 1, 2, 3, 4, 5 };int array2[5] { …...
23种设计模式-观察者(Observer)设计模式
文章目录 一.什么是观察者模式?二.观察者模式的结构三.观察者模式的应用场景四.观察者模式的优缺点五.观察者模式的实现(C示例)六.观察者模式的实现(JAVA示例)七.代码解释八.总结 类图: 观察者设计模式类图…...
【CUDA】Branch Divergence and Unrolling Loop
目录 一、避免分支发散 1.1 并行规约问题 1.2 并行规约中的发散 二、UNrolling Loops 一、避免分支发散 控制流有时依赖于 thread 索引。同一个warp中,一个条件分支可能导致性能很差。通过重新组织数据获取模式可以减少或避免 warp divergence。具体问题查看下…...
深度学习:卷积神经网络的计算复杂度,顺序操作,最大路径长度
卷积层的计算复杂度 在深度学习中,卷积层的计算复杂度主要取决于卷积核的大小、输入和输出的通道数量、以及输入序列的长度。具体来说,卷积层的计算复杂度可以通过以下几个因素来计算: 卷积核大小 k:卷积核的大小决定了每次卷积操…...
springboot 配置文件中 multipart.max-file-size 各个版本的写法
由于springboot具有几个版本,不同版本对于文件上传最大限制的配置也有所不同。 所以要注意springboot本身的版本,不然会一直报错 在springboot1.3版本中: multipart.maxFileSize在springboot1.4与springboot1.5版本中: spring…...
linux 中mysql查看慢日志
1、到mysql容器,先登录到数据库,查看是否开启 mysql -h 127.0.0.1 -uroot -p SHOW VARIABLES LIKE slow_query_log; 2、如果没有开启,需要先开启 set global slow_query_log ON; 3、查看慢日志文件 SHOW VARIABLES LIKE slow_query_log…...
单片机的基本组成与工作原理
单片机(Microcontroller Unit, MCU)是一种将计算机的主要部分集成在一个芯片上的小型计算机系统。它通常包括中央处理器(CPU)、存储器(Memory)、输入输出接口(I/O Ports)、定时器/计…...
智慧隧道和智慧交通
通过引入先进的物联网技术,将各种硬件设备如传感器、摄像头、控制系统等有效地连接并管理起来,以实现道路安全和交通流畅的目标。这些设备将能够实时监控和控制隧道内的各种设备和系统,从而提高道路安全、提升驾驶体验并降低管理成本。 在这个…...
List、Set、Map详解和区别
在 Java 中,List、Set、Map是常用的集合类型,它们各自具有不同的特点和用途,以下是对它们的详细介绍及区别分析: List(列表) 特点: 有序性:List中的元素是有序的,即元素…...
界面控件DevExpress WinForms v24.2新功能预览 - 支持.NET 9
DevExpress WinForms 拥有180组件和UI库,能为Windows Forms平台创建具有影响力的业务解决方案。DevExpress WinForms能完美构建流畅、美观且易于使用的应用程序,无论是Office风格的界面,还是分析处理大批量的业务数据,它都能轻松胜…...
Postman之pm.test断言操作
Postman之pm.test断言操作 1.断言方法2.连接符3.条件判断符 用于验证请求的响应数据是否符合预期 1.断言方法 pm.test():定义一个测试函数,接受两个参数,一个字符串参数用来描述该测试,一个返回True/False的函数 语法格式&#…...
对数几率回归
对数几率回归简介 对数几率回归(Logistic Regression)是一种用于解决分类问题的经典统计模型,其核心思想是利用逻辑函数(Sigmoid函数)将线性回归模型的输出值映射到概率范围 [0, 1],从而实现分类预测。对数…...
docker 配置同宿主机共同网段的IP 同时通过通网段的另一个电脑实现远程连接docker
docker配置网络 #宿主机执行命令 ifconfig 查询对应的主机ip 子网掩码 网关地址 #[网卡名称]:inet[主机IP] netmask[子网掩码] broadcast[网关地址]这里需要重点关注:eno1[网卡名称]以及【192.168.31.225】网关地址 在宿主机执行docker命令创建一个虚拟…...
4-7-1.C# 数据容器 - LinkedList(LinkedList 的定义、LinkedList 结点的遍历、LinkedList 的常用方法)
LinkedList 概述 LinkedList<T> 通过节点(Node)来存储数据,每个节点包含数据和指向下一个节点的引用 LinkedList<T> 存储的元素是可重复的 LinkedList<T> 支持泛型,可以指定存储的元素的类型 LinkedList<…...
「三」体验HarmonyOS端云一体化开发模板——使用DevEco Studio直接创建端云一体化工程
关于作者 白晓明 宁夏图尔科技有限公司董事长兼CEO、坚果派联合创始人 华为HDE、润和软件HiHope社区专家、鸿蒙KOL、仓颉KOL 华为开发者学堂/51CTO学堂/CSDN学堂认证讲师 开放原子开源基金会2023开源贡献之星 「目录」 「一」HarmonyOS端云一体化概要 「二」体验HarmonyOS端云一…...
确保以管理员权限运行 Visual Studio 开发者命令提示符
文章目录 解决方法:1. 以管理员身份运行命令提示符2. 改变目录权限3. 改变项目目录位置4. 检查文件系统权限 总结: ********************************************************************** ** Visual Studio 2022 Developer Command Prompt v17.12.0 …...
命令执行简单(棱角社区有毒)
前言:小迪安全2022第一节反弹shell,小迪用的是两台都是云服务器,没有服务器可以在自己的主机上搭建也是可以的,主机上搭两个网站 思路:生成一个木马文件,下载到本机,然后利用本机上传到目标主机…...
网站建设多久可以建成/seo在哪可以学
[Unity中文课堂教程] C#中级编程 - 10 - 命名空间/using 原教程视频地址: 《[Unity中文课堂教程预告片] C#中级编程_哔哩哔哩_bilibili》 《C#中级编程 - Unity中文课堂 (u3d.cn)》 《C# 命名空间(Namespace) | 菜鸟教程 (runoob.com)》 内容…...
做代购网站有哪些/免费b站网站推广
Welcome to 3306π4月APRIL 14TH福利「3306π」社区北京站meetup活动刚上线一周多,早鸟免费票、普票均已告罄。为了方便在外地以及北京本地有事无法亲临现场交流的胖友们,我们特邀“IT大咖说”平台直播本次活动。各位亲们可以在家里、在野外、在飞机中、…...
什么网站可以帮忙做任务赚钱/免费建站哪个比较好
模仿C#的StringBuilder类,还有很多函数需要慢慢完善的以前写javascript的时候,有个js的Stringbuilder类,说是效率高,不知道在php下,这样处理字符串组合时不时也会效率高呢?请高手指点<?clas…...
移动端网站/长沙好的seo外包公司
elk笔记24--用gohangout替代logstash消费日志介绍使用gohangout使用gohangout前后对比注意事项说明介绍 gohangout 是 childe 大佬使用 golang 模仿的 Logstash 开源项目。用于消费 Kafka 数据,处理后写入 ES、Clickhouse 等。 相对于elk 中官方提供的 logstash&am…...
怎么做好推广和营销/seo网站优化服务
题意: 给一段字符串成段染色,问染成目标串最少次数. SOL: 区间DP... DP[i][j]表示从i染到j最小代价 转移:dp[i][j]min(dp[i][j],dp[i1][k]dp[k1][j]); CODE: BZ: /* # Created time: 2016-03-28 21:10 # Filename: uva4394.cpp # Description: */ #define me AcrossTheSky #i…...
做剧情网站侵权吗/地推怎么做最有效
为什么80%的码农都做不了架构师?>>> 方法一:通过共享对象锁加上可见变量来实现 /*** 指定线程执行顺序:通过synchronized共享对象锁加上volatile可见变量来实现*/ public class ThreadOrder {private volatile int orderNum 1;p…...