主頁 > 後端開發 > Redis--部署操作

Redis--部署操作

2021-01-05 06:35:30 後端開發

1.Redis

1.1 安裝

  • 當前ubuntu虛擬機中已經安裝好了redis,以下步驟可以跳過
  • 以后自己安裝程序如下:redis下載鏈接:x 指的是版本號 http://download.redis.io/releases/redis-x.x.x.tar.gz
  • step1:下載

    wget http://download.redis.io/releases/redis-x.x.x.tar.gz

    

  • step2:解壓

    tar xzf redis-x.x.x.tar.gz

  • step3:移動,放到usr/local?錄下

    sudo mv ./redis-x.x.x /usr/local/redis/

  • step4:進?redis?錄

    cd /usr/local/redis/

  • step5:生成

    sudo make

    

 

  • step6:測驗,這段運?時間會較?

    sudo make test

    

 

  • step7:安裝,將redis的命令安裝到/usr/local/bin/?錄

    sudo make install

  • step8:安裝完成后,我們進入目錄/usr/local/bin中查看

    cd /usr/local/bin

    ls -all

    

    redis-server redis服務器

    redis-cli redis命令列客戶端

    redis-benchmark redis性能測驗工具

    redis-check-aof AOF檔案修復工具

    redis-check-rdb RDB檔案檢索工具

  • step9:配置?件,移動到/etc/?錄下

    配置?件?錄為/usr/local/redis/redis.conf

    sudo cp /usr/local/redis/redis.conf /etc/redis/

  • step9:其他補充

    Mac 上安裝 Redis:https://brew.sh/

    使用 brew 安裝 Redis:https://www.cnblogs.com/cloudshadow/p/mac_brew_install_redis.html

 

1.2 配置

  • Redis的配置資訊在/etc/redis/redis.conf

    查看  sudo vi /etc/redis/redis.conf

  • 系結ip:如果需要遠程訪問,可將此?注釋,或系結?個真實ip
    • bind 127.0.0.1
  • 端?:默認為6379
    • port 6379
  • 是否以守護行程運?
    • 如果以守護行程運行,則不會在命令?阻塞,類似于服務
    • 如果以?守護行程運?,則當前終端被阻塞
    • 設定為yes表示守護行程,設定為no表示?守護行程
    • 推薦設定為yes   daemonize yes
  • 資料?件
    • dbfilename dump.rdb

 

  • 資料?件存盤路徑
    • dir /var/lib/redis  
  • ?志?件
    • logfile "/var/log/redis/redis-server.log"
  • 資料庫,默認有16個
    • database 16
  • 主從復制,類似于雙機備份
    • slaveof  host  port

 

  • 參考資料
    • redis配置資訊http://blog.csdn.net/ljphilp/article/details/52934933

 

1.3 服務器端和客戶端命令

  1.3.1 服務器端

  • 服務器端的命令為redis-server   
  • 可以使?help查看幫助?檔
    • redis-server --help
  • 個人習慣
    • ps aux | grep redis 查看redis服務器行程
    • sudo kill -9 pid 殺死redis服務器
    • sudo redis-server /etc/redis/redis.conf 指定加載的組態檔

  1.3.2 客戶端

  • 客戶端的命令為redis-cli
  • 可以使?help查看幫助?檔
    • redis-cli --help
  • 連接redis
    • redis-cli

      

  • 運?測驗命令
    • ping
  • 切換資料庫
  • 資料庫沒有名稱,默認有16個,通過0-15來標識,連接redis默認選擇第一個資料庫
    • select 10

 

1.4 資料操作

 

鍵命令

        1)查看所有鍵:keys *
        2)查看名稱中包含a的鍵:keys a*
        3)判斷鍵是否存在,如果存在回傳1,不存在回傳0:exists key1
        4)查看鍵對應的value的型別:type key
        5)洗掉鍵及對應的值:del key1 key2 ...
        6)設定過期時間,以秒為單位:expire key seconds
        7)查看有效時間,以秒為單位:ttl key
鍵命令  string
hash型別:
    
    hash?于存盤物件,物件的結構為屬性、值
    值的型別為string

    1、增加、修改
    
        設定單個屬性:hset key field value
        設定多個屬性:hmset key field1 value1 field2 value2 ...
           
    2、獲取
        
        獲取指定鍵所有的屬性:hkeys key
        獲取所有屬性的值:hvals key
        獲取?個屬性的值:hget key field
        獲取多個屬性的值:hmget key field1 field2 ... 

    3、洗掉
        
        洗掉整個hash鍵及值,使?del命令:hdel key ...
