Docker安装Cassandra数据库,在SpringBoot中连接Cassandra
简介
Apache Cassandra是一个高度可扩展的高性能分布式数据库,旨在处理许多商用服务器上的大量数据,提供高可用性而没有单点故障。它是NoSQL数据库的一种。首先让我们了解一下NoSQL数据库的作用。
NoSQL 数据库
NoSQL数据库(有时称为“Not Only SQL”)是一种数据库,它提供了一种存储和检索关系数据库中使用的表格关系以外的数据的机制。这些数据库是无模式的,支持简单的复制,具有简单的API,最终是一致的,并且可以处理大量数据。
什么是Apache Cassandra?
Apache Cassandra是一个开源,分布式和分散/分布式存储系统(数据库),用于管理分布在世界各地的大量结构化数据。它提供高可用性服务,没有单点故障。
以下列出了Apache Cassandra的一些值得注意的地方-
- 它具有可伸缩性,容错性和一致性。
- 它是一个面向列的数据库。
- 其分发设计基于亚马逊的Dynamo及其在Google的Bigtable上的数据模型。
- 它创建于Facebook,与关系数据库管理系统截然不同。
- Cassandra实现了Dynamo风格的复制模型,没有单点故障,但是添加了更强大的“column family”数据模型。
- 一些大型公司(例如Facebook,Twitter,Cisco,Rackspace,ebay,Twitter,Netflix等)正在使用Cassandra。
特性:
弹性可扩展性 - Cassandra是高度可扩展的; 它允许添加更多的硬件以适应更多的客户和更多的数据根据要求。
始终基于架构 - Cassandra没有单点故障,它可以连续用于不能承担故障的关键业务应用程序。
快速线性性能 - Cassandra是线性可扩展性的,即它为你增加集群中的节点数量增加你的吞吐量。因此,保持一个快速的响应时间。
灵活的数据存储 - Cassandra适应所有可能的数据格式,包括:结构化,半结构化和非结构化。它可以根据您的需要动态地适应变化的数据结构。
便捷的数据分发 - 可以在多个数据中心之间复制数据,可以灵活地在需要时分发数据。
事务支持 - Cassandra支持属性,如原子性,一致性,隔离和持久性(ACID)。
快速写入 - Cassandra被设计为在廉价的商品硬件上运行。 它执行快速写入,并可以存储数百TB的数据,而不牺牲读取效率。
Cassandra特点
Cassandra由于其出色的技术特性而变得如此受欢迎。以下是Cassandra的一些功能:
- 弹性可扩展性– Cassandra具有高度可扩展性;它允许添加更多硬件,以根据需求容纳更多客户和更多数据。
- 始终在线-Cassandra没有单点故障,并且可以连续用于无法承受故障的关键业务应用程序。
- 快速的线性规模性能-Cassandra具有线性可扩展性,即,随着集群中节点数量的增加,它可以提高吞吐量。因此,它保持了快速的响应时间。
- 灵活的数据存储-Cassandra可容纳所有可能的数据格式,包括:结构化,半结构化和非结构化。它可以根据需要动态适应对数据结构的更改。
- 轻松进行数据分发-Cassandra通过在多个数据中心之间复制数据,提供了在所需位置分发数据的灵活性。
- 事务支持-Cassandra支持原子性,一致性,隔离性和持久性(ACID)等属性。
- 快速写入-Cassandra旨在在廉价的商品硬件上运行。它执行快速的写入,并且可以存储数百TB的数据,而不会牺牲读取效率。
架构
Cassandra的设计目标是在多个节点上处理大数据工作负载而不会出现任何单点故障。 Cassandra在其节点之间具有对等分布式系统,并且数据分布在集群中的所有节点之间。
- 集群中的所有节点都扮演相同的角色。每个节点都是独立的,并同时互连到其他节点。
- 集群中的每个节点都可以接受读写请求,而不管数据实际位于集群中的何处。
- 当某个节点发生故障时,可以从网络中的其他节点处理读/写请求。
Cassandra中的数据复制
在Cassandra中,集群中的一个或多个节点充当给定数据段的副本。如果检测到某些节点响应的值过时,则Cassandra会将最新值返回给客户端。返回最新值后,Cassandra在后台执行读取修复以更新过时的值。
下图显示了Cassandra如何在集群中的节点之间使用数据复制以确保没有单点故障的示意图。
Cassandra使用Gossip协议,以允许节点彼此通信并检测集群中的任何故障节点。
入门安装:使用docker-compose 安装
docker-compose.yaml
version: "3.8"
services:cassandra:image: cassandra:4.1container_name: cassandraports:- 9042:9042volumes:- $PWD/commitlog:/var/lib/cassandra/commitlog- $PWD/hints:/var/lib/cassandra/hints- $PWD/data:/var/lib/cassandra/data- $PWD/saved_caches:/var/lib/cassandra/saved_caches- $PWD/logs:/var/log/cassandra
启动容器
使用如下指令启动容器:
docker-compose up -d
注意:如果如果没有在docker-compose.yaml文件所在目录或者文件名不是docker-compose.yaml,需要通过-f指定文件所在位置。即如:
docker-compose -f cassandra-start-up.yaml up -d
启动好之后,可以进入到容器之中:
➜ cassandra docker-compose up -d
Creating network "cassandra_default" with the default driver
Pulling cassandra (cassandra:4.1)...
4.1: Pulling from library/cassandra
eaead16dc43b: Pull complete
46e1869246ce: Pull complete
bbd45db92608: Pull complete
6fcfd0f47989: Pull complete
996685dfbe33: Pull complete
4927828dcc1b: Pull complete
7f67cde8352d: Pull complete
09bb07e15655: Pull complete
b8d7c6610af3: Pull complete
Status: Downloaded newer image for cassandra:4.1
Creating cassandra ... done
➜ cassandra docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
cdf4f5b56a88 cassandra:4.1 "docker-entrypoint.s…" 10 minutes ago Up 10 minutes 7000-7001/tcp, 7199/tcp, 9160/tcp, 0.0.0.0:9042->9042/tcp cassandra
➜ cassandra docker exec -it cdf4f5b56a88 bash
root@cdf4f5b56a88:/# cqlsh
Connected to Test Cluster at 127.0.0.1:9042
[cqlsh 6.1.0 | Cassandra 4.1-beta1 | CQL spec 3.4.6 | Native protocol v5]
Use HELP for help.
cqlsh> desc keyspaces;system system_distributed system_traces system_virtual_schema
system_auth system_schema system_views
可以看到,我们已经通过cqlsh命令,登录到了当前的Cassandra数据库。
但是这里会有疑惑产生:
登录数据库的指令太过简单了吧?!如果需要登录指定主机地址的数据库,应该怎么设置主机地址?
登录数据库的指令不需要用户名和密码嘛?
需要的话,我的用户名和密码是什么?就目前而言,我并没有做任何设置。
如何设置用户名和密码?
cqlsh的基本命令
选项 使用/作用
help 此命令用于显示有关CQLsh命令选项的帮助主题。
version 它用于查看您正在使用的CQLsh的版本。
color 它用于彩色输出。
debug 它显示其他调试信息。
execute 它用于引导shell接受并执行CQL命令。
show 显示当前会话详情
这里的options包括哪些呢? 官网写的很详细,我就不抄了,看这里 cqlsh: the CQL shell
我就挑几个最关心的看一下:
-u USERNAME --username=USERNAME
Authenticate as user.
-p PASSWORD --password=PASSWORD
Authenticate using password.
-k KEYSPACE --keyspace=KEYSPACE
Authenticate to the given keyspace.
这三个是用来指定用户名和密码以及keySpace的。
–credentials=CREDENTIALS
Specify an alternative credentials file location.
这个是用来指定credentials的。
为什么没有输入用户名和密码就直接登录了?
这里是由于没有做任何个性化配置,我们使用的相关配置是默认配置文件cassandra.yaml文件里的配置,这个配置文件在容器里的/opt/cassandra/conf目录下。这里的配置内容是
#AllowAllAuthenticator performs no checks - set it to disable authentication.
authenticator: AllowAllAuthenticator
当这里配置为AllowAllAuthenticator的时候,将不做任何的检查。是设置为关闭认证。
要想启用用户名密码登录,就需要将其设置为PasswordAuthenticator:
authenticator: PasswordAuthenticator
不过这个时候会发现,容器中没有vim,也没有vi,那就只能把容器里的文件copy出来,修改完再copy回去了。
docker cp cdf4f5b56a88:/opt/cassandra/conf/cassandra.yaml .
我这是把文件从容器中copy当当前位置,修改完之后再copy回去,source和destination位置互换,即:
docker cp cassandra.yaml cdf4f5b56a88:/opt/cassandra/conf/
替换完成之后,再重新启动容器:
docker restart cdf4f5b56a88
重启完之后再进入容器,再使用cqlsh指令登录,发得到如下错误:
➜ cassandra docker exec -it cdf4f5b56a88 bash
root@cdf4f5b56a88:/# cqlsh
Connection error: ('Unable to connect to any servers', {'127.0.0.1:9042': ConnectionRefusedError(111, "Tried connecting to [('127.0.0.1', 9042)]. Last error: Connection refused")})
root@cdf4f5b56a88:/#
看上面的提示,似乎也看不出来什么错误,只是connection refused。那就想着用用户名和密码尝试一下吧?由于我们没有设置用户名和密码,这个时候就只能使用系统默认设置的用户名和密码都是cassandra的账户进行登录。
root@cdf4f5b56a88:/# cqlsh -u cassandra -p cassandraWarning: Using a password on the command line interface can be insecure.
Recommendation: use the credentials file to securely provide the password.Connected to Test Cluster at 127.0.0.1:9042
[cqlsh 6.1.0 | Cassandra 4.1-beta1 | CQL spec 3.4.6 | Native protocol v5]
Use HELP for help.
cassandra@cqlsh>
创建新用户
cassnadra划分了三种角色类型:
xxopr: 应用账号,只能进行对表的查询、数据插入、数据删除等DML操作
xxdata: 相当于数据OWNER用户,对表空间内的对象拥有增删改查等DDL操作
cassandra: 超级用户,用于创建表空间的,DBA权限管理
这里先创建一个superuser:
create user root_cassandra with password '123456' superuser;
然后使用这个用户进行登录:
root@cdf4f5b56a88:/# cqlsh -u root_cassandra -p 123456Warning: Using a password on the command line interface can be insecure.
Recommendation: use the credentials file to securely provide the password.Connected to Test Cluster at 127.0.0.1:9042
[cqlsh 6.1.0 | Cassandra 4.1-beta1 | CQL spec 3.4.6 | Native protocol v5]
Use HELP for help.
root_cassandra@cqlsh> list users;name | super | datacenters
----------------+-------+-------------cassandra | True | ALLroot_cassandra | True | ALL(2 rows)
root_cassandra@cqlsh>
可以看到,这里已经有两个超级用户了,不想保留cassandra这个用户的可以直接drop掉。
drop user cassandra
简单操作
既然已经到这里了,那就创建一个用户,试试简单操作先:
root_cassandra@cqlsh> create user test_data with password '123456' nosuperuser;
root_cassandra@cqlsh> exit;
root@cdf4f5b56a88:/# cqlsh -u test_data -p 123456Warning: Using a password on the command line interface can be insecure.
Recommendation: use the credentials file to securely provide the password.Connected to Test Cluster at 127.0.0.1:9042
[cqlsh 6.1.0 | Cassandra 4.1-beta1 | CQL spec 3.4.6 | Native protocol v5]
Use HELP for help.
test_data@cqlsh> CREATE KEYSPACE IF NOT EXISTS store WITH REPLICATION = { 'class' : 'SimpleStrategy', 'replication_factor' : '1' };
test_data@cqlsh> desc keyspaces;store system_auth system_schema system_views
system system_distributed system_traces system_virtual_schematest_data@cqlsh> desc keyspace storeCREATE KEYSPACE store WITH replication = {'class': 'SimpleStrategy', 'replication_factor': '1'} AND durable_writes = true;
test_data@cqlsh> CREATE TABLE IF NOT EXISTS store.shopping_cart (... userid text PRIMARY KEY,... item_count int,... last_update_timestamp timestamp... );
test_data@cqlsh> INSERT INTO store.shopping_cart... (userid, item_count, last_update_timestamp)... VALUES ('9876', 2, toTimeStamp(now()));
test_data@cqlsh> INSERT INTO store.shopping_cart... (userid, item_count, last_update_timestamp)... VALUES ('1234', 5, toTimeStamp(now()));
可以看到已经创建了一个keyspace为store的库,创建了一个表shopping_cart,并插入了一些数据。查看一下表结构以及数据:
test_data@cqlsh:store> select * from store.shopping_cart;userid | item_count | last_update_timestamp
--------+------------+---------------------------------1234 | 5 | 2022-11-05 08:39:47.077000+00009876 | 2 | 2022-11-05 08:39:46.226000+0000(2 rows)
test_data@cqlsh:store> desc table shopping_cart;CREATE TABLE store.shopping_cart (userid text PRIMARY KEY,item_count int,last_update_timestamp timestamp
) WITH additional_write_policy = '99p'AND bloom_filter_fp_chance = 0.01AND caching = {'keys': 'ALL', 'rows_per_partition': 'NONE'}AND cdc = falseAND comment = ''AND compaction = {'class': 'org.apache.cassandra.db.compaction.SizeTieredCompactionStrategy', 'max_threshold': '32', 'min_threshold': '4'}AND compression = {'chunk_length_in_kb': '16', 'class': 'org.apache.cassandra.io.compress.LZ4Compressor'}AND memtable = 'default'AND crc_check_chance = 1.0AND default_time_to_live = 0AND extensions = {}AND gc_grace_seconds = 864000AND max_index_interval = 2048AND memtable_flush_period_in_ms = 0AND min_index_interval = 128AND read_repair = 'BLOCKING'AND speculative_retry = '99p';
test_data@cqlsh:store>
到此完成了Cassandra的启动。
在SpringBoot中连接Cassandra
1.添加依赖:
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd"><modelVersion>4.0.0</modelVersion><parent><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-parent</artifactId><version>2.5.14</version><relativePath/></parent><groupId>com.example</groupId><artifactId>demo</artifactId><version>0.0.1-SNAPSHOT</version><name>demo</name><description>Demo project for Spring Boot</description><properties><java.version>1.8</java.version></properties><dependencies><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-data-cassandra</artifactId></dependency><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId></dependency><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-test</artifactId><scope>test</scope></dependency></dependencies><build><plugins><plugin><groupId>org.springframework.boot</groupId><artifactId>spring-boot-maven-plugin</artifactId></plugin></plugins></build></project>
2.添加配置:
spring:data:cassandra:contact-points: localhostport: 9042keyspace-name: storeusername: root_cassandrapassword: 123456
3.添加配置类
package com.example.demo;import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.stereotype.Component;@Component
@ConfigurationProperties(prefix = "spring.data.cassandra",ignoreInvalidFields = true)
public class CassandraConfigurationProperties {private String contactPoints;private int port = 9042;private String username;private String password;private String keyspaceName;public String getContactPoints() {return contactPoints;}public void setContactPoints(String contactPoints) {this.contactPoints = contactPoints;}public int getPort() {return port;}public void setPort(int port) {this.port = port;}public String getUsername() {return username;}public void setUsername(String username) {this.username = username;}public String getPassword() {return password;}public void setPassword(String password) {this.password = password;}public String getKeyspaceName() {return keyspaceName;}public void setKeyspaceName(String keyspaceName) {this.keyspaceName = keyspaceName;}
}
package com.example.demo;import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.context.properties.EnableConfigurationProperties;
import org.springframework.context.annotation.Configuration;
import org.springframework.data.cassandra.config.AbstractCassandraConfiguration;
import org.springframework.data.cassandra.config.CqlSessionFactoryBean;@Configuration
@EnableConfigurationProperties(CassandraConfigurationProperties.class)
public class CassandraConfiguration extends AbstractCassandraConfiguration {@Autowiredprivate CassandraConfigurationProperties cassandraConfigurationProperties;@Overrideprotected String getKeyspaceName() {return cassandraConfigurationProperties.getKeyspaceName();}@Overrideprotected String getContactPoints() {return cassandraConfigurationProperties.getContactPoints();}@Overrideprotected int getPort() {return cassandraConfigurationProperties.getPort();}@Overridepublic CqlSessionFactoryBean cassandraSession() {CqlSessionFactoryBean cqlSessionFactoryBean = super.cassandraSession();cqlSessionFactoryBean.setPassword(cassandraConfigurationProperties.getPassword());cqlSessionFactoryBean.setUsername(cassandraConfigurationProperties.getUsername());return cqlSessionFactoryBean;}}
设置对应的实体类:
package com.example.demo;import org.springframework.data.cassandra.core.cql.PrimaryKeyType;
import org.springframework.data.cassandra.core.mapping.Column;
import org.springframework.data.cassandra.core.mapping.PrimaryKeyColumn;
import org.springframework.data.cassandra.core.mapping.Table;import java.util.Date;@Table("shopping_cart")
public class ShoppingCart {@PrimaryKeyColumn(type = PrimaryKeyType.PARTITIONED)private String userid;@Columnprivate int item_count;@Columnprivate Date last_update_timestamp;public String getUserid() {return userid;}public void setUserid(String userid) {this.userid = userid;}public int getItem_count() {return item_count;}public void setItem_count(int item_count) {this.item_count = item_count;}public Date getLast_update_timestamp() {return last_update_timestamp;}public void setLast_update_timestamp(Date last_update_timestamp) {this.last_update_timestamp = last_update_timestamp;}@Overridepublic String toString() {return "ShoppingCart{" +"userid='" + userid + '\'' +", item_count=" + item_count +", last_update_timestamp=" + last_update_timestamp +'}';}
}
设置接口类:
package com.example.demo;import org.springframework.data.cassandra.repository.CassandraRepository;public interface ShoppingCartRepo extends CassandraRepository<ShoppingCart, String> {
}
设置SpringBoot启动类:
package com.example.demo;import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;@SpringBootApplication
public class DemoApplication {public static void main(String[] args) {SpringApplication.run(DemoApplication.class, args);}}
编写测试代码:
package com.example.demo;import org.junit.jupiter.api.Test;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.data.cassandra.core.CassandraTemplate;import java.util.List;@SpringBootTest
class DemoApplicationTests {@Autowiredprivate CassandraTemplate cassandraTemplate;@Testvoid query() {ShoppingCart cart = cassandraTemplate.selectOne("select * from store.shopping_cart", ShoppingCart.class);System.out.println(cart);}@Autowiredprivate ShoppingCartRepo shoppingCartRepo;@Testvoid query2(){List<ShoppingCart> all = shoppingCartRepo.findAll();System.out.println(all);}}
相关文章:
Docker安装Cassandra数据库,在SpringBoot中连接Cassandra
简介 Apache Cassandra是一个高度可扩展的高性能分布式数据库,旨在处理许多商用服务器上的大量数据,提供高可用性而没有单点故障。它是NoSQL数据库的一种。首先让我们了解一下NoSQL数据库的作用。 NoSQL 数据库 NoSQL数据库(有时称为“Not …...
Linux常用命令总结(建议收藏)
Linux常用命令总结(建议收藏) 这里收集了一些常用命令以便需要时查看,欢迎作补充。(这里的提到操作都默认以CentOS系统为基础) 文件管理 目录操作 切换目录 cd 查看目录 ls -l 列出文件详细信息 或者直接ll-a 列出当前目录下所有文件及…...
【Java】P1 基础知识与碎碎念
Java 基础知识 碎碎念安装 Intellij IDEAJDK 与 JREJava 运行过程Java 系统配置Java 运行过程Java的三大分类前言 本节内容主要围绕Java基础内容,从Java的安装到helloworld,什么是JDK与什么是JRE,系统环境配置,不深入Java代码知识…...
Jackson CVE-2017-7525 反序列化漏洞
0x00 前言 Jackson 相对应fastjson来说利用方面要求更加苛刻,默认情况下无法进行利用。 同样本次的调用链也可以参考fastjson内容:Java代码审计——Fastjson TemplatesImpl调用链 相关原理,可以参考:Jackson 反序列化漏洞原理 …...
【2023】DevOps、SRE、运维开发面试宝典之Kubernetes相关面试题
文章目录 1、Kubernetes集群的特点?2、Kubernetes集群各节点的组件有那些?分别有什么作用?3、简述Kubernetes集群的工作原理4、什么是Pod资源5、Label标签的作用?6、Deployment控制器与Statfulset控制器的区别?7、Pod拉取镜像的三种策略?8、简述Pod的生命周期9、Pod的生命…...
【算法】PatchMatch立体匹配算法_原理解析
目录 前言 原理解析 1.倾斜支持窗口(Slanted Support Windows) 什么是视差平面? 为什么视差和像素坐标点之间的关系可以解释为平面方程? 视差平面的通用参数方程和点加法向量方程 什么是倾斜支持窗口? 2.基于倾…...
【同步工具类:CyclicBarrier】
同步工具类:CyclicBarrier介绍源码分析CyclicBarrier 基于ReetrantLock Condition实现。构造函数await() 函数业务场景方案一:代码实现测试截图方案二代码实现测试打印总结介绍 官方介绍: 一种同步辅助工具,允许一组线程都等待对方到达共同的障碍点。CyclicBarrie…...
Android 12.0 Settings 去掉打开开发者模式和USB调试模式的广播
1.概述 在12.0的系统产品rom定制化开发中,在系统Settings的开发者模式中,打开开发者模式和usb调试模式都会发出开发者模式改变广播和usb调试模式改变广播, 项目开发功能需要要求去掉这两个广播以免影响其他功能,所以就要看哪里发出广播来屏蔽掉就可以了,这样就可以去掉开发…...
OSI七层网络模型和TCP/IP四层网络模型的异同
文章目录前言一、什么是OSI?二、什么是TCP/IP四层模型?三、OSI七层网络模型和TCP/IP四层网络模型的关系:四、 OSI七层和TCP/IP的区别:前言 本节系统总结: 一、什么是OSI?二、什么是TCP/IP四层模型…...
接口测试必备技能 - 加密和签名
1、什么是加密以及解密? 加密:在网络上传输的原始数据(明文)经过加密后形成(密文)传输,防止被窃取。 解密:将加密还原成原始数据 2、加密方式分类? 对称式加密…...
JVM虚拟机概述(1)
1.JVM概述 1.1为什么要学习JVM 通过学习JVM ( java Virtual Machine )可以帮助我们理解java程序运行的过程,了解虚拟机中各种机制的实现原理。为后期写出优质的代码做好准备,为向更高的层次提升打好基础。 1.2虚拟机 虚拟机的本质就是在windows中&…...
学习.NET MAUI Blazor(七)、实现一个真正的ChatGPT聊天应用
今天在新闻上看到一条消息,OpenAI已经开放了ChatGPT的接口,也就是GPT-3.5,对比原来的GPT-3,增加了gpt-3.5-turbo、gpt-3.5-turbo-0301两个模型。 gpt-3.5-turbo:使用最新的GPT-3.5模型,并针对聊天进行了优…...
Django框架学习
文章目录Django框架项目开发1. 创建项目2. 项目目录结构3. 视图函数(view)4. 路由配置url5. HTTP请求6. HTTP响应 - 状态吗7. GET方式传参8. POST传递参数模板Templates1. 通过 loader 获取模板,通过HttpResponse进行响应2. 使用 render() 直接加载并响应…...
JavaSE21-集合1-set
文章目录一、集合概念二、set集合1、set集合的特点2、HashSet2.1 特点2.2 创建对象2.3 常用方法2.4 遍历2.4.1 foreach遍历2.4.2 使用迭代器遍历2.4.3 转换为数组遍历一、集合概念 集合就是用于存储多个数据的容器。相对于具有相同功能的数组来说,集合的长度可变会…...
Web版和客户端哪种SQL工具更好?ChatGPT有话要说
2023年年初公司发布了一款Web版SQL工具,短期内就赢得了众多用户的喜爱和下载。不过,也有SQL用户在评论区中提出自己的观点,认为Web版工具都不可靠,甚至看见Web版工具就劝返… … 工具Web化逐渐成为一种趋势,比如&…...
从客户端的角度来看移动端IM即时通讯的消息可靠性和送达机制
如何确保IM 不丢消息是个相对复杂的话题,从客户端发送数据到服务器,再从服务器抵达目标客户端,最终在 UI 成功展示,其间涉及的环节很多,这里只取其中一环「接收端如何确保消息不丢失」来探讨,粗略聊下我接触…...
2023年java春招面试题及答案
2023年java春招面试题1、下面有关jdbc statement的说法错误的是?2、下面有关JVM内存,说法错误的是?3、下面有关servlet service描述错误的是?4、下面有关servlet和cgi的描述,说法错误的是?5、下面有关SPRIN…...
Django学习——基础篇(上)
一、Django的安装 pip install djangopython目录下出现两个文件 djando-admin.exe django django-admin.exe django 二、创建项目 1.命令行(终端) 1.打开终端 winR 输入cmd 2.进入项目目录 3.执行命令创建项目 2.Pycharm 两种方法对比 1.命令行创…...
研报精选230302
目录 【个股230302华西证券_比亚迪】系列点评五十四:迪“王”需求向上 出口“海”阔天空【个股230302华西证券_华利集团】下游去库存背景下承压,毛利率保持稳健【个股230302开源证券_恒顺醋业】公司信息更新报告:四季度业绩承压,期…...
Unity心得
- 将结果与因子颠倒的函数Mathf.InverseLerp非常实用 - at 10 meters, you want volume 1 - at 20 meters, you want volume 0 - volume InvLerp( 20, 10, distance ) - 显示HideFlags为Hide类型的物体 Resources .FindObjectsOf…...
TryHackMe-Binex
Binex 枚举计算机并获取交互式 shell。利用 SUID 位文件,使用 GNU 调试器利用缓冲区溢出并通过 PATH 操作获得根访问权限。 端口扫描 循例 nmap SMB枚举 题目给了提示:Hint 1: RID range 1000-1003 Hint 2: The longest username has the unsecure pa…...
外贸人如何写出优秀的开发信?附详细思路
如何写出优秀的开发信?最近做出口生意的客户都在抱怨,开发信的回复率越来越低,其实原因有很多,有时候并非自己的能力实在很欠缺。原因总结如图:第一:市场不景气这个就是就属于客观因素了,这也许…...
python自学之《21天学通Python》(18)——第21章 案例2 Python搞定大数据
“大数据(Big Data)”这个术语最早期的引用可追溯到apache org的开源项目Nutch。当时,大数据用来描述为更新网络搜索索引需要同时进行批量处理或分析的大量数据集。随着谷歌MapReduce和GoogleFileSystem (GFS)的发布&a…...
面试问题【数据库】
数据库数据库的三范式是什么drop、delete、truncate 分别在什么场景之下使用char 和 varchar 的区别是什么数据库的乐观锁和悲观锁是什么SQL 约束有哪几种mysql 的内连接、左连接、右连接有什么区别MyIASM和Innodb两种引擎所使用的索引的数据结构是什么mysql 有关权限的表都有哪…...
Allegro如何输出钻孔表操作指导
Allegro如何输出钻孔表操作指导 用Allegro做PCB设计的时候,需要输出钻孔表格,用于生产加工,如下图 如何输出钻孔表,具体操作如下 点击Manufacture点击NC...
消息队列 面试题 整理
消息队列 为什么要使用消息队列? 异步解耦:关注的是通知而非处理。 流量削峰:将短时间内高并发的请求持久化,然后逐步处理,削平高峰期的请求。 日志收集: 事务最终一致性 系统间的消息通信方式ÿ…...
【Java】对象比较大小
在Java中经常会涉及到对象数组的排序问题,那么就涉及到对象之间的比较问题。Java实现对象排序的方式有两种: 自然排序:java.lang.Comparable定制排序:java.util.Comparator 规则:需要我们自定义根据对象的某个或某些属…...
发票自动OCR识别并录入模板 3分钟免费配置
要问整个公司里和数据打交道最多的职能,非财务莫属了吧。除了每天要处理大量财务数据外,还有发票录入的工作让财务陷入“易燃易爆炸”的工作状态。发票报销看似简单,但发票的类型有很多种,每种发票需要录入的信息也有差别。再加上…...
Dubbo 配置说明
dubbo:scan:base-packages: com.ut.msdasw.services.appservice //这个会扫描该包下得全部接口protocol: //这个主要是配置传输的协议和端口,只是一个协议name: dubbo port: 30032registry: //这里是服务注册中心的地址address: spring-cloud://localhost consum…...
英飞凌TCxxx实战系列01_Alarm处理
目录 1.概述2. Alarm内部处理2.1关联的寄存器2.2 Alarm设置case3. SMU外部处理3.1 关联的寄存器4. WDT Alarm的特殊处理4.1 看门狗超时测试4.2 RecoveryTimer相关的Alarm1.概述 当MCU运行出现问题,如MCU温度过高、过低,看门狗超时等会触发一个Alarm,当SMU收到Alarm信号后,…...
网站制作书籍推荐/百度指数官网登录
建筑给排水工程包括:给水、排水、热水、消火栓、自动喷淋等常用系统,其管道当中流动的是水。(其管道输送介质为水)一、给排水工程的主要功能(1)建筑给水系统的任务,就是经济合理地将水由室外给水管网输送到装置在室内的各种配水龙头、生产用水…...
做美食介绍的网站/福建百度推广
随着微软2013系列产品的深入推广和功能的完善,越来越多的企业喜欢选择最新最好的微软基础架构产品,Lync Server 2013就是一款现在非常流行的企业内部的即时通讯工具。很多用户可能在客户端的选择上,或多或少的都会从早期的 Office Communicat…...
装修网站合作/百度关键词指数查询
ROS支持多机互通,可以设置一台主机,多台从机,主机中运行roscore,启动master节点,从机直接运行其他节点,在配置好的机器之间就可以互相通信了,就像在同一台机器上一样。 具体应该如何配置呢&…...
曲靖网站设计/站内推广方案
线程状态转换的图解: 1、新建状态(New):新创建了一个线程对象。 2、就绪状态(Runnable):线程对象创建后,其他线程调用了该对象的start()方法。 该状态的线程位于可运行线程池中&…...
开源 网站源代码/北京it培训机构哪家好
点击上方 "Java指南者"关注, 星标或置顶一起成长免费送 1024GB 精品学习资源 来源:https://juejin.im/post/6881259928909152270什么是方法引用?对一个类某个方法进行引用。形式大致为:类型::方法名(构造方法为类型::new)对象::方法名例子&…...
flash做网站的论文/搜索热度查询
TMaMba 2014/01/13 17:010x00 前言在渗透测试和安全扫描工作中,发现越来越多站点部署了应用防护系统或异常流量监控系统,其中包括:WEB应用防火墙(软件WAF、硬件WAF、云WAF)、入侵检测系统、入侵防御系统、访问监控系统…...