說起來迈喉,可能有些小伙伴會不相信,我是第一次用 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 Reference 和 Redis 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)動力放棒。