Redis的介紹和使用(NoSQL、Jedis)

2020-08-08 20:20:24

Redis

本次介紹以下幾個內容:

  1. NoSQL介紹
  2. Redis介紹
  3. Jedis的API
  4. 使用工具類來連線Redis

NoSQL介紹

NoSQL概念

Not Only SQL:不僅僅是SQL,指的就是非關係型數據庫,它是關係型數據庫有益的補充。最終的數據還是儲存在關係型數據庫中。非關係型數據庫主要是提升數據庫的查詢速度,一般做爲數據的快取來使用。

在这里插入图片描述

優點
  1. 格式靈活:儲存數據的格式可以是key,value形式、文件形式、圖片形式等等,使用靈活,應用場景廣泛,而關係型數據庫則只支援基礎型別。
  2. 速度快:nosql可以使用硬碟或者隨機記憶體作爲載體,而關係型數據庫只能使用硬碟;
  3. 成本低:nosql數據庫部署簡單,基本都是開源軟體。
缺點
  1. 不提供sql支援,學習和使用成本較高;
  2. 數據結構相對複雜,複雜查詢方面不方便。

爲什麼要使用NOSQL

具體表現爲對如下三高問題的解決:

High Performance - 數據庫高併發存取

​ 在同一個時間點,同時有海量的使用者併發存取。往往要達到每秒上萬次讀寫請求。關係數據庫應付上萬次SQL查詢還勉強頂得住,但是應付上萬次SQL寫數據請求,硬碟IO就已經無法承受了。

  • 如天貓的雙11,從凌晨0點到2點這段時間,每秒達到上千萬次的存取量。
  • 12306春運期間,過年回家買火車搶票的時間,使用者不斷查詢有沒有剩餘票。
Huge Storage - 海量數據的儲存

​ 數據庫中數據量特別大,數據庫表中每天產生海量的數據。

​ 類似QQ,微信,微博,每天使用者產生海量的使用者動態,每天產生幾千萬條記錄。對於關係數據庫來說,在一張幾億條記錄的表裏面進行SQL查詢,效率是極其低下乃至不可忍受的。

High Scalability && High Availability- 高可延伸性和高可用性的需求

​ 關係型數據庫進行擴充套件和升級是比較麻煩的一樣事,對於很多需要提供24小時不間斷服務的網站來說,對數據庫系統進行升級和擴充套件是非常痛苦的事情,往往需要停機維護和數據遷移。

​ 非關係型數據庫可以通過不斷的新增伺服器節點來實現擴充套件,而不需對原有的數據庫進行維護。

Redis介紹

Redis就是現在比較主流的非關係數據庫。

Windows版Redis的下載

在这里插入图片描述

Redis的5種數據型別

redis是一種高階的key-value的儲存系統,其中value支援五種數據型別,指的是它值的型別,鍵可以認爲是字串型別。redis不是用Java寫的,是C語言寫的。

值的數據型別 說明
string型別 字串
list型別 列表:元素可以重複,元素是有索引號,有先後順序的
set型別 集合:元素是不可重複的,元素沒有索引號,沒有先後順序的
hash型別 值由多個鍵值對組成
zset型別 集合:元素不可重複的,每個元素有索引號,還有一個分數值,可以根據分數進行排序

在Redis中以二進制儲存,沒有編碼和解碼的過程。

無論存入的是字串、整數、浮點型別都會以字串寫入。

在Redis中字串型別的值最多可以容納的數據長度是512M,這是以後最常用的數據型別。
在这里插入图片描述

常用命令
命令 功能
set 鍵 值 存入字串型別的鍵和值,如果鍵不存在就是新增,存在就是修改
setnx 鍵 值 鍵不存在就是新增,存在不做任何操作,不會覆蓋以前的鍵和值
get 鍵 通過鍵獲取值
del 鍵 通過鍵刪除鍵和值

list型別的操作命令

概述

在Redis中,List型別是按照插入順序排序的字串鏈表。和數據結構中的普通鏈表一樣,我們可以在其左部(left)和右部(right)新增新的元素。

