day67_Redis學習筆記_01

課程計劃php

  • 一、Redis的介紹
    • a) 什麼是NoSql
    • b) NoSql的分類
    • c) 什麼是Redis
    • d) Redis的歷史發展
    • e) Redis的應用場景
  • 二、Redis服務端的安裝(重點)
  • 三、Redis客戶端的使用
    • a) redis自帶客戶端(命令行)
    • b) 圖形界面的客戶端(瞭解)
    • c) Java客戶端Jedis(重點)
  • 四、Redis的數據類型(重點)
    • a) String類型
    • b) 散列類型(Map類型)
    • c) List類型(列表類型)
    • d) Set類型(集合類型)
    • e) SortedSet類型(zset類型)
  • 五、keys命令(瞭解)
  • 六、Redis的持久化方案
    • a) RDB方式(默認)
    • b) AOF方式
  • 七、Redis的主從複製
  • 八、Redis的集羣(重點)
  • 九、Jedis鏈接Redis集羣

一、Redis的介紹

1.一、什麼是NoSql

爲了解決高併發、高可擴展、高可用、大數據存儲問題而產生的數據庫解決方案,就是NoSql數據庫。
NoSQL,泛指非關係型的數據庫,NoSQL即Not-Only SQL,它能夠做爲關係型數據庫的良好補充前端

1.二、Nosql的分類

鍵值(Key-Value)存儲數據庫:
  相關產品:Tokyo Cabinet/Tyrant、Redis、Voldemort、Berkeley DB
  典型應用:內容緩存,主要用於處理大量數據的高訪問負載
  數據模型:一系列鍵值對
  優點:快速查詢
  劣勢:存儲的數據缺乏結構化(如今經過Redis數據類型獲得解決)
列存儲數據庫:
  相關產品:Cassandra、HBase、Riak
  典型應用:分佈式的文件系統
  數據模型:以列簇式存儲,將同一列數據存在一塊兒
  優點:查找速度快,可擴展性強,更容易進行分佈式擴展
  劣勢:功能相對侷限
文檔型數據庫:
  相關產品:CouchDB、MongoDB
  典型應用:Web應用(與Key-Value相似,Value是結構化的),好比:存儲日誌
  數據模型:一系列鍵值對
  優點:數據結構要求不嚴格
  劣勢:查詢性能不高,並且缺少統一的查詢語法
圖形(Graph)數據庫:
  相關數據庫:Neo4J、InfoGrid、Infinite Graph
  典型應用:社交網絡、微信平臺
  數據模型:圖結構
  優點:利用圖結構相關算法。
  劣勢:須要對整個圖作計算才能得出結果,不容易作分佈式的集羣方案。java

1.三、什麼是Redis

  Redis是用C語言開發的一個開源的高性能鍵值對(key-value)數據庫。它經過提供多種鍵值數據類型來適應不一樣場景下的存儲需求,目前爲止Redis支持的鍵值數據類型以下:
  String字符串類型
  Map散列類型
  List列表類型
  Set集合類型
  SortedSet有序集合類型linux

1.四、Redis的歷史發展

  2008年,意大利的一家創業公司Merzia推出了一款基於MySQL的網站實時統計系統LLOOGG,然而沒過多久該公司的創始人Salvatore Sanfilippo便對MySQL的性能感到失望,因而他決定親自爲LLOOGG量身定作一個數據庫,並於2009年開發完成,這個數據庫就是Redis。不過Salvatore Sanfilippo並不知足只將Redis用於LLOOGG這一款產品,而是但願更多的人使用它,因而在同一年Salvatore Sanfilippo將Redis開源發佈,並開始和Redis的另外一名主要的代碼貢獻者Pieter Noordhuis一塊兒繼續着Redis的開發,直到今天。
  Salvatore Sanfilippo本身也沒有想到,短短的幾年時間,Redis就擁有了龐大的用戶羣體。Hacker News在2012年發佈了一份數據庫的使用狀況調查,結果顯示有近12%的公司在使用Redis。國內如新浪微博、街旁網、知乎網,國外如GitHub、Stack Overflow、Flickr等都是Redis的用戶。
  VMware公司從2010年開始贊助Redis的開發,Salvatore Sanfilippo和Pieter Noordhuis也分別在3月和5月加入VMware,全職開發Redis。c++

