1.存儲key value以及5種不同的數(shù)據(jù)結(jié)構(gòu)之間的mapping(映射)
2.redis不使用表格
- memcached只能保存字符串
- redis儲存---------主儲存(primary storage)
|
|
|
|-------二級儲存(secondary storage)
|
|
|
|
5.需要考慮的問題是,由于redis屬于內(nèi)存數(shù)據(jù)庫,當(dāng)服務(wù)器關(guān)閉的時候,數(shù)據(jù)也會丟失。那么數(shù)據(jù)該何去何從,但是redis提供了兩種數(shù)據(jù)持久化的方式,都可以將數(shù)據(jù)以小而緊湊的格式寫入硬盤中,分別為<<<1>>>時間點(diǎn)轉(zhuǎn)儲(point-in-time dump),其中可以通過在一定時間內(nèi)到達(dá)一定數(shù)量的寫入操作執(zhí)行,當(dāng)這一條件能夠滿足的時候,又可以通過兩條轉(zhuǎn)存到硬盤(dump-to-disk)兩條命令的一條來執(zhí)行;第二種<<<2>>>是將所有修改了數(shù)據(jù)庫的命令都寫入一個只追加(append-only)的文件里面,用戶可以根據(jù)數(shù)據(jù)的重要程度,來設(shè)置不同步(sync),每秒同步一次或者每寫入一個命令同步一次。
6.Redis的數(shù)據(jù)結(jié)構(gòu)
---String 可以是字符串,整數(shù)或者浮點(diǎn)數(shù)
---List 一個鏈表,鏈表上的每個節(jié)點(diǎn)都包含了一個字符串
---Set 包含字符串的無序收集器,并且被包含的字符串都是獨(dú)一無二的
---Zset 字符串成員與浮點(diǎn)數(shù)分值之間的有序映射,元素的排列順序由分值大小決定
---Hash 包含鍵值對的無序散列表
其中Set和Zset是Redis特有的數(shù)據(jù)結(jié)構(gòu)
使用的Nodejs來與Redis進(jìn)行交互
首先要在nodejs相關(guān)項目下安裝redis包,執(zhí)行npm install redis --save
在nodejs中啟動server.js,server.js相關(guān)代碼如下
對于set的基本操作如下
const redis = require('redis');
const client = redis.createClient();
client.on('erro', (err)=>{
console.log('Error' + err)
})
//string key, string value
client.set('hello', 'world', redis.print);
client.get("hello", function(err, reply) {
// reply is null when the key is missing
console.log(reply);
});
這僅僅是對redis中的set結(jié)構(gòu)進(jìn)行設(shè)置,此時在控制臺返回的結(jié)果為Reply:OK以及world。
對于鏈表list,一個鏈表可以有序的保存多個字符串,其中包含的字符串可以重復(fù)出現(xiàn),其中對于鏈表的操作LPUSH,RPUSH分別是從list的左邊和右邊推入元素,而LPOP以及RPOP是分別從list的左邊以及右邊彈出元素。LINDEX是獲取給定位置的單個元素,LRANGE是返回列表給定范圍內(nèi)的所有元素
client.rpush(['frameworks', 'angularjs', 'backbone'], function(err, reply) {
console.log(reply); //prints 2
});
返回的是list的長度。所表達(dá)的信息是創(chuàng)建了一個叫frameworks的list,然后推入了兩個元素,分別為angular和backbone,返回的是list的長度
client.lrange('frameworks', 0, -1, function(err, reply) {
console.log(reply); // ['angularjs', 'backbone']
});
Redis集合(set)
Redis集合和Redis列表都可以保存多個字符串,不同點(diǎn)在于,Redis集合通過散列表來保證儲存的字符串各不相同,而Redis列表中卻可以儲存相同的字符串,由于Redis集合使用了無序(unordered)的保存方式來保存元素,因此Redis集合不能像鏈表一樣從兩側(cè)推入或者彈出元素。不過用戶可以通過SADD或者SREM進(jìn)行添加元素到集合中,或者從集合中刪除某特定元素。SISMEMBER可以快速檢查某個元素是否存在Redis集合里?;蛘呤褂?code>SMEMBERS獲取集合內(nèi)包含的所有元素
在Nodejs中使用如下
client.sadd(['tags', 'angularjs', 'backbonejs', 'emberjs'], function(err, reply) {
console.log(reply); // 3
});
返回set的長度為3,tags為Redis集合的名字。
client.smembers('tags', function(err, reply) {
console.log(reply);
});
此時會返回[ 'emberjs', 'backbonejs', 'angularjs' ],即集合tags里面的內(nèi)容
Redis散列(hash)
Redis散列可以保存多個鍵值對之間的映射。和字符串一樣,散列的值即可以是字符串,也可以是數(shù)字。并且用戶可以對這些數(shù)值做自增自減操作。
client.hmset('frameworks', {
'javascript': 'AngularJS',
'css': 'Bootstrap',
'node': 'Express'
});
Redis的有序集合(zset)
有序集合和散列一樣,用來存儲鍵值對;有序集合的鍵被稱作成員(member),每個成員各不相同;有序集合的值被稱為分值(score),分值必須為浮點(diǎn)數(shù),Redis有序集合是唯一一個即可以根據(jù)成員訪問元素,也可以通過分值以及分值的排列順序來訪問元素的結(jié)構(gòu)