hash
list型別
    
    串列的元素型別為string
    按照插?順序排序

    1、增加
        
        在左側插?資料:lpush key value1 value2 ...
        在右側插?資料:rpush key value1 value2 ...
        在指定元素的前或后插?新元素:
               linsert key before或after 現有元素 新元素
    
    2、獲取
        
        回傳串列?指定范圍內的元素:range key start stop
        設定指定元素的值:lset key index value
    
    3、洗掉
        
        洗掉指定元素
            將串列中前count次出現的值為value的元素移除
            count > 0: 從頭往尾移除
            count < 0: 從尾往頭移除
            count = 0: 移除所有

        lrem key count value

    4、截取修剪

        修剪(截取) 在[start stop]區間內的元素,區間外的元素全部洗掉
            ltrim key start stop
list
set型別
    1)?序集合
    2)元素為string型別
    3)元素具有唯?性,不重復
    4)說明:對于集合沒有修改操作


    1、增加
        
        1)添加元素:sadd key member1 member2 ...

    2、獲取

        1)回傳所有的元素:smembers key

    3、洗掉

        1)洗掉指定元素:srem key values
set
zset型別
    1)sorted set,有序集合
    2)元素為string型別
    3)元素具有唯?性,不重復
    4)每個元素都會關聯?個double型別的score,
         表示權重,通過權重將元素從?到?排序 
    5)說明:沒有修改操作

    1、增加
    
        1)添加:zadd key score1 member1 score2 member2 ...

    2、獲取
        
        1)回傳指定范圍內的元素:zrange key start stop
        2)獲取鍵a1的集合中權限值在min和max之間的成員
                zrangebyscore a1 5 6
        3)獲取鍵a2的集合中元素zhangsan的權重
                zscore a4 zhangsan
    
    3、洗掉
        
        1)洗掉指定元素:zrem key member1 member2 ...
        2)洗掉權重在指定范圍的元素:zremrangebyscore key min max
zset

 

