当前位置: 首页 > news >正文

带您了解TiDB MySQL数据库中关于日期、时间的坑

带您了解TiDB & MySQL数据库中关于日期、时间的坑

  • 时间的基础知识
    • 什么是时间
    • 计算时间的几种方法
      • 世界时(UT)
      • 协调世界时(UTC)
      • 国际原子时(TAI)
    • 时区的概念
      • 中国所在的时区
  • 操作系统的时区
    • date
    • timedatectl
  • 数据库中的时区
    • TiDB数据库中的时区
      • 查看时区参数
      • 与时间相关的函数
      • 与时间相关的数据类型
      • 与日期相关的函数
      • 如何计算闰年
    • MySQL数据库中的时区
      • 日期相关的函数
      • MySQL数据库中的定时器
  • 总结

时间的基础知识

什么是时间

时间是人们根据自然现象而进行的一种抽象概念。人类通过观察日月星辰、季节交替、动植物生长等自然现象,逐渐认识到时间的存在,并进行了一系列的时间计量。

计算时间的几种方法

世界时(UT)

世界时(Universal Time,简称UT)是以地球自转周期作为基础的时间计量标准,UT可以根据不同的定义方式分为UT0、UT1、UT2、UT1R等不同的形式。UT的定义是基于天文观测数据,主要通过观测地球自转的角速度来确定时间单位。UT是地球物理学中使用最广泛的时间系统之一,但它受到地球自转速率的不断变化的影响,因此不够稳定和准确。

为了弥补UT的不足,国际标准化组织(ISO)于1970年提出了协调世界时(UTC)。

协调世界时(UTC)

协调世界时(Coordinated Universal Time,简称UTC),又称世界统一时间,世界标准时间,是目前国际上通用的时间标准,它是以原子钟为基础,通过对全球范围内的原子钟信号进行加权平均而得出的一种时间标准。

协调世界时采用24小时制,一天被划分为24个小时,每小时包括60分钟,每分钟包括60秒。起点是1970年1月1日0时0分0秒,与Unix时间戳相同。

协调世界时以地球自转为基础,以本初子午线上的标准子午线时为基准,使地球各地的时间保持一致。UTC引入了闰秒来纠正由于地球自转速率的微小变化所导致的时间偏差。

国际原子时(TAI)

国际原子时(International Atomic Time,简称TAI)是一个标准的原子时计量系统,以铯原子的振荡频率为基础,是世界上精度最高的时间计量方式之一。TAI通过一个网络由多个原子钟测量得出,并被国际计量组织(BIPM)所管理。

国际原子时与世界时(UT)之间存在微小的偏差,这是由于地球自转速度的变化导致的。因此,国际地球自转服务(IERS)会不定期地宣布添加或减少闰秒,以保持TAI和UT之间的同步。

时区的概念

时区是按照一定的经度范围将地球划分成若干个区域,使得同一个时区内的时间是相同的,以方便人们进行时间交流和统一管理。世界上总共分为24个主要时区,每个主要时区相差15度经度。

通常,时区以协调世界时(UTC)的正负偏移量来表示,偏移量为0的时区被称为“格林威治标准时间”(GMT),也就是世界标准时间。

全球24个标准时区及其相应的偏差(以协调世界时(UTC)为基准):

  • UTC-12: 国际日期变更线以西12小时
  • UTC-11: 协调世界时减去11小时
  • UTC-10: 协调世界时减去10小时
  • UTC-9: 协调世界时减去9小时
  • UTC-8: 协调世界时减去8小时
  • UTC-7: 协调世界时减去7小时
  • UTC-6: 协调世界时减去6小时
  • UTC-5: 协调世界时减去5小时
  • UTC-4: 协调世界时减去4小时
  • UTC-3: 协调世界时减去3小时
  • UTC-2: 协调世界时减去2小时
  • UTC-1: 协调世界时减去1小时
  • UTC: 协调世界时
  • UTC+1: 协调世界时加上1小时
  • UTC+2: 协调世界时加上2小时
  • UTC+3: 协调世界时加上3小时
  • UTC+4: 协调世界时加上4小时
  • UTC+5: 协调世界时加上5小时
  • UTC+6: 协调世界时加上6小时
  • UTC+7: 协调世界时加上7小时
  • UTC+8: 协调世界时加上8小时
  • UTC+9: 协调世界时加上9小时
  • UTC+10: 协调世界时加上10小时
  • UTC+11: 协调世界时加上11小时
  • UTC+12: 协调世界时加上12小时

