Redis初識(shí)

Redis介紹

Redis是一個(gè)開源的使用ANSI C語言編寫濒生、支持網(wǎng)絡(luò)有决、可基于內(nèi)存亦可持久化的日志型、Key-Value數(shù)據(jù)庫(kù)褐桌,并提供多種語言的API。

小白理解:就是個(gè)軟件象迎,安裝在電腦上啟動(dòng)之后荧嵌,會(huì)占用電腦8G內(nèi)存中的一部分內(nèi)存,來存儲(chǔ)需要緩存的數(shù)據(jù)砾淌。訪問內(nèi)存效率和訪問磁盤效率的速度級(jí)別不一樣啦撮,所以這部分緩存內(nèi)存還是比較珍貴的,當(dāng)然生產(chǎn)機(jī)器的內(nèi)存在128G以上倒是可以緩存不少數(shù)據(jù)汪厨。

一般什么情況下可以使用Redis

  • 1 緩存:

簡(jiǎn)單舉例赃春,用戶相同URL+參數(shù)請(qǐng)求到后臺(tái),后臺(tái)先去訪問Redis緩存劫乱,第一次訪問key=URL+參數(shù)织中,沒有緩存,本次直接訪問MySQL數(shù)據(jù)庫(kù)衷戈,并且把結(jié)果存到Redis緩存中狭吼,在緩存有效期內(nèi),從第2次之后的所有請(qǐng)求殖妇,都訪問Redis緩存中的數(shù)據(jù)刁笙,達(dá)到高峰期減少數(shù)據(jù)庫(kù)的查詢負(fù)擔(dān)。

  • 2 分布式鎖:

目前比較流行微服務(wù)架構(gòu)谦趣,單機(jī)JVM鎖不足以達(dá)到同步資源競(jìng)爭(zhēng)的目的疲吸,此時(shí)可以借助Redis設(shè)置key值線程互斥特性(只要可以達(dá)到線程安全互斥功能的軟件都可以用來實(shí)現(xiàn)分布式鎖功能,例如:數(shù)據(jù)庫(kù)InnoDB引擎行級(jí)鎖前鹅、zookeeper的set節(jié)點(diǎn)方法等)這里就不細(xì)說了摘悴。

一、安裝

略...

二舰绘、常用命令

默認(rèn)安裝 Redis有16個(gè)數(shù)據(jù)庫(kù)分別為 Database 0-15

1 啟動(dòng)命令

  • For Linux
# bin目錄下直接啟動(dòng)
> redis-server 
# bin目錄下作為后臺(tái)程序啟動(dòng)
> nohup redis-server &
  • For Windows10
# 第一步
> cd C:\Program Files\Redis
# 第二步 配置文件
> redis-server.exe redis.windows.conf
  • For Mac
# bin目錄下直接啟動(dòng)
> redis-server 

2 選擇數(shù)據(jù)庫(kù)命令

# 選擇第0個(gè)數(shù)據(jù)庫(kù) 當(dāng)然默認(rèn)最大值為15
127.0.0.1:6379> select 0
OK

3 存取數(shù)據(jù)命令

  • String格式
# 設(shè)置中文
127.0.0.1:6379> set name 張三
OK
127.0.0.1:6379> get name
"\xe5\xbc\xa0\xe4\xb8\x89"

# 設(shè)置數(shù)字
127.0.0.1:6379> set age 100
OK
127.0.0.1:6379> get age
"100"
  • list集合格式
# 設(shè)置長(zhǎng)度為4的list key=nums
127.0.0.1:6379> lpush nums 1
(integer) 1
127.0.0.1:6379> lpush nums 2
(integer) 2
127.0.0.1:6379> lpush nums 3
(integer) 3
127.0.0.1:6379> lpush nums 5
(integer) 4

# 獲取nums內(nèi)容
127.0.0.1:6379> lrange nums 0 4
1) "5"
2) "3"
3) "2"
4) "1"
# 截取長(zhǎng)度超過總長(zhǎng)度 默認(rèn)取最大值
127.0.0.1:6379> lrange nums 0 5
1) "5"
2) "3"
3) "2"
4) "1"
127.0.0.1:6379> 

