主頁 > 後端開發 > Redis實戰之入門到精通,通俗易懂!

Redis實戰之入門到精通,通俗易懂!

2020-12-09 06:49:40 後端開發

本章主要內容
? Redis 與其他軟體的相同之處和不同之處
? Redis 的用法
? 使用 Python 示例代碼與 Redis 進行簡單的互動
? 使用 Redis 解決實際問題

以下知識點決議來自于《Redis實戰》檔案其中的一部分!由于不影響觀看,只選取了其中的一部分來展示,
需要完整版的可以點擊這里!!暗號CSDN,獲取!

Redis 是一個遠程記憶體資料庫,它不僅性能強勁,而且還具有復制特性以及為解決問題而生
的獨一無二的資料模型,Redis 提供了 5 種不同型別的資料結構,各式各樣的問題都可以很自然
地映射到這些資料結構上:Redis 的資料結構致力于幫助用戶解決問題,而不會像其他資料庫那
樣,要求用戶扭曲問題來適應資料庫,除此之外,通過復制、持久化(persistence)和客戶端分
片(client-side sharding)等特性,用戶可以很方便地將 Redis 擴展成一個能夠包含數百 GB 資料、
每秒處理上百萬次請求的系統,
筆者第一次使用 Redis 是在一家公司里面,這家公司需要對一個保存了 6 萬個客戶聯系
方式的關系資料庫進行搜索,搜索可以根據名字、郵件地址、所在地和電話號碼來進行,每
次搜索需要花費 10~15 秒的時間,在花了一周時間學習 Redis 的基礎知識之后,我使用 Redis
重寫了一個新的搜索引擎,然后又花費了數周時間來仔細測驗這個新系統,使它達到生產級
別,最終這個新的搜索系統不僅可以根據名字、郵件地址、所在地和電話號碼等資訊來過濾
和排序客戶聯系方式,并且每次操作都可以在 50 毫秒之內完成,這比原來的搜索系統足足快
了 200 倍,閱讀本書可以讓你學到很多小技巧、小竅門以及使用 Redis 解決某些常見問題的
方法,
本章將介紹 Redis 的適用范圍,以及在不同環境中使用 Redis 的方法(比如怎樣跟不同的組
件和編程語言進行通信等);而之后的章節則會展示各式各樣的問題,以及使用 Redis 來解決這
些問題的方法,

第 1 章 初識 Redis

1.1 Redis 簡介
安裝 Redis 和 Python 附錄 A 介紹了快速安裝 Redis 和 Python 的方法,
在其他編程語言里面使用 Redis 本書只展示了使用 Python 語言撰寫的示例代碼,使用 Ruby、Java 和 JavaScript(Node.js)撰寫的示例代碼可以在這里找到:https://github.com/josiahcarlson/redis-in-action,使用 Spring 框架的讀者可以通過查看 http://www.springsource.org/spring-data/redis來學習如何在 Spring 框架中使用 Redis,

前面對于Redis資料庫的描述只說出了一部分真相,Redis是一個速度非常快的非關系數
據庫(non-relational database),它可以存盤鍵(key)與 5 種不同型別的值(value)之間的
映射(mapping),可以將存盤在記憶體的鍵值對資料持久化到硬碟,可以使用復制特性來擴
展讀性能,還可以使用客戶端分片

1.1.1 Redis 與其他資料庫和軟體的對比
來擴展寫性能,接下來的幾節將分別介紹Redis的這幾個特性,
如果你熟悉關系資料庫,那么你肯定寫過用來關聯兩個表的資料的 SQL 查詢 ,而 Redis 則屬于人們常說的 NoSQL 資料庫或者非關系資料庫:Redis 不使用表,它的資料庫也不會預定義或者強制去要求用戶對 Redis 存盤的不同資料進行關聯,

高性能鍵值快取服務器 memcached 也經常被拿來與 Redis 進行比較:這兩者都可用于存盤鍵值映射,彼此的性能也相差無幾,但是 Redis 能夠自動以兩種不同的方式將資料寫入硬碟,并且 Redis 除了能存盤普通的字串鍵之外,還可以存盤其他 4 種資料結構,而 memcached 只能存盤普通的字串鍵,這些不同之處使得 Redis 可以用于解決更為廣泛的問題,并且既可以用作主資料庫(primary database)使用,又可以作為其他存盤系統的輔助資料庫(auxiliary database)使用,

