1. 程式人生 > >你離高薪 offer 只差一個Redis入門,我是認真的

你離高薪 offer 只差一個Redis入門,我是認真的

說起來,可能有些小夥伴會不相信,我是第一次用 Redis,真的。因為公司小,業務量小,Redis 根本派不上用場。不過,最近打算把系統升級一下,順帶把當下時髦的技術入個門,“與時俱進”嘛,雖然進的有“一點點”晚(注意雙引號)。

作為一名富有責任心的技術博主,我覺得有必要把我入門 Redis 的過程分享出來,供一些小夥伴作為參考。要是我哪裡寫錯了,別客氣,過來給我一巴掌,就行了(溫柔點,別打腫,影響顏值就不好了)。

01、Redis 是什麼

Redis 是網際網路技術領域中使用最廣泛的儲存中介軟體,它是 Remote Dictionary Service 三個單詞中加粗字母的組合。你別說,組合起來後念著挺自然的。

Redis 以超高的效能、完美的文件、簡潔的原始碼著稱,國內外很多大型網際網路公司都在用,比如說阿里、騰訊、GitHub、Stack Overflow 等等。它的版本更新非常的快,功能也越來越強大,最初只是用來作為快取資料庫,現在已經可以用它來實現訊息隊列了。

可以這麼說吧,掌握 Redis 已經變成了一項後端工程師必須具備的基礎技能。

Redis 的作者是一名義大利人,網名 Antirez,長相還是過得去的,感興趣的小夥伴可以 Google 一下。知道為什麼 Redis 的預設埠是 6379 嗎?

據說是手機鍵盤上“MERZ”的位置決定的,小夥伴們可以開啟自己手機上九宮格鍵盤感受一下。“MERZ”是什麼意思呢?據說是“愚蠢”的意思。這?是不是感覺程式設計師的生活中還是有蠻多神祕色彩的?

02、安裝 Redis

Redis 針對不同的作業系統有不同的安裝方式,我們這篇入門的文章就以 Windows 為例吧。

下載地址如下:

https://github.com/MicrosoftArchive/redis/releases

Windows 最新的版本是 3.2.100。從下圖中可以看得出,Redis 的體積非常的輕量級,還不到 6 M。體積越小,讓我感覺 Redis 越牛逼,你是不是也有這種感覺?

有兩種安裝方式,第一種是 msi 的方式,雙擊執行後安裝;第二種是免安裝,綠色版,只需要把 zip 包解壓就可以了。

裡面有一份英文版的文件——Windows Service Documentation.docx,教我們如何安裝 Redis 服務、如何啟動、如何關閉,以及如何使用自定義埠啟動服務。

開啟命令列,進入到當前解壓後的目錄,輸入啟動命令:

redis-server redis.windows.conf

然後你就會看到 Redis 啟動後的歡迎畫面,左邊這個盒子感覺好有藝術感啊!有小夥伴知道是怎麼生成的嗎?

還有一些其他的提示資訊:

  • Redis 當前的版本號為 3.2.100
  • 埠是 6379
  • 程序 ID,也就是 PID 為 12636
  • Redis 官方地址為:http://redis.io

那如何停止服務呢?可以直接按下 Ctrl+C 組合鍵——粗暴、壁咚(當然可以直接點右上角的叉號)。

PS:本來想用 Linux 版或者 OSX 版的,怕入門的小夥伴沒有環境。後面可以整一個。

03、Redis 的資料結構

Redis 有 5 種基礎資料結構,String、Hash、List、Set、SortedSet,也是學 Redis 必須掌握的。除此之外,還有 HyperLogLog、Geo、Pub/Sub,算是高階資料結構了。我們這篇入門的文章就以 String 為例吧。

String 結構使用非常廣泛,比如說把使用者的登陸資訊轉成 JSON 字串後快取起來,等需要取出的時候再反序列化一次。

小夥伴們應該都知道,Java 的 String 是不可變的,無法修改。Redis 的 String 是動態的,可以修改的,兩者不同哦。關於 Redis 的 String 結構,我覺得老錢的 Redis 教程上講得非常明白,大家一起拜讀下。

Redis 的 String 在內部結構實現上類似於 Java 的 ArrayList,採用預分配冗餘空間的方式來減少記憶體的頻繁分配。如上圖所示,當前字串實際分配的空間為 capacity,一般高於實際的字串長度 len。當字串長度小於 1M 時,擴容是對現有空間的成倍增長;如果長度超過 1M 時,擴容一次只會多增加 1M 的空間。最大長度為 512M。

04、實操 Redis

好了好了,我估計很多小夥伴們已經整裝待發,準備實操一把了。這就來。

Redis 的解壓目錄下有一個名叫 redis-cli.exe 的檔案,這是 Redis 自帶的一個客戶端工具,可以用來連線之前我們啟動好的 Redis 服務。雙擊啟動它。

這個客戶端還是非常智慧的,當鍵入命令的時候,會跳出對應的提示

當按下空格跟進關鍵字的時候,對應位置上的提示會自動消失。

