主頁 > 後端開發 > redis集群詳解

redis集群詳解

2021-10-28 06:04:59 後端開發

1.什么是集群

所謂的集群,就是通過增加服務器的數量,提供相同的服務,從而讓服務器達到一個穩定、高效的狀態,

2.使用redis集群的必要性

單個redis存在不穩定性,當redis服務宕機了,就沒有可用的服務了,而且單個redis的讀寫能力是有限的,使用redis集群可以強化redis的讀寫能力,并且當一臺服務器宕機了,其他服務器還能正常作業,不影響使用

3.redis集群

1.redis集群中,每一個redis稱之為一個節點, 2.redis集群中,有兩種型別的節點:主節點(master)、從節點(slave), 3.redis集群,是基于redis主從復制實作,

4.redis主從復制

4.1 概念

主從復制模型中,有多個redis節點, 其中,有且僅有一個為主節點Master,從節點Slave可以有多個,只要網路連接正常,Master會一直將自己的資料更新同步給Slaves,保持主從同步, https://note.youdao.com/yws/public/resource/91d12014a4ca13af8e12ed980b727311/xmlnote/B84027559586440A87B51AA01A900047/9415

4.2 特點

1.主節點Master可讀、可寫. 2.從節點Slave只讀,(read-only) 因此,主從模型可以提高讀的能力,在一定程度上緩解了寫的能力,因為能寫仍然只有Master節點一個,可以將讀的操作全部移交到從節點上,變相提高了寫能力,  

4.3 配置

建議克隆一個虛擬機,再進行配置

4.3.1 需求

配置主節點:6380 配置從節點(兩個):6381、6382  

4.3.2 配置步驟

1.在/usr/local目錄下,創建一個/redis/master-slave目錄
mkdir -p redis/master-slave

 

2.在master-slave目錄下,創建三個子目錄6380、6381、6382
mkdir 6380 6381 6382
3.依次拷貝redis解壓目錄下的redis.conf組態檔,到這三個子目錄中
cp -v /opt/soft/redis-3.2.9/redis.conf ./6380
    cp -v /opt/soft/redis-3.2.9/redis.conf ./6381
    cp -v /opt/soft/redis-3.2.9/redis.conf ./6382
4.進入6380目錄,修改redis.conf,將port埠修改成6380即可, https://note.youdao.com/yws/public/resource/91d12014a4ca13af8e12ed980b727311/xmlnote/33AE580B6E80452FBFEE6E738B124081/9451 5.進入6381目錄,修改redis.conf,將port埠改成6381,同時指定開啟主從復制, https://note.youdao.com/yws/public/resource/91d12014a4ca13af8e12ed980b727311/xmlnote/A4D782DCD3AB40469DEFCDEEECCD9636/9456   https://note.youdao.com/yws/public/resource/91d12014a4ca13af8e12ed980b727311/xmlnote/651AB57F1B644F129ABD6B02287A248B/9458 6.進入6382目錄,修改redis.conf,將port埠改成6382,同時指定開啟主從復制, https://note.youdao.com/yws/public/resource/91d12014a4ca13af8e12ed980b727311/xmlnote/422A19B30A664589BC9325EF8C669EA7/9461   https://note.youdao.com/yws/public/resource/91d12014a4ca13af8e12ed980b727311/xmlnote/D5E24BB2F89F4B3D833B98D41E39E627/9463  

4.3.3 測驗

1.打開三個xshell視窗,在每一個視窗中,啟動一個redis節點,查看日志輸出,(不要改成后臺模式啟動,看不到日志,不直觀)
cd 6380 && redis-server ./redis.conf
   cd 6381 && redis-server ./redis.conf
   cd 6382 && redis-server ./redis.conf
  2.另外再打開三個xshell視窗,在每一個視窗中,登陸一個redis節點  

redis-cli -p 6380 redis-cli -p 6381 redis-cli -p 6382

 

  3.在主節點6380上,進行讀寫操作,操作成功 https://note.youdao.com/yws/public/resource/91d12014a4ca13af8e12ed980b727311/xmlnote/0A55D3E5CCBB4B4BB12D889EF9AA056D/9482 4.在從節點6381上 讀操作執行成功,并且成功從6380上同步了資料;寫操作執行失敗,(從節點,只能讀,不能寫) https://note.youdao.com/yws/public/resource/91d12014a4ca13af8e12ed980b727311/xmlnote/55FF8242DBB4498D9FDA2B6515FBFF02/9485  

