Redis1. 概念: redis是一款高性能的NOSQL系列的非關係型數據庫
1.1.什麼是NOSQL
NoSQL(NoSQL = Not Only SQL),意即「不只僅是SQL」,是一項全新的數據庫理念,泛指非關係型的數據庫。
隨着互聯網web2.0網站的興起,傳統的關係數據庫在應付web2.0網站,特別是超大規模和高併發的SNS類型的web2.0純動態網站已經顯得力不從心,暴露了不少難以克服的問題,而非關係型的數據庫則因爲其自己的特色獲得了很是迅速的發展。NoSQL數據庫的產生就是爲了解決大規模數據集合多重數據種類帶來的挑戰,尤爲是大數據應用難題。java
1.1.1. NOSQL和關係型數據庫比較
優勢:
1)成本:nosql數據庫簡單易部署,基本都是開源軟件,不須要像使用oracle那樣花費大量成本購買使用,相比關係型數據庫價格便宜。
2)查詢速度:nosql數據庫將數據存儲於緩存之中,關係型數據庫將數據存儲在硬盤中,天然查詢速度遠不及nosql數據庫。
3)存儲數據的格式:nosql的存儲格式是key,value形式、文檔形式、圖片形式等等,因此能夠存儲基礎類型以及對象或者是集合等各類格式,而數據庫則只支持基礎類型。
4)擴展性:關係型數據庫有相似join這樣的多表查詢機制的限制致使擴展很艱難。web
缺點:
1)維護的工具和資料有限,由於nosql是屬於新的技術,不能和關係型數據庫10幾年的技術同日而語。
2)不提供對sql的支持,若是不支持sql這樣的工業標準,將產生必定用戶的學習和使用成本。
3)不提供關係型數據庫對事務的處理。ajax
1.1.2. 非關係型數據庫的優點:
1)性能NOSQL是基於鍵值對的,能夠想象成表中的主鍵和值的對應關係,並且不須要通過SQL層的解析,因此性能很是高。
2)可擴展性一樣也是由於基於鍵值對,數據之間沒有耦合性,因此很是容易水平擴展。redis
1.1.3. 關係型數據庫的優點:
1)複雜查詢能夠用SQL語句方便的在一個表以及多個表之間作很是複雜的數據查詢。
2)事務支持使得對於安全性能很高的數據訪問要求得以實現。對於這兩類數據庫,對方的優點就是本身的弱勢,反之亦然。算法
1.1.4. 總結
關係型數據庫與NoSQL數據庫並不是對立而是互補的關係,即一般狀況下使用關係型數據庫,在適合使用NoSQL的時候使用NoSQL數據庫,
讓NoSQL數據庫對關係型數據庫的不足進行彌補。
通常會將數據存儲在關係型數據庫中,在nosql數據庫中備份存儲關係型數據庫的數據sql
1.2.主流的NOSQL產品
• 鍵值(Key-Value)存儲數據庫
相關產品: Tokyo Cabinet/Tyrant、Redis、Voldemort、Berkeley DB
典型應用: 內容緩存,主要用於處理大量數據的高訪問負載。
數據模型: 一系列鍵值對
優點: 快速查詢
劣勢: 存儲的數據缺乏結構化
• 列存儲數據庫
相關產品:Cassandra, HBase, Riak
典型應用:分佈式的文件系統
數據模型:以列簇式存儲,將同一列數據存在一塊兒
優點:查找速度快,可擴展性強,更容易進行分佈式擴展
劣勢:功能相對侷限
• 文檔型數據庫
相關產品:CouchDB、MongoDB
典型應用:Web應用(與Key-Value相似,Value是結構化的)
數據模型: 一系列鍵值對
優點:數據結構要求不嚴格
劣勢: 查詢性能不高,並且缺少統一的查詢語法
• 圖形(Graph)數據庫
相關數據庫:Neo4J、InfoGrid、Infinite Graph
典型應用:社交網絡
數據模型:圖結構
優點:利用圖結構相關算法。
劣勢:須要對整個圖作計算才能得出結果,不容易作分佈式的集羣方案。
1.3 什麼是Redis
Redis是用C語言開發的一個開源的高性能鍵值對(key-value)數據庫,官方提供測試數據,50個併發執行100000個請求,讀的速度是110000次/s,寫的速度是81000次/s ,且Redis經過提供多種鍵值數據類型來適應不一樣場景下的存儲需求,目前爲止Redis支持的鍵值數據類型以下:
1) 字符串類型 string
2) 哈希類型 hash
3) 列表類型 list
4) 集合類型 set
5) 有序集合類型 sortedset
1.3.1 redis的應用場景
• 緩存(數據查詢、短鏈接、新聞內容、商品內容等等)
• 聊天室的在線好友列表
• 任務隊列。(秒殺、搶購、12306等等)
• 應用排行榜
• 網站訪問統計
• 數據過時處理(能夠精確到毫秒
• 分佈式集羣架構中的session分離數據庫
1. 官網:https://redis.io
2. 中文網:http://www.redis.net.cn/
3. 解壓直接可使用:
* redis.windows.conf:配置文件
* redis-cli.exe:redis的客戶端
* redis-server.exe:redis服務器端
json
1. redis的數據結構:
* redis存儲的是:key,value格式的數據,其中key都是字符串,value有5種不一樣的數據結構
* value的數據結構:
1) 字符串類型 string
2) 哈希類型 hash : map格式
3) 列表類型 list : linkedlist格式。支持重複元素
4) 集合類型 set : 不容許重複元素
5) 有序集合類型 sortedset:不容許重複元素,且元素有順序
2. 字符串類型 string
1. 存儲: set key value
127.0.0.1:6379> set username zhangsan
OK
2. 獲取: get key
127.0.0.1:6379> get username
"zhangsan"
3. 刪除: del key
127.0.0.1:6379> del age
(integer) 1
3. 哈希類型 hash
1. 存儲: hset key field value
127.0.0.1:6379> hset myhash username lisi
(integer) 1
127.0.0.1:6379> hset myhash password 123
(integer) 1
2. 獲取:
* hget key field: 獲取指定的field對應的值
127.0.0.1:6379> hget myhash username
"lisi"
* hgetall key:獲取全部的field和value
127.0.0.1:6379> hgetall myhash
1) "username"
2) "lisi"
3) "password"
4) "123"
3. 刪除: hdel key field
127.0.0.1:6379> hdel myhash username
(integer) 1
4. 列表類型 list:能夠添加一個元素到列表的頭部(左邊)或者尾部(右邊)
1. 添加:
1. lpush key value: 將元素加入列表左表
2. rpush key value:將元素加入列表右邊
127.0.0.1:6379> lpush myList a
(integer) 1
127.0.0.1:6379> lpush myList b
(integer) 2
127.0.0.1:6379> rpush myList c
(integer) 3
2. 獲取:
* lrange key start end :範圍獲取
127.0.0.1:6379> lrange myList 0 -1
1) "b"
2) "a"
3) "c"
3. 刪除:
* lpop key: 刪除列表最左邊的元素,並將元素返回
* rpop key: 刪除列表最右邊的元素,並將元素返回windows
1. 存儲:sadd key value
127.0.0.1:6379> sadd myset a
(integer) 1
127.0.0.1:6379> sadd myset a
(integer) 0
2. 獲取:smembers key:獲取set集合中全部元素
127.0.0.1:6379> smembers myset
1) "a"
3. 刪除:srem key value:刪除set集合中的某個元素
127.0.0.1:6379> srem myset a
(integer) 1
6. 有序集合類型 sortedset:不容許重複元素,且元素有順序.每一個元素都會關聯一個double類型的分數。redis正是經過分數來爲集合中的成員進行從小到大的排序。數組
7. 通用命令
1. keys * : 查詢全部的鍵
2. type key : 獲取鍵對應的value的類型
3. del key:刪除指定的key value
1. redis是一個內存數據庫,當redis服務器重啓,獲取電腦重啓,數據會丟失,咱們能夠將redis內存中的數據持久化保存到硬盤的文件中。
2. redis持久化機制:
1. RDB:默認方式,不須要進行配置,默認就使用這種機制
* 在必定的間隔時間中,檢測key的變化狀況,而後持久化數據
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
2. 從新啓動redis服務器,並指定配置文件名稱
D:JavaWeb2018day23_redis資料rediswindows-64redis-2.8.9>redis-server.exe redis.windows.conf
2. AOF:日誌記錄的方式,能夠記錄每一條命令的操做。能夠每一次命令操做後,持久化數據
1. 編輯redis.windwos.conf文件
appendonly no(關閉aof) --> appendonly yes (開啓aof)
# appendfsync always : 每一次操做都進行持久化
appendfsync everysec : 每隔一秒進行一次持久化
# appendfsync no : 不進行持久化
AJAX:1. 概念: ASynchronous JavaScript And XML 異步的JavaScript 和 XML 1. 異步和同步:客戶端和服務器端相互通訊的基礎上 客戶端必須等待服務器端的響應。在等待的期間客戶端不能作其餘操做。 客戶端不須要等待服務器端的響應。在服務器處理請求的過程當中,客戶端能夠進行其餘的操做。 Ajax 是一種在無需從新加載整個網頁的狀況下,可以更新部分網頁的技術。 [1] 經過在後臺與服務器進行少許數據交換,Ajax 可使網頁實現異步更新。這意味着能夠在不從新加載整個網頁的狀況下,對網頁的某部分進行更新。 傳統的網頁(不使用 Ajax)若是須要更新內容,必須重載整個網頁頁面。 提高用戶的體驗2. 實現方式: 1. 原生的JS實現方式(瞭解) //1.建立核心對象 var xmlhttp; if (window.XMLHttpRequest) {// code for IE7+, Firefox, Chrome, Opera, Safari xmlhttp=new XMLHttpRequest(); } else {// code for IE6, IE5 xmlhttp=new ActiveXObject("Microsoft.XMLHTTP"); } //2. 創建鏈接 / 參數: 1. 請求方式:GET、POST get方式,請求參數在URL後邊拼接。send方法爲空參 post方式,請求參數在send方法中定義 2. 請求的URL: 3. 同步或異步請求:true(異步)或 false(同步) / xmlhttp.open("GET","ajaxServlet?username=tom",true); //3.發送請求 xmlhttp.send(); //4.接受並處理來自服務器的響應結果 //獲取方式 :xmlhttp.responseText //何時獲取?當服務器響應成功後再獲取 //當xmlhttp對象的就緒狀態改變時,觸發事件onreadystatechange。 xmlhttp.onreadystatechange=function() { //判斷readyState就緒狀態是否爲4,判斷status響應狀態碼是否爲200 if (xmlhttp.readyState==4 && xmlhttp.status==200) { //獲取服務器的響應結果 var responseText = xmlhttp.responseText; alert(responseText); } } 2. JQeury實現方式 1. $.ajax() * 語法:$.ajax({鍵值對}); //使用$.ajax()發送異步請求 $.ajax({ url:"ajaxServlet1111" , // 請求路徑 type:"POST" , //請求方式 //data: "username=jack&age=23",//請求參數 data:{"username":"jack","age":23}, success:function (data) { alert(data); },//響應成功後的回調函數 error:function () { alert("出錯啦...") },//表示若是請求響應出現錯誤,會執行的回調函數 dataType:"text"//設置接受到的響應數據的格式 }); 2. $.get():發送get請求 * 語法:$.get(url, [data], [callback], [type]) 參數: url:請求路徑 data:請求參數 callback:回調函數 type:響應結果的類型 3. $.post():發送post請求 * 語法:$.post(url, [data], [callback], [type]) 參數: url:請求路徑 data:請求參數 callback:回調函數 type:響應結果的類型
JSON:
Person p = new Person();
p.setName("張三");
p.setAge(23);
p.setGender("男");
var p = {"name":"張三","age":23,"gender":"男"};
* json如今多用於存儲和交換文本信息的語法
* 進行數據的傳輸
* JSON 比 XML 更小、更快,更易解析。
1. 基本規則
* 數據在名稱/值對中:json數據是由鍵值對構成的
* 鍵用引號(單雙都行)引發來,也能夠不使用引號
* 值得取值類型:
1. 數字(整數或浮點數)
2. 字符串(在雙引號中)
3. 邏輯值(true 或 false)
4. 數組(在方括號中) {"persons":[{},{}]}
5. 對象(在花括號中) {"address":{"province":"陝西"....}}
6. null
* 數據由逗號分隔:多個鍵值對由逗號分隔
* 花括號保存對象:使用{}定義json 格式
* 方括號保存數組:[]
2. 獲取數據:
1. json對象.鍵名
2. json對象["鍵名"]
3. 數組對象[索引]
4. 遍歷
//1.定義基本格式
var person = {"name": "張三", age: 23, 'gender': true};
var ps = [{"name": "張三", "age": 23, "gender": true},
{"name": "李四", "age": 24, "gender": true},
{"name": "王五", "age": 25, "gender": false}];
//獲取person對象中全部的鍵和值
//for in 循環
/* for(var key in person){
//這樣的方式獲取不行。由於至關於 person."name"
//alert(key + ":" + person.key);
alert(key+":"+person[key]);
}*/
//獲取ps中的全部值
for (var i = 0; i < ps.length; i++) {
var p = ps;
for(var key in p){
alert(key+":"+p[key]);
}
}
* JSON解析器:
* 常見的解析器:Jsonlib,Gson,fastjson,jackson
1. JSON轉爲Java對象
1. 導入jackson的相關jar包
2. 建立Jackson核心對象 ObjectMapper
3. 調用ObjectMapper的相關方法進行轉換
1. readValue(json字符串數據,Class)
2. Java對象轉換JSON
1. 使用步驟:
1. 導入jackson的相關jar包
2. 建立Jackson核心對象 ObjectMapper
3. 調用ObjectMapper的相關方法進行轉換
1. 轉換方法:
* writeValue(參數1,obj):
參數1:
File:將obj對象轉換爲JSON字符串,並保存到指定的文件中
Writer:將obj對象轉換爲JSON字符串,並將json數據填充到字符輸出流中
OutputStream:將obj對象轉換爲JSON字符串,並將json數據填充到字節輸出流中
* writeValueAsString(obj):將對象轉爲json字符串
2. 註解:
1. @JsonIgnore:排除屬性。
2. @JsonFormat:屬性值得格式化
* @JsonFormat(pattern = "yyyy-MM-dd")
3. 複雜java對象轉換 1. List:數組 2. Map:對象格式一致