以下是完整的鍵值對測試命令,小夥伴們可以按照格式動手實操一把。

> set name cmower
OK
> get name
"cmower"
> exists name
(integer) 1
> del name
(integer) 1
> get name
(nil)

1)set 命令用來儲存一個鍵值對,在本例中,name 為 key,cmower 為 值。

2)get 命令用來獲取一個鍵值對。

3)exists 命令用來測試一個鍵值對是否存在,(integer) 1 表示存在,(integer) 0 表示不存在。

4)del 命令用來刪除一個鍵值對,(integer) 1 表示執行成功,(integer) 0 表示執行失敗。

5)當鍵值對刪除後,再通過 get 命令獲取時,結果就為 (nil)

可能有小夥伴會好奇,nil 是什麼意思?它是 Objective-C、Swift、Ruby、Lua 等程式語言中的一個關鍵字,更詳細的解釋可以看一下《Programming in Lua 程式設計第二版》:

nil 是一種型別,它只有一個值 nil,它的主要功能是用於區別其他任何值,就像之前所說的,一個全域性變數在第一次賦值前的預設值就是 nil,將 nil 賦予一個全域性變數等同於刪除它,Lua 將 nil 用於表示一種“無效值(non-value)”的情況,即沒有任何有效值的情況。

想了解 Redis 命令的具體使用方法,可以參考以下連結:

http://redisdoc.com/index.html

是 Redis Command Reference 和 Redis Documentation 的中文翻譯版,良心吧?

05、在 Java 中使用 Redis

有些小夥伴可能會問,“二哥,我是一名 Java 程式設計師,我該如何在 Java 中使用 Redis 呢?”這個問題問得好,這就來,這就來。

第一步,在專案中新增 Jedis(Java 和 Redis 的混拼) 依賴:

<dependency>
    <groupId>redis.clients</groupId>
    <artifactId>jedis</artifactId>
    <version>3.2.0</version>
</dependency>

第二步,新建 UserInfo(使用者資訊)類:

public class UserInfo {
    private String name;
    private int age;

    public UserInfo(String name, int age) {
        this.name = name;
        this.age = age;
    }

    @Override
    public String toString() {
        return "UserInfo{" +
                "name='" + name + '\'' +
                ", age=" + age +
                '}';
    }

    // getter / setter
}

第三步,在專案中新增 Gson(用於序列化和反序列化使用者資訊) 依賴:

<dependency>
    <groupId>com.google.code.gson</groupId>
    <artifactId>gson</artifactId>
    <version>2.8.6</version>
    <scope>compile</scope>
</dependency>

第四步,新建測試類 RedisTest:

public class RedisTest {
    private static final String REDIS_KEY = "user";
    public static void main(String[] args) {
        Jedis jedis = new Jedis("localhost", 6379);

        Gson gson = new Gson();
        UserInfo userInfo = new UserInfo("沉默王二", 18);

        jedis.set(REDIS_KEY, gson.toJson(userInfo));
        UserInfo getUserInfoFromRedis = gson.fromJson(jedis.get(REDIS_KEY),UserInfo.class);

        System.out.println("get:" + getUserInfoFromRedis);

        System.out.println("exists:" + jedis.exists(REDIS_KEY));
        System.out.println("del:" + jedis.del(REDIS_KEY));
        System.out.println("get:" + jedis.get(REDIS_KEY));
    }
}

1)REDIS_KEY 常量為儲存使用者資訊到 Redis 的 key。

2)在 Jedis 的幫助下,Java 連線 Redis 服務變得非常簡單,只需要一行程式碼:

Jedis jedis = new Jedis("localhost", 6379);

引數分別是主機名,埠號。

儲存鍵值對用 set() 方法,獲取鍵值對用 get() 方法,判斷鍵值對是否存在用 exists() 方法,刪除鍵值對用 del() 方法。

3)Gson 是谷歌提供的一個開源庫,可以將 Java 物件序列化為 JSON 字串,同樣可以將 JSON 字串反序列化(解析)為匹配的 Java 物件。

使用起來也非常簡單,toJson() 方法將物件轉成 JSON 字串,fromJson() 方法將 JSON 字串反序列化物件。

好了,來看一下程式的輸出結果:

get:UserInfo{name='沉默王二', age=18}
exists:true
del:1
get:null

完全符合我們的預期,perfect!

06、鳴謝

好了,我親愛的小夥伴們,以上就是本文的全部內容了,是不是看完後很想實操一把 Redis,趕快行動吧!如果你在學習的過程中遇到了問題,歡迎隨時和我交流,雖然我也是個菜鳥,但我有熱情啊。

另外,如果你想寫入門級別的文章,這篇就是最好的範例。

我是沉默王二,一枚有趣的程式設計師。如果覺得文章對你有點幫助,請微信搜尋「 沉默王二 」第一時間閱讀,回覆【666】更有我為你精心準備的 500G 高清教學視訊(已分門別類)。

本文 GitHub 已經收錄,有大廠面試完整考點,歡迎 Star。

原創不易,莫要白票,請你為本文點個贊吧,這將是我寫作更多優質文章的最強動力。