中国所在的时区

中国所在的时区是指中国范围内划分的标准时区,中国的大致经度范围是73°33′E至135°05′E,本应跨越5个时区,但为了统一管理、保证全国统一时间,中国只采用了一个时区,即东八区(UTC+8)。中国除了采用UTC+8表示时区,还可以使用中国标准时间(China Standard Time,CST)来表示。

操作系统的时区

在Ubuntu 20.04系统中,有几个命令是和时间、时区有关的。

date

可以通过date命令来查看时间,在输出结果中同时会显示当前时间是按什么时间计时的。

wux_labs@wux-labs-vm:~$ date
Wed Feb 22 06:39:29 UTC 2023

image-20230222143718419

从输出结果可以看到,当前是UTC时间,2023-02-22。

timedatectl

还可以使用timedatectl命令查看时间的详细信息。

wux_labs@wux-labs-vm:~$ timedatectlLocal time: Wed 2023-02-22 06:39:35 UTCUniversal time: Wed 2023-02-22 06:39:35 UTCRTC time: Wed 2023-02-22 06:39:35    Time zone: Etc/UTC (UTC, +0000)       
System clock synchronized: yes                        NTP service: active                     RTC in local TZ: no

image-20230222143740512

从结果中可以看到当前时间的详细信息,以及时区信息:

Time zone: Etc/UTC (UTC, +0000)  

使用timedatectl list-timezones命令可以列出所有可使用的时区。

使用timedatectl set-timezone命令可以修改系统的时区。

以下命令将系统时区修改为Asia/Shanghai

wux_labs@wux-labs-vm:~$ sudo timedatectl set-timezone Asia/Shanghai

修改完成后再次查看一下时间信息:

wux_labs@wux-labs-vm:~$ date
Wed Feb 22 14:39:48 CST 2023
wux_labs@wux-labs-vm:~$ timedatectlLocal time: Wed 2023-02-22 14:39:52 CSTUniversal time: Wed 2023-02-22 06:39:52 UTCRTC time: Wed 2023-02-22 06:39:52    Time zone: Asia/Shanghai (CST, +0800) 
System clock synchronized: yes                        NTP service: active                     RTC in local TZ: no

image-20230222144426244

数据库中的时区

TiDB数据库中的时区

在TiDB数据库中,通过参数time_zone可以设置数据库的时区。TiDB中的参数的作用域分为Global级别和Session级别,每个级别都可以设置time_zone参数,TiDB在取值的时候优先取Session级别的,Session级别没设置再取Global级别的,具体的优先级为:

Session > Global > 操作系统 > UTC

查看时区参数

在TiDB中,可以通过以下语句来查看当前集群中的参数。

mysql> select @@global.time_zone,@@session.time_zone;
+--------------------+---------------------+
| @@global.time_zone | @@session.time_zone |
+--------------------+---------------------+
| SYSTEM             | SYSTEM              |
+--------------------+---------------------+
1 row in set (0.00 sec)

image-20230222150042438

在当前集群中time_zone都未设置,所以采用的是操作系统的时区。

与时间相关的函数

在TiDB中,有一些与时间有关的函数,其函数返回值会受时区的影响。

  • now()函数用于获取当前时间,包括日期和时间
  • curtime()函数用于获取当前时间,仅包含时间
mysql> select now(),curtime();
+---------------------+-----------+
| now()               | curtime() |
+---------------------+-----------+
| 2023-02-22 07:17:45 | 07:17:45  |
+---------------------+-----------+
1 row in set (0.00 sec)

由于TiDB数据库集群在启动的时候,操作系统采用的时间是UTC时间,所以当前启动的TiDB数据库集群也采用的UTC时间。

下面修改一下Session级别的参数。

mysql> set session time_zone = '+8:00';
Query OK, 0 rows affected (0.00 sec)

修改完成后,再看看当前时区参数以及函数返回值,都会发生变化。

mysql> select @@global.time_zone,@@session.time_zone;
+--------------------+---------------------+
| @@global.time_zone | @@session.time_zone |
+--------------------+---------------------+
| SYSTEM             | +8:00               |
+--------------------+---------------------+
1 row in set (0.00 sec)mysql> select now(),curtime();
+---------------------+-----------+
| now()               | curtime() |
+---------------------+-----------+
| 2023-02-22 15:18:06 | 15:18:06  |
+---------------------+-----------+
1 row in set (0.00 sec)

