debian系統redis-dump安裝

1. ?Ruby 環境?

Redis-dump 是一個 Ruby 工具,需先安裝 Ruby 和 RubyGems。

安裝命令?:

sudo apt update
sudo apt install ruby-full build-essential
[root@a29d39f5fd10:/opt/redis-dump/bin# apt install ruby-full build-essential
Reading package lists... Done
Building dependency tree... Done
Reading state information... Done
ruby-full is already the newest version (1:3.1).
build-essential is already the newest version (12.9).
0 upgraded, 0 newly installed, 0 to remove and 6 not upgraded.

2. ?編譯工具和開發庫?

某些 Ruby Gem 可能需要編譯本地擴展,需安裝構建工具和依賴庫:

sudo apt install libssl-dev libreadline-dev zlib1g-dev
root@a29d39f5fd10:/opt/redis-dump/bin#  apt install libssl-dev libreadline-dev zlib1g-dev
Reading package lists... Done
Building dependency tree... Done
Reading state information... Done
libssl-dev is already the newest version (3.0.16-1~deb12u1).
libreadline-dev is already the newest version (8.2-1.3).
zlib1g-dev is already the newest version (1:1.2.13.dfsg-1).
0 upgraded, 0 newly installed, 0 to remove and 6 not upgraded.
root@a29d39f5fd10:/opt/redis-dump/bin#  apt install libssl-dev libreadline-dev zlib1g-dev
Reading package lists... Done
Building dependency tree... Done
Reading state information... Done
libssl-dev is already the newest version (3.0.16-1~deb12u1).
libreadline-dev is already the newest version (8.2-1.3).
zlib1g-dev is already the newest version (1:1.2.13.dfsg-1).
0 upgraded, 0 newly installed, 0 to remove and 6 not upgraded.
root@a29d39f5fd10:/opt/redis-dump/bin#  apt install libssl-dev libreadline-dev zlib1g-dev -y
Reading package lists... Done
Building dependency tree... Done
Reading state information... Done
libssl-dev is already the newest version (3.0.16-1~deb12u1).
libreadline-dev is already the newest version (8.2-1.3).
zlib1g-dev is already the newest version (1:1.2.13.dfsg-1).
0 upgraded, 0 newly installed, 0 to remove and 6 not upgraded.

?作用?:

  • libssl-dev: SSL/TLS 支持。
  • libreadline-dev: 增強命令行交互功能。
  • zlib1g-dev: 壓縮庫支持。

3. ?安裝 redis-dump?

直接通過 RubyGems 安裝:

gem install redis-dump

root@a29d39f5fd10:/opt/redis-dump/bin# gem install redis-dump
Fetching redis-dump-0.6.1.gem
Successfully installed redis-dump-0.6.1
Parsing documentation for redis-dump-0.6.1
Installing ri documentation for redis-dump-0.6.1
Done installing documentation for redis-dump after 0 seconds
1 gem installed

驗證安裝

redis-dump -v
root@a29d39f5fd10:/opt/redis-dump/bin# redis-dump -v
<internal:/usr/lib/ruby/vendor_ruby/rubygems/core_ext/kernel_require.rb>:85:in `require': cannot load such file -- redis (LoadError)from <internal:/usr/lib/ruby/vendor_ruby/rubygems/core_ext/kernel_require.rb>:85:in `require'from /var/lib/gems/3.1.0/gems/redis-dump-0.6.1/lib/redis/dump.rb:7:in `<top (required)>'from <internal:/usr/lib/ruby/vendor_ruby/rubygems/core_ext/kernel_require.rb>:85:in `require'from <internal:/usr/lib/ruby/vendor_ruby/rubygems/core_ext/kernel_require.rb>:85:in `require'from /var/lib/gems/3.1.0/gems/redis-dump-0.6.1/exe/redis-dump:18:in `<top (required)>'from /usr/local/bin/redis-dump:25:in `load'from /usr/local/bin/redis-dump:25:in `<main>'

安裝redis

root@a29d39f5fd10:/opt/redis-dump/bin# gem install redis
Fetching redis-5.4.0.gem
Fetching connection_pool-2.5.3.gem
Fetching redis-client-0.24.0.gem
Successfully installed connection_pool-2.5.3
Successfully installed redis-client-0.24.0
Successfully installed redis-5.4.0
Parsing documentation for connection_pool-2.5.3
Installing ri documentation for connection_pool-2.5.3
Parsing documentation for redis-client-0.24.0
Installing ri documentation for redis-client-0.24.0
Parsing documentation for redis-5.4.0
Installing ri documentation for redis-5.4.0
Done installing documentation for connection_pool, redis-client, redis after 0 seconds
3 gems installed

再次驗證

root@a29d39f5fd10:/opt/redis-dump/bin# redis-dump --version
<internal:/usr/lib/ruby/vendor_ruby/rubygems/core_ext/kernel_require.rb>:85:in `require': cannot load such file -- yajl (LoadError)
Did you mean?  yamlfrom <internal:/usr/lib/ruby/vendor_ruby/rubygems/core_ext/kernel_require.rb>:85:in `require'from /var/lib/gems/3.1.0/gems/redis-dump-0.6.1/lib/redis/dump.rb:8:in `<top (required)>'from <internal:/usr/lib/ruby/vendor_ruby/rubygems/core_ext/kernel_require.rb>:85:in `require'from <internal:/usr/lib/ruby/vendor_ruby/rubygems/core_ext/kernel_require.rb>:85:in `require'from /var/lib/gems/3.1.0/gems/redis-dump-0.6.1/exe/redis-dump:18:in `<top (required)>'from /usr/local/bin/redis-dump:25:in `load'from /usr/local/bin/redis-dump:25:in `<main>'

安裝yajl

root@a29d39f5fd10:/opt/redis-dump/bin# gem install yajl-ruby
Fetching yajl-ruby-1.4.3.gem
Building native extensions. This could take a while...
Successfully installed yajl-ruby-1.4.3
Parsing documentation for yajl-ruby-1.4.3
Installing ri documentation for yajl-ruby-1.4.3
Done installing documentation for yajl-ruby after 0 seconds
1 gem installed

再次驗證

root@a29d39f5fd10:/opt/redis-dump/bin# redis-dump --version
<internal:/usr/lib/ruby/vendor_ruby/rubygems/core_ext/kernel_require.rb>:85:in `require': cannot load such file -- uri/redis (LoadError)from <internal:/usr/lib/ruby/vendor_ruby/rubygems/core_ext/kernel_require.rb>:85:in `require'from /var/lib/gems/3.1.0/gems/redis-dump-0.6.1/lib/redis/dump.rb:11:in `<top (required)>'from <internal:/usr/lib/ruby/vendor_ruby/rubygems/core_ext/kernel_require.rb>:85:in `require'from <internal:/usr/lib/ruby/vendor_ruby/rubygems/core_ext/kernel_require.rb>:85:in `require'from /var/lib/gems/3.1.0/gems/redis-dump-0.6.1/exe/redis-dump:18:in `<top (required)>'from /usr/local/bin/redis-dump:25:in `load'from /usr/local/bin/redis-dump:25:in `<main>'
修復uri/redis錯誤

出現 LoadError: cannot load such file – uri/redis 錯誤是因為 redis-dump 的代碼中存在錯誤的 require 語句,錯誤地嘗試加載 uri/redis(該庫不存在)。以下是解決方法:

定位錯誤文件
root@a29d39f5fd10:/opt/redis-dump/bin# find /var/lib/gems -name "dump.rb"  # 查找 redis-dump 的 dump.rb 文件
/var/lib/gems/3.1.0/gems/redis-dump-0.6.1/lib/redis/dump.rb
查看錯誤文件內容

root@a29d39f5fd10:/opt/redis-dump/bin# vi /var/lib/gems/3.1.0/gems/redis-dump-0.6.1/lib/redis/dump.rb
bash: vi: command not found

root@a29d39f5fd10:/opt/redis-dump/bin# cat /var/lib/gems/3.1.0/gems/redis-dump-0.6.1/lib/redis/dump.rbunless defined?(RD_HOME)RD_HOME = File.expand_path(File.join(File.dirname(__FILE__), '..', '..') )
endrequire 'redis'
require 'yajl'
require 'base64'require 'uri/redis'require_relative "dump/version"class Redisclass Dumpunless defined?(Redis::Dump::VALID_TYPES)VALID_TYPES = ['string', 'set', 'list', 'zset', 'hash', 'none'].freezeend@host = '127.0.0.1'@port = 6379@debug = false@encoder = Yajl::Encoder.new@parser = Yajl::Parser.new@chunk_size = 10000@with_optimizations = true@with_base64 = falseclass << selfattr_accessor :debug, :encoder, :parser, :safe, :host, :port, :password, :timeout, :chunk_size, :with_optimizations, :with_base64def le(msg)STDERR.puts "#%.4f: %s" % [Time.now.utc.to_f, msg]enddef ld(msg)STDERR.puts "#%.4f: %s" % [Time.now.utc.to_f, msg] if debugenddef memory_usage`ps -o rss= -p #{Process.pid}`.to_i # in kbenddef check_utf8=(check)if check == false@parser = Yajl::Parser.new(:check_utf8 => false)endendendattr_accessor :dbs, :uriattr_reader :redis_connectionsdef initialize(dbs=nil, uri="redis://#{Redis::Dump.host}:#{Redis::Dump.port}")@redis_connections = {}@uri = uriunless dbs.nil?@dbs = Range === dbs ? dbs : (dbs..dbs)@dbs = (@dbs.first.to_i..@dbs.last.to_i) # enforce integers@dbs.to_a.each { |db| redis(db) } # open_all_connectionsendenddef redis(db)redis_connections["#{uri}/#{db}"] ||= connect("#{uri}/#{db}")enddef connect(this_uri)self.class.ld 'CONNECT: ' << this_uriopts = {:url => this_uri}opts[:password] = Redis::Dump.password if Redis::Dump.passwordopts[:timeout] = Redis::Dump.timeout if Redis::Dump.timeoutRedis.new **optsenddef each_database@redis_connections.keys.sort.each do |redis_uri|yield redis_connections[redis_uri]endenddef dump filter=nilfilter ||= '*'entries = []each_database do |redis|chunk_entries = []Redis::Dump.ld "[db#{redis.connection[:db]}] Memory before: #{Redis::Dump.memory_usage}kb"dump_keys = redis.keys(filter)dump_keys_size = dump_keys.sizeRedis::Dump.ld "[db#{redis.connection[:db]}] Dumping #{dump_keys_size} keys: #{dump_keys.join(', ')}"dump_keys.each_with_index do |key,idx|entry, idxplus = key, idx+1if block_given?chunk_entries << entryprocess_chunk idx, dump_keys_size do |count|Redis::Dump.ld " dumping #{chunk_entries.size} (#{count}) from #{redis.connection[:id]}"output_buffer = []chunk_entries = chunk_entries.select do |key|type = Redis::Dump.type(redis, key)if self.class.with_optimizations && type == 'string'trueelseoutput_buffer.push self.class.encoder.encode(Redis::Dump.dump(redis, key, type))falseendendunless output_buffer.empty?yield output_bufferendunless chunk_entries.empty?yield Redis::Dump.dump_strings(redis, chunk_entries) { |obj| self.class.encoder.encode(obj) }endoutput_buffer.clearchunk_entries.clearendelseentries << self.class.encoder.encode(Redis::Dump.dump(redis, entry))endendRedis::Dump.ld "[db#{redis.connection[:db]}] Memory after: #{Redis::Dump.memory_usage}kb"endentriesenddef process_chunk idx, total_sizeidxplus = idx+1yield idxplus if (idxplus % self.class.chunk_size).zero? || idxplus >= total_sizeendprivate :process_chunkdef report filter='*'values = []total_size, dbs = 0, {}each_database do |redis|chunk_entries = []dump_keys = redis.keys(filter)dump_keys_size = dump_keys.sizedump_keys.each_with_index do |key,idx|entry, idxplus = Redis::Dump.report(redis, key), idx+1chunk_entries << entryprocess_chunk idx, dump_keys_size do |count|Redis::Dump.ld " reporting on #{chunk_entries.size} (#{idxplus}) from #{redis.connection[:id]}"chunk_entries.each do |e|puts record if obj.global.verbose >= 1dbs[e['db']] ||= 0dbs[e['db']] += e['size']total_size += e['size']endchunk_entries.clearendendendputs dbs.keys.sort.collect { |db| "  db#{db}: #{dbs[db].to_bytes}" }puts "total: #{total_size.to_bytes}"valuesenddef load(string_or_stream, &each_record)count = 0Redis::Dump.ld " LOAD SOURCE: #{string_or_stream}"Redis::Dump.parser.parse string_or_stream do |obj|unless @dbs.member?(obj["db"].to_i)Redis::Dump.ld "db out of range: #{obj["db"]}"nextendthis_redis = redis(obj["db"])Redis::Dump.ld "load[#{this_redis.hash}, #{obj}]"if each_record.nil?if Redis::Dump.safe && this_redis.exists(obj['key'])Redis::Dump.ld " record exists (no change)"nextendbeginval, type = obj['value'], obj['type']Redis::Dump.ld " > load `#{val}`"if Redis::Dump.with_base64 && type === 'string'Redis::Dump.ld " > load+decode64 for `#{val}`"val = Base64.decode64 valendret = Redis::Dump.set_value this_redis, obj['key'], type, val, obj['ttl']rescue => exRedis::Dump.le '(key: %s) %s' % [obj['key'], ex.message]endelseeach_record.call objendcount += 1endcountendmodule ClassMethodsdef type(this_redis, key)type = this_redis.type keyraise TypeError, "Unknown type: #{type}" if !VALID_TYPES.member?(type)typeenddef report(this_redis, key)info = { 'db' => this_redis.connection[:db], 'key' => key }info['type'] = type(this_redis, key)info['size'] = stringify(this_redis, key, info['type'], info['value']).sizeinfo['bytes'] = info['size'].to_bytesinfoenddef dump(this_redis, key, type=nil)type ||= type(this_redis, key)info = { 'db' => this_redis.connection[:db], 'key' => key }info['ttl'] = this_redis.ttl keyinfo['type'] = typestringified = stringify(this_redis, key, info['type'], info['value'])info['value'] = value(this_redis, key, info['type'])info['size'] = stringified.sizeif Redis::Dump.with_base64 && type === 'string'info['value'] = Base64.encode64(info['value'])endinfoenddef dump_strings(this_redis, keys)vals = this_redis.mget *keysidx = -1keys.collect { |key|idx += 1val = vals[idx].to_sinfo = {'db'    => this_redis.connection[:db],'key'   => key,'ttl'   => this_redis.ttl(key),'type'  => 'string','value' => Redis::Dump.with_base64 ? Base64.encode64(val) : val,'size'  => vals[idx].to_s.size}block_given? ? yield(info) : info}enddef set_value(this_redis, key, type, value, expire=nil)t ||= typesend("set_value_#{t}", this_redis, key, value)this_redis.expire key, expire if expire.to_s.to_i > 0enddef value(this_redis, key, t=nil)send("value_#{t}", this_redis, key)enddef stringify(this_redis, key, t=nil, v=nil)send("stringify_#{t}", this_redis, key, v)enddef set_value_hash(this_redis, key, hash)hash.keys.each { |k|  this_redis.hset key, k, hash[k] }enddef set_value_list(this_redis, key, list)list.each { |value|  this_redis.rpush key, value }enddef set_value_set(this_redis, key, set)set.each { |value|  this_redis.sadd? key, value }enddef set_value_zset(this_redis, key, zset)zset.each { |pair|  this_redis.zadd key, pair[1].to_f, pair[0] }enddef set_value_string(this_redis, key, str)this_redis.set key, strenddef set_value_none(this_redis, key, str)# ignoreenddef value_string(this_redis, key)  this_redis.get key                                                       enddef value_list  (this_redis, key)  this_redis.lrange key, 0, -1                                             enddef value_set   (this_redis, key)  this_redis.smembers key                                                  enddef value_zset  (this_redis, key)  this_redis.zrange(key, 0, -1, :with_scores => true).flatten.tuple        enddef value_hash  (this_redis, key)  this_redis.hgetall(key)                                                  enddef value_none  (this_redis, key)  ''                                                                       enddef stringify_string(this_redis, key, v=nil)  (v || value_string(this_redis, key))                          enddef stringify_list  (this_redis, key, v=nil)  (v || value_list(this_redis, key)).join                       enddef stringify_set   (this_redis, key, v=nil)  (v || value_set(this_redis, key)).join                        enddef stringify_zset  (this_redis, key, v=nil)  (v || value_zset(this_redis, key)).flatten.compact.join       enddef stringify_hash  (this_redis, key, v=nil)  (v || value_hash(this_redis, key)).to_a.flatten.compact.join  enddef stringify_none  (this_redis, key, v=nil)  (v || '')                                                     endendextend Redis::Dump::ClassMethodsclass Problem < RuntimeErrordef initialize(*args)@args = args.flatten.compactenddef message() @args && @args.first endendend
endclass Arraydef chunk(number_of_chunks)chunks = (1..number_of_chunks).collect { [] }chunks.each do |a_chunk|a_chunk << self.shift if self.any?endchunksendalias / chunkdef tuple(tuple_size=2)tuples = (1..(size/tuple_size)).collect { [] }tuples.each_with_index do |a_tuple,idx|tuple_size.times { a_tuple << self.shift } if self.any?endtuplesend
endclass Numericdef to_ms(self*1000).to_iend# TODO: Use 1024?def to_bytesargs = case self.abs.to_iwhen (1000)..(1000**2)'%3.2f%s' % [(self / 1000.to_f).to_s, 'KB']when (1000**2)..(1000**3)'%3.2f%s' % [(self / (1000**2).to_f).to_s, 'MB']when (1000**3)..(1000**4)'%3.2f%s' % [(self / (1000**3).to_f).to_s, 'GB']when (1000**4)..(1000**6)'%3.2f%s' % [(self / (1000**4).to_f).to_s, 'TB']else[self, 'B'].joinendend
end
編輯文件內容
root@a29d39f5fd10:/opt/redis-dump/bin#  nano /var/lib/gems/3.1.0/gems/redis-dump-0.6.1/lib/redis/dump.rb
bash: nano: command not found
安裝nano
root@a29d39f5fd10:/opt/redis-dump/bin# apt-get install -y nano
Reading package lists... Done
Building dependency tree... Done
Reading state information... Done
Suggested packages:hunspell
The following NEW packages will be installed:nano
0 upgraded, 1 newly installed, 0 to remove and 6 not upgraded.
Need to get 680 kB of archives.
After this operation, 2916 kB of additional disk space will be used.
Get:1 http://deb.debian.org/debian bookworm/main arm64 nano arm64 7.2-1+deb12u1 [680 kB]
Fetched 680 kB in 1s (475 kB/s)
debconf: delaying package configuration, since apt-utils is not installed
Selecting previously unselected package nano.
(Reading database ... 42773 files and directories currently installed.)
Preparing to unpack .../nano_7.2-1+deb12u1_arm64.deb ...
Unpacking nano (7.2-1+deb12u1) ...
Setting up nano (7.2-1+deb12u1) ...
update-alternatives: using /bin/nano to provide /usr/bin/editor (editor) in auto mode
update-alternatives: using /bin/nano to provide /usr/bin/pico (pico) in auto mode
root@a29d39f5fd10:/opt/redis-dump/bin# nano /var/lib/gems/3.1.0/gems/redis-dump-0.6.1/lib/redis/dump.rb
再次編輯文件
root@a29d39f5fd10:/opt/redis-dump/bin# nano /var/lib/gems/3.1.0/gems/redis-dump-0.6.1/lib/redis/dump.rb

將require ‘uri/redis’ 修改位require ‘uri’

保存并退出編輯器?(Ctrl+O → Enter → Ctrl+X)
再次驗證
root@a29d39f5fd10:/opt/redis-dump/bin# redis-dump --version
<internal:/usr/lib/ruby/vendor_ruby/rubygems/core_ext/kernel_require.rb>:85:in `require': cannot load such file -- drydock (LoadError)from <internal:/usr/lib/ruby/vendor_ruby/rubygems/core_ext/kernel_require.rb>:85:in `require'from /var/lib/gems/3.1.0/gems/redis-dump-0.6.1/exe/redis-dump:19:in `<top (required)>'from /usr/local/bin/redis-dump:25:in `load'from /usr/local/bin/redis-dump:25:in `<main>'
安裝drydock
root@a29d39f5fd10:/opt/redis-dump/bin# gem install drydock
Fetching drydock-0.6.9.gem
Successfully installed drydock-0.6.9
Parsing documentation for drydock-0.6.9
Installing ri documentation for drydock-0.6.9
Done installing documentation for drydock after 0 seconds
1 gem installed
再次驗證

root@a29d39f5fd10:/opt/redis-dump/bin# redis-dump --version
redis-dump v0.6.1
root@a29d39f5fd10:/opt/redis-dump/bin#

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/web/80844.shtml
繁體地址,請注明出處:http://hk.pswp.cn/web/80844.shtml
英文地址,請注明出處:http://en.pswp.cn/web/80844.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

微軟押注“代理式AI網絡”:一場重塑軟件開發與工作方式的技術革命

在 2025 年 Build 開發者大會上&#xff0c;微軟正式發布了其面向“開放代理式網絡&#xff08;Open Agentic Web&#xff09;”的宏大戰略&#xff0c;推出超過 50 項 AI 相關技術更新&#xff0c;涵蓋 GitHub、Azure、Windows 和 Microsoft 365 全線產品。這一系列更新的核心…

【音頻】wav文件如何解析編碼格式(壓縮格式)?

要確定一個WAV文件的編碼格式&#xff0c;可以通過以下幾種方法實現&#xff0c;包括使用操作系統自帶工具、專業音頻軟件或編程解析文件頭信息。以下是詳細說明&#xff1a; 一、通過文件屬性查看&#xff08;Windows/macOS&#xff09; 1. Windows系統 步驟&#xff1a; 右…

算法打卡第三天

10.長度最小的子數組 &#xff08;力扣209題&#xff09; 給定一個含有 n 個正整數的數組和一個正整數 target 。 找出該數組中滿足其總和大于等于 target 的長度最小的 子數組 [numsl, numsl1, ..., numsr-1, numsr] &#xff0c;并返回其長度**。**如果不存在符合條件的子…

數字電子技術基礎(六十二)——使用Multisim軟件繪制邊沿觸發的D觸發器和JK觸發器

1 使用Mulitism軟件模擬時鐘觸發的D觸發器 D觸發器是一種基本的數字電路存儲元件&#xff0c;它在時鐘信號的邊沿將輸入數據D傳遞到輸出Q。下面開始使用Multisim軟件來模擬時鐘觸發的D觸發器。 器件選擇&#xff1a; 觸發器選擇&#xff1a;在組選項欄中點擊Misc Digital&am…

自動獲取新版本 js 靜態文件

場景 代碼里有靜態js文件&#xff0c;發布一個版本1.0在真實環境&#xff0c;再修改重新發布2.0&#xff0c;用戶如何得到新版本&#xff1f; 方法 一、文件名哈希策略&#xff08;最推薦&#xff09; 通過構建工具為文件生成唯一哈希值&#xff0c;使每次更新后的文件名不同…

第13天-用BeautifulSoup解析網頁數據:以百度熱搜可視化為例

一、BeautifulSoup簡介 BeautifulSoup是Python最受歡迎的HTML/XML解析庫之一,它能將復雜的網頁文檔轉換為樹形結構,支持多種解析器(如lxml、html.parser)。配合requests庫,可以快速構建網頁爬蟲項目。 二、環境準備 pip install requests beautifulsoup4 matplotlib 三…

PyTorch中cdist和sum函數使用詳解

torch.cdist 是 PyTorch 中用于計算**兩個張量之間的成對距離&#xff08;pairwise distance&#xff09;**的函數&#xff0c;常用于點云處理、圖神經網絡、相似性度量等場景。 基本語法 torch.cdist(x1, x2, p2.0)參數說明&#xff1a; 參數說明x1一個形狀為 [B, M, D] 或 …

智能視覺檢測技術:制造業質量管控的“隱形守護者”

在工業4.0浪潮的推動下&#xff0c;制造業正經歷一場以智能化為核心的變革。傳統人工質檢模式因效率低、誤差率高、成本高昂等問題&#xff0c;逐漸難以滿足現代生產對高精度、高速度的需求。智能視覺檢測技術作為人工智能與機器視覺融合的產物&#xff0c;正成為制造業質量管控…

水滸后傳-暹羅國建立新國家的故事

第一節《怒海余生》 李俊率領殘部穿越臺風海域&#xff0c;在暹羅灣遭遇葡萄牙艦隊突襲。童猛為掩護船隊突圍&#xff0c;駕駛火船與敵艦同歸于盡&#xff0c;留下最后的忠義絕唱。 第二節《血染王城》 李俊與暹羅舊貴族勢力在曼谷河畔展開決戰。中原陣法與暹羅象兵碰撞出驚心…

1.portainer

容器可視化工具 商業版Business、社區版Community docker容器部署portainer&#xff0c;對外暴露端口9443是一個自簽名的證書端口。還有另外一個暴露的端口8000。 volume 要想看得到&#xff0c;需要通過 portainer可視化界面看到volume&#xff0c;就必須使用&#xff1a; d…

使用Starrocks制作拉鏈表

5月1日向ods_order_info插入3條數據&#xff1a; CREATE TABLE ods_order_info(dt string,id string COMMENT 訂單編號,total_amount decimal(10,2) COMMENT 訂單金額 ) PRIMARY KEY(dt, id) PARTITION BY (dt) DISTRIBUTED BY HASH(id) PROPERTIES ( "replication_num&q…

Linux下Docker使用阿里云鏡像加速器

在中國大陸環境中配置 Docker 使用阿里云鏡像加速器&#xff0c;并確保通過 Clash 代理訪問 Docker Hub 我這里用的Debian12。 步驟 1&#xff1a;獲取阿里云鏡像加速器地址 登錄阿里云容器鏡像服務控制臺&#xff1a;(qinyang.wang) 網址&#xff1a;阿里云登錄 - 歡迎登錄阿…

Electron 后臺常駐服務實現(托盤 + 開機自啟)

基于 electron-vite-vue 項目結構 本篇將詳細介紹如何為 Electron 應用實現后臺常駐運行&#xff0c;包括&#xff1a; ? 創建系統托盤圖標&#xff08;Tray&#xff09;? 支持點擊托盤菜單控制窗口顯示/退出? 實現開機自啟功能&#xff08;Auto Launch&#xff09; &#…

opencv的直方圖

理解并運用 OpenCV 中的圖像直方圖 &#x1f4ca;&#x1f5bc;? 圖像直方圖是計算機視覺和圖像處理中一種基本且強大的工具&#xff0c;它提供了圖像像素強度分布的圖形化表示。OpenCV 作為一個全面的計算機視覺庫&#xff0c;內置了計算和可視化直方圖的強大功能。本文將深…

Linux 內核探秘:從零構建 GPIO 設備驅動程序實戰指南

在嵌入式系統開發領域&#xff0c;GPIO&#xff08;通用輸入 / 輸出&#xff09;作為硬件與軟件交互的橋梁&#xff0c;是實現設備控制與數據采集的基礎。編寫高效、穩定的 GPIO 設備驅動程序&#xff0c;對于發揮硬件性能至關重要。本文將深入剖析 Linux 內核中 GPIO 驅動開發…

嵌入式單片機中STM32F1演示寄存器控制方法

該文以STM32F103C8T6為示例,演示如何使用操作寄存器的方法點亮(關閉LED燈),并講解了如何調試,以及使用宏定義。 第一:操作寄存器點亮LED燈。 (1)首先我們的目的是操作板子上的LED2燈,對其實現點亮和關閉操作。打開STM32F103C8T6的原理圖,找到LED2的位置。 可以看到…

牛客網 NC16407 題解:托米航空公司的座位安排問題

牛客網 NC16407 題解&#xff1a;托米航空公司的座位安排問題 題目分析 解題思路 本題可以采用深度優先搜索(DFS)來解決&#xff1a; 從左上角開始&#xff0c;按行優先順序遍歷每個座位對于每個座位&#xff0c;有兩種選擇&#xff1a; 選擇該座位&#xff08;如果滿足條件…

智慧展館數字孿生平臺

2022年進博會上&#xff0c;國家會展中心憑借“數字孿生機器人調度平臺”驚艷全球&#xff0c;實現人機協同、虛實聯動的智慧運營&#xff1b;2023年天府農博園通過“BIMIoT”技術&#xff0c;貫穿展館全生命周期管理&#xff0c;成為農業會展的數字化標桿。這些案例背后&#…

胡說八道1---豆包問答總結

用戶提問 1 指令&#xff1a;25 - - [21/May/2025:01:35:45 0000] “POST /prod-api/system/base/getList HTTP/1.1” 405 559 “http://192.168.1.109:16380/login” “Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/136.0.0.0 …

C# AOP編程

AOP(面向切片編程的概念我這里就不介紹了&#xff0c;這里先介紹一下C#中的AOP編程框架。 1.AOP的分類 .net下支持AOP的框架很多&#xff0c;搜了一下有&#xff1a;PostSharp、AspectInjector、Fody 、Castle Windsor、Spring.NET、Ninject、Unity等&#xff0c;實現的方式主要…