【分布式】Redis分布式缓存
一、什么是Redis分布式缓存
- Redis分布式缓存是指使用Redis作为缓存系统来存储和管理数据的分布式方案。在分布式系统中,多台服务器共同对外提供服务,为了提高系统的性能和可扩展性,通常会引入缓存来减轻数据库的压力。Redis作为一种高性能的内存数据库,具备快速读写和高并发处理能力,非常适合用作分布式缓存。
二、Redis分布式缓存的特点
特点 | 描述 |
---|---|
分布式架构 | 使用主从复制和集群模式实现数据的分布式存储和管理 |
内存存储 | 数据存储在内存中,提供快速读写和高并发处理能力 |
支持多种数据结构 | 提供字符串、哈希、列表、集合和有序集合等多种数据结构 |
缓存淘汰策略 | 支持多种缓存淘汰策略,如LRU、LFU和随机等 |
缓存穿透防止 | 使用布隆过滤器等技术,防止缓存穿透 |
高并发处理能力 | 使用单线程和非阻塞IO等机制,处理大量并发请求 |
高可用性 | 支持主从复制和集群模式,保证数据的高可用性和可扩展性 |
灵活的缓存策略 | 可根据业务需求选择合适的缓存策略 |
提升系统性能和可扩展性 | 减轻数据库负载压力,提升系统的性能和可扩展性 |
支持丰富的数据处理功能 | 提供丰富的数据结构和数据操作命令,支持灵活的数据处理需求 |
提供缓存监控和管理功能 | 提供监控和管理工具,方便管理和维护分布式缓存系统 |
安全稳定 | Redis具备持久化机制,支持数据备份和恢复,保证数据的安全稳定性 |
易于使用和部署 | Redis具有简单的配置和易于使用的接口,方便部署和集成到系统中 |
社区活跃 | Redis拥有庞大的开源社区,持续不断地发布新版本和解决问题 |
三、Redis分布式缓存的多种实现方式及区别
实现方式 | 描述 | 主要区别 |
---|---|---|
主从复制 | 通过配置主节点(Master)和从节点(Slave)实现数据复制 | - 主节点负责写入操作,从节点用于读取操作和备份 - 可以通过配置多个从节点实现负载均衡与高可用性 |
哨兵模式 | 使用哨兵节点(Sentinel)监控主节点状态并进行故障转移 | - 哨兵节点负责监控主节点的状态 - 当主节点失效时,自动选举从节点为新的主节点 - 支持高可用性 |
Redis Cluster | 使用多个Redis实例以集群的方式共同管理一个数据集 | - 数据被分割为多个哈希槽,存储在不同节点上 - 自动进行数据复制与故障转移 - 支持负载均衡与高可用性 |
四、主从复制模式
1. 什么是主从复制模式
- 主从复制模式是指在分布式系统中,通过设置一个主节点(Master)和多个从节点(Slave)来实现数据的复制和同步。主节点负责接收和处理所有的写操作,而从节点则负责复制主节点的数据,并用于读取操作和备份。
2. 主要实现步骤
-
配置主节点:
首先选择一个节点作为主节点,在主节点的配置文件中,开启主从复制功能,设置好监听端口和网络地址,并开启对外提供服务。 -
配置从节点:
选择服务器作为从节点,在从节点的配置文件中,设置好主节点的网络地址和端口,并开启对主节点的连接。 -
启动主节点:
在主节点上启动数据库服务,并确保数据库服务正常运行。 -
启动从节点:
在从节点上启动数据库服务,并确保数据库服务正常运行。 -
主节点授权:
在主节点上设置一个授权密码,并将密码配置到从节点中,以实现从节点对主节点的连接。 -
从节点连接主节点:
从节点会通过向主节点发送SYNC命令来建立与主节点的连接,并发送复制命令。 -
主节点接受从节点:
主节点接受从节点的连接请求,并验证从节点的身份。 -
数据同步:
主节点将自己的数据同步到从节点。初始同步可以通过全量复制,即将主节点的全部数据复制到从节点;增量同步则是主节点将新写入的数据实时传输给从节点。 -
数据更新和读取:
所有写入操作都要在主节点上进行,主节点会将更新的数据同步到所有从节点。读取操作可以在主节点或从节点上进行,从节点可以提供读取服务以减轻主节点的负载。 -
监控和故障切换:
监控主节点的状态和性能,当主节点发生故障时,可以通过手动或自动的方式将一个从节点提升为新的主节点,以保证服务的可用性和连续性。
3. 重要机制
重要机制 | 描述 |
---|---|
1. 全量复制 | 主节点接收到SYNC命令后,会开启一个后台线程,将自己的整个数据集发送给从节点。 |
2. 增量复制 | 主节点会将新的写命令发送给从节点,并通过每秒发送一个心跳包来保持与从节点的连接。从节点接收到新的写命令后,会对数据进行更新。 |
3. 心跳检测 | 主节点会通过发送心跳包来检测与从节点的连接是否正常。如果连接断开,主节点会尝试重新连接。 |
4. 断线重连 | 从节点如果与主节点的连接断开,会尝试重新连接。主节点会检测到从节点的重新连接,并继续发送增量复制的命令。 |
5. 故障转移 | 当主节点发生故障时,Redis集群会从从节点中选举一个新的主节点,然后将其他从节点切换到新的主节点上。 |
6. 同步延迟 | 由于网络原因或主节点负载过高,从节点可能会出现同步延迟的情况。这会导致从节点的数据不是实时更新。 |
五、Redis Cluster模式
1. 什么是Redis Cluster模式
-
Redis Cluster模式是Redis官方提供的一种分布式数据存储解决方案,用于支持在多个节点上分片和复制数据。它的设计目标是提供高可用性、可扩展性和数据一致性。
-
在Redis Cluster模式中,数据被分布在多个节点上,并且每个节点都负责处理一部分数据。为了实现数据的均匀分布和高可用性,Redis Cluster使用了一致性哈希算法,将数据映射到一个固定数量的槽位上。每个节点负责管理一些槽位和相应的数据。
-
除了数据的分片,Redis Cluster还提供了数据的复制功能,通过将数据复制到其他节点上来保证数据的冗余和故障恢复。每个节点可以有多个副本节点,其中一个节点是主节点,负责处理写操作,其他是从节点,负责复制主节点的数据。
-
Redis Cluster通过使用Gossip协议来实现节点之间的通信和故障检测。每个节点会周期性地与其他节点进行通信,交换关于自己和其他节点的信息,从而达到故障检测、故障转移和数据迁移的目的。
总体来说,Redis Cluster模式是一种可扩展、高可用的分布式数据存储方案,适用于需要处理大量数据和高并发的场景。
2. 主要实现步骤
-
配置文件:
为每个节点创建一个配置文件。配置文件中需要指定节点的IP地址、端口号、节点类型(主节点/从节点)等信息。 -
启动节点:
启动每个节点的Redis服务器,可以通过命令行启动或者使用配置文件来启动。启动时需要指定节点的配置文件。 -
创建集群:
选择一个节点作为初始节点,通过命令行工具redis-cli或者Redis提供的脚本redis-trib.rb来创建集群。使用命令行工具时,可以执行命令redis-cli --cluster create <node1> <node2> ... <nodeN> --cluster-replicas <replicas>
,其中<node1> <node2> ... <nodeN>
是所有节点的IP地址和端口号,<replicas>
是每个主节点对应的从节点数量。 -
添加节点:
在集群创建完成后,可以通过命令行工具或者脚本来添加新的节点到集群中。使用命令行工具时,可以执行命令redis-cli --cluster add-node <new_node> <existing_node>
,其中<new_node>
是要添加的节点IP地址和端口号,<existing_node>
是已存在的节点IP地址和端口号。 -
扩容:
如果需要扩容集群,可以在已经添加的节点上执行命令redis-cli --cluster reshard <node>
,其中<node>
是一个已存在的节点。该命令会引导你完成数据迁移和槽位重分配的操作。 -
故障转移:
如果某个节点发生故障或者下线,Redis Cluster会自动进行故障转移操作,选择一个从节点提升为主节点,保证数据的可用性。
需要注意的是,在Redis Cluster中,每个节点都需要运行一个Redis服务器实例,而且每个节点都需要使用相同的配置文件(或者至少具有相同的集群配置)。另外,Redis Cluster节点之间通过Gossip协议进行通信和故障检测,所以确保网络正常运行是很重要的。
3. 重要机制
重要机制 | 描述 |
---|---|
1. 集群槽分配 | 集群将整个数据集分成16384个槽,每个槽可以存储一个键值对。每个节点负责管理一部分槽的数据。 |
2. 节点互连 | 节点通过互相发送PING和PONG命令来建立互连关系。节点会维护一个集群状态,包含其他节点的信息。 |
3. 槽迁移 | 当节点加入或离开集群时,槽的分配会发生变化。集群会通过将槽从一个节点迁移到另一个节点来完成槽的重新分配。 |
4. 数据传播 | 当一个主节点接收到一个写命令时,它会将该命令发送给对应的从节点,并等待从节点确认。如果从节点没有确认,主节点会将命令发送给其他从节点。 |
5. 故障转移 | 当一个主节点不可用时,集群会通过选举过程将一个从节点升级为新的主节点。其他从节点会重新分配槽,并将数据从旧的主节点复制到新的主节点。 |
6. 客户端请求路由 | 客户端发送一个命令到任意一个节点,节点会根据命令的键值计算槽,并将请求路由到负责该槽的节点。 |
7. 节点状态监控 | 集群会定期检测节点的健康状态,包括节点是否可达、是否正常工作等。如果节点不可达或出现异常,集群会进行相应的处理。 |
Redis Cluster模式实现了数据的分布存储、故障转移和负载均衡的功能。集群中的每个节点都是平等的,可以接收客户端的读写请求,提高了系统的可用性和扩展性。
六、主从复制模式与Redis cluster的区别
主从复制 | 数据分片 | |
---|---|---|
部署方式 | 一主多从 | 多节点 |
写操作 | 主节点处理 | 分布在多节点 |
读操作 | 主节点和从节点都可处理 | 分布在多节点 |
可用性 | 主节点故障时,需要手动进行故障切换 | 单节点故障不影响整体可用性 |
扩展性 | 读操作可以扩展到多个从节点 | 数据分布在多个节点,可以横向扩展 |
数据一致性 | 主节点会将数据同步到从节点,有一定的延迟 | 数据分散在多个节点,可能会出现一致性问题 |
数据备份 | 从节点可用作数据备份 | 数据存储在多个节点,提供数据冗余 |
部署规模 | 适合小规模集群 | 适合大规模集群 |
场景适用 | 读写分离的场景,读多写少 | 数据规模大,需要横向扩展的场景 |
七、Redis分布式缓存的Java使用示例
import redis.clients.jedis.Jedis;
import redis.clients.jedis.JedisPool;
import redis.clients.jedis.JedisPoolConfig;public class RedisCache {private static final String REDIS_HOST = "localhost";private static final int REDIS_PORT = 6379;private static JedisPool jedisPool;static {JedisPoolConfig jedisPoolConfig = new JedisPoolConfig();jedisPoolConfig.setMaxTotal(100); // 设置最大连接数jedisPoolConfig.setMaxIdle(10); // 设置最大空闲连接数// 创建连接池jedisPool = new JedisPool(jedisPoolConfig, REDIS_HOST, REDIS_PORT);}public static void put(String key, String value) {try (Jedis jedis = jedisPool.getResource()) {jedis.set(key, value);}}public static String get(String key) {try (Jedis jedis = jedisPool.getResource()) {return jedis.get(key);}}public static void remove(String key) {try (Jedis jedis = jedisPool.getResource()) {jedis.del(key);}}
}
在上面的示例中,首先创建了一个JedisPool对象,用于连接Redis服务器。然后,在put方法中使用try-with-resources语句获取Jedis实例,并使用set方法将键值对存储到Redis中。在get方法中同样使用try-with-resources语句获取Jedis实例,并使用get方法从Redis中获取值。在remove方法中使用try-with-resources语句获取Jedis实例,并使用del方法删除键值对。
这只是一个简单的示例,可以根据自己的需求进行扩展和优化,例如添加缓存过期时间、添加对象序列化和反序列化等。
八、Redis分布式缓存的SpringBoot实现示例
- 首先,在pom.xml文件中添加Redis和Spring Boot的相关依赖:
<dependencies><!-- Redis依赖 --><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-data-redis</artifactId></dependency><!-- Spring Boot依赖 --><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId></dependency>
</dependencies>
- 在application.properties文件中配置Redis连接信息:
# Redis连接信息
spring.redis.host=localhost
spring.redis.port=6379
spring.redis.password=
- 创建一个缓存工具类RedisCacheUtil.java,用于操作Redis缓存:
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.stereotype.Component;import java.util.concurrent.TimeUnit;@Component
public class RedisCacheUtil {@Autowiredprivate RedisTemplate<String, Object> redisTemplate;// 存储缓存数据public void setCacheObject(String key, Object value, long timeout, TimeUnit timeUnit) {redisTemplate.opsForValue().set(key, value, timeout, timeUnit);}// 获取缓存数据public Object getCacheObject(String key) {return redisTemplate.opsForValue().get(key);}// 删除缓存数据public boolean deleteCacheObject(String key) {return redisTemplate.delete(key);}
}
- 创建一个Controller类,用于测试缓存的读写操作:
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;import java.util.concurrent.TimeUnit;@RestController
@RequestMapping("/cache")
public class CacheController {@Autowiredprivate RedisCacheUtil redisCacheUtil;@GetMapping("/get/{key}")public Object getCache(@PathVariable String key) {// 从缓存中获取数据Object value = redisCacheUtil.getCacheObject(key);if (value != null) {return value;}// 如果缓存中不存在,则从数据库中获取数据,并存入缓存value = fetchDataFromDatabase(key);redisCacheUtil.setCacheObject(key, value, 5, TimeUnit.MINUTES);return value;}@GetMapping("/delete/{key}")public boolean deleteCache(@PathVariable String key) {// 删除缓存数据return redisCacheUtil.deleteCacheObject(key);}// 模拟从数据库中获取数据的方法private Object fetchDataFromDatabase(String key) {// ...return "Data from database for key: " + key;}
}
通过访问/cache/get/{key}
可以从缓存中获取数据,如果缓存中不存在,则从数据库中获取数据并存入缓存;通过访问/cache/delete/{key}
可以删除缓存数据。
相关文章:
【分布式】Redis分布式缓存
一、什么是Redis分布式缓存 Redis分布式缓存是指使用Redis作为缓存系统来存储和管理数据的分布式方案。在分布式系统中,多台服务器共同对外提供服务,为了提高系统的性能和可扩展性,通常会引入缓存来减轻数据库的压力。Redis作为一种高性能的…...
Ubuntu——extrepo添加部分外部软件源
extrepo 是一个用于 Ubuntu 和其他基于 Debian 的系统的工具,它的主要作用是简化和管理外部软件源(repositories)的添加和更新。通过使用 extrepo,用户可以方便地添加、删除和管理第三方软件源,而不需要手动编辑源列表…...

评估大语言模型(LLM)在分子预测任务能够理解分子几何形状性能
摘要 论文地址:https://arxiv.org/pdf/2403.05075 近年来,机器学习模型在各个领域越来越受欢迎。学术界和工业界都投入了大量精力来提高机器学习的效率,以期实现人工通用智能(AGI)。其中,大规模语言模型&a…...
如何查看电脑刷新率
Windows 系统 通过显示设置查看: 右键点击桌面空白处,选择 “显示设置”。在打开的窗口中,找到 “高级显示设置”。点击 “显示适配器属性”。在弹出的窗口中,选择 “监视器” 选项卡,即可看到当前的屏幕刷新率。使用 …...
mysql集群MHA方式部署
1. 基本信息 部署机器角色部署路径192.168.242.71MySQL-Mater MHA-NodeMySQL: /alidata1/mysql-8.0.28192.168.242.72MySQL-Slave MHA-NodeMHA-Node: /alidata1/admin/tools/mha4mysql-node-0.58192.168.242.73MySQL-Slave MHA-Node192.168.242.74MHA-ManagerMHA-Manager: …...

第十七章 使用 MariaDB 数据库管理系统
1. 数据库管理系统 数据库是指按照某些特定结构来存储数据资料的数据仓库。在当今这个大数据技术迅速崛起的年代,互联网上每天都会生成海量的数据信息,数据库技术也从最初只能存储简单的表格数据的单一集中存储模式,发展到了现如今存储海量…...

rabbitmq 安装延时队列插件rabbitmq_delayer_message_exchange(linux centOS 7)
1.插件版本 插件地址:Community Plugins | RabbitMQ rabbitmq插件需要对应的版本,根据插件地址找到插件 rabbitmq_delayer_message_exchange 点击Releases 因为我rabbitmq客户端显示的版本是: 所以我选择插件版本是: 下载 .ez文…...

Unity性能优化---动态网格组合(一)
网格组合是将 Unity 中的多个对象组合为一个对象的技术。因此,在多物体的场景中,使用网格组合,会有效的减少小网格的数量,最终将得到一个包含许多小网格的大网格游戏对象,这将提高游戏或模拟器的性能。在Unity 的 “St…...

Appium:安装uiautomator2失败
目录 1、通过nmp安装uiautomator2:失败 2、通过 Appium 的平台直接安装驱动程序 3、通过pip 来安装 uiautomator2 1、通过nmp安装uiautomator2:失败 我先是通过npm安装的uiautomator2,也显示已经安装成功了: npm install -g …...

电子信息工程自动化 单片机彩灯控制
摘要 随着社会经济和科学技术的不断进步,人们在保持发展的同时,环境带给人类的影响已经不足以让我们忽视,所以城市的美化问题慢慢的进入了人们的眼帘,PLC的产生给带电子产品带来了巨大变革,彩灯的使用在城市的美化中变…...

word poi-tl 表格功能增强,实现表格功能垂直合并
目录 问题解决问题poi-tl介绍 功能实现引入依赖模版代码效果图 附加(插件实现)MergeColumnData 对象MergeGroupData 类ServerMergeTableData 数据信息ServerMergeTablePolicy 合并插件 问题 由于在开发功能需求中,word文档需要垂直合并表格&…...

LSTM-CNN-BP-RF-SVM五模型咖喱融合策略混合预测模型
目录 效果一览基本介绍程序设计参考资料 效果一览 基本介绍 LSTM-CNN-BP-RF-SVM五模型咖喱融合策略混合预测模型 Matlab代码注释清晰。 程序设计 完整程序和数据获取方式:私信博主回复LSTM-CNN-BP-RF-SVM五模型咖喱融合策略混合预测模型(Matlab&#…...
《鸿蒙开发-答案之书》 怎么设置Json字段的别名
《鸿蒙开发-答案之书》 怎么设置Json字段的别名 Android设置别名用的是SerializedName(“msg”),那鸿蒙用的是啥,有点懵不知道。 鸿蒙得引入第三方库:ohpm install class-transformer 然后用Expose({ name: ‘first-name’ }) 示例代码&…...
ftp服务器搭建-安装、配置及验证
ftp服务器搭建-安装、配置及验证 #安装 sudo apt-get install vsftpd #配置文件 cat > /etc/vsftpd.conf << "EOF" listenNO listen_ipv6YES anonymous_enableNO local_enableYES write_enableYES dirmessage_enableYES use_localtimeYES xferlog_enable…...
鸿蒙应用获取wifi连接的ip地址(官方文档获取的格式转换成192.168.1.xxx格式)
目录 一.背景 二.官网流程 wifiManager.getLinkedInfo9+ 三.转换成192.168.xxx.xxx格式 一.背景 本次来学习如何获取到鸿蒙设备连接wifi后的ip地址,由于官网文档中获取的ip地址和我们平时看到的192:168:xxx:xxx有所不同,需要进行下转换,所以记录下,如下的流程是在OpenH…...

c++数据结构算法复习基础--11--高级排序算法-快速排序-归并排序-堆排序
高阶排序 1、快速排序 冒泡排序的升级算法 每次选择一个基准数,把小于基准数的放到基准数的左边,把大于基准数的放到基准数的右边,采用 “ 分治算法 ”处理剩余元素,直到整个序列变为有序序列。 最好和平均的复杂度:…...
人工智能学习路线详细规划
一、引言 在当今科技飞速发展的时代,人工智能已成为引领未来的关键技术之一。无论是为了追求职业发展的新机遇,还是出于对这一前沿领域的浓厚兴趣,深入学习人工智能都是一个极具价值的选择。本文将为大家精心规划一条人工智能学习路线&#…...

深度学习之视觉处理
CNN 视觉处理三大任务:分类、目标检测、图像分割上游:提取特征,CNN下游:分类、目标、分割等,具体的任务 概述 卷积神经网络是深度学习在计算机视觉领域的突破性成果。在计算机视觉领域, 往往我们输入的图像都很大&am…...

遇到问题:hive中的数据库和sparksql 操作的数据库不是同一个。
遇到的问题: 1、hive中的数据库和sparksql 操作的数据库不同步。 观察上面的数据库看是否同步 !!! 2、查询服务器中MySQL中hive的数据库,发现创建的位置没有在hdfs上,而是在本地。 这个错误产生的原因是&…...
Spring Boot与Spring Security集成:前后分离认证流程的优化实践
在当前的Web开发领域,前后分离架构已经成为一种流行趋势。这种架构将前端和后端进行解耦,前端负责用户界面和交互逻辑,后端则负责数据处理和业务逻辑。在前后分离的项目中,如何安全、高效地实现用户认证是一个关键问题。本文将深入…...
[特殊字符] 智能合约中的数据是如何在区块链中保持一致的?
🧠 智能合约中的数据是如何在区块链中保持一致的? 为什么所有区块链节点都能得出相同结果?合约调用这么复杂,状态真能保持一致吗?本篇带你从底层视角理解“状态一致性”的真相。 一、智能合约的数据存储在哪里…...

Debian系统简介
目录 Debian系统介绍 Debian版本介绍 Debian软件源介绍 软件包管理工具dpkg dpkg核心指令详解 安装软件包 卸载软件包 查询软件包状态 验证软件包完整性 手动处理依赖关系 dpkg vs apt Debian系统介绍 Debian 和 Ubuntu 都是基于 Debian内核 的 Linux 发行版ÿ…...

【CSS position 属性】static、relative、fixed、absolute 、sticky详细介绍,多层嵌套定位示例
文章目录 ★ position 的五种类型及基本用法 ★ 一、position 属性概述 二、position 的五种类型详解(初学者版) 1. static(默认值) 2. relative(相对定位) 3. absolute(绝对定位) 4. fixed(固定定位) 5. sticky(粘性定位) 三、定位元素的层级关系(z-i…...

el-switch文字内置
el-switch文字内置 效果 vue <div style"color:#ffffff;font-size:14px;float:left;margin-bottom:5px;margin-right:5px;">自动加载</div> <el-switch v-model"value" active-color"#3E99FB" inactive-color"#DCDFE6"…...
Nginx server_name 配置说明
Nginx 是一个高性能的反向代理和负载均衡服务器,其核心配置之一是 server 块中的 server_name 指令。server_name 决定了 Nginx 如何根据客户端请求的 Host 头匹配对应的虚拟主机(Virtual Host)。 1. 简介 Nginx 使用 server_name 指令来确定…...
【Web 进阶篇】优雅的接口设计:统一响应、全局异常处理与参数校验
系列回顾: 在上一篇中,我们成功地为应用集成了数据库,并使用 Spring Data JPA 实现了基本的 CRUD API。我们的应用现在能“记忆”数据了!但是,如果你仔细审视那些 API,会发现它们还很“粗糙”:有…...
实现弹窗随键盘上移居中
实现弹窗随键盘上移的核心思路 在Android中,可以通过监听键盘的显示和隐藏事件,动态调整弹窗的位置。关键点在于获取键盘高度,并计算剩余屏幕空间以重新定位弹窗。 // 在Activity或Fragment中设置键盘监听 val rootView findViewById<V…...

零基础在实践中学习网络安全-皮卡丘靶场(第九期-Unsafe Fileupload模块)(yakit方式)
本期内容并不是很难,相信大家会学的很愉快,当然对于有后端基础的朋友来说,本期内容更加容易了解,当然没有基础的也别担心,本期内容会详细解释有关内容 本期用到的软件:yakit(因为经过之前好多期…...
Hive 存储格式深度解析:从 TextFile 到 ORC,如何选对数据存储方案?
在大数据处理领域,Hive 作为 Hadoop 生态中重要的数据仓库工具,其存储格式的选择直接影响数据存储成本、查询效率和计算资源消耗。面对 TextFile、SequenceFile、Parquet、RCFile、ORC 等多种存储格式,很多开发者常常陷入选择困境。本文将从底…...

Python Ovito统计金刚石结构数量
大家好,我是小马老师。 本文介绍python ovito方法统计金刚石结构的方法。 Ovito Identify diamond structure命令可以识别和统计金刚石结构,但是无法直接输出结构的变化情况。 本文使用python调用ovito包的方法,可以持续统计各步的金刚石结构,具体代码如下: from ovito…...