基於列存儲的開源分散式NoSQL資料庫Apache Cassandra入門分享

来源:https://www.cnblogs.com/itxiaoshen/archive/2023/03/29/17270966.html
-Advertisement-
Play Games

通過Hbase與Cassandra對比,層次展開瞭解Apache Cassandra特性和使用場景,通過部署但實力和多實例集群進一步理解其運作,最後通過CQL及其客戶端命令工具理解其數據模型和數據類型,通過對鍵空間、表、索引、數據操作熟悉常見CQL語法和使用。 ...


@

目錄

概述

定義

Apache Cassandra 官網地址 https://cassandra.apache.org/ 最新版本4.1.1

Apache Cassandra 官網文檔地址 https://cassandra.apache.org/doc/latest/

Apache Cassandra 源碼地址 https://github.com/apache/cassandra

Apache Cassandra 是一個開源的分散式、高可用、最終一致性的NoSQL資料庫,可以快速、可擴展可靠的管理海量數據,無單點故障。

NoSQL,泛指非關係型的資料庫,NoSQL去掉關係資料庫的關係型特性,數據之間無關係,非常容易擴展。

  • 易擴展:NoSQL資料庫種類繁多,但是一個共同的特點都是去掉關係資料庫的關係型特性。數據之間無關係,這樣就非常容易擴展,在架構的層面上帶來了可擴展的能力。
  • 大數據量,高性能:NoSQL資料庫都具有非常高的讀寫性能,尤其在大數據量下。一般MySQL使用Query Cache。NoSQL的Cache是記錄級的,是一種細粒度的Cache,所以NoSQL在這個層面上來說性能就要高很多。
  • 靈活的數據模型:NoSQL無須事先為要存儲的數據建立欄位,隨時可以存儲自定義的數據格式。而在關係資料庫里,增刪欄位是一件非常麻煩的事情。
  • 高可用:NoSQL在不太影響性能的情況,就可以方便地實現高可用的架構。比如Cassandra、HBase模型,通過複製模型也能實現高可用。

特性

  • 彈性可擴展性:允許添加更多的硬體以適應更多的客戶和更多的數據根據要求。
  • 無中心化架構:沒有單點故障,它可以連續用於不能承擔故障的關鍵業務應用程式。
  • 快速線性性能:增加集群中的節點數量增加你的吞吐量。因此,保持一個快速的響應時間。
  • 靈活的數據存儲:包括:結構化,半結構化和非結構化。它可以根據您的需要動態地適應變化的數據結構。
  • 便捷的數據分發:通過在多個數據中心之間複製數據,可以靈活地在需要時分發數據。
  • 事務支持:支持屬性,如原子性,一致性,隔離和持久性(ACID)。
  • 快速寫入

