redis

一、 數據庫

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的方法抽取出一個接口,分別對應單機版和集羣版創建兩個實現類。

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

   

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章