1.五、Redis的應用場景

  一、緩存(數據查詢、短鏈接、新聞內容、商品內容等等)。(最多使用)
  二、分佈式集羣架構中的session分離。
  三、聊天室的在線好友列表。
  四、任務隊列。(秒殺、搶購、12306等等)
  五、應用排行榜。
  六、網站訪問統計。
  七、數據過時處理(能夠精確到毫秒)。git

二、Redis服務端的安裝(重點)

2.一、Redis的下載

  • 官網地址:http://redis.io/
  • 最新版本爲:redis-5.0.0
  • 本課程使用:redis-3.0.0
  • 下載地址:http://download.redis.io/releases/redis-3.0.0.tar.g

2.二、Redis的安裝

Redis是C語言開發,建議在linux上運行,本教程使用Centos7做爲安裝環境。github

  • 第一步:在VMware中安裝CentOS7(參考Linux教程中的安裝虛擬機)
  • 第二步:在Linux下安裝gcc環境(該步驟能夠省略,CentOS中默認自帶C環境),可是建議仍是手動安裝下,須要聯網,安裝命令以下:
      [root@itheima ~]# yum install gcc-c++
    安裝成功截圖:
  • 第三步:將下載的Redis源碼包上傳到Linux服務器中
    【注意:SecureCRT須要切換到sftp窗口,步驟:選中鏈接窗口右鍵「鏈接SFTP會話」,直接拖拽文件至窗口中,回車】
      sftp> put -r "E:\學習資料\java\java就業班\1七、第十七階段redis(1天)\redis\res\redis-3.0.0.tar.gz"
  • 第四步:返回到鏈接窗口,解壓縮redis源碼包
      [root@itheima ~]# tar -zxf redis-3.0.0.tar.gz
  • 第五步:編譯redis源碼
      [root@itheima ~]# cd redis-3.0.0/
      [root@itheima redis-3.0.0]# make
  • 第六步:安裝redis
      [root@itheima redis-3.0.0]# make install PREFIX=/usr/local/redis
  • 第七步:查看是否安裝成功
      [root@itheima redis-3.0.0]# cd /usr/local/redis/
      [root@itheima redis]# ll

2.三、Redis的啓動

2.3.一、前端啓動

  • 前端啓動的命令:
      [root@itheima bin]# ./redis-server
  • 前端啓動的關閉命令:
      強制關閉(非法關閉):Ctrl+c
      正常關閉(須要經過其餘窗口):[root@itheima bin]# ./redis-cli shutdown
  • 啓動界面:
  • 前端啓動的問題:
      ssh命令窗口關閉,則redis-server程序結束,即一旦客戶端關閉,則redis服務也停掉。不推薦使用此方法。

2.3.一、後端啓動

  • 第一步:將虛擬機中/root目錄下redis源碼包中的redis.conf配置文件複製到虛擬機/usr/local/redis/bin/目錄下
      方式一:[root@itheima bin]# cp /root/redis-3.0.0/redis.conf /usr/local/redis/bin/
      方式二:[root@itheima bin]# cp /root/redis-3.0.0/redis.conf ./
  • 第二步:修改redis.conf,將daemonize由no改成yes
      [root@itheima bin]# vim redis.conf
  • 第三步:執行命令,後端啓動redis
      [root@itheima bin]# ./redis-server redis.conf
  • 第四步:查看是否啓動成功,經過查看進程號
  • 關閉後端啓動的方式:
      強制關閉:[root@itheima bin]# kill -9 7272
      正常關閉:[root@itheima bin]# ./redis-cli shutdown
  • 在項目中,建議使用正常關閉。
    由於redis做爲緩存來使用的話,是將數據存儲到內存中,
      若是使用正常關閉,則會將內存數據持久化到本地以後,再關閉。
      若是使用強制關閉,則不會進行持久化操做,可能會形成部分數據的丟失。