5.Sentinel哨兵模式

5.1 主從模式的缺陷

當主節點宕機了,整個集群就沒有可寫的節點了, 由于從節點上備份了主節點的所有資料,那在主節點宕機的情況下,如果能夠將從節點變成一個主節點,就可以解決這個問題了,這就是Sentinel哨兵的作用,  

5.2 哨兵的任務

Redis 的 Sentinel 系統用于管理多個 Redis 服務器(instance), 該系統執行以下三個任務: 監控(Monitoring): Sentinel 會不斷地檢查你的主服務器和從服務器是否運作正常, 提醒(Notification): 當被監控的某個 Redis 服務器出現問題時, Sentinel 可以通過 API 向管理員或者其他應用程式發送通知, 自動故障遷移(Automatic failover): 當一個主服務器不能正常作業時, Sentinel 會開始一次自動故障遷移操作, 它會將失效主服務器的其中一個從服務器升級為新的主服務器, 并讓失效主服務器的其他從服務器改為復制新的主服務器; 當客戶端試圖連接失效的主服務器時, 集群也會向客戶端回傳新主服務器的地址, 使得集群可以使用新主服務器代替失效服務器,  

5.2.1 監控(Monitoring)

1.Sentinel可以監控任意多個Master和該Master下的Slaves,(即多個主從模式) 2.同一個哨兵下的、不同主從模型,彼此之間相互獨立, 3.Sentinel會不斷檢查Master和Slaves是否正常, https://note.youdao.com/yws/public/resource/91d12014a4ca13af8e12ed980b727311/xmlnote/5D9B185D0CB8439C8CD2A8E7193E5855/9507  

5.2.2 自動故障切換(Automatic failover)

5.2.2.1 Sentinel網路

監控同一個Master的Sentinel會自動連接,組成一個分布式的Sentinel網路,互相通信并交換彼此關于被監視服務器的資訊,下圖中,三個監控s1的Sentinel,自動組成Sentinel網路結構, https://note.youdao.com/yws/public/resource/91d12014a4ca13af8e12ed980b727311/xmlnote/16DC43CA8C994E89A88C86C7ED6723C5/9514 為什么要使用sentinel網路呢? 當只有一個sentinel的時候,如果這個sentinel掛掉了,那么就無法實作自動故障切換了,在sentinel網路中,只要還有一個sentinel活著,就可以實作故障切換,  

5.2.2.2 故障切換的程序

1.投票(半數原則) 當任何一個Sentinel發現被監控的Master下線時,會通知其它的Sentinel開會,投票確定該Master是否下線(半數以上,所以sentinel通常配奇數個并且至少3個), 2.選舉 當Sentinel確定Master下線后,會在所有的Slaves中,選舉一個新的節點,升級成Master節點, 其它Slaves節點,轉為該節點的從節點, 投票: https://note.youdao.com/yws/public/resource/91d12014a4ca13af8e12ed980b727311/xmlnote/8C7F1CF02FDA464DA2F149FE613035CE/9530   選舉: https://note.youdao.com/yws/public/resource/91d12014a4ca13af8e12ed980b727311/xmlnote/F7B0F7844D7541C48CCCB69130FDB61A/9537 3.原Master重新上線 當原Master節點重新上線后,自動轉為當前Master節點的從節點, https://note.youdao.com/yws/public/resource/91d12014a4ca13af8e12ed980b727311/xmlnote/51FDE83A109F4D8DA922514138562C66/9553  

5.3 哨兵模式部署

5.3.1 需求

前提:已經存在一個正在運行的主從模式, 另外,配置三個Sentinel實體,監控同一個Master節點,

5.3.2 配置Sentinel

1.在/usr/local目錄下,創建/redis/sentinels/目錄
mkdir -p sentinels
2.在/sentinels目錄下,以次創建s1、s2、s3三個子目錄中
mkdir s1 s2 s3
3.依次拷貝redis解壓目錄下的sentinel.conf檔案,到這三個子目錄中

