你離高薪 offer 只差一個Redis入門才沧,我是認(rèn)真的

說起來迈喉,可能有些小伙伴會不相信,我是第一次用 Redis温圆,真的挨摸。因?yàn)楣拘。瑯I(yè)務(wù)量小岁歉,Redis 根本派不上用場得运。不過,最近打算把系統(tǒng)升級一下锅移,順帶把當(dāng)下時髦的技術(shù)入個門熔掺,“與時俱進(jìn)”嘛,雖然進(jìn)的有“一點(diǎn)點(diǎn)”晚(注意雙引號)非剃。

作為一名富有責(zé)任心的技術(shù)博主置逻,我覺得有必要把我入門 Redis 的過程分享出來,供一些小伙伴作為參考备绽。要是我哪里寫錯了券坞,別客氣鬓催,過來給我一巴掌,就行了(溫柔點(diǎn)恨锚,別打腫宇驾,影響顏值就不好了)。

01猴伶、Redis 是什么

Redis 是互聯(lián)網(wǎng)技術(shù)領(lǐng)域中使用最廣泛的存儲中間件课舍,它是 Remote Dictionary Service 三個單詞中加粗字母的組合。你別說蜗顽,組合起來后念著挺自然的布卡。

Redis 以超高的性能、完美的文檔雇盖、簡潔的源碼著稱忿等,國內(nèi)外很多大型互聯(lián)網(wǎng)公司都在用,比如說阿里崔挖、騰訊贸街、GitHub、Stack Overflow 等等狸相。它的版本更新非常的快薛匪,功能也越來越強(qiáng)大,最初只是用來作為緩存數(shù)據(jù)庫脓鹃,現(xiàn)在已經(jīng)可以用它來實(shí)現(xiàn)消息隊(duì)列了逸尖。

可以這么說吧,掌握 Redis 已經(jīng)變成了一項(xiàng)后端工程師必須具備的基礎(chǔ)技能瘸右。

Redis 的作者是一名意大利人娇跟,網(wǎng)名 Antirez,長相還是過得去的太颤,感興趣的小伙伴可以 Google 一下苞俘。知道為什么 Redis 的默認(rèn)端口是 6379 嗎?

據(jù)說是手機(jī)鍵盤上“MERZ”的位置決定的龄章,小伙伴們可以打開自己手機(jī)上九宮格鍵盤感受一下吃谣。“MERZ”是什么意思呢做裙?據(jù)說是“愚蠢”的意思岗憋。這?是不是感覺程序員的生活中還是有蠻多神秘色彩的菇用?

02澜驮、安裝 Redis

Redis 針對不同的操作系統(tǒng)有不同的安裝方式,我們這篇入門的文章就以 Windows 為例吧惋鸥。

下載地址如下:

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

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

有兩種安裝方式,第一種是 msi 的方式溅漾,雙擊運(yùn)行后安裝山叮;第二種是免安裝,綠色版添履,只需要把 zip 包解壓就可以了屁倔。

里面有一份英文版的文檔——Windows Service Documentation.docx凉驻,教我們?nèi)绾伟惭b Redis 服務(wù)量承、如何啟動、如何關(guān)閉疗杉,以及如何使用自定義端口啟動服務(wù)往衷。

打開命令行钞翔,進(jìn)入到當(dāng)前解壓后的目錄,輸入啟動命令:

redis-server redis.windows.conf

然后你就會看到 Redis 啟動后的歡迎畫面席舍,左邊這個盒子感覺好有藝術(shù)感安冀巍!有小伙伴知道是怎么生成的嗎来颤?

還有一些其他的提示信息:

  • Redis 當(dāng)前的版本號為 3.2.100
  • 端口是 6379
  • 進(jìn)程 ID汰扭,也就是 PID 為 12636
  • Redis 官方地址為:http://redis.io

那如何停止服務(wù)呢?可以直接按下 Ctrl+C 組合鍵——粗暴脚曾、壁咚(當(dāng)然可以直接點(diǎn)右上角的叉號)东且。

PS:本來想用 Linux 版或者 OSX 版的,怕入門的小伙伴沒有環(huán)境本讥。后面可以整一個珊泳。

03、Redis 的數(shù)據(jù)結(jié)構(gòu)