#獲取nums長(zhǎng)度
127.0.0.1:6379> llen nums
(integer) 4

list定位烦租、刪除等功能后續(xù)補(bǔ)上,由于時(shí)間關(guān)系這里就不列舉了

  • set集合格式
# 給集合demos中添加元素1235 四個(gè)值
127.0.0.1:6379> sadd demos 1
(integer) 1
127.0.0.1:6379> sadd demos 2
(integer) 1
127.0.0.1:6379> sadd demos 3
(integer) 1
127.0.0.1:6379> sadd demos 5
(integer) 1

# 查看set集合demos中的內(nèi)容
127.0.0.1:6379> smembers demos
1) "1"
2) "2"
3) "3"
4) "5"

Redis 有序集合和集合一樣也是string類型元素的集合,且不允許重復(fù)的成員除盏。
不同的是每個(gè)元素都會(huì)關(guān)聯(lián)一個(gè)double類型的分?jǐn)?shù)。redis正是通過分?jǐn)?shù)來為集合中的成員進(jìn)行從小到大的排序挫以。

  • hash集合操作 (類似map)
# 單個(gè)值操作
127.0.0.1:6379> hset map1 name zhangsan
(integer) 1
127.0.0.1:6379> hget map1 name
"zhangsan"

# 多個(gè)值操作 此時(shí)相當(dāng)于可以存儲(chǔ)對(duì)象
127.0.0.1:6379> hmset map2 name zhangsan age 22 sex 1 mobile 18202179701
OK
# 獲取某個(gè)屬性
127.0.0.1:6379> hmget map2 name
1) "zhangsan"
# 獲取對(duì)象全部?jī)?nèi)容
127.0.0.1:6379> hgetall map2
1) "name"
2) "zhangsan"
3) "age"
4) "22"
5) "sex"
6) "1"
7) "mobile"
8) "18202179701"
  • stream格式 (5.0穩(wěn)定版本新增者蠕,了解一下,后續(xù)補(bǔ)充完整)
127.0.0.1:6379> xadd test * apple 1
1507383725597-0
127.0.0.1:6379> xadd test * binana 2
1507383735965-0

127.0.0.1:6379> xrange test 1507383725597-0 1507383735965-0
1) 1) 1507383725597-0
   2) 1) "apple"
      2) "1"
2) 1) 1507383735965-0
   2) 1) "binana"
      2) "2"

其實(shí)以上命令開發(fā)的時(shí)候基本上用不上掐松,對(duì)Java和Python等語言都有第三方封裝好了Api直接導(dǎo)入使用

三 Redis緩存高并發(fā)情況下

Java使用例子

public class RedisTool {

    private static final String LOCK_SUCCESS = "OK";
    private static final String SET_IF_NOT_EXIST = "NX";
    private static final String SET_WITH_EXPIRE_TIME = "PX";

    /**
     * 嘗試獲取分布式鎖
     * @param jedis Redis客戶端
     * @param lockKey 鎖
     * @param requestId 請(qǐng)求標(biāo)識(shí)
     * @param expireTime 超期時(shí)間
     * @return 是否獲取成功
     */
    public static boolean tryGetDistributedLock(Jedis jedis, String lockKey, String requestId, int expireTime) {

        String result = jedis.set(lockKey, requestId, SET_IF_NOT_EXIST, SET_WITH_EXPIRE_TIME, expireTime);
        if (LOCK_SUCCESS.equals(result)) {
            return true;
        }
        return false;
    }
}

可以看到踱侣,我們加鎖就一行代碼:jedis.set(String key, String value, String nxxx, String expx, int time)粪小,這個(gè)set()方法一共有五個(gè)形參:

第一個(gè)為key,我們使用key來當(dāng)鎖抡句,因?yàn)閗ey是唯一的探膊。