與Hbase對比

  • 架構:HBASE起源於Google BigTable,幾乎遵從了BigTable論文的大多數架構設計。Cassandra則是採納了BigTable的數據模型,同時吸收了Amazon Dynamo的分散式設計。
    • 從存儲結構模型的微觀上看,HBASE和Cassandra在單點存儲數據的機理是類似的,但是從分散式架構的巨集觀上看,兩者則大相徑庭。、
    • 從單點存儲模型上看起來兩者較為相似,有日誌追加(WAL VS CommitLog),有記憶體寫入緩衝區(MemStore VS MemTable),也都刷盤(flush)到LSM-Tree結構的持久化文件(StoreFile VS SSTable File),都用Bloomfilter和Row Index的組合模式進行行鍵的索引,它們也都是利用BigTable的數據模型結構實現高速的寫入和熱點數據的查找。
    • 從分散式架構上HBASE是中心化架構並滿足分散式CAP定理中的CP(分散式一致性),強調數據寫入的強一致性;Cassandra是去中心化架構並滿足分散式CAP定理中的AP(分散式高可用),適應數據在讀取過程中完成最終一致性。
  • 關鍵特性
    • 由內看結構: 在查詢方面Cassandra還支持二級索引,內置CQL(MySQL的SQL語法接近),SSTable分層結構也側重定位與查找;但HBase沒有二級索引,只強調列簇的行鍵scan,Region中的Store與HDFS密切配合,StoreFile中KV以順序排列,存儲強調整體的時間寫入順序。因此Cassandra就非常適合通過列欄位為條件來查找,而HBase更擅長通過行掃描做列集分析。
      • 本質原因在於Cassandra的數據是基於一致性哈希演算法,按照HASH範圍劃分,實現記錄根據哈希值在整個集群節點的隨機分佈以及複本冗餘,那麼查找起來更適合在整個集群中對任何記錄進行大範圍的定位和查詢,充分利用集群的整體算力;
      • 但是HBase是順序的寫入同一個Region,在數據量足夠大後再分裂,那麼HBase就不適合頻繁大範圍的對數據定位與查找,更適合按行鍵做順序掃描的集合分析。查詢主要體現在就近和熱點數據上的高性能。
    • 由外看分散式: Cassandra的集群去中心化主要利用一致性哈希環機制實現數據的分佈和擴容縮容的數據遷移,利用gossip協議在對等節點的網路傳播下保存集群狀態一致性,利用anti-entropy(反熵)機制實現數據讀取過程中節點之間的比對,保證數據一致性,這些都是集群在對等條件下基於機制而達成狀態上的共識,那麼Cassandra的這些特性,就使得集群不能太大,太大就不好管理,也容易導致網路通訊過於密集。Cassandra這種去中心化架構表現出來的優點就是集群無單點故障隱患,集群健壯性高,可用性極高,運維很省事。HBASE以及所依賴的Hadoop HDFS都是基於中心化集中式管理,存在HMaster的集群單點故障風險,因此一般HBASE的HMaster可以有一個或多個HA熱備,引入HA後的HBASE集群依然很健壯,只是必然引入更高的部署複雜度,底層依賴的HDFS NameNode HA在服務部署複雜性方面則更甚之。
  • 適用場景:HBASE更側重分析,Cassandra則勝於查詢
    • Cassandra更適合在數據大吞吐的情況下,藉助數據分佈優勢,高速寫入,並通過二級索引實現SQL語法豐富的欄位級查找,以及支持線上應用實時產生的超大規模數據的存儲,可以在大規模數據寫入與查詢的都比較適合的場景下替代MySQL,在事務和一致性要求不嚴格的環境下,為每天併發與寫入量驚人的線上業務系統,提供資料庫支撐。因此其面向服務的領域偏重oltp。
    • HBASE更適合管理著大規模集群,併在超大規模數據之上進行實時的,結構化的海量數據支撐,而且滿足強一致性要求,達到行級事務要求,可以使其對接一些關鍵性業務在可靠性要求高的環境下支撐線上實時分析,例如電子商務交易,金融交易等等。但並不適合隨機性很強的查詢,更適合大吞吐的數據寫入,熱點數據的行級查找以及大規模的掃描分析。並且具有Hadoop生態的數倉工具支撐。因此HBASE更面向olap。

Cassandra使用場景

  • 特征
    • 數據寫入操作密集
    • 數據修改操作很少
    • 通過主鍵查詢
    • 需要對數據進行分區存儲
  • 場景舉例
    • 存儲日誌型數據
    • 類似物聯網的海量數據
    • 對數據進行跟蹤

術語

  • cluster:使用gossip協議交換消息的兩個或多個資料庫實例。
  • commitlog:資料庫將更改後的數據追加到文件,以便在故障後恢復。
  • datacenter:在集群中一起配置的一組相關節點,用於複製和工作負載隔離。不一定是單獨的位置或物理數據中心。數據中心名稱區分大小寫,不能修改。
  • gossip:用於在節點之間交換位置和狀態信息的點對點通信協議。
  • hint:除了read-repair和full/incremental anti-entropy repair之外,Cassandra實現的三種方法之一,也是最終一致性保證,最終確認所有更新最終被所有副本接收。
  • listen address:要綁定到的地址或介面,並告訴要連接到的其他Cassandra節點。
  • seed node:種子節點用於引導加入集群的新節點。
  • snitch:節點IP地址到物理位置和虛擬位置(如機架和數據中心)的映射。
  • SSTable:提供了從鍵到值的持久的、有序的不可變映射,其中鍵和值都是任意的位元組字元串。

架構

概覽

Cassandra是具有最終一致語義的分區寬列存儲模型,最初是由Facebook設計的,它使用了一種分階段事件驅動架構(SEDA)來實現Amazon的Dynamo分散式存儲和複製技術以及谷歌的Bigtable數據和存儲引擎模型的組合。