cp -v /opt/soft/redis-3.2.9/sentinel.conf ./s1 cp -v /opt/soft/redis-3.2.9/sentinel.conf ./s2 cp -v /opt/soft/redis-3.2.9/sentinel.conf ./s3
4.依次修改s1、s2、s3子目錄中的sentinel.conf檔案,修改埠,并指定要監控的主節點,(從節點不需要指定,sentinel會自動識別) S1哨兵配置如下: https://note.youdao.com/yws/public/resource/91d12014a4ca13af8e12ed980b727311/xmlnote/290090865FCB4C6D9C0CCBF48E05E2EE/9576   https://note.youdao.com/yws/public/resource/91d12014a4ca13af8e12ed980b727311/xmlnote/B628329A6707413F913C6F672DB82E13/9578 S2哨兵配置如下: https://note.youdao.com/yws/public/resource/91d12014a4ca13af8e12ed980b727311/xmlnote/B5059B8FFED04F718AB717DFE9472565/9582   https://note.youdao.com/yws/public/resource/91d12014a4ca13af8e12ed980b727311/xmlnote/B4B9A653A49943808378125CB7F2EC4A/9584 S3哨兵配置如下: https://note.youdao.com/yws/public/resource/91d12014a4ca13af8e12ed980b727311/xmlnote/91652046DF5E4466B7C8CAB9032AE5EC/9587   https://note.youdao.com/yws/public/resource/91d12014a4ca13af8e12ed980b727311/xmlnote/987E88013FC1491FBB822EBF5B55FC84/9589 5.再打開三個xshell視窗,在每一個視窗中,啟動一個哨兵實體,并觀察日志輸出

redis-sentinel ./s1/sentinel.conf redis-sentinel ./s2/sentinel.conf redis-sentinel ./s3/sentinel.conf

 

  核心日志輸出(部署成功): https://note.youdao.com/yws/public/resource/91d12014a4ca13af8e12ed980b727311/xmlnote/0F8D8AB584814133BF264D5E1565B4DA/9595  

5.3.3 測驗

1.先關閉6380節點,發現,確實重新指定了一個主節點   查看服務:ps -aux|grep redis https://note.youdao.com/yws/public/resource/91d12014a4ca13af8e12ed980b727311/xmlnote/FC1F6B3C1D5943CC88F66CB96DDC024A/9612 關閉服務:kill -9 1841   https://note.youdao.com/yws/public/resource/91d12014a4ca13af8e12ed980b727311/xmlnote/0B5F6F4781A641089707868B8782E926/9606 2.再次上線6380節點,發現,6380節點成為了新的主節點的從節點 https://note.youdao.com/yws/public/resource/91d12014a4ca13af8e12ed980b727311/xmlnote/96011FE9DB1545B3A1EA176A334A1D9D/9609 5.3.4 結論 Sentinel哨兵模式,確實能實作自動故障切換,提供穩定的服務, 5.3.5 注意事項 如果哨兵和redis節點不在同一臺服務器上,需要注意IP系結的問題, 1.主從模型,所有的節點,使用ip系結 https://note.youdao.com/yws/public/resource/91d12014a4ca13af8e12ed980b727311/xmlnote/D4F7E7D1DED846D8AD9E424E5F3A6431/9625 2.所有的哨兵,也都使用ip去系結主機 https://note.youdao.com/yws/public/resource/91d12014a4ca13af8e12ed980b727311/xmlnote/946B31EB44244924B9CF6C4EAC96A56C/9629 3.所有的哨兵,都是通過主節點的ip,去監控主從模型 https://note.youdao.com/yws/public/resource/91d12014a4ca13af8e12ed980b727311/xmlnote/2C56C500D64D4283995B3AE136B77B3C/9632

6.Redis-cluster集群

6.1 哨兵模式的缺陷

在哨兵模式中,仍然只有一個Master節點,當并發寫請求較大時,哨兵模式并不能緩解寫壓力, 只有主節點才具有寫能力,那如果在一個集群中,能夠配置多個主節點,就可以緩解寫壓力了,這就是redis-cluster集群模式,  

6.2 Redis-cluster集群概念

1.由多個Redis服務器組成的分布式網路服務集群; 2.集群之中有多個Master主節點,每一個主節點都可讀可寫; 3.節點之間會互相通信,兩兩相連; 4.Redis集群無中心節點,   https://note.youdao.com/yws/public/resource/91d12014a4ca13af8e12ed980b727311/xmlnote/168BF7B352BB4A92AE407A222771CC4F/9648

6.3集群節點復制