本書的后續章節會分別介紹將 Redis 用作主存盤(primary storage)和二級存盤(secondary storage)時的用法和查詢模式,一般來說,許多用戶只會在 Redis 的性能或者功能是必要的情況下,才會將資料存盤到 Redis 里面:如果程式對性能的要求不高,又或者因為費用原因而沒辦法將大量資料存盤到記憶體里面,那么用戶可能會選擇使用關系資料庫,或者其他非關系資料庫,在實際中,讀者應該根據自己的需求來決定是否使用 Redis,并考慮是將 Redis 用作主存盤還是輔

① 分片是一種將資料劃分為多個部分的方法,對資料的劃分可以基于鍵包含的 ID、基于鍵的散列值,或者
基于以上兩者的某種組合,通過對資料進行分片,用戶可以將資料存盤到多臺機器里面,也可以從多臺
機器里面獲取資料,這種方法在解決某些問題時可以獲得線性級別的性能提升,

助存盤,以及如何通過復制、持久化和事務等手段保證資料的完整性,
表 1-1 展示了一部分在功能上與 Redis 有重疊的資料庫服務器和快取服務器,從這個表可以
看出 Redis 與這些資料庫及軟體之間的區別, 
在這里插入圖片描述
1.1.2 附加特性
在使用類似 Redis 這樣的記憶體資料庫時,一個首先要考慮的問題就是“當服務器被關閉時,服務器存盤的資料將何去何從呢?”Redis 擁有兩種不同形式的持久化方法,它們都可以用小而緊湊的格式將存盤在記憶體中的資料寫入硬碟:第一種持久化方法為時間點轉儲(point-in-time dump),轉儲操作既可以在“指定時間段內有指定數量的寫操作執行”這一條件被滿足時執行,又可以通過呼叫兩條轉儲到硬碟(dump-to-disk)命令中的任何一條來執行;第二種持久化方法將所有修改了資料庫的命令都寫入一個只追加(append-only)檔案里面,用戶可以根據資料的重要程度,將只追加寫入設定為從不同步(sync)、每秒同步一次或者每寫入一個命令就同步一次,

我們將在第 4 章中更加深入地討論這些持久化選項,另外,盡管 Redis 的性能很好,但受限于 Redis 的記憶體存盤設計,有時候只使用一臺 Redis服務器可能沒有辦法處理所有請求,因此,為了擴展 Redis 的讀性能,并為 Redis 提供故障轉移

5 (failover)支持 ,Redis 實作了主從復制特性:執行復制的從服務器會連接上主服務器,接收主服務器發送的整個資料庫的初始副本(copy);之后主服務器執行的寫命令,都會被發送給所有連接著的從服務器去執行,從而實時地更新從服務器的資料集,因為從服務器包含的資料會不斷地進行更新,所以客戶端可以向任意一個從服務器發送讀請求,以此來避免對主服務器進行集中式的訪問,我們將在第 4 章中更加深入地討論 Redis 從服務器,

1.1.3 使用 Redis 的理由
有 memcached 使用經驗的讀者可能知道,用戶只能用 APPEND 命令將資料添加到已有字串的末尾,memcached 的檔案中宣告,可以用 APPEND 命令來管理元素串列,這很好!用戶可以將元素追加到一個字串的末尾,并將那個字串當作串列來使用,但隨后如何洗掉這些元素呢?memcached 采用的辦法是通過黑名單(blacklist)來隱藏串列里面的元素,從而避免對元素執行讀取、更新、寫入(包括在一次資料庫查詢之后執行的 memcached 寫入)等操作,相反地,Redis 的 LIST 和 SET 允許用戶直接添加或者洗掉元素,使用 Redis 而不是 memcached 來解決問題,不僅可以讓代碼變得更簡短、更易懂、更易維護,而且還可以使代碼的運行速度更快(因為用戶不需要通過讀取資料庫來更新資料),除此之外,在其他許多情況下,Redis 的效率和易用性也比關系資料庫要好得多,

