一、 數據庫
1、數據庫
(1)關係型數據庫SQL<MySQL、Oracle、DB2、SQLServer>:有表,而且表與表直接存在關係<主外鍵>;
(2)非關係型數據庫No SQL(沒有表),可以作爲關係型數據庫的一個很好的補充,不能替代;
2、NoSQl產生的原因
對數據庫高併發訪問的需求;
3、NoSQl數據庫的分類
(1) 鍵值(Key-Value)存儲數據庫
相關產品: Tokyo Cabinet/Tyrant、Redis、Voldemort、Berkeley DB。
典型應用:內容緩存,主要用於處理大量數據的高訪問負載。
數據模型:一系列鍵值對
優勢:快速查詢
劣勢:存儲的數據缺少結構化
(2)列存儲數據庫
相關產品:Cassandra, HBase, Riak
典型應用:分佈式的文件系統
數據模型:以列簇式存儲,將同一列數據存在一起
優勢:查找速度快,可擴展性強,更容易進行分佈式擴展
劣勢:功能相對侷限
(3)文檔型數據庫
相關產品:CouchDB、MongoDB
典型應用:Web應用(與Key-Value類似,Value是結構化的)
數據模型:一系列鍵值對
優勢:數據結構要求不嚴格
劣勢:查詢性能不高,而且缺乏統一的查詢語法
(4)圖形(Graph)數據庫
相關數據庫:Neo4J、InfoGrid、Infinite Graph
典型應用:社交網絡
數據模型:圖結構
優勢:利用圖結構相關算法。
劣勢:需要對整個圖做計算才能得出結果,不容易做分佈式的集羣方案。
二、redis
1、redis的介紹
(1)什麼是redis?
redis是用c語言開發的開源的高性能的key-value非關係型數據庫,主要應用在緩存,目前支持的鍵值數據類型有五種
(2)redis的應用場景
**緩存
**分佈式集羣架構中的session分離。
**任務隊列。(秒殺、搶購、12306等等)
**應用排行榜。(SortedSet)
**網站訪問統計。
**數據過期處理。(expire)
2、redis的五種數據類型
Key全都是字符串的!value有上述5種類型,最重要的是string!!!
redis命令不區分大小寫,但是key區分的
redis中的數據都是字符串。
redis是單線程,(不適合存儲比較大的數據)
(1)String:key-value【使用最多,和json連用】
**set key value 設置值
**get key 獲取值
**如果key對應value是整數
incr key 加一 value+1
decr key 減一 value-1
使用incr 命令,如果key 不存在,會自動創建key 並自動+1.
(2)Hash: key-field-value【一般用於存儲JavaBean數據,但是被string+json形式完全替代】
**相當於一個key 對應一個map (map中又是key- value),
**hset key field value 設置值
**hget key field 獲取值
**hincrby key field num 設置增數量
(3)List【實時排名】
**List是有順序可重複(數據結構中的:雙鏈表,隊列),可作爲鏈表 ,從左添加元素 也可以從右添加元素。
**lpush list a b c d (從左添加元素)
**rpush list 1 2 3 4 (從右邊添加元素)
**lrange list 0 -1 (從0 到 -1 元素查看:也就表示查看所有)
**lpop list (從左邊取,刪除)
**rpop list (從右邊取,刪除)
(4)Set【唯一性,使用環境較少】
**Set無順序,不能重複
**sadd set1 a b c d d (向set1中添加元素) 元素不重複
**smembers set1 (查詢元素)
**srem set1 a (刪除元素)
(5) SortedSet(zset)【用於網站排名,競價排名,變化不能太快】
**有順序,不能重複【適合做排行榜 排序需要一個分數屬性】
**zadd zset1 9 a 8 c 10 d 1 e (添加元素 zadd key score member )
**zrange key 0 -1 withscores 查看所有元素,如果要查看分數,加上withscores.
**zrange zset1 0 -1 (從小到大)
**zrevrange zset1 0 -1 (從大到小)
**zincrby zset2 score member (對元素member 增加 score)
3、key命令
**expire key second (設置key的過期時間)
**ttl key (查看剩餘時間)(-2 表示不存在,-1 表示已被持久化,正數表示剩餘的時間)
**persist key (清除過期時間,也即是持久化 持久化成功體提示 1 不成功0)。
**del key: 刪除key
**EXISTS key
若key存在,返回1,否則返回0。
**select 0 表示:選擇0號數據庫。默認是0號數據庫
4、redis持久化方案
Redis 數據都放在內存中。如果機器掛掉,內存的數據就不存在。
需要做持久化,把內存中的數據保存在磁盤,下一次啓動的時候就可以恢復數據到內存中。
1、RDB 快照形式 (定期將當前時刻的數據保存磁盤中)會產生一個dump.rdb文件
特點:會存在數據丟失,性能較好,數據備份。
2、AOF append only file (所有對redis的操作命令記錄在aof文件中),恢復數據,重新執行一遍即可。
特點:每秒保存,數據比較完整,耗費性能。
3、同時開啓兩個持久化方案,則按照 AOF的持久化放案恢復數據。默認是按照rdb的方式恢復數據,如果開啓了AOF,就是用AOF恢復數據,數據是存在於/usr/local/redis/bin/appendonly.aof文件中
5、redis集羣【一臺redis的併發量不夠時就要用到redis集羣】
(1)redis集羣架構圖
架構細節:
(1)redis間的通信:所有的redis節點彼此互聯(PING-PONG機制),內部使用二進制協議優化傳輸速度和帶寬.
(2)節點的fail是通過集羣中超過半數的節點檢測失效時才生效.通過投票機制【一臺服務器掛了,他自己可能不知道】
(3)客戶端與redis節點直連,不需要中間proxy層.客戶端不需要連接集羣所有節點,連接集羣中任何一個可用節點即可
(4)redis-cluster把所有的物理節點映射到[0-16383]slot上,cluster 負責維護node<->slot<->value
Redis 集羣中內置了 16384 個哈希槽,當需要在 Redis 集羣中放置一個 key-value 時,redis 先對 key 使用 crc16 算法算出一個結果,然後把結果對 16384 求餘數,這樣每個 key 都會對應一個編號在 0-16383 之間的哈希槽,redis 會根據節點數量大致均等的將哈希槽映射到不同的節點
0-5000
5001-10000
10001-16383
server1
server2
server3
key1(98 slot)
三、jedis
1、什麼是jedis?
集成了redis的一些命令操作,封裝了redis的java客戶端。提供了連接池管理
因爲集羣是比較消耗成本的,所以在公司中,一般生產環境使用集羣,開發環境使用單機版。
我們在項目整合中都需要有。可以開發一個接口,有單機版的實現類和集羣版的實現類。使用時可以面向接口開發,不影響業務邏輯,使用spring管理實現類,部署時切換實現類即可。
常用的操作redis的方法抽取出一個接口,分別對應單機版和集羣版創建兩個實現類。