第二個(gè)為value,我們傳的是requestId待榔,很多童鞋可能不明白逞壁,有key作為鎖不就夠了嗎,為什么還要用到value锐锣?原因就是我們?cè)谏厦嬷v到可靠性時(shí)腌闯,分布式鎖要滿足第四個(gè)條件解鈴還須系鈴人,通過給value賦值為requestId雕憔,我們就知道這把鎖是哪個(gè)請(qǐng)求加的了姿骏,在解鎖的時(shí)候就可以有依據(jù)。requestId可以使用UUID.randomUUID().toString()方法生成斤彼。

第三個(gè)為nxxx分瘦,這個(gè)參數(shù)我們填的是NX,意思是SET IF NOT EXIST琉苇,即當(dāng)key不存在時(shí)嘲玫,我們進(jìn)行set操作;若key已經(jīng)存在翁潘,則不做任何操作趁冈;

第四個(gè)為expx,這個(gè)參數(shù)我們傳的是PX拜马,意思是我們要給這個(gè)key加一個(gè)過期的設(shè)置渗勘,具體時(shí)間由第五個(gè)參數(shù)決定。

第五個(gè)為time俩莽,與第四個(gè)參數(shù)相呼應(yīng)旺坠,代表key的過期時(shí)間。

總的來說扮超,執(zhí)行上面的set()方法就只會(huì)導(dǎo)致兩種結(jié)果:1. 當(dāng)前沒有鎖(key不存在)取刃,那么就進(jìn)行加鎖操作,并對(duì)鎖設(shè)置個(gè)有效期出刷,同時(shí)value表示加鎖的客戶端璧疗。2. 已有鎖存在,不做任何操作馁龟。
RLock lock = redisson.getLock("myLock");
// 加鎖
lock.lock();
// 或者設(shè)置加鎖時(shí)間坷檩,防止代碼報(bào)錯(cuò)后却音,鎖不釋放
lock.lock(10, TimeUnit.SECONDS);
// 再或者每個(gè)一段時(shí)間嘗試加鎖一次
boolean res = lock.tryLock(100, 10, TimeUnit.SECONDS);
// 以上三種方式都可以
if (res) {
   try {
     ...
   } finally {
       // 最后解鎖改抡,讓其他線程進(jìn)來
       lock.unlock();
   }
}

maven引入

<!-- https://mvnrepository.com/artifact/org.redisson/redisson -->
<dependency>
    <groupId>org.redisson</groupId>
    <artifactId>redisson</artifactId>
    <version>3.11.2</version>
</dependency>

四 Redis和Memcache對(duì)比

  • memcache是一個(gè)分布式的內(nèi)存對(duì)象緩存系統(tǒng),并不提供持久存儲(chǔ)功能系瓢,而redis擁有持久化功能(其實(shí)memcache也支持部分延遲持久化到磁盤)
  • memcache數(shù)據(jù)存儲(chǔ)基于LRU(簡(jiǎn)單說:最近阿纤、最少使用key會(huì)被剔除),而redis則可以永久保存(服務(wù)一直運(yùn)行情況下)
  • memcache是多線程的(這是memcache優(yōu)勢(shì)之一)夷陋,也就意味著阻塞情況少欠拾,而redis是單線程的,阻塞情況相對(duì)較多肌稻,兩者性能上相差不大
  • memcache只支持簡(jiǎn)單的k清蚀、v數(shù)據(jù)存儲(chǔ),而redis支持多種數(shù)據(jù)格式存儲(chǔ)爹谭。
  • memcache是多線程枷邪、非阻塞IO復(fù)用網(wǎng)絡(luò)模型,而redis是單線程IO復(fù)用模型

五 Redis基本概念整理截圖

image.png