資料庫的一個常見用法是存盤長期的報告資料,并將這些報告資料用作固定時間范圍內的聚合資料(aggregates),收集聚合資料的常見做法是:先將各個行插入一個報告表里面,之后再通過掃描這些行來收集聚合資料,并根據收集到的聚合資料來更新聚合表中已有的那些行,之所以使用插入行的方式來存盤,是因為對于大部分資料庫來說,插入行操作的執行速度非常快(插入行只會在硬碟檔案末尾進行寫入),不過,對表里面的行進行更新卻是一個速度相當慢的操作,因為這種更新除了會引起一次隨機讀(random read)之外,還可能會引起一次隨機寫(random write),而在Redis里面,用戶可以直接使用原子的(atomic)INCR命令及其變種來計算聚合資料,并且因為Redis將資料存盤在記憶體里面 ①

① 客觀來講,memcached 也能用在這個簡單的場景里,但使用 Redis 存盤聚合資料有以下 3 個好處:
1、首先,使用 Redis 可以將彼此相關的聚合資料放在同一個結構里面,這樣訪問聚合資料就會變得更為容易;
2、其次,使用 Redis 可以將聚合資料放到有序集合里面,構建出一個實時的排行榜;
3、最后,Redis 的聚合資料可以是整數或者浮點數,而 memcached 的聚合資料只能是整數,而且發送給Redis的命令請求并不需要經過典型的查詢分析器(parser)或者查詢優化器(optimizer)進行處理,所以對Redis存盤的資料執行隨機寫的速度總是非常迅速的,

使用 Redis 而不是關系資料庫或者其他硬碟存盤資料庫,可以避免寫入不必要的臨時資料,也免去了對臨時資料進行掃描或者洗掉的麻煩,并最終改善程式的性能,雖然上面列舉的都是一些簡單的例子,但它們很好地證明了“工具會極大地改變人們解決問題的方式”這一點,

1.2 Redis 資料結構簡介

正如之前的表 1-1 所示,Redis 可以存盤鍵與 5 種不同資料結構型別之間的映射,這 5 種數
據結構型別分別為 STRING(字串)、LIST(串列)、SET(集合)、HASH(散列)和 ZSET(有序集合),有一部分 Redis 命令對于這 5 種結構都是通用的,如 DEL、TYPE、RENAME 等;但也有一部分 Redis 命令只能對特定的一種或者兩種結構使用,第 3 章將對 Redis 提供的命令進行更深入的介紹,
大部分程式員應該都不會對 Redis 的 STRING、LIST、HASH 這 3 種結構感到陌生,因
為它們和很多編程語言內建的字串、串列和散列等結構在實作和語意(semantics)方面都
非常相似,有些編程語言還有集合資料結構,在實作和語意上類似于 Redis 的 SET,ZSET 在
某種程度上是一種 Redis 特有的結構,但是當你熟悉了它之后,就會發現它也是一種非常有
用的結構,表 1-2 對比了 Redis 提供的 5 種結構,說明了這些結構存盤的值,并簡單介紹了
它們的語意,
在這里插入圖片描述

命令串列 本節在介紹每個資料型別的時候,都會在一個表格里面展示一小部分處理這些資料結 構的命令,之后的第 3會展示一個更詳細(但仍不完整)的命令串列,完整的 Redis 命令串列 可以http://redis.io/commands 找到,

這一節將介紹如何表示 Redis 的這 5 種結構,并且還會介紹 Redis 命令的使用方法,從而為本書的后續內容打好基礎,本書展示的所有示例代碼都是用 Python 寫的,如果讀者已經按照附錄 A 里面描述的方法安裝好了 Redis,那么應該也已經安裝好了 Python,以及在 Python 里面使用Redis 所需的客戶端庫,只要讀者在電腦里面安裝了 Redis、Python 和 redis-py 庫,就可以在閱讀本書的同時,嘗試執行書中展示的示例代碼了,

請安裝 Redis 和 Python 在閱讀后續內容之前,請讀者先按照附錄 A 中介紹的方法安裝 Redis 和Python,如果讀者覺得附錄 A 描述的安裝方法過于復雜,那么這里有一個更簡單的方法,但這 個方法只能用于 Debian系統(或者該系統的衍生系統):從 http://redis.io/download 下載 Redis 的 壓縮包,解壓壓縮包,執行 make&& sudo make install,之后再執行 sudo python -m easy_install redis hiredis(hiredis 是可選的,它是一個使用 C 語言撰寫的高性能 Redis 客戶端),

