NoSQL
NoSQL,泛指非關(guān)系型數(shù)據(jù)庫颅痊。隨著互聯(lián)網(wǎng)的發(fā)展,傳統(tǒng)的關(guān)系型數(shù)據(jù)庫在應(yīng)付超大型和高并發(fā)的網(wǎng)站已經(jīng)新的力不從心牵舵,暴露了很多難以克服的問題沼头,而非關(guān)系型的數(shù)據(jù)庫則由于其本身的特點(diǎn)得到了非常迅速的發(fā)展阶冈。NoSQL數(shù)據(jù)庫的產(chǎn)生就是為了解決大規(guī)模數(shù)據(jù)集合多重?cái)?shù)據(jù)種類帶來的挑戰(zhàn),尤其是大數(shù)據(jù)應(yīng)用難題线椰。
NoSQL的四大分類
1.鍵值存儲(chǔ)數(shù)據(jù)庫
這一類數(shù)據(jù)庫只要會(huì)使用一個(gè)哈希表,這個(gè)表中有一個(gè)特定的鍵和一個(gè)指針指向特定的數(shù)據(jù)尘盼。key/value模型對于IT系統(tǒng)來說的優(yōu)勢在于簡單憨愉、易部署。舉例如:Redis卿捎,Voldemort配紫,Oracle BDB,Tokyo Cabinet/Tyrant
2.列存儲(chǔ)數(shù)據(jù)庫
這部分?jǐn)?shù)據(jù)庫通常是用來應(yīng)對分布式存儲(chǔ)的海量數(shù)據(jù)娇澎。鍵依然存在笨蚁,但是他們的特點(diǎn)是指向多個(gè)列。這些列是由列家族來安排的趟庄。如:Cassandra, HBase, Riak
3.文檔型數(shù)據(jù)庫
文檔型數(shù)據(jù)庫的靈感是來自于Lotus Notes辦公軟件的括细,而且它同第一種鍵值存儲(chǔ)相類似。該類型的數(shù)據(jù)模型是版本化的文檔戚啥,半結(jié)構(gòu)化的文檔以特定的格式存儲(chǔ)奋单,比如JSON。文檔型數(shù)據(jù)庫可 以看作是鍵值數(shù)據(jù)庫的升級(jí)版猫十,允許之間嵌套鍵值览濒。而且文檔型數(shù)據(jù)庫比鍵值數(shù)據(jù)庫的查詢效率更高呆盖。如:CouchDB, MongoDb
4.圖形數(shù)據(jù)庫
圖形結(jié)構(gòu)的數(shù)據(jù)庫同其他行列以及剛性結(jié)構(gòu)的SQL數(shù)據(jù)庫不同,它是使用靈活的圖形模型贷笛,并且能夠擴(kuò)展到多個(gè)服務(wù)器上应又。NoSQL數(shù)據(jù)庫沒有標(biāo)準(zhǔn)的查詢語言(SQL),因此進(jìn)行數(shù)據(jù)庫查詢需要制定數(shù)據(jù)模型乏苦。許多NoSQL數(shù)據(jù)庫都有REST式的數(shù)據(jù)接口或者查詢API株扛。如:Neo4J, InfoGrid, Infinite Graph.
NoSQL的適用場景
- 數(shù)據(jù)模型比較簡單
- 需要靈活性更強(qiáng)的IT系統(tǒng)
- 對數(shù)據(jù)庫性能要求較高
- 不需要高度的數(shù)據(jù)一致性
- 對于給定key,比較容易映射復(fù)雜值的環(huán)境
Redis
Redis是一個(gè)key-value存儲(chǔ)系統(tǒng)汇荐。和Memcached類似洞就,它支持存儲(chǔ)的value類型相對更多,包括string(字符串)掀淘、list(鏈表)旬蟋、set(集合)、zset(sorted set 有序集合)和hash(哈希類型)革娄。這些數(shù)據(jù)類型都支持push/pop倾贰、add/remove及取交集并集和差集及更豐富的操作,而且這些操作都是原子性的稠腊。在此基礎(chǔ)上躁染,Redis支持各種不同方式的排序。與Memcached一樣架忌,為了保證效率吞彤,數(shù)據(jù)都是緩存在內(nèi)存中。區(qū)別的是redis會(huì)周期性的把更新的數(shù)據(jù)寫入磁盤或者把修改操作寫入追加的記錄文件叹放,并且在此基礎(chǔ)上實(shí)現(xiàn)了master-slave(主從)同步饰恕。
Redis支持主從同步。數(shù)據(jù)可以從主服務(wù)器向任意數(shù)量的從服務(wù)器上同步井仰,從服務(wù)器可以是關(guān)聯(lián)其他從服務(wù)器的主服務(wù)器埋嵌。這使得Redis可執(zhí)行單層樹復(fù)制。存盤可以有意無意的對數(shù)據(jù)進(jìn)行寫操作俱恶。由于完全實(shí)現(xiàn)了發(fā)布/訂閱機(jī)制雹嗦,使得從數(shù)據(jù)庫在任何地方同步樹時(shí),可訂閱一個(gè)頻道并接收主服務(wù)器完整的消息發(fā)布記錄合是。同步對讀取操作的可擴(kuò)展性和數(shù)據(jù)冗余很有幫助了罪。
Redis的安裝
1.windows下的安裝
因?yàn)閞edis官網(wǎng)上沒有msi文件的redis安裝包,所以我們可以點(diǎn)擊下面的鏈接
redis msi下載地址
下載完成后點(diǎn)擊安裝即可
2.ubuntu下安裝(linux下安裝)
- 使用apt自行安裝
sudo apt-get install Redis`
-
壓縮包安裝
- 到官網(wǎng)下載Redis壓縮包文件
- 解壓下載的壓縮包文件
- 到解壓的文件下使用make編譯生成可執(zhí)行文件聪全。使用make命令要確保系統(tǒng)中安裝了c語言解釋環(huán)境泊藕。若出錯(cuò)可以安裝gcc,使用下面的命令.
`sudo apt-get install gcc`
make命令執(zhí)行完成之后难礼,會(huì)在src文件加下生成多個(gè)文件
其中包含有redis-cli娃圆、redis-server玫锋、redis-benchmark、redis-stat文件
redis-cli:redis命令行操作工具
redis-server:redis服務(wù)器的deamon啟動(dòng)程序(后臺(tái)程序讼呢,守護(hù)進(jìn)程)
redis-benchmark:redis的性能測試工具撩鹿,測試redis在你的系統(tǒng)記你的配置下的讀寫性能
redis-stat:redis狀態(tài)檢測工具,可以檢測redis當(dāng)前狀態(tài)參數(shù)及延遲狀況
k4. 編譯完成之后進(jìn)入src文件夾下進(jìn)行安裝 使用make install命令驗(yàn)
(ll查看src下的目錄吝岭,有redis-server 三痰、redis-cil即可)
5. 建立redis目錄(非必須)
這個(gè)過程不是必須的,只是為了將Redis相關(guān)的資源統(tǒng)一管理而進(jìn)行的操作
建立倆個(gè)文件夾存放redis命令和配置文件
mkdir -p /usr/local/redis/etc`
`mkdir -p /usr/local/redis/bin`
把redis.conf 移動(dòng)到/usr/local/redis/etc下窜管,
`cpredis.conf/usr/local/redis/etc/`
把的mkreleasehdr.sh、redis-benchmark稚机、redis-check-aof幕帆、redis-check-dump、redis-cli赖条、redis-server
文件移動(dòng)到bin下失乾,命令:
`mv mkreleasehdr.sh redis-benchmark redis-check-aof redis-check-dump redis-cli redis-server /usr/local/redis/bin`
6. 配置參數(shù)
在我們成功安裝Redis后,我們直接執(zhí)行redis-server即可運(yùn)行Redis纬乍,此時(shí)它是按照默認(rèn)配置來運(yùn)行的(默認(rèn)配置甚至不是后臺(tái)運(yùn)行)碱茁。我們希望Redis按我們的要求運(yùn)行,則我們需要修改配置文件仿贬,Redis的配置文件就是redis.conf
下面是一部分的參數(shù)意義
* daemonize:是否以后臺(tái)daemon方式運(yùn)行
* bind 127.0.0.1:指定redis只接受來自此ip的請求纽竣,若比設(shè)置,則處理所有請求
* pidfule:pid文件位置
* port:監(jiān)聽端口
* timeout:請求超時(shí)時(shí)間茧泪,0 代表永不超時(shí)
* tcp-keepalive 0 :指定tcp連接是否為長連接蜓氨。默認(rèn)為0,表示禁用
* loglevel:日志信息級(jí)別队伟,從高到底以此為debug穴吹、verbose、notice和warning
* logfile:日志文件位置
* database:開啟數(shù)據(jù)庫數(shù)量
* dbfilename dump.rbd:存儲(chǔ)數(shù)據(jù)的文件名
* dir ./. 存儲(chǔ)數(shù)據(jù)的文件的所在路徑
* rdbcompression:是否使用壓縮
* save 900 1
save 300 10
save 60 10000
保存數(shù)據(jù)快照的頻率嗜侮,即將數(shù)據(jù)持久化到dump.rdb文件中的頻度港令。用來描述”在多少秒期間至少多少個(gè)變更操作”觸發(fā)snapshot數(shù)據(jù)保存動(dòng)作
默認(rèn)設(shè)置,意思是:
if(在60 秒之內(nèi)有10000 個(gè)keys 發(fā)生變化時(shí)){
進(jìn)行鏡像備份
}else if(在300 秒之內(nèi)有10 個(gè)keys 發(fā)生了變化){
進(jìn)行鏡像備份
}else if(在900 秒之內(nèi)有1 個(gè)keys 發(fā)生了變化){
進(jìn)行鏡像備份
}
* stop-writes-on-bgsave-error yes:當(dāng)持久化出現(xiàn)錯(cuò)誤時(shí)是否依然進(jìn)行動(dòng)作锈颗,是否終止所有的客戶端write請求顷霹。
默認(rèn)設(shè)置”yes”表示終止,一旦snapshot數(shù)據(jù)保存故障宜猜,那么此server為只讀服務(wù)泼返。如果為”no”,那么此次snapshot將失敗姨拥,但下一次snapshot不會(huì)受到影響绅喉,不過如果出現(xiàn)故障渠鸽,數(shù)據(jù)只能恢復(fù)到”最近一個(gè)成功點(diǎn)“
* slaveof:設(shè)置該數(shù)據(jù)庫為其他數(shù)據(jù)庫的從數(shù)據(jù)庫,并為其指定master信息柴罐。
* masterauth:主數(shù)據(jù)庫連接需要密碼驗(yàn)證時(shí)徽缚,在這里指定
* requirepass :設(shè)置密碼(安全驗(yàn)證)
Redis的數(shù)據(jù)類型
redis的五種基本數(shù)據(jù)類型
string 字符串
set 集合
list 列表
zset 有序集合
-
hash 對象(哈希類型)
string類型的操作指令
<pre class="prettyprint linenums prettyprinted" style="box-sizing: border-box; overflow: auto; font-family: Menlo, Monaco, Consolas, "Courier New", monospace; font-size: 13px; display: block; padding: 9.5px; margin: 0px 0px 10px; line-height: 1.42857; color: rgb(51, 51, 51); word-break: break-all; overflow-wrap: break-word; background-color: rgb(245, 245, 245); border: 1px solid rgb(204, 204, 204); border-radius: 4px; font-style: normal; font-variant-ligatures: normal; font-variant-caps: normal; font-weight: 400; letter-spacing: normal; orphans: 2; text-align: start; text-indent: 0px; text-transform: none; widows: 2; word-spacing: 0px; -webkit-text-stroke-width: 0px; text-decoration-style: initial; text-decoration-color: initial;">
-
set key value #設(shè)置key對應(yīng)string類型的值,返回1表示成功革屠,0失敗
image.png -
get key # 獲取指定key對應(yīng)的值凿试。如果key不存在,返回nil似芝。如果key的value不是string那婉,就返回錯(cuò)誤
image.png -
setnx key value #若key不存在,設(shè)置value的值党瓮,若存在详炬,則不作操作 get key | 獲取指定key的value值
image.png -
getset key value #先獲取key的值 在設(shè)置可以的值,若可以不存在寞奸,則返回nil
image.png mget k1 k2 ... #獲取多個(gè)key的值呛谜,若對應(yīng)的key不存在,則返回nil
mset k1 v1 k2 v2 ... #一次設(shè)置多個(gè)key的值枪萄,成功返回1隐岛,表示所有的值都設(shè)置成功,返回0表示沒有任何值被設(shè)置
msernx k1 v1 k2 v2 ... #設(shè)置多個(gè)key的值瓷翻,但是不會(huì)覆蓋已經(jīng)存在的key
setex key second value #設(shè)置指定key的值聚凹,并設(shè)置它的失效時(shí)間(秒)
psetex key millionseconds value #和setex一樣,唯一的區(qū)別是時(shí)間一毫秒為單位
incr key # 對key的值加1逻悠,只對數(shù)據(jù)字符串有效
incrby key value #對key的值加value元践,只對數(shù)據(jù)字符串有效
decr key #對key的值減1
decrby key value #對key的值減value
strlen key #求對應(yīng)key的值的長度
append key value #對key對應(yīng)的值及進(jìn)行拼接(從末尾拼接)
getrange key start end #獲取指定起始和結(jié)束為止的key的值的子串
setrange key offset value # 覆蓋key對應(yīng)值的指定位置的字符,offset為偏移量童谒,value時(shí)在offset后放置的值单旁。這個(gè)命令可以確保key有一個(gè)足夠大的字符串
setbit key offset value #設(shè)置或者清空key的value(字符串)在offset處的bit值
scan curssor [match pattern][COUNT count] #迭代當(dāng)前數(shù)據(jù)庫中key的集合
getbit key offset #返回key對應(yīng)的string在offset處的bit值
bitcount key [start end] #統(tǒng)計(jì)字符串被設(shè)置為1的bit數(shù)。將字符串轉(zhuǎn)化成二進(jìn)制饥伊,統(tǒng)計(jì)為1的數(shù)量
</pre>
hash類型的操作指令
<pre class="prettyprint linenums prettyprinted" style="box-sizing: border-box; overflow: auto; font-family: Menlo, Monaco, Consolas, "Courier New", monospace; font-size: 13px; display: block; padding: 9.5px; margin: 0px 0px 10px; line-height: 1.42857; color: rgb(51, 51, 51); word-break: break-all; overflow-wrap: break-word; background-color: rgb(245, 245, 245); border: 1px solid rgb(204, 204, 204); border-radius: 4px; font-style: normal; font-variant-ligatures: normal; font-variant-caps: normal; font-weight: 400; letter-spacing: normal; orphans: 2; text-align: start; text-indent: 0px; text-transform: none; widows: 2; word-spacing: 0px; -webkit-text-stroke-width: 0px; text-decoration-style: initial; text-decoration-color: initial;">
hdel key field [field...] 從key指定的哈希集中移除指定的屬性
hexists key field # 返回對應(yīng)hash中field知否存在象浑。1表示存在,0表示不存在
hget key field #獲取指定hash中給字段field的值
hgetall key #獲取hash中所有字段和值琅豆,每個(gè)字段名后就是字段對應(yīng)的值
hincrby key field value #增加key對應(yīng)的哈希集中制定的數(shù)值(value)
hiincrbyfloat key field vaue #和hincrby一樣愉豺,區(qū)別是加的值為float
hkeys key #獲取指定哈希集的所有字段的名字
hlen key #獲取指定哈希集包含的字段的長度
hmget key field [field...] #返回key對應(yīng)哈希集中指定的字段的值
hmget key field value [field value] #設(shè)置指定的哈希集中指定的字段的值
hscan key cursor [match pattern][COUNT count] #迭代hash類型中的鍵值對
hset key field value #設(shè)置哈希集中指定字段的值如果字段在哈希集中存在,它將被重寫茫因。
hsernx key field value #設(shè)置哈希集中指定字段的值蚪拦,如存在則不作操作
hstrlen key field #返回哈希集中指定字段對應(yīng)的值的長度
hvals key #返回哈希集中所有的字段的值
</pre>
list類型的操作指令
<pre class="prettyprint linenums prettyprinted" style="box-sizing: border-box; overflow: auto; font-family: Menlo, Monaco, Consolas, "Courier New", monospace; font-size: 13px; display: block; padding: 9.5px; margin: 0px 0px 10px; line-height: 1.42857; color: rgb(51, 51, 51); word-break: break-all; overflow-wrap: break-word; background-color: rgb(245, 245, 245); border: 1px solid rgb(204, 204, 204); border-radius: 4px; font-style: normal; font-variant-ligatures: normal; font-variant-caps: normal; font-weight: 400; letter-spacing: normal; orphans: 2; text-align: start; text-indent: 0px; text-transform: none; widows: 2; word-spacing: 0px; -webkit-text-stroke-width: 0px; text-decoration-style: initial; text-decoration-color: initial;">
blpop key [key ...] timeout
brpop key [key ...] timeout
lindex key index #獲取索引位對應(yīng)的元素
linsert key before|after pivot value #把value插入到pivot前面或后面
llen key #但是key對應(yīng)的list的長度
lpop key #移除并飯后key對應(yīng)的list的第一個(gè)元素
lpush key value [value...] #從左(頭)側(cè)將值放入list中
rpush key value [value...] #從右(尾)側(cè)將值放入list中
lpushx key value #只有當(dāng)key對應(yīng)的list存在才會(huì)從頭部插入value
lrange key start stop #循環(huán)顯示list的值
lrem key count value #從存于 key 的列表里移除前 count 次出現(xiàn)的值為 value 的元素。 這個(gè) count 參數(shù)通過下面幾種方式影響這個(gè)操作:
count > 0: 從頭往尾移除值為 value 的元素。
count < 0: 從尾往頭移除值為 value 的元素驰贷。
count = 0: 移除所有值為 value 的元素盛嘿。
</pre>