https://note.youdao.com/yws/public/resource/91d12014a4ca13af8e12ed980b727311/xmlnote/820C8CE361E843F6BE90FB38F8253326/9651 在Redis-Cluster集群中,可以給每一個主節點添加從節點,主節點和從節點直接遵循主從模型的特性,當用戶需要處理更多讀請求的時候,添加從節點可以擴展系統的讀性能,  

6.4 故障轉移

Redis集群的主節點內置了類似Redis Sentinel的節點故障檢測和自動故障轉移功能,當集群中的某個主節點下線時,集群中的其他在線主節點會注意到這一點,并對已下線的主節點進行故障轉移, https://note.youdao.com/yws/public/resource/91d12014a4ca13af8e12ed980b727311/xmlnote/D849C91B9A4D41139BC3B054113027BF/9659 集群進行故障轉移的方法和Redis Sentinel進行故障轉移的方法基本一樣,不同的是,在集群里面,故障轉移是由集群中其他在線的主節點負責進行的,所以集群不必另外使用Redis Sentinel,  

6.5 集群分片策略

Redis-cluster分片策略,是用來解決key存盤位置的, 集群將整個資料庫分為16384個槽位slot,所有key-value資料都存盤在這些slot中的某一個上,一個slot槽位可以存放多個資料,key的槽位計算公式為:slot_number=crc16(key)%16384,其中crc16為16位的回圈冗余校驗和函式, 集群中的每個主節點都可以處理0個至16383個槽,當16384個槽都有某個節點在負責處理時,集群進入上線狀態,并開始處理客戶端發送的資料命令請求,

https://note.youdao.com/yws/public/resource/91d12014a4ca13af8e12ed980b727311/xmlnote/C8A3DECF6D9346E3A8DF382ED78D379A/9667

6.6 集群redirect轉向

由于Redis集群無中心節點,請求會隨機發給任意主節點,主節點只會處理自己負責槽位的命令請求,其它槽位的命令請求,該主節點會回傳客戶端一個轉向錯誤,客戶端根據錯誤中包含的地址和埠重新向正確的負責的主節點發起命令請求, https://note.youdao.com/yws/public/resource/91d12014a4ca13af8e12ed980b727311/xmlnote/0643C468D3544F7C8BE10A97921166FF/9673

6.7 集群搭建

6.7.1準備作業

1.安裝ruby環境 redis集群管理工具redis-trib.rb依賴ruby環境,首先需要安裝ruby環境

yum -y install ruby yum -y install rubygems

 

  2.安裝ruby和redis的介面程式 拷貝redis-3.0.0.gem至/usr/local下,執行安裝:
gem install /usr/local/redis-3.0.0.gem

6.7.2 集群規劃

1.Redis集群最少需要6個節點,可以分布在一臺或者多臺主機上, 本次搭建在一臺主機上創建偽分布式集群,不同的埠表示不同的redis節點,如下: 主節點:192.168.56.3:7001 192.168.56.3:7002 192.168.56.3:7003 從節點:192.168.56.3:7004 192.168.56.3:7005 192.168.56.3:7006   2.在/usr/local/redis下創建redis-cluster目錄,在其下創建7001、7002......7006目錄,如下:

mkdir -p redis/redis-cluster mkdir -v 7001 7002 7003 7004 7005 7006
  3.將redis解壓路徑下的組態檔redis.conf,依次拷貝到每個700X目錄內,并修改每個700X目錄下的redis.conf組態檔: 必選配置: port 700X bind ip(當前主機ip:192.168.xxx.xxx) cluster-enabled yes (啟動redis-cluster集群模式) 建議配置: daemonized yes logfile /usr/local/redis/redis-cluster/700X/node.log  

6.7.3 啟動每個結點redis服務

依次以700X下的redis.conf,啟動redis節點,(必須指定redis.conf檔案)
cd 700x && redis-server ./redis.conf
 

6.7.4 執行創建集群命令

進入到redis原始碼存放目錄redis/redis-4.10.3/src下,執行redis-trib.rb,此腳本是ruby腳本,它依賴ruby環境,

./redis-trib.rb create --replicas 1 192.168.192.128:7001 192.168.192.128:7002 192.168.192.128:7003 192.168.192.128:7004 192.168.192.128:7005 192.168.192.128:7006

 