Cassandra提供了Cassandra查詢語言(CQL),這是一種類似sql的語言,用於創建和更新資料庫模式以及訪問數據。

  • Keyspace:定義每個數據中心如何複製數據集。複製是指每個集群保存的副本數量。鍵空間包含表。
  • Table:定義分區集合的類型化模式。表包含分區,分區包含行,行包含列。Cassandra表可以靈活地向表中添加新列,並且零停機時間。
  • Partition:定義主鍵的強制部分,Cassandra中的所有行都必須識別存儲該行的集群中的節點。所有性能查詢都在查詢中提供分區鍵。
  • Row:包含由唯一主鍵標識的列集合,該主鍵由分區鍵和可選的其他集群鍵組成。
  • Column:具有屬於行類型的單個數據。

CQL在分區數據集上支持許多高級特性,例如:

  • 具有原子比較和設置語義的單分區輕量級事務。
  • 用戶定義的類型、函數和聚合
  • 集合類型包括集合、映射和列表。
  • 本地二級索引
  • 物化視圖(實驗階段)

Dynamo

Apache Cassandra依賴於Amazon的Dynamo分散式存儲鍵值系統的許多技術。Dynamo系統中的每個節點都有三個主要組件

  • 請求分區數據集上的協調
  • 環成員和故障檢測
  • 本地持久性(存儲)引擎

Cassandra主要利用前兩個集群組件,同時使用基於日誌結構化合併樹(Log Structured Merge Tree, LSM)的存儲引擎。特別是Cassandra依賴於Dynamo風格:

  • 使用一致哈希進行數據集分區
  • 使用版本化數據和可調一致性的多主複製
  • 通過gossip協議進行分散式集群成員和故障檢測
  • 在商用硬體上的增量擴展

Cassandra滿足大規模(PiB+)業務關鍵型存儲需求。特別是由於應用程式要求對pb級數據集進行完整的全球複製,同時還需要始終可用的低延遲讀寫。

數據集分區使用令牌環的一致性哈希

使用令牌環的一致性哈希:Cassandra使用一種稱為一致散列的特殊散列形式在存儲節點上劃分數據。在朴素數據哈希中,通常通過對鍵對桶數取模的哈希來將鍵分配給桶。例如,如果您希望使用朴素哈希將數據分佈到100個節點,您可以將每個節點分配到0到100之間的存儲桶,對輸入鍵取模100進行哈希,並將數據存儲在相關的存儲桶中。然而,在這個簡單的方案中,添加一個節點可能會使幾乎所有映射失效。

相反,Cassandra將每個節點映射到一個連續哈希環上的一個或多個令牌,並通過將一個鍵哈希到環上,然後沿一個方向“行走”環來定義所有權,類似於Chord演算法。一致哈希與普通數據哈希的主要區別在於,當要哈希的節點(桶)數量發生變化時,一致哈希只需要移動一小部分鍵。

image-20230324103453323

  • 令牌:發電機樣式哈希環上的單個位置。
  • 端點:網路上的單個物理IP和埠。
  • 主機ID:單個“物理”節點的唯一標識符,通常出現在一個gEndpoint上,並包含一個或多個gtoken。
  • 虛擬節點(或vnode):由相同物理節點擁有的哈希環上的gToken,具有相同的gHost ID。

image-20230324103624626

存儲引擎

  • CommitLog:提交日誌是Cassandra節點本地所有突變的附加日誌。寫入Cassandra的任何數據都將首先寫入提交日誌,然後再寫入記憶表。這在意外停機的情況下提供了持久性。在啟動時,提交日誌中的任何變化都將應用於memtables。
  • Memtables:memtable是Cassandra緩衝寫入的記憶體結構;通常,每個表都有一個活動的memtable;最終memtable被刷新到磁碟上,成為不可變的sstable。
  • SSTables :SSTables 是Cassandra用於在磁碟上持久化數據的不可變數據文件。當SSTables 從memtable被刷新到磁碟或從其他節點被流式傳輸時,Cassandra觸發壓縮,將多個SSTables 合併為一個。一旦編寫了新的SSTables ,就可以刪除舊的SSTables 。

部署

單實例部署

# 通過官網下載下載最新的版本
wget https://dlcdn.apache.org/cassandra/4.1.1/apache-cassandra-4.1.1-bin.tar.gz
# 解壓
tar -xvf apache-cassandra-4.1.1-bin.tar.gz
# 進入目錄
cd apache-cassandra-4.1.1
# 啟動,如果是root用戶啟動bin/cassandra -R
bin/cassandra
# 查看日誌
tail -f logs/system.log
# 檢查Cassandra的狀態
bin/nodetool status

