Redis筆記

1. 概念: redis是一款高性能的NOSQL系列的非關(guān)系型數(shù)據(jù)庫

  • 什么是NOSQL
    NoSQL(NoSQL = Not Only SQL)拴疤,意即“不僅僅是SQL”,是一項全新的數(shù)據(jù)庫理念仇奶,泛指非關(guān)系型的數(shù)據(jù)庫。
    隨著互聯(lián)網(wǎng)web2.0網(wǎng)站的興起,傳統(tǒng)的關(guān)系數(shù)據(jù)庫在應(yīng)付web2.0網(wǎng)站蟀给,特別是超大規(guī)模和高并發(fā)的SNS類型的web2.0純動態(tài)網(wǎng)站已經(jīng)顯得力不從心黎做,暴露了很多難以克服的問題叉跛,而非關(guān)系型的數(shù)據(jù)庫則由于其本身的特點得到了非常迅速的發(fā)展。NoSQL數(shù)據(jù)庫的產(chǎn)生就是為了解決大規(guī)模數(shù)據(jù)集合多重數(shù)據(jù)種類帶來的挑戰(zhàn)蒸殿,尤其是大數(shù)據(jù)應(yīng)用難題筷厘。

  • NOSQL和關(guān)系型數(shù)據(jù)庫比較
    優(yōu)點:
    1)成本:nosql數(shù)據(jù)庫簡單易部署,基本都是開源軟件宏所,不需要像使用oracle那樣花費大量成本購買使用酥艳,相比關(guān)系型數(shù)據(jù)庫價格便宜。
    2)查詢速度:nosql數(shù)據(jù)庫將數(shù)據(jù)存儲于緩存之中爬骤,關(guān)系型數(shù)據(jù)庫將數(shù)據(jù)存儲在硬盤中充石,自然查詢速度遠不及nosql數(shù)據(jù)庫。
    3)存儲數(shù)據(jù)的格式:nosql的存儲格式是key,value形式霞玄、文檔形式骤铃、圖片形式等等,所以可以存儲基礎(chǔ)類型以及對象或者是集合等各種格式坷剧,而數(shù)據(jù)庫則只支持基礎(chǔ)類型惰爬。
    4)擴展性:關(guān)系型數(shù)據(jù)庫有類似join這樣的多表查詢機制的限制導(dǎo)致擴展很艱難。
    缺點:
    1)維護的工具和資料有限惫企,因為nosql是屬于新的技術(shù)撕瞧,不能和關(guān)系型數(shù)據(jù)庫10幾年的技術(shù)同日而語。
    2)不提供對sql的支持,如果不支持sql這樣的工業(yè)標(biāo)準(zhǔn)风范,將產(chǎn)生一定用戶的學(xué)習(xí)和使用成本咨跌。
    3)不提供關(guān)系型數(shù)據(jù)庫對事務(wù)的處理。

  • 非關(guān)系型數(shù)據(jù)庫的優(yōu)勢:
    1)性能NOSQL是基于鍵值對的硼婿,可以想象成表中的主鍵和值的對應(yīng)關(guān)系锌半,而且不需要經(jīng)過SQL層的解析,所以性能非常高寇漫。
    2)可擴展性同樣也是因為基于鍵值對刊殉,數(shù)據(jù)之間沒有耦合性,所以非常容易水平擴展州胳。

  • 關(guān)系型數(shù)據(jù)庫的優(yōu)勢:
    1)復(fù)雜查詢可以用SQL語句方便的在一個表以及多個表之間做非常復(fù)雜的數(shù)據(jù)查詢记焊。
    2)事務(wù)支持使得對于安全性能很高的數(shù)據(jù)訪問要求得以實現(xiàn)。對于這兩類數(shù)據(jù)庫栓撞,對方的優(yōu)勢就是自己的弱勢遍膜,反之亦然。

  • 總結(jié)
    關(guān)系型數(shù)據(jù)庫與NoSQL數(shù)據(jù)庫并非對立而是互補的關(guān)系瓤湘,即通常情況下使用關(guān)系型數(shù)據(jù)庫瓢颅,在適合使用NoSQL的時候使用NoSQL數(shù)據(jù)庫,
    讓NoSQL數(shù)據(jù)庫對關(guān)系型數(shù)據(jù)庫的不足進行彌補弛说。
    一般會將數(shù)據(jù)存儲在關(guān)系型數(shù)據(jù)庫中挽懦,在nosql數(shù)據(jù)庫中備份存儲關(guān)系型數(shù)據(jù)庫的數(shù)據(jù)