image-20230222151952213

与时间相关的数据类型

在TiDB中,有一些数据类型也与时间有关。

  • datetime,日期时间类型,会同时存储日期和时间
  • timestamp,时间戳类型,会同时存储日期和时间
  • time,时间类型,仅会存储时间

下面创建一个表用来看看不同数据类型受时区的影响情况。

mysql> create table temp(f1 datetime, f2 timestamp, f3 time);
Query OK, 0 rows affected (0.14 sec)

插入数据,都取当前时间。

mysql> insert into temp values(now(), now(), curtime());
Query OK, 1 row affected (0.01 sec)

查看时区及时间。

mysql> select @@global.time_zone,@@session.time_zone;
+--------------------+---------------------+
| @@global.time_zone | @@session.time_zone |
+--------------------+---------------------+
| SYSTEM             | SYSTEM              |
+--------------------+---------------------+
1 row in set (0.00 sec)mysql> select * from temp;
+---------------------+---------------------+----------+
| f1                  | f2                  | f3       |
+---------------------+---------------------+----------+
| 2023-02-22 07:27:13 | 2023-02-22 07:27:13 | 07:27:13 |
+---------------------+---------------------+----------+
1 row in set (0.00 sec)

以上结果是采用UTC时间的值,数据是持久化到表中的,固定不变的值。

image-20230222152926293

接下来,切换一下时区,再来看看表中的数据情况。

mysql> set session time_zone = '+8:00';
Query OK, 0 rows affected (0.00 sec)mysql> select @@global.time_zone,@@session.time_zone;
+--------------------+---------------------+
| @@global.time_zone | @@session.time_zone |
+--------------------+---------------------+
| SYSTEM             | +8:00               |
+--------------------+---------------------+
1 row in set (0.00 sec)mysql> select * from temp;
+---------------------+---------------------+----------+
| f1                  | f2                  | f3       |
+---------------------+---------------------+----------+
| 2023-02-22 07:27:13 | 2023-02-22 15:27:13 | 07:27:13 |
+---------------------+---------------------+----------+
1 row in set (0.01 sec)

从结果可以看到,对于已经持久化保存的固定数据:

  • datetime、time两种数据类型的值不受时区影响
  • timestamp数据类型的值会受时区影响,时区不同,查询结果不同

image-20230222153120778

避坑1:

在数据库中,使用Timestamp数据类型,一定要小心,一定要确定好时区,分析影响性。

如果可以,使用datetime类型,而不使用timestamp类型。

与日期相关的函数

在TiDB数据库中,有一些关于日期的函数、计算:

  • curdate(),用来获取当前时间

  • date(),将字符串转换成日期

  • day(),获取日期的天

  • +interval 1 day,日期计算,加1天

  • =,可用于判断两个日期是否相等,相等返回1,不等返回0

  • datediff(),用来计算两个日期之间相差的天数

比如下面的代码用来做日期相关的计算:

mysql> select curdate(), curdate() + interval 5 day, day(curdate()), date('2023-02-22'), curdate() = date('2023-02-22'), curdate() = date('2023-02-23');
+------------+----------------------------+----------------+--------------------+--------------------------------+--------------------------------+
| curdate()  | curdate() + interval 5 day | day(curdate()) | date('2023-02-22') | curdate() = date('2023-02-22') | curdate() = date('2023-02-23') |
+------------+----------------------------+----------------+--------------------+--------------------------------+--------------------------------+
| 2023-02-22 | 2023-02-27                 |             22 | 2023-02-22         |                              1 |                              0 |
+------------+----------------------------+----------------+--------------------+--------------------------------+--------------------------------+
1 row in set (0.00 sec)

image-20230222161304920

注意:

date()函数仅能将有效的日期字符串转换成日期,如果日期不合法将会返回NULL。

在下面的例子中,data将正确的日期进行了转换,错误的日期返回了NULL。

mysql> select date('2023-02-22'),date('20230222'),date('2023-02-29'),date('20230229');
+--------------------+------------------+--------------------+------------------+
| date('2023-02-22') | date('20230222') | date('2023-02-29') | date('20230229') |
+--------------------+------------------+--------------------+------------------+
| 2023-02-22         | 2023-02-22       | NULL               | NULL             |
+--------------------+------------------+--------------------+------------------+
1 row in set, 2 warnings (0.00 sec)

