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中
- 官網(wǎng):https://redis.io
- 中文網(wǎng):http://www.redis.net.cn/
- 下載后解壓直接可以使用:
- redis.windows.conf:配置文件
- redis-cli.exe:redis的客戶端
-
redis-server.exe:redis服務(wù)器端
image.png
雙擊redis-server.exe啟動服務(wù)
啟動客戶端,存?zhèn)€字符串進行測試款违,雙擊redis-cli.exe
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ù)元素哄辣,且元素有順序
-
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
- 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ù)缕减,查詢緩存...");
}