1.5 與python互動

  安裝包

  安裝Redis的有3種方式https://github.com/andymccurdy/redis-py

  • 第一種:進?虛擬環境,聯?安裝包redis
    • pip install redis
  • 第二種:進?虛擬環境,聯?安裝包redis
    • easy_install redis
  • 第三種:到中?官?-客戶端下載redis包的原始碼,使?原始碼安裝
    • 一步步執行 wget https://github.com/andymccurdy/redis-py/archive/master.zip
    • unzip master.zip
    • cd redis-py-master
    • sudo python setup.py install

  呼叫模塊

  • 引?模塊
    • from redis import StrictRedis
  • 這個模塊中提供了StrictRedis物件,?于連接redis服務器,并按照不同型別提供 了不同?法,進?互動操作

  

  1.5.1  StrictRedis物件方法

      • 通過init創建物件,指定引數host、port與指定的服務器和端?連接,host默認為localhost,port默認為6379,db默認為0
      • sr = StrictRedis(host='localhost', port=6379, db=0)
        
        sr=StrictRedis()

         

      • 根據不同的型別,擁有不同的實體?法可以調?,與前?學的redis命令對應,?法需要的引數與命令的引數?致  
        • 1、exists
          2、type
          3、delete
          4、expire
          5、getrange
          6、ttl
          keys
        • 1、set
          2、setex
          3、mset
          4、append
          5、get
          6、mget
          7、key
          string
        • 1、hset
          2、hmset
          3、hkeys
          4、hget
          5、hmget
          6、hvals
          7、hdel
          hash
        • 1、lpush
          2、rpush
          3、linsert
          4、lrange
          5、lset
          6、lrem
          list
        • 1、sadd
          2、smembers
          3、srem
          set
        • 1、zadd
          2、zrange
          3、zrangebyscore
          4、zscore
          5、zrem
          6、zremrangebyscore
          zset

 

  1.5.2  舉例 String

      • ?法set,添加鍵、值,如果添加成功則回傳True,如果添加失敗則回傳False
        撰寫代碼如下:
        
        
        from redis import *
        if __name__=="__main__":
            try:
                #創建StrictRedis物件,與redis服務器建?連接
                sr=StrictRedis()
                #添加鍵name,值為itheima
                result=sr.set('name','itheima')
                #輸出回應結果,如果添加成功則回傳True,否則回傳False
                print(result)
            except Exception as e:
                print(e)
        string--增加
      • 1)?法get,添加鍵對應的值,如果鍵存在則回傳對應的值,
             如果鍵不存在則回傳None
        
        撰寫代碼如下:
        
        
        from redis import *
        if __name__=="__main__":
            try:
                #創建StrictRedis物件,與redis服務器建?連接
                sr=StrictRedis()
                #獲取鍵name的值
                result = sr.get('name')
                #輸出鍵的值,如果鍵不存在則回傳None
                print(result)
            except Exception as e:
                print(e)    
        string--獲取
      • 1)?法set,如果鍵已經存在則進?修改,如果鍵不存在則進?添加
        
        撰寫代碼如下:
        
        
        from redis import *
        if __name__=="__main__":
            try:
                #創建StrictRedis物件,與redis服務器建?連接
                sr=StrictRedis()
                #設定鍵name的值,如果鍵已經存在則進?修改,如果鍵不存在則進?添加
                result = sr.set('name','itcast')
                #輸出回應結果,如果操作成功則回傳True,否則回傳False
                print(result)
            except Exception as e:
                print(e)
        string--修改
      • 1)?法delete,洗掉鍵及對應的值,如果洗掉成功則回傳受影響的鍵數,
             否則回傳0
        
        撰寫代碼如下:
        
        
        from redis import *
        if __name__=="__main__":
            try:
                #創建StrictRedis物件,與redis服務器建?連接
                sr=StrictRedis()
                #設定鍵name的值,如果鍵已經存在則進?修改,如果鍵不存在則進?添加
                result = sr.delete('name')
                #輸出回應結果,如果洗掉成功則回傳受影響的鍵數,否則則回傳0
                print(result)
            except Exception as e:
                print(e)
        string--洗掉
      • 1)?法keys,根據正則運算式獲取鍵
        
        撰寫代碼如下:
        
        
        from redis import *
        if __name__=="__main__":
            try:
                #創建StrictRedis物件,與redis服務器建?連接
                sr=StrictRedis()
                #獲取所有的鍵
                result=sr.keys()
                #輸出回應結果,所有的鍵構成?個串列,如果沒有鍵則回傳空串列
                print(result)
            except Exception as e:
                print(e)
        string--獲取鍵

         

1.6 搭建主從

  1.6.1 主從概念

      • ?個master可以擁有多個slave,?個slave?可以擁有多個slave,如此下去,形成了強?的多級服務器集群架構
      • master用來寫資料,slave用來讀資料,經統計:網站的讀寫比率是10:1
      • 通過主從配置可以實作讀寫分離
      •  

         master和slave都是一個redis實體(redis服務)

  1.6.2 主從配置

      配置主
      • 查看當前主機的ip地址
        • ifconfig

 

      • 修改/etc/redis/redis.conf檔案

           sudo vi redis.conf
           bind 192.168.26.128

      • 重啟redis服務  

           sudo service redis stop
           sudo redis-server redis.conf

  配置從

      • 復制/etc/redis/redis.conf檔案   

           sudo cp redis.conf ./slave.conf

      • 修改redis/slave.conf檔案  

           sudo vi slave.conf    

      • 編輯內容  

           bind 192.168.26.128   

           port 6378

           slaveof 192.168.26.128 6379  

      • redis服務

           sudo redis-server slave.conf

      • 查看主從關系  

           redis-cli -h 192.168.26.128 info Replication

  1.6.3 資料操作

      • 在master和slave分別執?info命令,查看輸出資訊 進入主客戶端

           redis-cli -h 192.168.26.128 -p 6379  

      • 進入從的客戶端

           redis-cli -h 192.168.26.128 -p 6378

      • 在master上寫資料

           set aa aa

           

      • 在slave上讀資料

           get aa

  1.6.4 與python互動

      • REDIS = {
            'Master':{
                'host':'192.168.56.100',
                'port': '6379',
                'db': 0
            },
            'Slave':{
                'host':'192.168.56.100',
                'port': '6378',
                'db': 0
            },
        }
        
        
        class MSRedis(object):
            '''讀寫分離客戶端(只針對程式中用到的命令)'''
            def __init__(self,conf):
                self.master = StrictRedis(**conf['Master'])
                self.slave = StrictRedis(**conf['Slave'])
                self.read_commands = [
                    'ttl', 'exist', 'expire', 'get', 'keys',
                    'hget', 'hgetall', 'hkeys', 'hmget',
                    'sismember', 'smembers', 'sdiff', 'sinter', 'sunion'
                    'zrevrange', 'zrevrangebyscore', 'zrevrank', 'zscore'
                ]
        
            def __getattribute__(self, name):
                if name in ['master', 'slave', 'read_commands']:
                    return object.__getattribute__(self, name)
                elif name in self.read_commands:
                    print('選擇了從庫')
                    return self.slave.__getattribute__(name)
                else:
                    print('選擇了主庫')
                    return self.master.__getattribute__(name)
        
        
        rds = MSRedis(REDIS)
        
        res = rds.get('name2')
        # res = rds.set('name2','lisi')
        print(res)
        redis_test.py

            