避坑2:

不要以为用date()函数可以成功转换的日期都是正常的日期,有能够成功转换的也是错误日期。

比如,你见过日为00的日期吗?

在下面的案例中,'2023-03-00’是一个错误的日期,但是经过date()函数转换后并不是NULL,而确实是一个日期。但是这个日期,并不等于2023-03-01的前一天。

mysql> select date('2023-03-00'),date('2023-03-01'),date('2023-03-01') - interval 1 day, date('2023-03-00') = date('2023-03-01') - interval 1 day;
+--------------------+--------------------+-------------------------------------+----------------------------------------------------------+
| date('2023-03-00') | date('2023-03-01') | date('2023-03-01') - interval 1 day | date('2023-03-00') = date('2023-03-01') - interval 1 day |
+--------------------+--------------------+-------------------------------------+----------------------------------------------------------+
| 2023-03-00         | 2023-03-01         | 2023-02-28                          |                                                        0 |
+--------------------+--------------------+-------------------------------------+----------------------------------------------------------+
1 row in set (0.00 sec)

image-20230222162331025

这个日期的天是0,并且它不是2023-03-01的前一天,也不是2023-02-28的后一天。

mysql> select day(date('2023-03-00')),day(date('2023-03-01')),date('2023-03-01') - interval 1 day, date('2023-03-00') = date('2023-02-28') + interval 1 day;
+-------------------------+-------------------------+-------------------------------------+----------------------------------------------------------+
| day(date('2023-03-00')) | day(date('2023-03-01')) | date('2023-03-01') - interval 1 day | date('2023-03-00') = date('2023-02-28') + interval 1 day |
+-------------------------+-------------------------+-------------------------------------+----------------------------------------------------------+
|                       0 |                       1 | 2023-02-28                          |                                                        0 |
+-------------------------+-------------------------+-------------------------------------+----------------------------------------------------------+
1 row in set (0.00 sec)

image-20230222162640395

由于它不是一个正常的日期,所以它无法计算日期之间的差值。

mysql> select datediff(date('2023-02-28'),date('1970-01-01')),datediff(date('2023-03-00'),date('1970-01-01')),datediff(date('2023-03-01'),date('1970-01-01'));
+-------------------------------------------------+-------------------------------------------------+-------------------------------------------------+
| datediff(date('2023-02-28'),date('1970-01-01')) | datediff(date('2023-03-00'),date('1970-01-01')) | datediff(date('2023-03-01'),date('1970-01-01')) |
+-------------------------------------------------+-------------------------------------------------+-------------------------------------------------+
|                                           19416 |                                            NULL |                                           19417 |
+-------------------------------------------------+-------------------------------------------------+-------------------------------------------------+
1 row in set, 1 warning (0.00 sec)

image-20230222164004982

如何计算闰年

在TiDB数据库中,可以通过日期的计算函数来计算当年是否是闰年,当2月的最后一天是29则是闰年,28则不是闰年。

mysql> select last_day(date('2023-02-01')), case when day(last_day(date('2023-02-01'))) = 29 then '是闰年' else '不是闰年' end;
+------------------------------+-------------------------------------------------------------------------------------------+
| last_day(date('2023-02-01')) | case when day(last_day(date('2023-02-01'))) = 29 then '是闰年' else '不是闰年' end        |
+------------------------------+-------------------------------------------------------------------------------------------+
| 2023-02-28                   | 不是闰年                                                                                  |
+------------------------------+-------------------------------------------------------------------------------------------+
1 row in set (0.00 sec)

image-20230222164815522

mysql> select last_day(date('2024-02-01')), case when day(last_day(date('2024-02-01'))) = 29 then '是闰年' else '不是闰年' end;
+------------------------------+-------------------------------------------------------------------------------------------+
| last_day(date('2024-02-01')) | case when day(last_day(date('2024-02-01'))) = 29 then '是闰年' else '不是闰年' end        |
+------------------------------+-------------------------------------------------------------------------------------------+
| 2024-02-29                   | 是闰年                                                                                    |
+------------------------------+-------------------------------------------------------------------------------------------+
1 row in set (0.00 sec)

image-20230222165039166

MySQL数据库中的时区

MySQL数据库中的时区与TiDB数据库中的时区一致,这里就不重复演示了。