其中--replicas 1 表示為每個主節點創建1個子節點   創建程序如下: https://note.youdao.com/yws/public/resource/91d12014a4ca13af8e12ed980b727311/xmlnote/962697712A7548E494F9C382D50B2A98/9743

6.7.5 查詢集群資訊

集群創建成功登陸任意redis結點查詢集群中的節點情況,
./redis-cli -c -h ip -p 埠
說明: -c表示以集群方式連接redis, -h指定ip地址, -p指定埠號 https://note.youdao.com/yws/public/resource/91d12014a4ca13af8e12ed980b727311/xmlnote/C95133E8998245FCA81F692C03D4BB7A/9738 cluster nodes 查詢集群結點資訊; cluster info 查詢集群狀態信,  

6.8 集群管理

6.8.1添加主節點

6.8.1.1節點規劃

集群創建成功后可以向集群中添加節點,下面是添加一個master主節點, 添加7007節點,參考6.7.2 集群結點規劃添加一個“7007”目錄作為新節點, 集群添加節點命令:./redis-trib.rb add-node 新節點ip:埠 集群中任意節點ip:埠
./redis-trib.rb add-node  192.168.23.3:7007 192.168.23.3:7001

 

查看集群結點發現7007已添加到集群中 https://note.youdao.com/yws/public/resource/91d12014a4ca13af8e12ed980b727311/xmlnote/A59CEDDFC4114AE1A7933F4D64A2E5D8/9766  

6.8.1.2 hash槽重新分配

添加完新的主節點后,需要對主節點進行hash槽分配,這樣該主節才可以存盤資料, redis集群有16384個槽,被所有的主節點共同分配,通過查看集群結點可以看到槽占用情況,   給剛添加的7007結點分配槽: 第一步:連接上集群
./redis-trib.rb reshard 192.168.192.128:7001(連接集群中任意一個可用節點都行)
第二步:輸入要分配的槽數量 https://note.youdao.com/yws/public/resource/91d12014a4ca13af8e12ed980b727311/xmlnote/84A757AA571341FBA5ED55F5A7CE1C36/9778 第三步:輸入接收槽的節點id https://note.youdao.com/yws/public/resource/91d12014a4ca13af8e12ed980b727311/xmlnote/BC16E1FBB463479BA852B06E06E48A67/9781   https://note.youdao.com/yws/public/resource/91d12014a4ca13af8e12ed980b727311/xmlnote/1DD22CF9BBDB4F5680BCDF65A0D7A912/9783 第四步:輸入源節點id https://note.youdao.com/yws/public/resource/91d12014a4ca13af8e12ed980b727311/xmlnote/6DEE7BA3F8B141009DC701200156A93F/9787 這里輸入all,表示從所有其它主節點中分配, 第五步:輸入yes開始移動槽到目標結點id https://note.youdao.com/yws/public/resource/91d12014a4ca13af8e12ed980b727311/xmlnote/1E3BE08189044C90B09094DB648FF63D/9793  

6.8.2 添加從節點

集群創建成功后可以向集群中添加節點,下面是添加一個slave從節點, 添加7008從結點,將7008作為7007的從結點,   新增從節點命令格式: ./redis-trib.rb add-node --slave --master-id masterID newNodIP:port MasterIP:port masterID 主節點id,從cluster nodes資訊中查看 newNodIP:port 新增節點的ip:埠 MasterIP:port 主節點的ip:埠 注意: 如果原來該結點在集群中的配置資訊已經生成cluster-config-file指定的組態檔中(如果cluster-config-file沒有指定則默認為nodes.conf),這時可能會報錯:   [ERR] Node XXXXXX is not empty. Either the node already knows other nodes (check with CLUSTER NODES) or contains some key in database 0 解決方法:洗掉生成的組態檔nodes.conf,洗掉后再執行./redis-trib.rb add-node指令,

6.8.3 洗掉結點:

洗掉節點命令格式:./redis-trib.rb del-node nodeIP:port nodeID nodeIP:port 待洗掉節點的ip:埠 nodeID 待洗掉節點的id,從cluster node中查看   注意,洗掉已經占有hash槽的結點會失敗,報錯如下: https://note.youdao.com/yws/public/resource/91d12014a4ca13af8e12ed980b727311/xmlnote/9D79E1207022479985BFD16496781ED9/9816   需要將該結點占用的hash槽分配出去(參考6.8.1.2 hash槽重新分配),  