2.主流的NOSQL產(chǎn)品

  • 鍵值(Key-Value)存儲數(shù)據(jù)庫
    相關(guān)產(chǎn)品: Tokyo Cabinet/Tyrant、Redis木人、Voldemort信柿、Berkeley DB
    典型應(yīng)用: 內(nèi)容緩存,主要用于處理大量數(shù)據(jù)的高訪問負(fù)載醒第。
    數(shù)據(jù)模型: 一系列鍵值對
    優(yōu)勢: 快速查詢
    劣勢: 存儲的數(shù)據(jù)缺少結(jié)構(gòu)化
  • 列存儲數(shù)據(jù)庫
    相關(guān)產(chǎn)品:Cassandra, HBase, Riak
    典型應(yīng)用:分布式的文件系統(tǒng)
    數(shù)據(jù)模型:以列簇式存儲渔嚷,將同一列數(shù)據(jù)存在一起
    優(yōu)勢:查找速度快,可擴展性強稠曼,更容易進行分布式擴展
    劣勢:功能相對局限
  • 文檔型數(shù)據(jù)庫
    相關(guān)產(chǎn)品:CouchDB形病、MongoDB
    典型應(yīng)用:Web應(yīng)用(與Key-Value類似,Value是結(jié)構(gòu)化的)
    數(shù)據(jù)模型: 一系列鍵值對
    優(yōu)勢:數(shù)據(jù)結(jié)構(gòu)要求不嚴(yán)格
    劣勢: 查詢性能不高蒲列,而且缺乏統(tǒng)一的查詢語法
    *圖形(Graph)數(shù)據(jù)庫
    相關(guān)數(shù)據(jù)庫:Neo4J、InfoGrid搀罢、Infinite Graph
    典型應(yīng)用:社交網(wǎng)絡(luò)
    數(shù)據(jù)模型:圖結(jié)構(gòu)
    優(yōu)勢:利用圖結(jié)構(gòu)相關(guān)算法蝗岖。
    劣勢:需要對整個圖做計算才能得出結(jié)果,不容易做分布式的集群方案榔至。

3.什么是Redis

Redis是用C語言開發(fā)的一個開源的高性能鍵值對(key-value)數(shù)據(jù)庫抵赢,官方提供測試數(shù)據(jù),50個并發(fā)執(zhí)行100000個請求,讀的速度是110000次/s,寫的速度是81000次/s ,且Redis通過提供多種鍵值數(shù)據(jù)類型來適應(yīng)不同場景下的存儲需求铅鲤,目前為止Redis支持的鍵值數(shù)據(jù)類型如下:
1) 字符串類型 string
2) 哈希類型 hash
3) 列表類型 list
4) 集合類型 set
5) 有序集合類型 sortedset

  • redis的應(yīng)用場景
    ? 緩存(數(shù)據(jù)查詢划提、短連接、新聞內(nèi)容邢享、商品內(nèi)容等等)
    ? 聊天室的在線好友列表
    ? 任務(wù)隊列鹏往。(秒殺、搶購骇塘、12306等等)
    ? 應(yīng)用排行榜
    ? 網(wǎng)站訪問統(tǒng)計
    ? 數(shù)據(jù)過期處理(可以精確到毫秒)
    ? 分布式集群架構(gòu)中的session分離

4.下載安裝

這里以windows方式為例伊履,實際應(yīng)用在Linux中
  1. 官網(wǎng):https://redis.io
  2. 中文網(wǎng):http://www.redis.net.cn/
  3. 下載后解壓直接可以使用:
  • redis.windows.conf:配置文件
  • redis-cli.exe:redis的客戶端
  • redis-server.exe:redis服務(wù)器端


    image.png

雙擊redis-server.exe啟動服務(wù)


image.png

啟動客戶端,存?zhèn)€字符串進行測試款违,雙擊redis-cli.exe


image.png

5.數(shù)據(jù)結(jié)構(gòu)說明

redis的數(shù)據(jù)結(jié)構(gòu):

  • redis存儲的是:key,value格式的數(shù)據(jù)唐瀑,其中key都是字符串,value有5種不同的數(shù)據(jù)結(jié)構(gòu)
  • value的數(shù)據(jù)結(jié)構(gòu):
    1) 字符串類型 string
    2) 哈希類型 hash : map格式
    3) 列表類型 list : linkedlist格式插爹。支持重復(fù)元素
    4) 集合類型 set : 不允許重復(fù)元素
    5) 有序集合類型 sortedset:不允許重復(fù)元素哄辣,且元素有順序
