課程計劃php
爲了解決高併發、高可擴展、高可用、大數據存儲問題而產生的數據庫解決方案,就是NoSql數據庫。
NoSQL,泛指非關係型的數據庫,NoSQL即Not-Only SQL
,它能夠做爲關係型數據庫的良好補充
。前端
鍵值(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
Redis是用
C語
言開發的一個開源的
高性能鍵值對(key-value)數據庫
。它經過提供多種鍵值數據類型
來適應不一樣場景下的存儲需求,目前爲止Redis支持的鍵值數據類型以下:
String字符串類型
Map散列類型
List列表類型
Set集合類型
SortedSet有序集合類型linux
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++
一、緩存(數據查詢、短鏈接、新聞內容、商品內容等等)。(最多使用)
二、分佈式集羣架構中的session分離。
三、聊天室的在線好友列表。
四、任務隊列。(秒殺、搶購、12306等等)
五、應用排行榜。
六、網站訪問統計。
七、數據過時處理(能夠精確到毫秒)。git
Redis是C語言開發,建議在linux上運行,本教程使用Centos7做爲安裝環境。github
實際開發中:只能修改防火牆配置,並非關閉!
)默認一共是16個數據庫,每一個數據庫之間是相互隔離。數據庫的數量是在redis.conf中配置的
。索引從0開始
,示例以下Jedis
和Redisson
。 在企業中用的最多的就是Jedis,下面咱們就重點學習下Jedis。 建立一個普通的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();
}
測試代碼以下:算法
/**
* 經過鏈接池鏈接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();
}
添加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(); } } }