image-20230323164552364

集群部署

準備三台192.168.2.100、192.168.2.101、192.168.2.102,選擇兩台作為種子節點,分別在每臺上修改配置文件vim conf/cassandra.yaml

# 同一個集群名稱一樣
cluster_name: 'Test Cluster'
# 種子地址,配置多個示例,用逗號隔開
seed_provider:
  - class_name: org.apache.cassandra.locator.SimpleSeedProvider
    parameters:
      - seeds: "192.168.2.100,192.168.2.101"
listen_address: 192.168.2.100
rpc_address: 192.168.2.100
# 下麵文件路徑按需修改,建議多個盤分開提高讀寫性能
# 數據文件(如sstable)所在的一個或多個目錄,預設$CASSANDRA_HOME/data/data
data_file_directories: /data1/cassandra/data
# commitlog文件所在的目錄
commitlog_directory: /data2/cassandra/commitlog
# 保存緩存的目錄
saved_caches_directory: /data3/cassandra/saved_caches
# hints所在的目錄
hints_directory: /data4/cassandra/hints

每台的listen_address和rpc_address修改為本機對應的,修改配置分別啟動cassandra

# 需要先殺死原來的cassandra進程,也可以自己準備腳本
ps -ef | grep cassandra
# 檢查Cassandra的狀態
bin/nodetool status
# 查詢關於令牌環的信息
bin/nodetool ring

CQL

概述

Cassandra Query Language(CQL),CQL提供了一個類似於SQL的模型;數據存儲在包含行和列的表中。因此在本文檔中使用時,這些術語(表、行和列)具有與SQL中相同的定義。

  • Data types
  • Data definition language
  • Data manipulation language
  • Operators
  • Secondary indexes
  • Materialized views
  • Functions
  • JSON
  • CQL security
  • Triggers
  • Appendices
  • Changes

數據模型

image-20230324183733942

  • 列(Column):列是Cassandra的基本數據結構單元,具有三個值:名稱,值、時間戳。在Cassandra中不需要預先定義列(Column),只需要在KeySpace里定義列族,然後就可以開始寫數據了。
  • 列族( Column Family):列族不嚴謹來說相當於關係資料庫的表(Table),是包含了多行(Row)的容器。
    • 類型
      • 靜態column family(static column family):欄位名是固定的,比較適合對於這些column都有預定義的元數據。
      • 動態column family(dynamic column family):欄位名是應用程式計算出來並且提供的,所以column family只能定義這些欄位的類型,無法不可以指定這些欄位的名字和值,這些名字和值是由應用程式插入某欄位才得出的。
    • Row key:ColumnFamily 中的每一行都用Row Key(行鍵)來標識,這個相當於關係資料庫表中的主鍵,並且總是被索引的
    • 主鍵:Cassandra可以使用PRIMARY KEY 關鍵字創建主鍵,分為2種
      • Single column Primary Key:如果 Primary Key 由一列組成稱為 Single column Primary Key。
      • Composite Primary Key:如果 Primary Key 由多列組成,那麼這種情況稱為 Compound Primary Key 或 Composite Primary Key。
    • 列族具有的屬性
      • keys_cached - 它表示每個SSTable保持緩存的位置數。
      • rows_cached - 它表示其整個內容將在記憶體中緩存的行數。
      • preload_row_cache -它指定是否要預先填充行緩存。
  • 鍵空間 (KeySpace)
    • Cassandra的鍵空間(KeySpace)不嚴謹相當於關係型資料庫的資料庫,創建一個鍵空間就是創建了一個資料庫。鍵空間包含一個或多個列族(Column Family)。一般將有關聯的數據放到同一個 KeySpace 下麵,鍵空間 (KeySpace) 創建的時候可以指定一些屬性:副本因數,副本策略,Durable_writes(是否啟用 CommitLog 機制)
    • 所有的副本都同樣重要,沒有主從之分。可以為每個數據中心定義副本因數。副本策略設置應大於1,但是不能超過集群中的節點數。
  • 副本 (Replication):副本就是把數據存儲到多個節點,來提高容錯性。
  • 節點(Node):存儲數據的機器。
  • 數據中心(DateCenter):數據中心指集群中所有的機器,組成了一個數據中心。
  • 集群(Cluster):Cassandra資料庫是為跨越多條主機共同工作,對用戶呈現為一個整體的分散式系統設計的。Cassandra最外層容器被稱為群集。Cassandra將集群中的節點組織成一個環(ring),然後把數據分配到集群中的節點(Node)上。
  • 超級列:超級列是一個特殊列,因此它也是一個鍵值對。但是超級列存儲了子列的地圖。