Redis 有 5 種基礎(chǔ)數(shù)據(jù)結(jié)構(gòu)拷沸,String色查、Hash、List撞芍、Set秧了、SortedSet,也是學(xué) Redis 必須掌握的序无。除此之外验毡,還有 HyperLogLog衡创、Geo、Pub/Sub晶通,算是高級數(shù)據(jù)結(jié)構(gòu)了璃氢。我們這篇入門的文章就以 String 為例吧。

String 結(jié)構(gòu)使用非常廣泛狮辽,比如說把用戶的登陸信息轉(zhuǎn)成 JSON 字符串后緩存起來一也,等需要取出的時候再反序列化一次。

小伙伴們應(yīng)該都知道喉脖,Java 的 String 是不可變的椰苟,無法修改。Redis 的 String 是動態(tài)的树叽,可以修改的舆蝴,兩者不同哦。關(guān)于 Redis 的 String 結(jié)構(gòu)菱皆,我覺得老錢的 Redis 教程上講得非常明白须误,大家一起拜讀下。

Redis 的 String 在內(nèi)部結(jié)構(gòu)實(shí)現(xiàn)上類似于 Java 的 ArrayList仇轻,采用預(yù)分配冗余空間的方式來減少內(nèi)存的頻繁分配京痢。如上圖所示,當(dāng)前字符串實(shí)際分配的空間為 capacity篷店,一般高于實(shí)際的字符串長度 len祭椰。當(dāng)字符串長度小于 1M 時,擴(kuò)容是對現(xiàn)有空間的成倍增長疲陕;如果長度超過 1M 時方淤,擴(kuò)容一次只會多增加 1M 的空間。最大長度為 512M蹄殃。

04携茂、實(shí)操 Redis

好了好了,我估計很多小伙伴們已經(jīng)整裝待發(fā)诅岩,準(zhǔn)備實(shí)操一把了讳苦。這就來。

Redis 的解壓目錄下有一個名叫 redis-cli.exe 的文件吩谦,這是 Redis 自帶的一個客戶端工具鸳谜,可以用來連接之前我們啟動好的 Redis 服務(wù)。雙擊啟動它式廷。

這個客戶端還是非常智能的咐扭,當(dāng)鍵入命令的時候,會跳出對應(yīng)的提示

當(dāng)按下空格跟進(jìn)關(guān)鍵字的時候,對應(yīng)位置上的提示會自動消失蝗肪。

以下是完整的鍵值對測試命令袜爪,小伙伴們可以按照格式動手實(shí)操一把。

> 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 表示執(zhí)行成功胰苏,(integer) 0 表示執(zhí)行失敗。

5)當(dāng)鍵值對刪除后醇疼,再通過 get 命令獲取時硕并,結(jié)果就為 (nil)

可能有小伙伴會好奇秧荆,nil 是什么意思倔毙?它是 Objective-C、Swift乙濒、Ruby陕赃、Lua 等編程語言中的一個關(guān)鍵字,更詳細(xì)的解釋可以看一下《Programming in Lua 程序設(shè)計第二版》:

nil 是一種類型颁股,它只有一個值 nil么库,它的主要功能是用于區(qū)別其他任何值,就像之前所說的甘有,一個全局變量在第一次賦值前的默認(rèn)值就是 nil诉儒,將 nil 賦予一個全局變量等同于刪除它,Lua 將 nil 用于表示一種“無效值(non-value)”的情況亏掀,即沒有任何有效值的情況忱反。

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

http://redisdoc.com/index.html

Redis Command ReferenceRedis Documentation 的中文翻譯版幌氮,良心吧缭受?

05、在 Java 中使用 Redis

有些小伙伴可能會問该互,“二哥米者,我是一名 Java 程序員,我該如何在 Java 中使用 Redis 呢?”這個問題問得好蔓搞,這就來胰丁,這就來。

第一步喂分,在項(xiàng)目中添加 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
}

第三步,在項(xiàng)目中添加 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 服務(wù)變得非常簡單梆掸,只需要一行代碼:

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

參數(shù)分別是主機(jī)名扬卷,端口號。

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

3)Gson 是谷歌提供的一個開源庫徒恋,可以將 Java 對象序列化為 JSON 字符串,同樣可以將 JSON 字符串反序列化(解析)為匹配的 Java 對象欢伏。

使用起來也非常簡單入挣,toJson() 方法將對象轉(zhuǎn)成 JSON 字符串,fromJson() 方法將 JSON 字符串反序列化對象颜懊。