三、Redis客戶端的使用

3.一、redis自帶的客戶端(命令行)

  • 先啓動服務端命令:[root@itheima bin]# ./redis-server redis.conf
  • 再啓動客戶端命令:[root@itheima bin]# ./redis-cli -h 127.0.0.1 -p 6379
      -h:指定訪問的redis服務器的ip地址
      -p:指定訪問的redis服務器的port端口
  • 若是不指定主機和端口也能夠
      便可以寫成:[root@itheima bin]# ./redis-cli
      使用默認配置:默認的ip【127.0.0.1】,默認的port【6379】
  • 關閉redis客戶端的方式:
      方式一:Ctrl+c
      方式二:127.0.0.1:6379> quit
  • 進行數據測試:
      127.0.0.1:6379> set s1 hello
      OK
      127.0.0.1:6379> get s1
      "hello"

3.二、圖形界面客戶端(瞭解)

  • 安裝文件位置:
  • 安裝以後,打開以下界面:
  • 遠程鏈接redis服務:
  • 不可以鏈接上redis服務器,爲何呢?
  • 緣由:端口被攔截,須要關閉或者修改虛擬機的防火牆配置。(注意:實際開發中:只能修改防火牆配置,並非關閉!
    CentOS7默認的防火牆不是iptables,而是firewalld。咱們能夠試一下systemctl stop firewalld關閉防火牆,可是不推薦該方式。
    若是是iptables,就vim /etc/sysconfig/iptables修改配置便可。詳細的過程,博主之後會整理補充上。
    本博主的是CentOS7,防火牆使用的是firewalld,咱們使用命令的方式來添加端口(修改後須要重啓firewalld服務):
      [root@itheima ~]# cd /etc/firewalld/zones/
      [root@itheima zones]# firewall-cmd --permanent --add-port=6379/tcp
      [root@itheima zones]# service firewalld restart
      Redirecting to /bin/systemctl restart firewalld.service
      [root@itheima zones]#
  • 再次使用redis圖形界面客戶端鏈接redis服務器,鏈接成功,以下圖所示:
  • 注意:默認一共是16個數據庫,每一個數據庫之間是相互隔離。數據庫的數量是在redis.conf中配置的
  • 切換數據庫使用命令:select 數據庫編號,就能夠選擇指定的數據庫來使用,索引從0開始,示例以下
      127.0.0.1:6379> select 15
      OK
      127.0.0.1:6379[15]>

3.三、Java客戶端Jedis(重點)

3.3.一、jedis介紹

  • Redis不只是使用命令來操做,如今基本上主流的語言都有客戶端支持,好比java、C、C#、C++、php、Node.js、Go等。
  • 在官方網站裏羅列一些Java的客戶端,有Jedis、Redisson、Jredis、JDBC-Redis、等其中官方推薦使用JedisRedisson。 在企業中用的最多的就是Jedis,下面咱們就重點學習下Jedis。
  • Jedis一樣也是託管在github上,地址:https://github.com/xetorthio/jedis

3.3.二、添加jar包

3.3.三、經過單實例鏈接redis服務器

建立一個普通的java項目,導入jar包
測試代碼以下:redis

    /**
     * 經過單實例鏈接redis服務器
     */

    @Test
    public void testJedisClient() 
{
        // 建立一個Jedis的鏈接
        Jedis jedis = new Jedis("192.168.5.128"6379);
        // 選擇數據庫
        jedis.select(2);
        // 執行redis命令
        jedis.set("s4""曉藝,你還好嗎?");
        // 從redis中取值
        String result = jedis.get("s4");
        // 打印結果
        System.out.println(result);
        // 關閉鏈接
        jedis.close();
    }

3.3.四、經過鏈接池鏈接redis服務器

測試代碼以下:算法

    /**
     * 經過鏈接池鏈接redis服務器
     */

    @Test
    public void testJedisPool() 
{
        // 建立一個鏈接池對象
        JedisPool jedisPool = new JedisPool("192.168.5.128"6379);
        // 從鏈接池中獲取jedis會話對象
        Jedis jedis = jedisPool.getResource();
        String result = jedis.get("s1");
        System.out.println(result);
        // 關閉鏈接
        jedis.close();
        // 關閉鏈接池
        jedisPool.close();
    }

3.3.五、spring整合JedisPool(自學)

添加spring的jar包
配置spring配置文件applicationContext.xml
applicationContext.xmlspring

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:mvc="http://www.springframework.org/schema/mvc"
    xmlns:context="http://www.springframework.org/schema/context"
    xmlns:aop="http://www.springframework.org/schema/aop" xmlns:tx="http://www.springframework.org/schema/tx"
    xsi:schemaLocation="http://www.springframework.org/schema/beans 
        http://www.springframework.org/schema/beans/spring-beans-3.2.xsd 
        http://www.springframework.org/schema/mvc 
        http://www.springframework.org/schema/mvc/spring-mvc-3.2.xsd 
        http://www.springframework.org/schema/context 
        http://www.springframework.org/schema/context/spring-context-3.2.xsd 
        http://www.springframework.org/schema/aop 
        http://www.springframework.org/schema/aop/spring-aop-3.2.xsd 
        http://www.springframework.org/schema/tx 
        http://www.springframework.org/schema/tx/spring-tx-3.2.xsd "
>


    <!-- 鏈接池配置 -->
    <bean id="jedisPoolConfig" class="redis.clients.jedis.JedisPoolConfig">
        <!-- 最大鏈接數 -->
        <property name="maxTotal" value="30" />
        <!-- 最大空閒鏈接數 -->
        <property name="maxIdle" value="10" />
        <!-- 每次釋放鏈接的最大數目 -->
        <property name="numTestsPerEvictionRun" value="1024" />
        <!-- 釋放鏈接的掃描間隔(毫秒) -->
        <property name="timeBetweenEvictionRunsMillis" value="30000" />
        <!-- 鏈接最小空閒時間 -->
        <property name="minEvictableIdleTimeMillis" value="1800000" />
        <!-- 鏈接空閒多久後釋放, 當空閒時間>該值 且 空閒鏈接>最大空閒鏈接數 時直接釋放 -->
        <property name="softMinEvictableIdleTimeMillis" value="10000" />
        <!-- 獲取鏈接時的最大等待毫秒數,小於零:阻塞不肯定的時間,默認-1 -->
        <property name="maxWaitMillis" value="1500" />
        <!-- 在獲取鏈接的時候檢查有效性, 默認false -->
        <property name="testOnBorrow" value="false" />
        <!-- 在空閒時檢查有效性, 默認false -->
        <property name="testWhileIdle" value="true" />
        <!-- 鏈接耗盡時是否阻塞, false報異常,ture阻塞直到超時, 默認true -->
        <property name="blockWhenExhausted" value="false" />
    </bean>

    <!-- redis單機 經過鏈接池鏈接redis服務器 -->
    <bean id="jedisPool" class="redis.clients.jedis.JedisPool" destroy-method="close">
        <constructor-arg name="poolConfig" ref="jedisPoolConfig" />
        <constructor-arg name="host" value="192.168.5.128" />
        <constructor-arg name="port" value="6379" />
    </bean>
</beans>

測試代碼以下:

    @Test
    public void testJedisPool() 
{
        JedisPool pool = (JedisPool) applicationContext.getBean("jedisPool");
        Jedis jedis = null;
        try {
            jedis = pool.getResource();
            jedis.set("s5""lisi");
            String name = jedis.get("s5");
            System.out.println(name);
        } catch (Exception ex) {
            ex.printStackTrace();
        } finally {
            if (jedis != null) {
                // 關閉鏈接                jedis.close();            }        }    }
相關文章
相關標籤/搜索