數據類型

CQL是一種類型化語言,支持豐富的數據類型集,包括Native類型、集合類型、用戶定義類型、元組類型和自定義類型

  • Native類型:ASCII | BIGINT | BLOB | BOOLEAN | COUNTER | DATE | DECIMAL | DOUBLE | DURATION | FLOAT | INET | INT | SMALLINT | TEXT | TIME | TIMESTAMP | TIMEUUID | TINYINT | UUID | VARCHAR | VARINT
  • 集合類型:maps(使用大括弧+鍵值)、sets(使用大括弧)、lists(使用中括弧)
  • 用戶定義類型:CQL支持定義用戶定義類型(udt)。可以使用create_type_statement、alter_type_statement和drop_type_statement來創建、修改和刪除這樣的類型。
  • 元組類型:CQL還支持元組和元組類型(其中元素可以是不同的類型)。從功能上講,元組可以作為具有匿名欄位的匿名UDT。

# CQL Shell 簡稱cqlsh,是一個可以和Cassandra資料庫通信的客戶端,使用這個cqlsh客戶端可以執行Cassandra查詢語言(CQL)。指定IP和埠連接cql
./bin/cqlsh 192.168.2.100 9042
describe cluster;
describe keyspaces;
describe tables;

image-20230324185325438

基礎操作

鍵空間

# 將輸出內容捕獲到名為outputfile的文件
capture 'outputfile';
# 創建鍵空間
CREATE KEYSPACE school WITH replication = {'class':'SimpleStrategy', 'replication_factor' : 3};
# 查看捕獲內容
cat outputfile

image-20230329173706159

# 查看鍵空間
DESCRIBE school;
# 使用鍵空間
use school;
# 修改鍵空間
ALTER KEYSPACE school WITH replication = {'class':'SimpleStrategy', 'replication_factor' : 1};
DESCRIBE school;
# 刪除鍵空間
DROP KEYSPACE school;

image-20230329173917368

CREATE TABLE student(
   id int PRIMARY KEY,  
   name text,  
   age int,  
   gender tinyint,  
   address text ,
   interest set<text>,
   phone list<text>,
   education map<text, text>
);
# 列出當前鍵空間下所有表
DESCRIBE Tables;
# 查看表信息
DESCRIBE TABLE student; 

image-20230329174748558

# 添加欄位
ALTER TABLE student ADD email text;
select * from student;
# 刪除欄位
ALTER table student DROP email;
select * from student
# 刪除表
DROP TABLE student;
# 清空表
TRUNCATE student;

image-20230329175240465

key索引

  • Primary Key 主鍵:是用來獲取某一行的數據, 可以是單一列(Single column Primary Key)或者多列(Composite Primary Key)。在 Single column Primary Key 決定這一條記錄放在哪個節點。
create table test1 (  id int PRIMARY KEY,  name text);
  • Partition Key 分區Key:在組合主鍵的情況下(上面的例子),第一部分稱作Partition Key(key_one就是partition key),第二部分是CLUSTERING KEY(key_two)Cassandra會對Partition key 做一個hash計算,並自己決定將這一條記錄放在哪個節點。如果 Partition key 由多個欄位組成,稱之為 Composite Partition key
create table test2 (  key_part_one int,  key_part_two int,  key_clust_one int,  key_clust_two int,  key_clust_three uuid,  name text,  PRIMARY KEY((key_part_one,key_part_two), key_clust_one, key_clust_two, key_clust_three));
  • Composite Primary Key 複合Key:如果 Primary Key 由多列組成,那麼這種情況稱為 Compound Primary Key 或 Composite Primary Key。執行創建表後,查詢testTab,會發現key_one和key_two 的顏色與其他列不一樣
create table test3 (  key_one int,  key_two int,  name text,  PRIMARY KEY(key_one, key_two));
  • Clustering Key 集群:決定同一個分區內相同 Partition Key 數據的排序,預設為升序,可以在建表語句裡面手動設置排序的方式。

索引

  • 普通列創建索引
# 為student的 name 添加索引,索引的名字為:sname, 命令:CREATE INDEX sname ON student (name);# 為student 的age添加索引,不設置索引名字,命令:CREATE INDEX ON student (age);DESCRIBE student;