在插入時,如果該鍵並不存在,Redis將爲該鍵建立一個新的鏈表。

如果鏈表中所有的元素均被移除,那麼該鍵也將會被從數據庫中刪除。

List中可以包含的最大元素數量是4G個(41億個)

1553422277890
常用命令
命令 行爲
lpush 鍵 元素 元素 從左邊新增1個或多個元素
rpush 鍵 元素 元素 從右邊新增1個或多個元素
lpop 鍵 刪除最左邊的一個元素,並且返回
rpop 鍵 刪除最右邊的一個元素,並且返回
lrange 鍵 開始 結束 查詢指定索引範圍內元素返回,每個元素有2個索引號
索引號從左向右:0~length-1
索引號從右向左:-1~-length
如果要獲取整個列表中所有的元素,索引號範圍如何寫?0~-1
llen 鍵 獲取列表中有多少個元素

在这里插入图片描述
一個Redis伺服器可以包括多個數據庫,用戶端可以只連線Redis中某個數據庫,就好比一個mysql伺服器中建立多個數據庫,用戶端連線時指定連線到哪個數據庫。

Redis中有db0-db15編號的16個數據庫。我們不能建立新的數據庫,也不能刪除數據庫。數據庫中也沒有表的結構,用戶端預設連線第0個數據庫。但可以通過組態檔設定有多少個數據庫。

Jedis的API介紹

Jedis的介紹

Redis不僅可以使用命令來操作,現在基本上主流的語言都有API支援,比如Java、C#、C++、PHP、Node.js、Go等。

在官方網站裡列一些Java的用戶端,有Jedis、Redisson、Jredis、JDBC-Redis等其中官方推薦使用Jedis和Redisson。

Jedis操作redis需要匯入jar包或者Jedis的依賴。

Jedis類常用方法

  1. 每個方法就是redis中的命令名,方法的參數就是命令的參數。
  2. 每個Jedis物件似於JDBC中Connection物件,獲取一個Jedis物件本質上就是獲取一個連線物件。
連線和關閉 功能
new Jedis(String host, int port) 建立一個連線物件
參數1:主機名
參數2:埠號 6379
void close() 關閉連線
對string操作的方法 說明
set(String key,String value) 新增字串型別的鍵和值
String get(String key) 通過鍵獲取值
del(String … keys) 刪除一個或多個鍵和值
對list操作的方法 說明
lpush(String key,String…values) 從左邊新增1個或多個元素
List<String> lrange(String key,long start,long end) 獲取一個範圍內所有的元素

Jedis的基本操作

package com.ys;

import redis.clients.jedis.Jedis;

/**
 * Jedis的基本使用
 */
public class Demo1Base {

    public static void main(String[] args) {
        //1.建立Jedis連線物件
        Jedis jedis = new Jedis("localhost", 6379);
        //2.向伺服器新增1個字串型別的鍵和值
        jedis.set("book","張三");
        //3.從伺服器中通過鍵獲取值
        String book = jedis.get("book");
        //4.關閉連線
        jedis.close();
        //5.列印輸出到控制檯
        System.out.println(book);
    }

}

Jedis連線池的使用

jedis連線池的基本概念

在这里插入图片描述

​ jedis連線資源的建立與銷燬是很消耗程式效能,所以jedis爲我們提供了jedis的連線池
技術,jedis連線池在建立時初始化一些連線物件儲存到連線池中,使用jedis連線資源時
不需要自己建立jedis物件,而是從連線池中獲取一個資源進行redis的操作。使用完畢
後,不需要銷燬該jedis連線資源,而是將該資源歸還給連線池,供其他請求使用。

Jedis連線池API

用於建立連線池的設定資訊

JedisPoolConfig設定類 功能說明
JedisPoolConfig() 構造方法,建立一個設定物件
void setMaxTotal() 連線池中最大連線數
void setMaxWaitMillis() 設定最長等待時間,單位是毫秒
JedisPool連線池類 說明
JedisPool(設定物件,伺服器名,埠號) 構造方法,建立連線池的類
參數1:上面的設定物件
參數2:伺服器名
參數3:埠號
Jedis getResource() 從連線池中獲取一個建立好的連線物件,返回Jedis物件