还是需要注意Timestamp数据类型的使用。

日期相关的函数

在MySQL中也有与TiDB相同的关于日期的函数,这里也就不重复演示了。

但是有一个不太一样的,就是date(),TiDB中会将date(‘2023-03-00’)成功转换成日期,虽然该日期非法,但不为NULL。而在MySQL中date(‘2023-03-00’)是非法的,返回NULL。

mysql> select date('2023-03-00'),date('2023-03-01'),date('2023-03-01') - interval 1 day, date('2023-03-00') = date('2023-03-01') - interval 1 day;
+--------------------+--------------------+-------------------------------------+----------------------------------------------------------+
| date('2023-03-00') | date('2023-03-01') | date('2023-03-01') - interval 1 day | date('2023-03-00') = date('2023-03-01') - interval 1 day |
+--------------------+--------------------+-------------------------------------+----------------------------------------------------------+
| NULL               | 2023-03-01         | 2023-02-28                          |                                                     NULL |
+--------------------+--------------------+-------------------------------------+----------------------------------------------------------+
1 row in set, 2 warnings (0.00 sec)

image-20230222165528962

MySQL数据库中的定时器

在TiDB数据库中不支持存储过程、自定义函数、触发器、定时器等。

在MySQL数据库中,可以创建定时器。

下面的语句创建一个定时器,每10秒钟往表中插入一条记录,5分钟后结束定时器功能。

mysql> create event insert_event-> on schedule every 10 second-> ends now() + interval 5 minute-> do insert into temp values(now(), now(), curtime());
Query OK, 0 rows affected (0.02 sec)

定时器创建完成后,每隔一段时间查看数据库表的数据,可以看到数据的增长。

image-20230222154922506

总结

好了,以上就是数据库中关于日期、时间的使用,在TiDB中有几个坑、MySQL中也有几个坑,你遇到过吗?使用的时候一定要注意。

最后我们实现了在数据库中判断闰年、定时器等功能。

相关文章:

带您了解TiDB MySQL数据库中关于日期、时间的坑

带您了解TiDB & MySQL数据库中关于日期、时间的坑时间的基础知识什么是时间计算时间的几种方法世界时(UT)协调世界时(UTC)国际原子时(TAI)时区的概念中国所在的时区操作系统的时区datetimedatectl数据库…...

【华为OD机试模拟题】用 C++ 实现 - 求字符串中所有整数的最小和

最近更新的博客 华为OD机试 - 入栈出栈(C++) | 附带编码思路 【2023】 华为OD机试 - 箱子之形摆放(C++) | 附带编码思路 【2023】 华为OD机试 - 简易内存池 2(C++) | 附带编码思路 【2023】 华为OD机试 - 第 N 个排列(C++) | 附带编码思路 【2023】 华为OD机试 - 考古…...

harbor 仓库迁移升级

harbor 仓库迁移升级 harbor仓库安装数据传输仓库切换版本 v1.8.0 v2.3.5 harbor仓库安装 环境准备:安装docker详见:docker 的介绍和部署,并下载docker-compose详见:docker 三剑客compose。 现有支持的安装harbor仓库的方式有两…...

评论功能设计思路~

文章目录 评论功能设计框架1、定义2、目标3、动机4、评论类别**5、评论互动****6、评论区展示结构****6.1 主题式****6.2 平铺式****6.3 盖楼式****7、评论排序机制****8、评论加载形式****9、其他**结语评论功能设计框架 1、定义 评论是指针对于事物进行主观或客观的自我印象…...

算法训练营 day52 动态规划 买卖股票的最佳时机系列1

算法训练营 day52 动态规划 买卖股票的最佳时机系列1 买卖股票的最佳时机 121. 买卖股票的最佳时机 - 力扣(LeetCode) 给定一个数组 prices ,它的第 i 个元素 prices[i] 表示一支给定股票第 i 天的价格。 你只能选择 某一天 买入这只股票…...

3.基于分割的文本检测算法--DBNet++

文章目录1.概况2.DBNet中的主要方法2.1 网络结构2.2 适应特征图融合模块(Adaptive Scale Fusion Module, ASF)3.ASF模块的源码实现参考资料欢迎访问个人网络日志🌹🌹知行空间🌹🌹 1.概况 2022年02月份论文:Real-Time S…...

IOS打包、SDK接入记录等