image-20230329180142411

可以發現 對age創建索引,沒有指定索引名字,會提供一個預設的索引名:student_age_idx。

索引原理:Cassandra之中的索引的實現相對MySQL的索引來說就要簡單粗暴很多了。Cassandra自動新創建了一張表格,同時將原始表格之中的索引欄位作為新索引表的Primary Key!並且存儲的值為原始數據的Primary Key。

  • 集合列創建索引
#  set集合添加索引CREATE INDEX ON student(interest);    #  map映射添加索引CREATE INDEX mymap ON student(KEYS(education));   # 刪除索引drop index sname;

image-20230329180544365

操作數據

# 插入數據INSERT INTO student (id,address,age,gender,name) VALUES (1011,'南京路',10,2,'mike') ;# 修改數據UPDATE student set age = 11 where id= 1011;# 批量操作BEGIN BATCH    INSERT INTO student (id,address,age,gender,name) VALUES (1012,'長沙路',12,1,'joo') ;    INSERT INTO student (id,address,age,gender,name) VALUES (1015,'上海路',20,1,'Jack') ;    UPDATE student set age = 15 where id= 1012;    DELETE FROM student WHERE id=1011;APPLY BATCH;# 刪除數據DELETE FROM student WHERE student_id=1011;

image-20230329181213622

# 更新map類型數據UPDATE student SET education={'中學': '城市第五中學', '小學': '城市第五小學'} WHERE id = 1012;# 更新list類型數據UPDATE student SET phone = ['020-66666666', '13666666666'] WHERE id = 1012;# 更新set類型數據UPDATE student SET interest = interest + {'游戲'} WHERE id = 1012;

image-20230329181804412

# 查詢條件
select * from student where interest CONTAINS '電影';

image-20230329182025446

# 設置數據的ttl
INSERT INTO student (id,address,age,gender,name,interest, phone,education) VALUES (1030,'朝陽路30號',20,1,'Cary',{'運動', '游戲'},['020-7777888','139876667556'],{'小學' :'第30小學','中學':'第30中學'}) USING TTL 20;

image-20230329182423283

  • 本人博客網站IT小神 www.itxiaoshen.com

