NoSQL,(Not Only SQL ),意即「不只僅是SQL」,泛指非關係型的數據庫。隨着互聯網web2.0網站的興起,傳統的關係數據庫在應付web2.0網站,特別是超大規模和高併發的web2.0純動態網站已經顯得力不從心,暴露了不少難以克服的問題,而非關係型的數據庫則因爲其自己的特色獲得了很是迅速的發展。NoSQL數據庫的產生就是爲了解決大規模數據集合多重數據種類帶來的挑戰,尤爲是大數據應用難題。html
當下已經存在不少的NoSQL數據庫,好比MongoDB、Redis、Riak、HBase、Cassandra等等。NoSQL能夠大致上分爲4個種類:鍵值(Key-Value)數據庫、面向文檔(Document-Oriented)數據庫、列存儲(Wide Column Store/Column-Family)數據庫以及圖(Graph-Oriented)數據庫。java
Redis 是徹底開源免費的,遵照BSD協議,是一個高性能的key-value數據庫。適用的場景有儲存用戶信息,好比會話、配置文件、參數、購物車等等。這些信息通常都和ID(鍵)掛鉤,這種情景下鍵值數據庫是個很好的選擇。Redis在國內的使用很是廣泛,不只包括BAT、微博、搜狐、小米、惟品會等,互聯網創業公司幾乎也都選擇了Redis。git
Redis 的優點:github
1) 性能極高,Redis能讀的速度是110000次/s,寫的速度是81000次/s 。web
2) 豐富的數據類型 , Redis支持二進制的 Strings, Lists, Hashes, Sets 及 Ordered Sets 數據類型操做。redis
3) Redis的全部操做都是原子性的,意思就是要麼成功執行要麼失敗徹底不執行。單個操做是原子性的。多個操做也支持事務,即原子性。數據庫
等等。c#
注意:Redis是內存數據庫,全部數據運行在內存中,可是能夠持久化到硬盤。Redis應用場景有緩存、計數器、隊列、排行榜等等。windows
(官網redis.io國內直接訪問不了)緩存
Linux版本下載:
http://www.redis.cn/download.html
Windows版本下載:
Redis 沒有官方的Windows版本,
可是微軟開源技術團隊開發和維護着Win64 的版本。
https://github.com/MicrosoftArchive/redis/releases
1)首先解壓Redis安裝包,在運行中輸入cmd,而後把目錄指向解壓的Redis目錄。
2、啓動命令
redis-server redis.windows.conf,出現下圖顯示錶示啓動成功了。若是想方便的話,能夠把 redis 的路徑加到系統的環境變量裏,這樣就免得再輸路徑了,後面的那個 redis.windows.conf 能夠省略。
1)上面雖然啓動了redis,可是隻要一關閉cmd窗口,redis就會消失。因此能夠redis設置成windows下的服務。首先咱們發現是沒有Redis服務的
2)、設置服務命令
redis-server --service-install redis.windows-service.conf --loglevel verbose
輸入命令以後沒有報錯,表示成功了,刷新服務,會看到多了一個redis服務
3)、經常使用的redis服務命令。
卸載服務:redis-server --service-uninstall
開啓服務:redis-server --service-start
中止服務:redis-server --service-stop
4)、啓動服務
5)、測試Redis,輸入命令:redis-cli.exe –h 127.0.0.1 –p 6379 鏈接服務端(直接redis-cli通常也能夠,鏈接遠程服務器語法:redis-cli -h host -p port -a password)
安裝測試成功。 這裏只是作簡單的安裝,部署服務使用,要更深刻進行了解。
6)如何設置服務器密碼:
1)方式1、
config get requirepass //獲取當前密碼
config set requirepass "password"//設置當前密碼,服務從新啓動後又會置爲默認,即無密碼;不建議此種方式
2)方式二:打開配置文件,找到下面第一句後加requirepass yourpassword
# requirepass foobared
requirepass yourpassword //此處注意,行前不能有空格
(若是是設置成了服務,須要在redis.windows-service.conf中設置)
從新設置密碼後,登陸後須要驗證才能獲取操做權限
auth 命令進行驗證,如auth 123456
Redis本質上是一個key-value數據庫,首先看它的key。它的key是非二進制安全的字符串類型,全部key中不能包含空格、轉義字符是不行的,如「my key」、「mykey\n」。
咱們能夠在使用時定義一種key的格式,如object-type:id:field(實例:user:100:name)
Key定義時不要太長(佔內存,查詢慢)或過短。
Key相關操做命令:
exists key //key是否存在
del key1,key2,…. //刪除key
type key//返回key對應的value的類型
keys pattern//返回匹配指定模式的全部key,支持*、?、[abc]等
接下來看value,Redis支持五種數據類型:string(字符串),hash(哈希),list(列表),set(集合)及zset(sorted set:有序集合)。
1) string字符串
如: set school nf //設置鍵值
get school //經過鍵獲取值
set number 10
incr number //使數值+1
decr number //使數值-1
mset school nf address Zhuhai //設置多個鍵值
mget school number //一次獲取多個值
2) hash哈希:Redis hash 是一個string類型的field和value的映射表,hash特別適合用於存儲對象。Redis 中每一個 hash 能夠存儲 232 - 1 鍵值對(40多億)。
如:hmset student name 張三 gender 男 age 18 //設置
hget student name //獲取某字段的值
hgetall student //獲取全部字段的值
hexists student name //判斷某字段是否存在
hdel student name //刪除某個或幾個字段
3) list列表:Redis列表是簡單的字符串列表,按照插入順序排序。你能夠添加一個元素到列表的頭部(左邊)或者尾部(右邊)。
如:lpush student 張三
lpush student 李四
lpush student 王五 //將值插入到列表的頭部(左邊),尾部(右邊)用rpush
lrange student 0 2 //獲取列表指定範圍內的元素
llen student //獲取列表長度
lindex student 0 //經過索引獲取列表某個元素
lpop student //移除列表的第一個元素(移除最後一個用rpop)
4) set集合:Redis 的 Set 是 String 類型的無序集合。集合成員是惟一的,這就意味着集合中不能出現重複的數據。
如:sadd books c#
sadd books java //向集合添加成員
smembers books //列出集合全部成員
scard books//返回集合成員數量
spop books//移除並返回集合中的一個隨機元素
srem books c# java js //移除集合中n個元素
5) zset有序集合:Redis 有序集合和集合同樣也是string類型元素的集合,且不容許重複的成員。不一樣的是每一個元素都會關聯一個double類型的分數。redis正是經過分數來爲集合中的成員進行從小到大的排序。有序集合的成員是惟一的,但分數(score)卻能夠重複。
如:zadd books 1 c#
zadd books 3 java
zadd books 2 js//向有序集合添加成員或更新成員
zrange books 0 10 [withscores]
//返回索引區間內的成員(可選項:帶分數)
zcard books//返回集合成員數
zcount books 0 10//返回指定區間分數內的成員數
zrank books c#//返回指定成員的索引
zscore books java//返回指定成員的分數值
zrem books c# java js//移除集合指定的n個成員
Redis是支持持久化的一個內存數據庫,常常須要將內存中的數據同步到磁盤中保證持久化。redis提供兩種方式進行持久化,一種是RDB持久化(原理是將Reids在內存中的數據庫記錄定時 dump到磁盤上的RDB文件),另一種是AOF(append only file)持久化(原理是將Reids的操做日誌以追加的方式寫入文件) 。
1)兩者的區別:
RDB持久化是指在指定的時間間隔內將內存中的數據集快照寫入磁盤,實際操做過程是fork一個子進程,先將數據集寫入臨時文件,寫入成功後,再替換以前的文件,用二進制壓縮存儲。
AOF持久化以日誌的形式記錄服務器所處理的每個寫、刪除操做,查詢操做不會記錄,以文本的方式記錄,能夠打開文件看到詳細的操做記錄
2)兩者優缺點:
RDB存在哪些優點呢?
1). 一旦採用該方式,那麼你的整個Redis數據庫將只包含一個文件,這對於文件備份而言是很是完美的。好比,你可能打算每一個小時歸檔一次最近24小時的數 據,同時還要天天歸檔一次最近30天的數據。經過這樣的備份策略,一旦系統出現災難性故障,咱們能夠很是容易的進行恢復。
2). 對於災難恢復而言,RDB是很是不錯的選擇。由於咱們能夠很是輕鬆的將一個單獨的文件壓縮後再轉移到其它存儲介質上。
3). 性能最大化。對於Redis的服務進程而言,在開始持久化時,它惟一須要作的只是fork出子進程,以後再由子進程完成這些持久化的工做,這樣就能夠極大的避免服務進程執行IO操做了。
4). 相比於AOF機制,若是數據集很大,RDB的啓動效率會更高。
RDB又存在哪些劣勢呢?
1). 若是你想保證數據的高可用性,即最大限度的避免數據丟失,那麼RDB將不是一個很好的選擇。由於系統一旦在定時持久化以前出現宕機現象,此前沒有來得及寫入磁盤的數據都將丟失。
2). 因爲RDB是經過fork子進程來協助完成數據持久化工做的,所以,若是當數據集較大時,可能會致使整個服務器中止服務幾百毫秒,甚至是1秒鐘。
AOF的優點有哪些呢?
1). 該機制能夠帶來更高的數據安全性,即數據持久性。Redis中提供了3中同步策略,即每秒同步、每修改同步和不一樣步。事實上,每秒同步也是異步完成的,其 效率也是很是高的,所差的是一旦系統出現宕機現象,那麼這一秒鐘以內修改的數據將會丟失。而每修改同步,咱們能夠將其視爲同步持久化,即每次發生的數據變 化都會被當即記錄到磁盤中。能夠預見,這種方式在效率上是最低的。至於無同步,無需多言,我想你們都能正確的理解它。
2). 因爲該機制對日誌文件的寫入操做採用的是append模式,所以在寫入過程當中即便出現宕機現象,也不會破壞日誌文件中已經存在的內容。然而若是咱們本次操做只是寫入了一半數據就出現了系統崩潰問題,不用擔憂,在Redis下一次啓動以前,咱們能夠經過redis-check-aof工具來幫助咱們解決數據 一致性的問題。
3). 若是日誌過大,Redis能夠自動啓用rewrite機制。即Redis以append模式不斷的將修改數據寫入到老的磁盤文件中,同時Redis還會創 建一個新的文件用於記錄此期間有哪些修改命令被執行。所以在進行rewrite切換時能夠更好的保證數據安全性。
4). AOF包含一個格式清晰、易於理解的日誌文件用於記錄全部的修改操做。事實上,咱們也能夠經過該文件完成數據的重建。
AOF的劣勢有哪些呢?
1). 對於相同數量的數據集而言,AOF文件一般要大於RDB文件。RDB 在恢復大數據集時的速度比 AOF 的恢復速度要快。
2). 根據同步策略的不一樣,AOF在運行效率上每每會慢於RDB。總之,每秒同步策略的效率是比較高的,同步禁用策略的效率和RDB同樣高效。
兩者選擇的標準,就是看系統是願意犧牲一些性能,換取更高的緩存一致性(aof),仍是願意寫操做頻繁的時候,不啓用備份來換取更高的性能,待手動運行save的時候,再作備份(rdb)。rdb這個就更有些 eventually consistent的意思了。
3)經常使用配置
1)RDB持久化配置
Redis會將數據集的快照dump到dump.rdb文件中。此外,咱們也能夠經過配置文件來修改Redis服務器dump快照的頻率,在打開redis.windows.conf文件以後,咱們搜索save,能夠看到下面的配置信息:
save 900 1 #在900秒(15分鐘)以後,若是至少有1個key發生變化,則dump內存快照。
save 300 10 #在300秒(5分鐘)以後,若是至少有10個key發生變化,則dump內存快照。
save 60 10000 #在60秒(1分鐘)以後,若是至少有10000個key發生變化,則dump內存快照。
2)AOF持久化配置
在Redis的配置文件redis.windows.conf中存在三種同步方式,它們分別是:
appendfsync always #每次有數據修改發生時都會寫入AOF文件。
appendfsync everysec #每秒鐘同步一次,該策略爲AOF的缺省策略。
appendfsync no #從不一樣步。高效可是數據不會被持久化。
Jedis是Redis官方首選的JAVA客戶端開發包。
jar包下載地址:
https://mvnrepository.com/artifact/redis.clients/jedis
詳細請看代碼案例。