如果讀者熟悉程序式編程語言或者面向物件編程語言,那么即使沒有使用過 Python,應該也
可以看懂 Python 代碼,另一方面,如果讀者決定使用其他編程語言來操作 Redis,那么就需要自
己來將本書的 Python 代碼翻譯成正在使用的語言的代碼,

使用其他語言撰寫的示例代碼 盡管沒有包含在書中,但本書展示的 Python 示例代碼已經被翻譯成 了 Ruby 代碼、Java 代碼和JavaScript 代碼,這些翻譯代碼可以在 https://github.com/josiahcarlson/redis-in-action 下載到,跟 Python 撰寫的示例代碼一樣,這些翻譯代碼也包含相應的注釋,方便讀 者參考,

為了讓示例代碼盡可能地簡單,本書會盡量避免使用 Python 的高級特性,并使用函式而不
是類或者其他東西來執行 Redis 操作,以此來將焦點放在使用 Redis 解決問題上面,而不必過多
地關注 Python 的語法,本節將使用 redis-cli 控制臺與 Redis 進行互動,首先,讓我們來了解一下
Redis 中最簡單的結構:STRING,

1.2.1 Redis 中的字串

Redis 的字串和其他編程語言或者其他鍵值存盤提供的字串非常相似,本書在使用
圖片表示鍵和值的時候,通常會將鍵名(key name)和值的型別放在方框的頂部,并將值
放在方框的里面,圖 1-1 以鍵為 hello、值為 world 的字串為例,分別標記了方框的各
個部分,

在這里插入圖片描述
字串擁有一些和其他鍵值存盤相似的命令,比如 GET(獲取值)、SET(設定值)和 DEL(洗掉值),如果讀者已經按照附錄 A 中給出的方法安裝了 Redis,那么可以根據代碼清單 1-1 展示的例子,嘗試使用 redis-cli 執行 SET、GET 和 DEL,表 1-3 描述了這 3 個命令的基本用法,
在這里插入圖片描述

使用 redis-cli 為了讓讀者在一開始就能便捷地與 Redis 進行互動,本章將使用 redis-cli 這個互動式 客戶端來介紹
Redis 命令,

除了能夠 GET、SET 和 DEL 字串值之外,Redis 還提供了一些可以對字串的其中一部分內容進行讀取和寫入的命令,以及一些能對字串存盤的數值執行自增或者自減操作的命令,第 3 章
將對這些命令進行介紹,但是在此之前,我們還有許多基礎知識需要了解,下面來看一下 Redis 的串列及其功能,

1.2.2 Redis 中的串列
Redis 對鏈表(linked-list)結構的支持使得它在鍵值存盤的世界中獨樹一幟,一個串列結構可以有序地存盤多個字串,和表示字串時使用的方法一樣,本節使用帶有標簽的方框來表示串列,并將串列包含的元素放在方框里面,圖 1-2 展示了一個這樣的示例,
在這里插入圖片描述

Redis 串列可執行的操作和很多編程語言里面的串列操作非常相似:LPUSH 命令和 RPUSH 命令分別用于將元素推入串列的左端(left end)和右端(right end);LPOP 命令和 RPOP 命令分別用于從串列的左端和右端彈出元素;LINDEX 命令用于獲取串列在給定位置上的一個元素;LRANGE 命令用于獲取串列在給定范圍上的所有元素,代碼清單 1-2 展示了一些串列命令的使用示例,表 1-4 簡單介紹了示例中用到的各個命令,
在這里插入圖片描述
即使 Redis 的串列只支持以上提到的幾個命令,它也已經可以用來解決很多問題了,但 Redis 并沒
有就此止步—除了上面提到的命令之外,Redis 串列還擁有從串列里面移除元素的命令、將元素插入
串列中間的命令、將串列修剪至指定長度(相當于從串列的其中一端或者兩端移除元素)的命令,以
及其他一些命令,第 3 章將介紹許多串列命令,但是在此之前,讓我們先來了解一下 Redis 的集合,
1.2.3 Redis 的集合
Redis 的集合和串列都可以存盤多個字串,它們之間的不同在于,串列可以存盤多個相同的字串,而
集合則通過使用散串列來保證自己存盤的每個字串都是各不相同的(這些散串列只有鍵,但沒有與鍵相關聯的值),本書表示集合的方法和表示串列的方法基本相同,圖 1-3 展示了一個包含 3 個元素的示例集合,
在這里插入圖片描述