image.png
  • string類型的操作


    image.png
  • hash類型的操作


    image.png

    還有獲取所有hash的val操作


    image.png
  • list類型操作


    image.png
  • 通用命令


    image.png

6.數(shù)據(jù)持久化

  • redis是一個內(nèi)存數(shù)據(jù)庫,當(dāng)redis服務(wù)器重啟赠尾,獲取電腦重啟力穗,數(shù)據(jù)會丟失,我們可以將redis內(nèi)存中的數(shù)據(jù)持久化保存到硬盤的文件中萍虽。
  • redis持久化機制:
    1.RDB:默認(rèn)方式睛廊,不需要進行配置,默認(rèn)就使用這種機制
    * 在一定的間隔時間中杉编,檢測key的變化情況超全,然后持久化數(shù)據(jù)
    1.1 編輯redis.windwos.conf文件
    //after 900 sec (15 min) if at least 1 key changed
    save 900 1
    // after 300 sec (5 min) if at least 10 keys changed
    save 300 10
    //after 60 sec if at least 10000 keys changed
    save 60 10000

1.2 重新啟動redis服務(wù)器,并指定配置文件名稱
D:\JavaWeb2018\day23_redis\資料\redis\windows-64\redis-2.8.9>redis-server.exe redis.windows.conf

  1. AOF:日志記錄的方式邓馒,可以記錄每一條命令的操作嘶朱。可以每一次命令操作后光酣,持久化數(shù)據(jù)
    1. 編輯redis.windwos.conf文件
    appendonly no(關(guān)閉aof) --> appendonly yes (開啟aof)

//appendfsync always : 每一次操作都進行持久化
appendfsync everysec : 每隔一秒進行一次持久化
//appendfsync no : 不進行持久化

7.jedis使用

jedis用來通過java代碼操作redis數(shù)據(jù)庫疏遏,有點類似于jdbc

  • 首先導(dǎo)入需要的jar包


    image.png
  • jedis工具類
/**
 JedisPool工具類
    加載配置文件,配置連接池的參數(shù)
    提供獲取連接的方法

 */
public class JedisPoolUtils {

    private static JedisPool jedisPool;

    static{
        //讀取配置文件
        InputStream is = JedisPoolUtils.class.getClassLoader().getResourceAsStream("jedis.properties");
        //創(chuàng)建Properties對象
        Properties pro = new Properties();
        //關(guān)聯(lián)文件
        try {
            pro.load(is);
        } catch (IOException e) {
            e.printStackTrace();
        }
        //獲取數(shù)據(jù)救军,設(shè)置到JedisPoolConfig中
        JedisPoolConfig config = new JedisPoolConfig();
        config.setMaxTotal(Integer.parseInt(pro.getProperty("maxTotal")));
        config.setMaxIdle(Integer.parseInt(pro.getProperty("maxIdle")));

        //初始化JedisPool
        jedisPool = new JedisPool(config,pro.getProperty("host"),Integer.parseInt(pro.getProperty("port")));



    }


    /**
     * 獲取連接方法
     */
    public static Jedis getJedis(){
        return jedisPool.getResource();
    }
}
  • 對應(yīng)的配置文件


    image.png
  • 配置文件詳細說明
