本次介紹以下幾個內容:
Not Only SQL:不僅僅是SQL,指的就是非關係型數據庫,它是關係型數據庫有益的補充。最終的數據還是儲存在關係型數據庫中。非關係型數據庫主要是提升數據庫的查詢速度,一般做爲數據的快取來使用。
具體表現爲對如下三高問題的解決:
在同一個時間點,同時有海量的使用者併發存取。往往要達到每秒上萬次讀寫請求。關係數據庫應付上萬次SQL查詢還勉強頂得住,但是應付上萬次SQL寫數據請求,硬碟IO就已經無法承受了。
數據庫中數據量特別大,數據庫表中每天產生海量的數據。
類似QQ,微信,微博,每天使用者產生海量的使用者動態,每天產生幾千萬條記錄。對於關係數據庫來說,在一張幾億條記錄的表裏面進行SQL查詢,效率是極其低下乃至不可忍受的。
關係型數據庫進行擴充套件和升級是比較麻煩的一樣事,對於很多需要提供24小時不間斷服務的網站來說,對數據庫系統進行升級和擴充套件是非常痛苦的事情,往往需要停機維護和數據遷移。
非關係型數據庫可以通過不斷的新增伺服器節點來實現擴充套件,而不需對原有的數據庫進行維護。
Redis就是現在比較主流的非關係數據庫。
官網提供了Linux版的Redis下載
Windows版的Redis,下載地址如下:
redis是一種高階的key-value的儲存系統,其中value支援五種數據型別,指的是它值的型別,鍵可以認爲是字串型別。redis不是用Java寫的,是C語言寫的。
值的數據型別 | 說明 |
---|---|
string型別 | 字串 |
list型別 | 列表:元素可以重複,元素是有索引號,有先後順序的 |
set型別 | 集合:元素是不可重複的,元素沒有索引號,沒有先後順序的 |
hash型別 | 值由多個鍵值對組成 |
zset型別 | 集合:元素不可重複的,每個元素有索引號,還有一個分數值,可以根據分數進行排序 |
在Redis中以二進制儲存,沒有編碼和解碼的過程。
無論存入的是字串、整數、浮點型別都會以字串寫入。
在Redis中字串型別的值最多可以容納的數據長度是512M,這是以後最常用的數據型別。
命令 | 功能 |
---|---|
set 鍵 值 | 存入字串型別的鍵和值,如果鍵不存在就是新增,存在就是修改 |
setnx 鍵 值 | 鍵不存在就是新增,存在不做任何操作,不會覆蓋以前的鍵和值 |
get 鍵 | 通過鍵獲取值 |
del 鍵 | 通過鍵刪除鍵和值 |
在Redis中,List型別是按照插入順序排序的字串鏈表。和數據結構中的普通鏈表一樣,我們可以在其左部(left)和右部(right)新增新的元素。
在插入時,如果該鍵並不存在,Redis將爲該鍵建立一個新的鏈表。
如果鏈表中所有的元素均被移除,那麼該鍵也將會被從數據庫中刪除。
List中可以包含的最大元素數量是4G個(41億個)
命令 | 行爲 |
---|---|
lpush 鍵 元素 元素 | 從左邊新增1個或多個元素 |
rpush 鍵 元素 元素 | 從右邊新增1個或多個元素 |
lpop 鍵 | 刪除最左邊的一個元素,並且返回 |
rpop 鍵 | 刪除最右邊的一個元素,並且返回 |
lrange 鍵 開始 結束 | 查詢指定索引範圍內元素返回,每個元素有2個索引號 索引號從左向右:0~length-1 索引號從右向左:-1~-length 如果要獲取整個列表中所有的元素,索引號範圍如何寫?0~-1 |
llen 鍵 | 獲取列表中有多少個元素 |
一個Redis伺服器可以包括多個數據庫,用戶端可以只連線Redis中某個數據庫,就好比一個mysql伺服器中建立多個數據庫,用戶端連線時指定連線到哪個數據庫。
Redis中有db0-db15編號的16個數據庫。我們不能建立新的數據庫,也不能刪除數據庫。數據庫中也沒有表的結構,用戶端預設連線第0個數據庫。但可以通過組態檔設定有多少個數據庫。
Redis不僅可以使用命令來操作,現在基本上主流的語言都有API支援,比如Java、C#、C++、PHP、Node.js、Go等。
在官方網站裡列一些Java的用戶端,有Jedis、Redisson、Jredis、JDBC-Redis等其中官方推薦使用Jedis和Redisson。
Jedis操作redis需要匯入jar包或者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) | 獲取一個範圍內所有的元素 |
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物件,而是從連線池中獲取一個資源進行redis的操作。使用完畢
後,不需要銷燬該jedis連線資源,而是將該資源歸還給連線池,供其他請求使用。
用於建立連線池的設定資訊
JedisPoolConfig設定類 | 功能說明 |
---|---|
JedisPoolConfig() | 構造方法,建立一個設定物件 |
void setMaxTotal() | 連線池中最大連線數 |
void setMaxWaitMillis() | 設定最長等待時間,單位是毫秒 |
JedisPool連線池類 | 說明 |
---|---|
JedisPool(設定物件,伺服器名,埠號) | 構造方法,建立連線池的類 參數1:上面的設定物件 參數2:伺服器名 參數3:埠號 |
Jedis getResource() | 從連線池中獲取一個建立好的連線物件,返回Jedis物件 |
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類得到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);
}
}
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();
}
}
以上就是本次分享的全部內容了,如果有不恰當的地方,歡迎指正。