7. java程式連接redis集群

7.1 連接步驟

第一步:創建專案,匯入jar包 https://note.youdao.com/yws/public/resource/91d12014a4ca13af8e12ed980b727311/xmlnote/D032723D29214B0E9210CEF3A74A0B0F/9834 第二步:創建redis集群的客戶端 根據集群redirect轉向的原理(詳見6.6 集群redirect轉向),我們在創建redis集群的客戶端時需要配置所有redis集群的節點,使客戶端可以找到負責處理對應槽位命令的主節點

package
com.gjs.jedis.test; import java.util.HashSet; import java.util.Set; import redis.clients.jedis.HostAndPort; import redis.clients.jedis.JedisCluster; public class TestJedisCluster { public static void main(String[] args) { //創建jedidsCluster客戶端 //創建一個set集合,用來封裝所有redis節點的資訊 Set<HostAndPort> nodes = new HashSet<HostAndPort>(); nodes.add(new HostAndPort("192.168.192.128", 7001)); nodes.add(new HostAndPort("192.168.192.128", 7002)); nodes.add(new HostAndPort("192.168.192.128", 7003)); nodes.add(new HostAndPort("192.168.192.128", 7004)); nodes.add(new HostAndPort("192.168.192.128", 7005)); nodes.add(new HostAndPort("192.168.192.128", 7006)); JedisCluster jedis = new JedisCluster(nodes); jedis.set("name", "zhangsan"); System.out.println("姓名:"+jedis.get("name")); jedis.close(); } }

7.2 注意事項:

連接Redis集群時,需要修改防火墻,開放每一個redis節點的埠, 編輯防火墻組態檔 vi /etc/sysconfig/iptables 編輯防火墻組態檔 vi /etc/sysconfig/iptables 說明:如果要開放一個范圍的埠,可以使用冒號來分割,即: 7001:7008,表示開發7001-7008之間所有的埠 防火墻重啟命令: service iptables restart   原文鏈接:https://www.cnblogs.com/gaojinshun/p/15472045.html 作者:ki16 出處:https://www.cnblogs.com/gaojinshun/ 本文著作權歸作者和博客園共有,歡迎轉載,但未經作者同意必須在文章頁面給出原文連接,否則保留追究法律責任的權利,

轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/338903.html

標籤:Java

上一篇:面試官:Java 反射機制的應用場景?

下一篇:SpringBoot 使用 slf4j+logback 進行日志管理

標籤雲
其他(157675) Python(38076) JavaScript(25376) Java(17977) C(15215) 區塊鏈(8255) C#(7972) AI(7469) 爪哇(7425) MySQL(7132) html(6777) 基礎類(6313) sql(6102) 熊猫(6058) PHP(5869) 数组(5741) R(5409) Linux(5327) 反应(5209) 腳本語言(PerlPython)(5129) 非技術區(4971) Android(4554) 数据框(4311) css(4259) 节点.js(4032) C語言(3288) json(3245) 列表(3129) 扑(3119) C++語言(3117) 安卓(2998) 打字稿(2995) VBA(2789) Java相關(2746) 疑難問題(2699) 细绳(2522) 單片機工控(2479) iOS(2429) ASP.NET(2402) MongoDB(2323) 麻木的(2285) 正则表达式(2254) 字典(2211) 循环(2198) 迅速(2185) 擅长(2169) 镖(2155) 功能(1967) .NET技术(1958) Web開發(1951) python-3.x(1918) HtmlCss(1915) 弹簧靴(1913) C++(1909) xml(1889) PostgreSQL(1872) .NETCore(1853) 谷歌表格(1846) Unity3D(1843) for循环(1842)

熱門瀏覽
  • 【C++】Microsoft C++、C 和匯編程式檔案

    ......

    uj5u.com 2020-09-10 00:57:23 more
  • 例外宣告

    相比于斷言適用于排除邏輯上不可能存在的狀態,例外通常是用于邏輯上可能發生的錯誤。 例外宣告 Item 1:當函式不可能拋出例外或不能接受拋出例外時,使用noexcept 理由 如果不打算拋出例外的話,程式就會認為無法處理這種錯誤,并且應當盡早終止,如此可以有效地阻止例外的傳播與擴散。 示例 //不可 ......

    uj5u.com 2020-09-10 00:57:27 more
  • Codeforces 1400E Clear the Multiset(貪心 + 分治)

    鏈接:https://codeforces.com/problemset/problem/1400/E 來源:Codeforces 思路:給你一個陣列,現在你可以進行兩種操作,操作1:將一段沒有 0 的區間進行減一的操作,操作2:將 i 位置上的元素歸零。最終問:將這個陣列的全部元素歸零后操作的最少 ......

    uj5u.com 2020-09-10 00:57:30 more
  • UVA11610 【Reverse Prime】

    本人看到此題沒有翻譯,就附帶了一個自己的翻譯版本 思考 這一題,它的第一個要求是找出所有 $7$ 位反向質數及其質因數的個數。 我們應該需要質數篩篩選1~$10^{7}$的所有數,這里就不慢慢介紹了。但是,重讀題,我們突然發現反向質數都是 $7$ 位,而將它反過來后的數字卻是 $6$ 位數,這就說明 ......

    uj5u.com 2020-09-10 00:57:36 more
  • 統計區間素數數量

    1 #pragma GCC optimize(2) 2 #include <bits/stdc++.h> 3 using namespace std; 4 bool isprime[1000000010]; 5 vector<int> prime; 6 inline int getlist(int ......

    uj5u.com 2020-09-10 00:57:47 more
  • C/C++編程筆記:C++中的 const 變數詳解,教你正確認識const用法

    1、C中的const 1、區域const變數存放在堆疊區中,會分配記憶體(也就是說可以通過地址間接修改變數的值)。測驗代碼如下: 運行結果: 2、全域const變數存放在只讀資料段(不能通過地址修改,會發生寫入錯誤), 默認為外部聯編,可以給其他源檔案使用(需要用extern關鍵字修飾) 運行結果: ......

    uj5u.com 2020-09-10 00:58:04 more
  • 【C++犯錯記錄】VS2019 MFC添加資源不懂如何修改資源宏ID

    1. 首先在資源視圖中,添加資源 2. 點擊新添加的資源,復制自動生成的ID 3. 在解決方案資源管理器中找到Resource.h檔案,編輯,使用整個專案搜索和替換的方式快速替換 宏宣告 4. Ctrl+Shift+F 全域搜索,點擊查找全部,然后逐個替換 5. 為什么使用搜索替換而不使用屬性視窗直 ......

    uj5u.com 2020-09-10 00:59:11 more
  • 【C++犯錯記錄】VS2019 MFC不懂的批量添加資源

    1. 打開資源頭檔案Resource.h,在其中預先定義好宏 ID(不清楚其實ID值應該設定多少,可以先新建一個相同的資源項,再在這個資源的ID值的基礎上遞增即可) 2. 在資源視圖中選中專案資源,按F7編輯資源檔案,按 ID 型別 相對路徑的形式添加 資源。(別忘了先把檔案拷貝到專案中的res檔案 ......

    uj5u.com 2020-09-10 01:00:19 more
  • C/C++編程筆記:關于C++的參考型別,專供新手入門使用

    今天要講的是C++中我最喜歡的一個用法——參考,也叫別名。 參考就是給一個變數名取一個變數名,方便我們間接地使用這個變數。我們可以給一個變數創建N個參考,這N + 1個變數共享了同一塊記憶體區域。(參考型別的變數會占用記憶體空間,占用的記憶體空間的大小和指標型別的大小是相同的。雖然參考是一個物件的別名,但 ......

    uj5u.com 2020-09-10 01:00:22 more
  • 【C/C++編程筆記】從頭開始學習C ++:初學者完整指南

    眾所周知,C ++的學習曲線陡峭,但是花時間學習這種語言將為您的職業帶來奇跡,并使您與其他開發人員區分開。您會更輕松地學習新語言,形成真正的解決問題的技能,并在編程的基礎上打下堅實的基礎。 C ++將幫助您養成良好的編程習慣(即清晰一致的編碼風格,在撰寫代碼時注釋代碼,并限制類內部的可見性),并且由 ......

    uj5u.com 2020-09-10 01:00:41 more
最新发布
  • Rust中的智能指標:Box<T> Rc<T> Arc<T> Cell<T> RefCell<T> Weak

    Rust中的智能指標是什么 智能指標(smart pointers)是一類資料結構,是擁有資料所有權和額外功能的指標。是指標的進一步發展 指標(pointer)是一個包含記憶體地址的變數的通用概念。這個地址參考,或 ” 指向”(points at)一些其 他資料 。參考以 & 符號為標志并借用了他們所 ......

    uj5u.com 2023-04-20 07:24:10 more
  • Java的值傳遞和參考傳遞

    值傳遞不會改變本身,參考傳遞(如果傳遞的值需要實體化到堆里)如果發生修改了會改變本身。 1.基本資料型別都是值傳遞 package com.example.basic; public class Test { public static void main(String[] args) { int ......

    uj5u.com 2023-04-20 07:24:04 more
  • [2]SpinalHDL教程——Scala簡單入門

    第一個 Scala 程式 shell里面輸入 $ scala scala> 1 + 1 res0: Int = 2 scala> println("Hello World!") Hello World! 檔案形式 object HelloWorld { /* 這是我的第一個 Scala 程式 * 以 ......

    uj5u.com 2023-04-20 07:23:58 more
  • 理解函式指標和回呼函式

    理解 函式指標 指向函式的指標。比如: 理解函式指標的偽代碼 void (*p)(int type, char *data); // 定義一個函式指標p void func(int type, char *data); // 宣告一個函式func p = func; // 將指標p指向函式func ......

    uj5u.com 2023-04-20 07:23:52 more
  • Django筆記二十五之資料庫函式之日期函式

    本文首發于公眾號:Hunter后端 原文鏈接:Django筆記二十五之資料庫函式之日期函式 日期函式主要介紹兩個大類,Extract() 和 Trunc() Extract() 函式作用是提取日期,比如我們可以提取一個日期欄位的年份,月份,日等資料 Trunc() 的作用則是截取,比如 2022-0 ......

    uj5u.com 2023-04-20 07:23:45 more
  • 一天吃透JVM面試八股文

    什么是JVM? JVM,全稱Java Virtual Machine(Java虛擬機),是通過在實際的計算機上仿真模擬各種計算機功能來實作的。由一套位元組碼指令集、一組暫存器、一個堆疊、一個垃圾回收堆和一個存盤方法域等組成。JVM屏蔽了與作業系統平臺相關的資訊,使得Java程式只需要生成在Java虛擬機 ......

    uj5u.com 2023-04-20 07:23:31 more
  • 使用Java接入小程式訂閱訊息!

    更新完微信服務號的模板訊息之后,我又趕緊把微信小程式的訂閱訊息給實作了!之前我一直以為微信小程式也是要企業才能申請,沒想到小程式個人就能申請。 訊息推送平臺🔥推送下發【郵件】【短信】【微信服務號】【微信小程式】【企業微信】【釘釘】等訊息型別。 https://gitee.com/zhongfuch ......

    uj5u.com 2023-04-20 07:22:59 more
  • java -- 緩沖流、轉換流、序列化流

    緩沖流 緩沖流, 也叫高效流, 按照資料型別分類: 位元組緩沖流:BufferedInputStream,BufferedOutputStream 字符緩沖流:BufferedReader,BufferedWriter 緩沖流的基本原理,是在創建流物件時,會創建一個內置的默認大小的緩沖區陣列,通過緩沖 ......

    uj5u.com 2023-04-20 07:22:49 more
  • Java-SpringBoot-Range請求頭設定實作視頻分段傳輸

    老實說,人太懶了,現在基本都不喜歡寫筆記了,但是網上有關Range請求頭的文章都太水了 下面是抄的一段StackOverflow的代碼...自己大修改過的,寫的注釋挺全的,應該直接看得懂,就不解釋了 寫的不好...只是希望能給視頻網站開發的新手一點點幫助吧. 業務場景:視頻分段傳輸、視頻多段傳輸(理 ......

    uj5u.com 2023-04-20 07:22:42 more
  • Windows 10開發教程_編程入門自學教程_菜鳥教程-免費教程分享

    教程簡介 Windows 10開發入門教程 - 從簡單的步驟了解Windows 10開發,從基本到高級概念,包括簡介,UWP,第一個應用程式,商店,XAML控制元件,資料系結,XAML性能,自適應設計,自適應UI,自適應代碼,檔案管理,SQLite資料庫,應用程式到應用程式通信,應用程式本地化,應用程式 ......

    uj5u.com 2023-04-20 07:22:35 more