1.7 搭建集群

    1.7.1 配置機器1

      • 在演示中,192.168.56.100為當前ubuntu機器的ip
      • 在192.168.56.100上進?Desktop?錄,創建conf?錄
      • 在conf?錄下創建?件7000.conf,編輯內容如下
        • port 7000
          bind 192.168.56.100
          daemonize yes
          pidfile 7000.pid
          cluster-enabled yes
          cluster-config-file 7000_node.conf
          cluster-node-timeout 15000
          appendonly yes
          7000.conf
      • 在conf?錄下創建?件7001.conf,編輯內容如下
        • port 7001
          bind 192.168.56.100
          daemonize yes
          pidfile 7001.pid
          cluster-enabled yes
          cluster-config-file 7001_node.conf
          cluster-node-timeout 15000
          appendonly yes
          7001.conf
      • 在conf?錄下創建?件7002.conf,編輯內容如下
        • port 7002
          bind 192.168.56.100
          daemonize yes
          pidfile 7002.pid
          cluster-enabled yes
          cluster-config-file 7002_node.conf
          cluster-node-timeout 15000
          appendonly yes
          7002.conf
      • 總結:三個?件的配置區別在port、pidfile、cluster-config-file三項
      • 使?配置?件啟動redis服務
        • redis-server 7000.conf
          redis-server 7001.conf
          redis-server 7002.conf

           

      • 查看行程如下圖

    1.7.2 配置機器2

      • 在演示中,192.168.56.100為當前ubuntu機器的ip
      • 在192.168.56.100上進?Desktop?錄,創建conf?錄
      • 在conf?錄下創建?件7003.conf,編輯內容如下
        • port 7003
          bind 192.168.56.100
          daemonize yes
          pidfile 7003.pid
          cluster-enabled yes
          cluster-config-file 7003_node.conf
          cluster-node-timeout 15000
          appendonly yes
          7003.con  
      • 在conf?錄下創建?件7004.conf,編輯內容如下
        • port 7004
          bind 192.168.56.100
          daemonize yes
          pidfile 7004.pid
          cluster-enabled yes
          cluster-config-file 7004_node.conf
          cluster-node-timeout 15000
          appendonly yes
          7004.conf
      • 在conf?錄下創建?件7005.conf,編輯內容如下
        • port 7005
          bind 192.168.56.100
          daemonize yes
          pidfile 7005.pid
          cluster-enabled yes
          cluster-config-file 7005_node.conf
          cluster-node-timeout 15000
          appendonly yes
          7005.conf
      • 總結:三個?件的配置區別在port、pidfile、cluster-config-file三項
      • 使?配置?件啟動redis服務
        • redis-server 7003.conf
          redis-server 7004.conf
          redis-server 7005.conf
      • 查看行程如下圖

    

    1.7.3 創建集群  

      • redis的安裝包中包含了redis-trib.rb,?于創建集群
      • 接下來的操作在192.168.56.100機器上進?
      • 將命令復制,這樣可以在任何?錄下調?此命令
      • sudo cp /usr/share/doc/redis-tools/examples/redis-trib.rb /usr/local/bin/
      • 安裝ruby環境,因為redis-trib.rb是?ruby開發的
      • sudo apt-get install ruby
      • 在提示資訊處輸?y,然后回?繼續安裝
      • 運?如下命令創建集群
      • redis-trib.rb create --replicas 1 192.168.56.100:7000 192.168.56.100:7001 192.168.56.100:7002 192.168.56.100:7003 192.168.56.100:7004 192.168.56.100:7005
      • 執?上?這個指令在某些機器上可能會報錯,主要原因是由于安裝的 ruby 不是最 新版本!
      • 天朝的防?墻導致?法下載最新版本,所以需要設定 gem 的源
      • 解決辦法如下
      • -- 先查看??的 gem 源是什么地址
        gem source -l -- 如果是https://rubygems.org/ 就需要更換
        -- 更換指令為
        gem sources --add https://gems.ruby-china.com/ --remove https://rubygems.org/
        -- 通過 gem 安裝 redis 的相關依賴
        sudo gem install redis
        -- 然后重新執?指令
      • redis-trib.rb create --replicas 1 192.168.56.100:7000 192.168.56.100:7001 192.168.56.100:7002 192.168.56.100:7003 192.168.56.100:7004 192.168.56.100:7005

         

      • 提示如下主從資訊,輸?yes后回?  
      • 提示完成,集群搭建成功

    

    1.7.4 資料驗證

      • 根據上圖可以看出,當前搭建的主服務器為7000、7001、7002,對應的從服務器是7003、7004、7005
      • 在192.168.56.100機器上連接7002,加引數-c表示連接到集群
      • redis-cli -h 172.16.179.131 -c -p 7002
      • 寫?資料
      • set name itheima
      • ?動跳到了7003服務器,并寫?資料成功
      • 在7003可以獲取資料,如果寫入資料又重定向到7000(負載均衡)

 

    

    1.7.5 在哪個服務器上寫資料:CRC16

      • redis cluster在設計的時候,就考慮到了去中?化,去中間件,也就是說,集群中 的每個節點都是平等的關系,都是對等的,每個節點都保存各?的資料和整個集 群的狀態,每個節點都和其他所有節點連接,?且這些連接保持活躍,這樣就保 證了我們只需要連接集群中的任意?個節點,就可以獲取到其他節點的資料
      • Redis集群沒有并使?傳統的?致性哈希來分配資料,?是采?另外?種叫做哈希 槽 (hash slot)的?式來分配的,redis cluster 默認分配了 16384 個slot,當我們 set?個key 時,會?CRC16演算法來取模得到所屬的slot,然后將這個key 分到哈 希槽區間的節點上,具體演算法就是:CRC16(key) % 16384,所以我們在測驗的 時候看到set 和 get 的時候,直接跳轉到了7000端?的節點
      • Redis 集群會把資料存在?個 master 節點,然后在這個 master 和其對應的salve 之間進?資料同步,當讀取資料時,也根據?致性哈希演算法到對應的 master 節 點獲取資料,只有當?個master 掛掉之后,才會啟動?個對應的 salve 節點,充 當 master
      • 需要注意的是:必須要3個或以上的主節點,否則在創建集群時會失敗,并且當存 活的主節點數?于總節點數的?半時,整個集群就?法提供服務了

   

    1.7.6 與python互動

      • from rediscluster import *
        
        if __name__ == '__main__':
          try:
            # 構建所有的節點,Redis會使?CRC16演算法,將鍵和值寫到某個節點上
            startup_nodes = [
                {'host': '192.168.56.100', 'port': '7000'},
                {'host': '192.168.56.100', 'port': '7001'},
                {'host': '192.168.56.100', 'port': '7002'},
                {'host': '192.168.56.100', 'port': '7003'},
                {'host': '192.168.56.100', 'port': '7004'},
                {'host': '192.168.56.100', 'port': '7005'},
            ]
            # 構建StrictRedisCluster物件
            src=https://www.cnblogs.com/laowang-wbh/archive/2021/01/04/RedisCluster(startup_nodes=startup_nodes,decode_responses=True) #decode_responses=True 回傳的內容自動decode一下
            # 設定鍵為name、值為itheima的資料
            result=src.set('name','zhangsan')
            print(result)
            # 獲取鍵為name
            name = src.get('name')
            print(name)
          except Exception as e:
            print(e)
        
        
        #1、存盤的位置不需要管 因為它是通過哈希自動分配到一個服務器上
        #2、現在我們開發只是要求高性能 還沒
        # 有高可用 崩潰了之后 有崩潰的處理方式 高可用交給運維去做
        redis_cluster.py

         

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

標籤:其他

上一篇:REDIS簡單動態字串

下一篇:springcloud學習(一)之Eureka

標籤雲
其他(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