好了财岔,來看一下程序的輸出結(jié)果:

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

完全符合我們的預(yù)期,perfect河爹!

06匠璧、鳴謝

好了,我親愛的小伙伴們咸这,以上就是本文的全部內(nèi)容了夷恍,是不是看完后很想實(shí)操一把 Redis,趕快行動吧媳维!如果你在學(xué)習(xí)的過程中遇到了問題酿雪,歡迎隨時和我交流,雖然我也是個菜鳥侄刽,但我有熱情啊指黎。

另外,如果你想寫入門級別的文章州丹,這篇就是最好的范例醋安。

我是沉默王二杂彭,一枚有趣的程序員。如果覺得文章對你有點(diǎn)幫助吓揪,請微信搜索「 沉默王二 」第一時間閱讀亲怠,回復(fù)【666】更有我為你精心準(zhǔn)備的 500G 高清教學(xué)視頻(已分門別類)。

本文 GitHub 已經(jīng)收錄柠辞,有大廠面試完整考點(diǎn)团秽,歡迎 Star。

原創(chuàng)不易叭首,莫要白票习勤,請你為本文點(diǎn)個贊吧,這將是我寫作更多優(yōu)質(zhì)文章的最強(qiáng)動力放棒。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末姻报,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子间螟,更是在濱河造成了極大的恐慌,老刑警劉巖损肛,帶你破解...
    沈念sama閱讀 222,183評論 6 516
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件厢破,死亡現(xiàn)場離奇詭異,居然都是意外死亡治拿,警方通過查閱死者的電腦和手機(jī)摩泪,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,850評論 3 399
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來劫谅,“玉大人见坑,你說我怎么就攤上這事∧蠹欤” “怎么了荞驴?”我有些...
    開封第一講書人閱讀 168,766評論 0 361
  • 文/不壞的土叔 我叫張陵,是天一觀的道長贯城。 經(jīng)常有香客問我熊楼,道長,這世上最難降的妖魔是什么能犯? 我笑而不...
    開封第一講書人閱讀 59,854評論 1 299
  • 正文 為了忘掉前任鲫骗,我火速辦了婚禮,結(jié)果婚禮上踩晶,老公的妹妹穿的比我還像新娘执泰。我一直安慰自己,他們只是感情好渡蜻,可當(dāng)我...
    茶點(diǎn)故事閱讀 68,871評論 6 398
  • 文/花漫 我一把揭開白布术吝。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪顿苇。 梳的紋絲不亂的頭發(fā)上峭咒,一...
    開封第一講書人閱讀 52,457評論 1 311
  • 那天,我揣著相機(jī)與錄音纪岁,去河邊找鬼凑队。 笑死,一個胖子當(dāng)著我的面吹牛幔翰,可吹牛的內(nèi)容都是我干的漩氨。 我是一名探鬼主播,決...
    沈念sama閱讀 40,999評論 3 422
  • 文/蒼蘭香墨 我猛地睜開眼遗增,長吁一口氣:“原來是場噩夢啊……” “哼叫惊!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起做修,我...
    開封第一講書人閱讀 39,914評論 0 277
  • 序言:老撾萬榮一對情侶失蹤霍狰,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后饰及,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體蔗坯,經(jīng)...
    沈念sama閱讀 46,465評論 1 319
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,543評論 3 342
  • 正文 我和宋清朗相戀三年燎含,在試婚紗的時候發(fā)現(xiàn)自己被綠了宾濒。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 40,675評論 1 353
  • 序言:一個原本活蹦亂跳的男人離奇死亡屏箍,死狀恐怖绘梦,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情赴魁,我是刑警寧澤卸奉,帶...
    沈念sama閱讀 36,354評論 5 351
  • 正文 年R本政府宣布,位于F島的核電站尚粘,受9級特大地震影響择卦,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜郎嫁,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 42,029評論 3 335
  • 文/蒙蒙 一秉继、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧泽铛,春花似錦尚辑、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,514評論 0 25
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽月褥。三九已至,卻和暖如春瓢喉,著一層夾襖步出監(jiān)牢的瞬間宁赤,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,616評論 1 274
  • 我被黑心中介騙來泰國打工栓票, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留决左,地道東北人。 一個月前我還...
    沈念sama閱讀 49,091評論 3 378
  • 正文 我出身青樓走贪,卻偏偏與公主長得像佛猛,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子坠狡,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,685評論 2 360