因為 Redis 的集合使用無序(unordered)方式存盤元素,所以用戶不能像使用串列那樣,將元素推入集合
的某一端,或者從集合的某一端彈出元素,不過用戶可以使用 SADD 命令將元素添加到集合,或者使用 SREM命令從集合里面移除元素,另外還可以通過 SISMEMBER 命令快速地檢查一個元素是否已經存在于集合中,或者使用 SMEMBERS 命令獲取集合包含的所有元素(如果集合包含的元素非常多,那么 SMEMBERS 命令的執行速度可能會很慢,所以請謹慎地使用這個命令),代碼清單 1-3 展示了一些集合命令的使用示例,表 1-5 簡單介紹了代碼清單里面用到的各個命令,
在這里插入圖片描述
在這里插入圖片描述
跟字串和串列一樣,集合除了基本的添加操作和移除操作之外,還支持很多其他操作,比
如 SINTER、SUNION、SDIFF 這 3 個命令就可以分別執行常見的交集計算、并集計算和差集計
算,第 3 章將對集合的相關命令進行更詳細的介紹,另外第 7 章還會展示如何使用集合來解決多
個問題,不過別心急,因為在 Redis 提供的 5 種資料結構中,還有兩種我們尚未了解,讓我們先
來看看 Redis 的散列,
1.2.4 Redis 的散列
Redis 的散列可以存盤多個鍵值對之間的映射,和字串一樣,散列存盤的值既可以是字符
串又可以是數字值,并且用戶同樣可以對散列存盤的數字值執行自增操作或者自減操作,圖 1-4
展示了一個包含兩個鍵值對的散列,
在這里插入圖片描述
散列在很多方面就像是一個微縮版的 Redis,不少字串命令都有相應的散列版本,代碼清
單 1-4 展示了怎樣對散列執行插入元素、獲取元素和移除元素等操作,表 1-6 簡單介紹了代碼清
單里面用到的各個命令,
在這里插入圖片描述
在這里插入圖片描述
熟悉檔案資料庫的讀者可以將 Redis 的散列看作是檔案資料庫里面的檔案,而熟悉關系資料庫的
讀者則可以將 Redis 的散列看作是關系資料庫里面的行,因為散列、檔案和行這三者都允許用戶同時訪
問或者修改一個或多個域(field),最后,讓我們來了解一下 Redis 的 5 種資料結構中的最后一種:有序集合,

1.2.5 Redis 的有序集合
有序集合和散列一樣,都用于存盤鍵值對:有序集合的鍵被稱為成員(member),每個成員都是各不相同的;而有序集合的值則被稱為分值(score),分值必須為浮點數,有序集合是 Redis 里面唯一一個既可以根據成員訪問元素(這一點和散列一樣),又可以根據分值以及分值的排列順序來訪問元素的結構,圖 1-5 展示了一個包含兩個元素的有序集合示例,
在這里插入圖片描述
和 Redis 的其他結構一樣,用戶可以對有序集合執行添加、移除和獲取等操作,代碼清單 1-5
展示了這些操作的執行示例,表 1-7 簡單介紹了代碼清單里面用到的各個命令,
在這里插入圖片描述
在這里插入圖片描述
現在讀者應該已經知道有序集合是什么和它能干什么了,到目前為止,我們基本了解了 Redis
提供的 5 種結構,接下來的一節將展示如何通過結合散列的資料存盤能力和有序集合內建的排
序能力來解決一個常見的問題,

以上知識點決議來自于《Redis實戰》檔案其中的一部分!由于不影響觀看,只選取了其中的一部分來展示,
需要完整版的可以點擊這里!!暗號CSDN,找群主獲取!

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

標籤:Java

上一篇:Java如何優雅地實作介面資料校驗

下一篇:@FeignClient注解 中屬性 contextId使用

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