#最大活動對象數(shù)     
redis.pool.maxTotal=1000    
#最大能夠保持idel狀態(tài)的對象數(shù)      
redis.pool.maxIdle=100  
#最小能夠保持idel狀態(tài)的對象數(shù)   
redis.pool.minIdle=50    
#當(dāng)池內(nèi)沒有返回對象時财异,最大等待時間    
redis.pool.maxWaitMillis=10000    
#當(dāng)調(diào)用borrow Object方法時,是否進行有效性檢查    
redis.pool.testOnBorrow=true    
#當(dāng)調(diào)用return Object方法時唱遭,是否進行有效性檢查    
redis.pool.testOnReturn=true  
#“空閑鏈接”檢測線程戳寸,檢測的周期,毫秒數(shù)拷泽。如果為負(fù)值疫鹊,表示不運行“檢測線程”袖瞻。默認(rèn)為-1.  
redis.pool.timeBetweenEvictionRunsMillis=30000  
#向調(diào)用者輸出“鏈接”對象時,是否檢測它的空閑超時拆吆;  
redis.pool.testWhileIdle=true  
# 對于“空閑鏈接”檢測線程而言嗅蔬,每次檢測的鏈接資源的個數(shù)蜓席。默認(rèn)為3.  
redis.pool.numTestsPerEvictionRun=50  
#redis服務(wù)器的IP    
redis.ip=xxxxxx  
#redis服務(wù)器的Port    
redis1.port=6379   
  • 使用
 //1.先從redis中查詢數(shù)據(jù)
        //1.1獲取redis客戶端連接
        Jedis jedis = JedisPoolUtils.getJedis();
        String value= jedis.get("xxx");

        //2判斷 value數(shù)據(jù)是否為null
        if(value== null || value.length() == 0){
            //redis中沒有數(shù)據(jù)
            System.out.println("redis中沒數(shù)據(jù)呀枢,查詢數(shù)據(jù)庫...");
            //2.1從數(shù)據(jù)中查詢
           ...
            //2.2返回查詢結(jié)果
          ...

            //2.3 將查詢數(shù)據(jù)存入redis
            jedis.set("value",value);
            //歸還連接
            jedis.close();

        }else{
            System.out.println("redis中有數(shù)據(jù)缕减,查詢緩存...");
        }
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市奕枢,隨后出現(xiàn)的幾起案子娄昆,更是在濱河造成了極大的恐慌,老刑警劉巖缝彬,帶你破解...
    沈念sama閱讀 221,820評論 6 515
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件萌焰,死亡現(xiàn)場離奇詭異,居然都是意外死亡谷浅,警方通過查閱死者的電腦和手機扒俯,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,648評論 3 399
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來一疯,“玉大人撼玄,你說我怎么就攤上這事《昭” “怎么了掌猛?”我有些...
    開封第一講書人閱讀 168,324評論 0 360
  • 文/不壞的土叔 我叫張陵,是天一觀的道長眉睹。 經(jīng)常有香客問我荔茬,道長,這世上最難降的妖魔是什么竹海? 我笑而不...
    開封第一講書人閱讀 59,714評論 1 297
  • 正文 為了忘掉前任慕蔚,我火速辦了婚禮,結(jié)果婚禮上斋配,老公的妹妹穿的比我還像新娘孔飒。我一直安慰自己,他們只是感情好艰争,可當(dāng)我...
    茶點故事閱讀 68,724評論 6 397
  • 文/花漫 我一把揭開白布坏瞄。 她就那樣靜靜地躺著,像睡著了一般甩卓。 火紅的嫁衣襯著肌膚如雪鸠匀。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 52,328評論 1 310
  • 那天猛频,我揣著相機與錄音狮崩,去河邊找鬼。 笑死鹿寻,一個胖子當(dāng)著我的面吹牛睦柴,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播毡熏,決...
    沈念sama閱讀 40,897評論 3 421
  • 文/蒼蘭香墨 我猛地睜開眼坦敌,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了痢法?” 一聲冷哼從身側(cè)響起狱窘,我...
    開封第一講書人閱讀 39,804評論 0 276
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎财搁,沒想到半個月后蘸炸,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 46,345評論 1 318
  • 正文 獨居荒郊野嶺守林人離奇死亡尖奔,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 38,431評論 3 340
  • 正文 我和宋清朗相戀三年搭儒,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片提茁。...
    茶點故事閱讀 40,561評論 1 352
  • 序言:一個原本活蹦亂跳的男人離奇死亡淹禾,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出茴扁,到底是詐尸還是另有隱情铃岔,我是刑警寧澤,帶...
    沈念sama閱讀 36,238評論 5 350
  • 正文 年R本政府宣布峭火,位于F島的核電站毁习,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏躲胳。R本人自食惡果不足惜蜓洪,卻給世界環(huán)境...
    茶點故事閱讀 41,928評論 3 334
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望坯苹。 院中可真熱鬧隆檀,春花似錦、人聲如沸粹湃。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,417評論 0 24
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽为鳄。三九已至裳仆,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間孤钦,已是汗流浹背歧斟。 一陣腳步聲響...
    開封第一講書人閱讀 33,528評論 1 272
  • 我被黑心中介騙來泰國打工纯丸, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人静袖。 一個月前我還...
    沈念sama閱讀 48,983評論 3 376
  • 正文 我出身青樓觉鼻,卻偏偏與公主長得像,于是被迫代替她去往敵國和親队橙。 傳聞我的和親對象是個殘疾皇子坠陈,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 45,573評論 2 359