以上為Redis技能淺談诺凡,對(duì)于新手還算比較實(shí)用东揣。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市腹泌,隨后出現(xiàn)的幾起案子嘶卧,更是在濱河造成了極大的恐慌,老刑警劉巖凉袱,帶你破解...
    沈念sama閱讀 212,454評(píng)論 6 493
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件芥吟,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡专甩,警方通過查閱死者的電腦和手機(jī)钟鸵,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,553評(píng)論 3 385
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來涤躲,“玉大人棺耍,你說我怎么就攤上這事≈钟#” “怎么了蒙袍?”我有些...
    開封第一講書人閱讀 157,921評(píng)論 0 348
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)嫩挤。 經(jīng)常有香客問我害幅,道長(zhǎng),這世上最難降的妖魔是什么岂昭? 我笑而不...
    開封第一講書人閱讀 56,648評(píng)論 1 284
  • 正文 為了忘掉前任矫限,我火速辦了婚禮,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘叼风。我一直安慰自己,他們只是感情好棍苹,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,770評(píng)論 6 386
  • 文/花漫 我一把揭開白布无宿。 她就那樣靜靜地躺著,像睡著了一般枢里。 火紅的嫁衣襯著肌膚如雪孽鸡。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 49,950評(píng)論 1 291
  • 那天栏豺,我揣著相機(jī)與錄音彬碱,去河邊找鬼。 笑死奥洼,一個(gè)胖子當(dāng)著我的面吹牛巷疼,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播灵奖,決...
    沈念sama閱讀 39,090評(píng)論 3 410
  • 文/蒼蘭香墨 我猛地睜開眼嚼沿,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來了瓷患?” 一聲冷哼從身側(cè)響起骡尽,我...
    開封第一講書人閱讀 37,817評(píng)論 0 268
  • 序言:老撾萬榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎擅编,沒想到半個(gè)月后攀细,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 44,275評(píng)論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡爱态,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,592評(píng)論 2 327
  • 正文 我和宋清朗相戀三年谭贪,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片肢藐。...
    茶點(diǎn)故事閱讀 38,724評(píng)論 1 341
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡故河,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出吆豹,到底是詐尸還是另有隱情鱼的,我是刑警寧澤,帶...
    沈念sama閱讀 34,409評(píng)論 4 333
  • 正文 年R本政府宣布痘煤,位于F島的核電站凑阶,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏衷快。R本人自食惡果不足惜宙橱,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 40,052評(píng)論 3 316
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧师郑,春花似錦环葵、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,815評(píng)論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至地梨,卻和暖如春菊卷,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背宝剖。 一陣腳步聲響...
    開封第一講書人閱讀 32,043評(píng)論 1 266
  • 我被黑心中介騙來泰國(guó)打工洁闰, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人万细。 一個(gè)月前我還...
    沈念sama閱讀 46,503評(píng)論 2 361
  • 正文 我出身青樓扑眉,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親雅镊。 傳聞我的和親對(duì)象是個(gè)殘疾皇子襟雷,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,627評(píng)論 2 350

推薦閱讀更多精彩內(nèi)容

  • 1.Redis簡(jiǎn)介 Redis本質(zhì)上是一種鍵值數(shù)據(jù)庫(kù),但它在保持鍵值數(shù)據(jù)庫(kù)簡(jiǎn)單快捷特點(diǎn)的同時(shí)仁烹,又吸收了部分關(guān)系數(shù)據(jù)...
    擦普洱閱讀 404評(píng)論 0 2
  • 初識(shí) Redis 《 Redis 開發(fā)與運(yùn)維》的學(xué)習(xí)筆記耸弄,希望大家多多指導(dǎo)。 什么是 Redis Redis 的全...
    izerone閱讀 367評(píng)論 1 2
  • redis是Redis是一個(gè)開源的使用ANSI C語言編寫卓缰、支持網(wǎng)絡(luò)计呈、可基于內(nèi)存亦可持久化的日志型、Key-Val...
    鏡中無我閱讀 181評(píng)論 0 0
  • 一征唬、Redis 1捌显、概述 Redis是速度非常快的非關(guān)系型內(nèi)存鍵值數(shù)據(jù)庫(kù)总寒,可以存儲(chǔ)鍵和物種不同類型的值之間的映射扶歪。...
    落地生涯閱讀 780評(píng)論 0 3
  • Redis是什么?1.百科定義Redis是一個(gè)開源的使用ANSI C語言編寫摄闸、支持網(wǎng)絡(luò)善镰、可基于內(nèi)存亦可持久化的日志...
    織田信長(zhǎng)閱讀 285評(píng)論 0 2