關係型數據庫與非關係型數據庫
當前比較流行的關係型數據庫有:MySQL、Orical、DB2、Microsoft SQL Server、Microsoft Access等
非關係型數據庫有:Redis、 NoSql、Cloudant、HBase等
關係型數據庫
1、關係型數據庫,是指採用了關係模型來組織數據的數據庫;
2、關係型數據庫的最大特點就是事務的一致性;
3、簡單來說,關係模型指的就是二維表格模型,而一個關係型數據庫就是由二維表及其之間的聯繫所組成的一個數據組織。
優點:
1、易於維護:都是使用表結構,格式一致;
2、使用方便:SQL語言通用,可用於複雜查詢;
3、複雜操作:支持SQL,可用於一個表以及多個表之間非常複雜的查詢。
缺點:
1、讀寫性能比較差,尤其是海量數據的高效率讀寫;
2、固定的表結構,靈活度稍欠;
3、高併發讀寫需求,傳統關係型數據庫來說,硬盤I/O是一個很大的瓶頸。
非關係型數據庫
指非關係型的,分佈式的。非關係型數據庫以鍵值對存儲在內存中,且結構不固定,每一個元組可以有不一樣的字段,每個元組可以根據需要增加一些自己的鍵值對,不侷限於固定的結構,可以減少一些時間和空間的開銷。
優點:
1、無需經過sql層的解析,讀寫性能很高;
2、基於鍵值對,數據沒有耦合性,容易擴展;
3、存儲數據的格式:nosql的存儲格式是key,value形式、文檔形式、圖片形式等等,文檔形式、圖片形式等等,而關係型數據庫則只支持基礎類型。
缺點:
1、不提供sql支持,學習和使用成本較高;
2、無事務處理,附加功能bi和報表等支持也不好;
總結
關係型數據庫與NoSQL數據庫並非對立而是互補的關係,即通常情況下使用關係型數據庫,在適合使用NoSQL的時候使用NoSQL數據庫, 讓NoSQL數據庫對關係型數據庫的不足進行彌補。一般會將數據存儲在關係型數據庫中,在nosql數據庫中備份存儲關係型數據庫的數據。
什麼是Redis
Redis是一款高性能的NOSQL系列的非關係型數據庫,是用C語言開發的一個開源的高性能鍵值對(key-value)數據庫,官方提供測試數據,50個併發執行100000個請求,讀的速度是110000次/s,寫的速度是81000次/s ,且Redis通過提供多種鍵值數據類型來適應不同場景下的存儲需求,目前爲止Redis支持的鍵值數據類型如下:
1) 字符串類型 string
2) 哈希類型 hash
3) 列表類型 list
4) 集合類型 set
5) 有序集合類型 sortedset
redis的應用場景
• 緩存(數據查詢、短連接、新聞內容、商品內容等等)
• 聊天室的在線好友列表
• 任務隊列。(秒殺、搶購、12306等等)
• 應用排行榜
• 網站訪問統計
• 數據過期處理(可以精確到毫秒
• 分佈式集羣架構中的session分離
安裝
下載地址:redis下載
解壓直接可以使用:
redis.windows.conf:配置文件
redis-cli.exe:redis的客戶端,雙擊啓動
redis-server.exe:redis服務器端,雙擊啓動
啓動服務器:
啓動客戶端:
redis的數據結構:
redis存儲的是:key,value格式的數據,其中key都是字符串,value有5種不同的數據結構,分別是:
1) 字符串類型 string
2) 哈希類型 hash : map格式
3) 列表類型 list : linkedlist格式。支持重複元素
4) 集合類型 set : 不允許重複元素
5) 有序集合類型 sortedset:不允許重複元素,且元素有順序
操作不同數據結構
字符串類型 string
string 是 redis 最基本的類型,你可以理解成與 Memcached 一模一樣的類型,一個 key 對應一個 value。
string 類型是二進制安全的。意思是 redis 的 string 可以包含任何數據。比如jpg圖片或者序列化的對象。
string 類型是 Redis 最基本的數據類型,string 類型的值最大能存儲 512MB。
常用命令:
設置一個鍵的值
set key value
獲取一個建的值get key
刪除鍵對del key
同時獲取多個mget key1 key2
127.0.0.1:6379> set username zhangsan
OK
127.0.0.1:6379> get username
"zhangsan"
127.0.0.1:6379> del username
(integer) 1
哈希類型 hash
Redis hash 是一個鍵值(key=>value)對集合。
Redis hash 是一個 string 類型的 field 和 value 的映射表,hash 特別適合用於存儲對象。
設置一個hash hset key valueKey value
獲取hash所有key和value hgetall key
獲取hash所有key hkeys key
獲取hash所有key的value hvals key
獲取hash內鍵值對的長度 hlen key
給一個hash的某個鍵值對賦值 hset key valueKey value
當hash中valueKey不存在時賦值 hsetnx key valueKey value刪除:hdel key field
redis 127.0.0.1:6379> HMSET runoob field1 "Hello" field2 "World"
"OK"
redis 127.0.0.1:6379> HGET runoob field1
"Hello"
redis 127.0.0.1:6379> HGET runoob field2
"World"
列表類型 list
Redis 列表是簡單的字符串列表,允許重複,按照插入順序排序。你可以添加一個元素到列表的頭部(左邊)或者尾部(右邊)。
添加:
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
獲取:
lrange key start end :範圍獲取
127.0.0.1:6379> lrange myList 0 -1
1) "b"
2) "a"
3) "c"
刪除:
lpop key: 刪除列表最左邊的元素,並將元素返回
rpop key: 刪除列表最右邊的元素,並將元素返回
集合類型 set
Redis 的 Set 是 String 類型的無序集合。集合成員是唯一的,這就意味着集合中不能出現重複的數據。
Redis 中集合是通過哈希表實現的,所以添加,刪除,查找的複雜度都是 O(1)。
集合中最大的成員數爲 232 - 1 (4294967295, 每個集合可存儲40多億個成員)。
存儲:
sadd key value
127.0.0.1:6379> sadd myset a
(integer) 1
127.0.0.1:6379> sadd myset a
(integer) 0
獲取:
smembers key:獲取set集合中所有元素
127.0.0.1:6379> smembers myset
1) "a"
刪除:s
rem key value:刪除set集合中的某個元素
127.0.0.1:6379> srem myset a
(integer) 1
有序集合類型 sortedset
Redis 有序集合和集合一樣也是string類型元素的集合,且不允許重複的成員。
不同的是每個元素都會關聯一個double類型的分數。redis正是通過分數來爲集合中的成員進行從小到大的排序。
有序集合的成員是唯一的,但分數(score)卻可以重複。
集合是通過哈希表實現的,所以添加,刪除,查找的複雜度都是O(1)。 集合中最大的成員數爲 232 - 1 (4294967295, 每個集合可存儲40多億個成員)。
存儲:
zadd key score value
127.0.0.1:6379> zadd mysort 60 zhangsan
(integer) 1
127.0.0.1:6379> zadd mysort 50 lisi
(integer) 1
127.0.0.1:6379> zadd mysort 80 wangwu
(integer) 1
獲取:
zrange key start end [withscores]
127.0.0.1:6379> zrange mysort 0 -1
1) "lisi"
2) "zhangsan"
3) "wangwu"
127.0.0.1:6379> zrange mysort 0 -1 withscores
1) "zhangsan"
2) "60"
3) "wangwu"
4) "80"
5) "lisi"
6) "500"
刪除:
zrem key value
127.0.0.1:6379> zrem mysort lisi
(integer) 1
通用命令
1. keys * : 查詢所有的鍵
2. type key : 獲取鍵對應的value的類型
3. del key:刪除指定的key value
Redis持久化
Redis是一個內存數據庫,當redis服務器重啓,獲取電腦重啓,數據會丟失,我們可以將redis內存中的數據持久化保存到硬盤的文件中。
持久化流程
(1)客戶端向服務端發送寫操作(數據在客戶端的內存中)。
(2)數據庫服務端接收到寫請求的數據(數據在服務端的內存中)。
(3)服務端調用write這個系統調用,將數據往磁盤上寫(數據在系統內存的緩衝區中)。
(4)操作系統將緩衝區中的數據轉移到磁盤控制器上(數據在磁盤緩存中)。
(5)磁盤控制器將數據寫到磁盤的物理介質中(數據真正落到磁盤上)。
Redis持久化機制
- RDB:默認方式,默認就使用這種機制。在一定的間隔時間中,檢測key的變化情況,然後持久化數據。
- AOF:日誌記錄的方式,可以記錄每一條命令的操作。可以每一次命令操作後,持久化數據。
RDB機制
RDB其實就是把數據以快照的形式保存在磁盤上。什麼是快照呢,你可以理解成把當前時刻的數據拍成一張照片保存下來。
RDB持久化是指在指定的時間間隔內將內存中的數據集快照寫入磁盤。也是默認的持久化方式,這種方式是就是將內存中數據以快照的方式寫入到二進制文件中,默認的文件名爲dump.rdb。
RDB三種觸發機制:
save觸發方式:該命令會阻塞當前Redis服務器,執行save命令期間,Redis不能處理其他命令,直到RDB過程完成爲止。
bgsave觸發方式:執行該命令時,Redis會在後臺異步進行快照操作,快照同時還可以響應客戶端請求。
自動觸發
RDB的優點:
·RDB是一個緊湊壓縮的二進制文件,代表Redis在某個時間點上的數據 快照。非常適用於備份,全量複製等場景。比如每6小時執行bgsave備份, 並把RDB文件拷貝到遠程機器或者文件系統中(如hdfs),用於災難恢復。
·Redis加載RDB恢復數據遠遠快於AOF的方式。
AOF機制
以獨立日誌的方式記錄每次寫命令, 重啓時再重新執行AOF文件中的命令達到恢復數據的目的。AOF的主要作用 是解決了數據持久化的實時性,目前已經是Redis持久化的主流方式。
AOF也有三種觸發機制
每修改同步always:同步持久化 每次發生數據變更會被立即記錄到磁盤 性能較差但數據完整性比較好
每秒同步everysec:異步操作,每秒記錄 如果一秒內宕機,有數據丟失
不同no:從不同步
優點
(1)AOF可以更好的保護數據不丟失,一般AOF會每隔1秒,通過一個後臺線程執行一次fsync操作,最多丟失1秒鐘的數據。(2)AOF日誌文件沒有任何磁盤尋址的開銷,寫入性能非常高,文件不容易破損。
(3)AOF日誌文件即使過大的時候,出現後臺重寫操作,也不會影響客戶端的讀寫。
(4)AOF日誌文件的命令通過非常可讀的方式進行記錄,這個特性非常適合做災難性的誤刪除的緊急恢復。比如某人不小心用flushall命令清空了所有數據,只要這個時候後臺rewrite還沒有發生,那麼就可以立即拷貝AOF文件,將最後一條flushall命令給刪了,然後再將該AOF文件放回去,就可以通過恢復機制,自動恢復所有數據
缺點
(1)對於同一份數據來說,AOF日誌文件通常比RDB數據快照文件更大
(2)AOF開啓後,支持的寫QPS會比RDB支持的寫QPS低,因爲AOF一般會配置成每秒fsync一次日誌文件,當然,每秒一次fsync,性能也還是很高的
(3)以前AOF發生過bug,就是通過AOF記錄的日誌,進行數據恢復的時候,沒有恢復一模一樣的數據出來。