IOS打包、SDK接入记录等 Mac上安装HCLR路径 /Applications/Unity/Hub/Editor/2019.4.40f1c1/Unity.app/Contents/il2cpp HCLR 指定4.40是要Unity启动打开的il2cpp,否则HCLR Installer他会报找不到MonoBleedingEdge Mac删除证书 只能点击钥匙串做上角的登录后&…...

【C++】类与对象(引入)

目录 前言 类的引入 类的定义 封装与访问限定符 封装 访问限定符 类的实例化 类的大小 this指针 特性 前言 🎶我们都知道,C语言是面向过程的编程,而C是面向对象的编程,更多体现在编程的关注点上。 🎶就拿洗…...

Redis 高级数据类型

文章目录一、Bitmaps:属性状态统计二、HyperLogLog:基数统计三、GEO:地理位置信息计算提示:以下是本篇文章正文内容,Redis系列学习将会持续更新 一、Bitmaps:属性状态统计 Bitmaps类型: 统计一…...

Java8 新特性-函数式接口

什么是函数式接口 先来看看传统的创建线程是怎么写的 Thread t1 new Thread(new Runnable() {Overridepublic void run() {System.out.println("t1");} }); t1.start();再来看看使用了函数式接口是怎么写的 Thread t2 new Thread(() -> System.out.println(&…...

这套软件测试试卷能打90分,直接入职字节吧

目录 一.填空 二、 判断题(正确的√,错误的╳)共10分,每小题1分 三、数据库部分:(共15分) 四、设计题。本题共 1 小题,满分 20分 一.填空 1、 系…...

GUI可视化应用开发及Python实现

0 建议学时 4学时,在机房进行 1 开发环境安装及配置 1.1 编程环境 安装PyCharm-community-2019.3.3 安装PyQt5 pip install PyQt5-tools -i https://pypi.douban.com/simple pip3 install PyQt5designer -i https://pypi.douban.com/simple1.2 环境配置 选择“…...

【论文简述】GMFlow: Learning Optical Flow via Global Matching(CVPR 2022)

一、论文简述 1. 第一作者:Haofei Xu 2. 发表年份:2022 3. 发表期刊:CVPR oral 4. 关键词:光流、代价体、Transformers、全局匹配、注意力机制 5. 探索动机:过去几年中具有代表性的光流学习框架的核心估计方式没有…...

【Spark分布式内存计算框架——离线综合实战】5. 业务报表分析

第三章 业务报表分析 一般的系统需要使用报表来展示公司的运营情况、 数据情况等,本章节对数据进行一些常见报表的开发,广告数据业务报表数据流向图如下所示: 具体报表的需求如下: 相关报表开发说明如下: 第一、数据…...

力扣-删除重复的电子邮箱

大家好,我是空空star,本篇带大家了解一道简单的力扣sql练习题。 文章目录前言一、题目:196. 删除重复的电子邮箱二、解题1.正确示范①提交SQL运行结果2.正确示范②提交SQL运行结果3.正确示范③提交SQL运行结果4.正确示范④提交SQL运行结果5.其…...

git基础

git-note Github Manual | GitHub Cheat Sheet | Visual Git Cheat Sheet 安装配置工具分支创建仓库.gitignore文件同步更改进行更改重做提交术语表 安装 desktop.github.com | git-scm.com 配置工具 对所有本地仓库的用户信息进行配置 对你的commit操作设置关联的用户名…...

postgres 源码解析50 LWLock轻量锁--1

简介 postgres LWLock(轻量级锁)是由SpinLock实现,主要提供对共享存储器的数据结构的互斥访问。LWLock有两种锁模式,一种为排他模式,另一种是共享模式,如果想要读取共享内存中的内容,需要在读取…...

JVM优化常用命令

jps列出正在运行的虚拟机进程jpstop列出线程CPU或内存占用top top -Hp pid //列出pid全部线程jstat监视虚拟机运行状态信息jstat -gc pid 5000 //每隔5s打印gc情况jmapjmap -heap pid //输出jvm内存情况 jmap -histo:live pid | more //查看堆内存中的对象数量和大小 jma…...

按键中断实验

gpio.c#include"gpio.h"//给gpio使能和设置为输入模式void hal_gpio_init(){//使能GPIOF控制器RCC->MP_AHB4ENSETR|(0x1<<5);//通过GPIOF_将pf9/pf7/pf8设置为输入模式 GPIOF->MODER&(~(0x3<<18));GPIOF->MODER&(~(0x3<<14));GPI…...

kubernetes入门介绍,从0到1搭建并使用

Kubernetes是一个容器编排系统&#xff0c;用于自动化应用程序部署、扩展和管理。本指南将介绍Kubernetes的基础知识&#xff0c;包括基本概念、安装部署和基础用法。 基础介绍 Kubernetes是Google开发的开源项目&#xff0c;是一个容器编排系统&#xff0c;可以自动化部署、…...

【C语言进阶】字符串函数与内存函数的学习与模拟实现

​ ​&#x1f4dd;个人主页&#xff1a;Sherry的成长之路 &#x1f3e0;学习社区&#xff1a;Sherry的成长之路&#xff08;个人社区&#xff09; &#x1f4d6;专栏链接&#xff1a;C语言进阶 &#x1f3af;长路漫漫浩浩&#xff0c;万事皆有期待 文章目录1.字符串处理函数介…...

【JavaEE初阶】第一节.多线程(进阶篇 ) 常见的锁策略、CAS及它的ABA问题

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 文章目录 前言一、常见的锁策略 1.1 乐观锁 vs 悲观锁 1.2 普通的互斥锁 vs 读写锁 1.3 重量级锁 vs 轻量级锁 1.4 自旋锁 vs 挂起等待锁 1.5 公平…...

Linux基础命令-pstree树状显示进程信息

Linux基础命令-uname显示系统内核信息 Linux基础命令-lsof查看进程打开的文件 Linux基础命令-uptime查看系统负载 文章目录 前言 一 命令介绍 二 语法及参数 2.1 使用man查看命令语法 2.2 常用参数 三 参考实例 3.1 以树状图的形式显示所有进程 3.2 以树状图显示进程号…...

keepalived+LVS配置详解

keepalivedLVS配置详解keepalived简介keepalived的应用场景keepalived工作原理VRRP协议核心组件分层工作工作状态LVS简介LVS三种模式NAT模式(网络地址映射)IPTUN模式(IP隧道)DR模式(直接路由)三种模式对比keepalivedLVS配置1.master配置2. keepalived配置文件3 修改keepalived配…...

Unity之C#端使用protobuf

什么是protobuf protobuf全称Protocol Buffers&#xff0c;由Google推出的一种平台、语言无关的数据交互格式&#xff0c;目前使用最广泛的一种数据格式&#xff0c;尤其在网络传输过程中&#xff0c;有很强的安全性&#xff0c;而且数据量比json和xml要小很多。 最主要的是pr…...

C++设计模式(18)——模板方法模式

亦称&#xff1a; Template Method 意图 模板方法模式是一种行为设计模式&#xff0c; 它在超类中定义了一个算法的框架&#xff0c; 允许子类在不修改结构的情况下重写算法的特定步骤。 问题 假如你正在开发一款分析公司文档的数据挖掘程序。 用户需要向程序输入各种格式…...

SQLserver 索引碎片

Oracle 不需要整理碎片&#xff0c;原因&#xff1f; 1. rowid 默认的索引是&#xff22;&#xff0d;树索引。索引建立在表中的一个或多个列或者是表的表达式上&#xff0c;将列值和行编号一起存储。行编号是唯一标记表中行的伪列。 行编号是物理表中的行数据的内部地址&am…...

【Storm】【二】安装

1 准备 1.1 准备linux服务器 本文搭建的是3节点的集群&#xff0c;需要3台linux服务器&#xff0c;我这里使用的是centos7版本的linux虚拟机&#xff0c;虚拟机网络配置如下&#xff1a; 主节点&#xff1a; master 192.168.92.90 从节点&#xff1a; slave1 192.168.92.…...

Android ConditionVariable

Android ConditionVariable 线程操作经常用到wait和notify&#xff0c;用起来稍显繁琐&#xff0c;而Android给我们封装好了一个ConditionVariable类&#xff0c;用于线程同步。提供了三个方法block()、open()、close()。 void block() //阻塞当前线程&#xff0c;直到条件为…...

Action Segmentation数据集介绍——Breakfast

文章目录简介细节Cooking actibitiesillustration of the actions论文讲解Breakfast&#xff08;The Breakfast Action Dataset&#xff09;简介 早餐动作数据集包括与早餐准备相关的10个动作&#xff0c;由18个不同厨房的52个不同的人执行。该数据集是最大的完全带注释的数据…...