您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • CPU包含運算器、寄存器 一、數據寄存器: AX用於算術、邏輯運算、外設傳送信息 BX用於存放存儲器地址 CX用於移位指令、迴圈和串處理指令中用作隱含的計數器 DX用於存放雙字的高十六位 其中AX、CX、DX不能作為基址和變址儲存器來存儲定址 二、變址寄存器 ESI、EDI、SI、DI稱為變址寄存器 ...
  • 安裝參考: 在 Arch Linux 中安裝和配置 KDE Plasma 桌面 - Linux迷 (linuxmi.com) (1) (25條消息) archlinux安裝kde桌面和sddm登錄管理器_kde登錄管理器_shier_smile的博客-CSDN博客 (2) 我的安裝過程(結合兩個參考 ...
  • 使用雲伺服器 Ubuntu20.04 LTS 1.安裝docker # 輸入docker提示docker安裝語句 apt install docker.io # 從Docker Hub中拉取最新項目鏡像 docker pull b3log/solo 2.安裝mysql # 使用以下命令將安裝mysq ...
  • PHP(PHP: Hypertext Preprocessor)即“超文本預處理器”,是在伺服器端執行的腳本語言,尤其適用於Web開發並可嵌入HTML中。PHP語法學習了C語言,吸納Java和Perl多個語言的特色發展出自己的特色語法,並根據它們的長項持續改進提升自己,例如java的面向對象編程,該... ...
  • 本文收集了170多個windows11上的快捷鍵,其中有少部分是windows11新添加的。大部分的win10快捷鍵也適用於win11。這些快捷鍵涵蓋了系統設置、命令行程式執行、Snap佈局切換、對話框快速處理等諸多方面,這裡收錄的是這些分類中最常用的快捷鍵。 編寫博文的過程中,我已驗證了其中90% ...
  • 參考:(25條消息) 虛擬機安裝Arch Linux_虛擬機安裝archlinux_追光少年羽的博客-CSDN博客 準備工作 在開始安裝 Arch Linux 之前,需要先下載安裝映像文件並創建好虛擬機環境。 下載安裝鏡像 下麵是 Arch Linux 官方的安裝文件下載地址: Arch Linux ...
  • 解決辦法 如果最近升級到了 openssh 8.8 版,你會發現連接某些之前連接得好好的伺服器突然無法連接: Unable to negotiate with x.x.x.x port 2222: no matching host key type found. Their offer: ssh-r ...
  • 1. 三值邏輯 1.1. 真 1.1.1. true 1.2. 假 1.2.1. false 1.3. 不確定 1.3.1. unknown 2. 兩種NULL 2.1. 未知”(unknown) 2.1.1. 不知道戴墨鏡的人眼睛是什麼顏色 2.1.2. 雖然現在不知道,但加上某些條件後就可以知道 ...
一周排行
    -Advertisement-
    Play Games
  • Timer是什麼 Timer 是一種用於創建定期粒度行為的機制。 與標準的 .NET System.Threading.Timer 類相似,Orleans 的 Timer 允許在一段時間後執行特定的操作,或者在特定的時間間隔內重覆執行操作。 它在分散式系統中具有重要作用,特別是在處理需要周期性執行的 ...
  • 前言 相信很多做WPF開發的小伙伴都遇到過表格類的需求,雖然現有的Grid控制項也能實現,但是使用起來的體驗感並不好,比如要實現一個Excel中的表格效果,估計你能想到的第一個方法就是套Border控制項,用這種方法你需要控制每個Border的邊框,並且在一堆Bordr中找到Grid.Row,Grid. ...
  • .NET C#程式啟動閃退,目錄導致的問題 這是第2次踩這個坑了,很小的編程細節,容易忽略,所以寫個博客,分享給大家。 1.第一次坑:是windows 系統把程式運行成服務,找不到配置文件,原因是以服務運行它的工作目錄是在C:\Windows\System32 2.本次坑:WPF桌面程式通過註冊表設 ...
  • 在分散式系統中,數據的持久化是至關重要的一環。 Orleans 7 引入了強大的持久化功能,使得在分散式環境下管理數據變得更加輕鬆和可靠。 本文將介紹什麼是 Orleans 7 的持久化,如何設置它以及相應的代碼示例。 什麼是 Orleans 7 的持久化? Orleans 7 的持久化是指將 Or ...
  • 前言 .NET Feature Management 是一個用於管理應用程式功能的庫,它可以幫助開發人員在應用程式中輕鬆地添加、移除和管理功能。使用 Feature Management,開發人員可以根據不同用戶、環境或其他條件來動態地控制應用程式中的功能。這使得開發人員可以更靈活地管理應用程式的功 ...
  • 在 WPF 應用程式中,拖放操作是實現用戶交互的重要組成部分。通過拖放操作,用戶可以輕鬆地將數據從一個位置移動到另一個位置,或者將控制項從一個容器移動到另一個容器。然而,WPF 中預設的拖放操作可能並不是那麼好用。為瞭解決這個問題,我們可以自定義一個 Panel 來實現更簡單的拖拽操作。 自定義 Pa ...
  • 在實際使用中,由於涉及到不同編程語言之間互相調用,導致C++ 中的OpenCV與C#中的OpenCvSharp 圖像數據在不同編程語言之間難以有效傳遞。在本文中我們將結合OpenCvSharp源碼實現原理,探究兩種數據之間的通信方式。 ...
  • 一、前言 這是一篇搭建許可權管理系統的系列文章。 隨著網路的發展,信息安全對應任何企業來說都越發的重要,而本系列文章將和大家一起一步一步搭建一個全新的許可權管理系統。 說明:由於搭建一個全新的項目過於繁瑣,所有作者將挑選核心代碼和核心思路進行分享。 二、技術選擇 三、開始設計 1、自主搭建vue前端和. ...
  • Csharper中的表達式樹 這節課來瞭解一下表示式樹是什麼? 在C#中,表達式樹是一種數據結構,它可以表示一些代碼塊,如Lambda表達式或查詢表達式。表達式樹使你能夠查看和操作數據,就像你可以查看和操作代碼一樣。它們通常用於創建動態查詢和解析表達式。 一、認識表達式樹 為什麼要這樣說?它和委托有 ...
  • 在使用Django等框架來操作MySQL時,實際上底層還是通過Python來操作的,首先需要安裝一個驅動程式,在Python3中,驅動程式有多種選擇,比如有pymysql以及mysqlclient等。使用pip命令安裝mysqlclient失敗應如何解決? 安裝的python版本說明 機器同時安裝了 ...