JedisPool的基本使用

package com.ys;

import redis.clients.jedis.Jedis;
import redis.clients.jedis.JedisPool;
import redis.clients.jedis.JedisPoolConfig;

import java.util.List;

/**
 * Jedis連線池的基本使用
 */
public class Demo2Pool {

    public static void main(String[] args) {
        //1.建立連線池的設定物件
        JedisPoolConfig config = new JedisPoolConfig();
        //2.設定連線池的參數
        config.setMaxTotal(10);  //最大連線數
        config.setMaxWaitMillis(2000);  //最長等待時間爲2秒鐘
        //3.建立連線池,使用上面設定物件
        JedisPool pool = new JedisPool(config,"localhost", 6379);
        //4.從連線池中獲取連線物件
        Jedis jedis = pool.getResource();
        //5.使用連線物件
        jedis.lpush("students", "張三", "李四", "王五");
        List<String> students = jedis.lrange("students", 0, -1);
        System.out.println(students);
        //6.關閉連線物件
        jedis.close();
    }

}

ResourceBundle類的使用

使用ResourceBundle類得到jedis.properties中的port屬性,並且輸出

jedis.properties:

# 連線池的最大連線數
maxTotal=10
# 最長等待時間爲2秒鐘
maxWaitMillis=2000
# 伺服器名字
host=localhost
# 埠號
port=6379

使用ResourceBundle類:

package com.ys;

import java.util.ResourceBundle;

public class Demo3Resource {

    public static void main(String[] args) {
        //1. 通過靜態方法讀取屬性檔案,參數是:屬性檔案的主檔名,沒有擴充套件名
        ResourceBundle bundle = ResourceBundle.getBundle("jedis");
        //2. 獲取屬性值,通過鍵獲取值
        String host = bundle.getString("host");
        //3.輸出值
        System.out.println(host);
    }
}

使用工具類來連線Redis

jedis.properties組態檔:

# 主機名
host=localhost
# 埠號
port=6379
# 最大連線數
maxTotal=20
# 最長等待時間
maxWaitMillis=3000

JedisUtils.java:

package com.ys.utils;

import redis.clients.jedis.Jedis;
import redis.clients.jedis.JedisPool;
import redis.clients.jedis.JedisPoolConfig;

import java.util.ResourceBundle;

/**
 * Jedis連線池工具類
 */
public class JedisUtils {

    private static JedisPool pool;

    //在靜態程式碼塊中建立連線池
    static {
        //讀取組態檔
        ResourceBundle bundle = ResourceBundle.getBundle("jedis");
        //讀取屬性值
        int maxTotal = Integer.parseInt(bundle.getString("maxTotal"));
        int maxWaitMillis = Integer.parseInt(bundle.getString("maxWaitMillis"));
        int port = Integer.parseInt(bundle.getString("port"));
        String host = bundle.getString("host");

        //建立連線池設定物件
        JedisPoolConfig config = new JedisPoolConfig();
        //設定連線池的參數
        config.setMaxTotal(maxTotal);
        config.setMaxWaitMillis(maxWaitMillis);
        //建立連線池
        pool = new JedisPool(config, host, port);
    }

    /**
     * 獲取連線物件
     */
    public static Jedis getJedis() {
        return pool.getResource();
    }

}

使用工具類:

package com.itheima;

import com.ys.utils.JedisUtils;
import redis.clients.jedis.Jedis;

//使用連線池工具類
public class JedisUse {

    public static void main(String[] args) {
        //從連線池中獲取連線物件
        Jedis jedis = JedisUtils.getJedis();
        //新增鍵和值
        jedis.set("car", "benchi");
        //取出
        String car = jedis.get("car");
        //輸出
        System.out.println(car);
        //關閉連線
        jedis.close();
    }
}

以上就是本次分享的全部內容了,如果有不恰當的地方,歡迎指正。