redis教程:
概述
redis是一種支持分布式的nosql數(shù)據(jù)庫,他的數(shù)據(jù)是保存在內(nèi)存中,同時redis可以定時把內(nèi)存數(shù)據(jù)同步到磁盤,即可以將數(shù)據(jù)持久化,并且他比memcached支持更多的數(shù)據(jù)結(jié)構(gòu)(string,list列表[隊列和棧],set[集合],sorted set[有序集合],hash(hash表))。相關(guān)參考文檔:http://redisdoc.com/index.html
redis使用場景:
- 登錄會話存儲:存儲在
redis中,與memcached相比,數(shù)據(jù)不會丟失。 - 排行版/計數(shù)器:比如一些秀場類的項目,經(jīng)常會有一些前多少名的主播排名。還有一些文章閱讀量的技術(shù),或者新浪微博的點贊數(shù)等。
- 作為消息隊列:比如
celery就是使用redis作為中間人。 - 當(dāng)前在線人數(shù):還是之前的秀場例子,會顯示當(dāng)前系統(tǒng)有多少在線人數(shù)。
- 一些常用的數(shù)據(jù)緩存:比如我們的
BBS論壇,板塊不會經(jīng)常變化的,但是每次訪問首頁都要從mysql中獲取,可以在redis中緩存起來,不用每次請求數(shù)據(jù)庫。 - 把前200篇文章緩存或者評論緩存:一般用戶瀏覽網(wǎng)站,只會瀏覽前面一部分文章或者評論,那么可以把前面200篇文章和對應(yīng)的評論緩存起來。用戶訪問超過的,就訪問數(shù)據(jù)庫,并且以后文章超過200篇,則把之前的文章刪除。
- 好友關(guān)系:微博的好友關(guān)系使用
redis實現(xiàn)。 - 發(fā)布和訂閱功能:可以用來做聊天軟件。
redis和memcached的比較:
| memcached | redis | |
|---|---|---|
| 類型 | 純內(nèi)存數(shù)據(jù)庫 | 內(nèi)存磁盤同步數(shù)據(jù)庫 |
| 數(shù)據(jù)類型 | 在定義value時就要固定數(shù)據(jù)類型 | 不需要 |
| 虛擬內(nèi)存 | 不支持 | 支持 |
| 過期策略 | 支持 | 支持 |
| 存儲數(shù)據(jù)安全 | 不支持 | 可以將數(shù)據(jù)同步到dump.db中 |
| 災(zāi)難恢復(fù) | 不支持 | 可以將磁盤中的數(shù)據(jù)恢復(fù)到內(nèi)存中 |
| 分布式 | 支持 | 主從同步 |
| 訂閱與發(fā)布 | 不支持 | 支持 |
redis在ubuntu系統(tǒng)中的安裝與啟動
-
安裝:
sudo apt-get install redis-server -
卸載:
sudo apt-get purge --auto-remove redis-server -
啟動:
redis安裝后,默認(rèn)會自動啟動,可以通過以下命令查看:ps aux|grep redis如果想自己手動啟動,可以通過以下命令進(jìn)行啟動:
sudo service redis-server start -
停止:
sudo service redis-server stop
redis在windows系統(tǒng)中的安裝與啟動:
- 下載:redis官方是不支持windows操作系統(tǒng)的。但是微軟的開源部門將redis移植到了windows上。因此下載地址不是在redis官網(wǎng)上。而是在github上:https://github.com/MicrosoftArchive/redis/releases。
- 安裝:點擊一頓下一步安裝就可以了。
- 運行:進(jìn)入到
redis安裝所在的路徑然后執(zhí)行redis-server.exe redis.windows.conf就可以運行了。 - 連接:
redis和mysql以及mongo是一樣的,都提供了一個客戶端進(jìn)行連接。輸入命令redis-cli(前提是redis安裝路徑已經(jīng)加入到環(huán)境變量中了)就可以連接到redis服務(wù)器了。
其他機器訪問本機redis服務(wù)器:
想要讓其他機器訪問本機的redis服務(wù)器。那么要修改redis.conf的配置文件,將bind改成bind [自己的ip地址或者0.0.0.0],其他機器才能訪問。
注意:bind綁定的是本機網(wǎng)卡的ip地址,而不是想讓其他機器連接的ip地址。如果有多塊網(wǎng)卡,那么可以綁定多個網(wǎng)卡的ip地址。如果綁定到額是0.0.0.0,那么意味著其他機器可以通過本機所有的ip地址進(jìn)行訪問。
對redis的操作
對redis的操作可以用兩種方式,第一種方式采用redis-cli,第二種方式采用編程語言,比如Python、PHP和JAVA等。
使用
redis-cli對redis進(jìn)行字符串操作:-
啟動
redis:sudo service redis-server start -
連接上
redis-server:
redis-cli -h [ip] -p [端口] -
添加:
set key value 如: set username xiaotuo將字符串值
value關(guān)聯(lián)到key。如果key已經(jīng)持有其他值,set命令就覆寫舊值,無視其類型。并且默認(rèn)的過期時間是永久,即永遠(yuǎn)不會過期。 -
刪除:
del key 如: del username -
設(shè)置過期時間:
expire key timeout(單位為秒)也可以在設(shè)置值的時候,一同指定過期時間:
set key value EX timeout 或: setex key timeout value -
查看過期時間:
ttl key 如: ttl username -
查看當(dāng)前
redis中的所有key:keys * -
列表操作:
-
在列表左邊添加元素:
lpush key value將值
value插入到列表key的表頭。如果key不存在,一個空列表會被創(chuàng)建并執(zhí)行lpush操作。當(dāng)key存在但不是列表類型時,將返回一個錯誤。 -
在列表右邊添加元素:
rpush key value將值value插入到列表key的表尾。如果key不存在,一個空列表會被創(chuàng)建并執(zhí)行RPUSH操作。當(dāng)key存在但不是列表類型時,返回一個錯誤。
-
查看列表中的元素:
lrange key start stop返回列表
key中指定區(qū)間內(nèi)的元素,區(qū)間以偏移量start和stop指定,如果要左邊的第一個到最后的一個lrange key 0 -1。 -
移除列表中的元素:
-
移除并返回列表
key的頭元素:
lpop key -
移除并返回列表的尾元素:
rpop key -
移除并返回列表
key的中間元素:lrem key count value將刪除
key這個列表中,count個值為value的元素。
-
-
指定返回第幾個元素:
lindex key index將返回
key這個列表中,索引為index的這個元素。 -
獲取列表中的元素個數(shù):
llen key 如: llen languages -
刪除指定的元素:
lrem key count value 如: lrem languages 0 php根據(jù)參數(shù) count 的值,移除列表中與參數(shù) value 相等的元素。
count的值可以是以下幾種:- count > 0:從表頭開始向表尾搜索,移除與
value相等的元素,數(shù)量為count。 - count < 0:從表尾開始向表頭搜索,移除與
value相等的元素,數(shù)量為count的絕對值。 - count = 0:移除表中所有與
value相等的值。
- count > 0:從表頭開始向表尾搜索,移除與
-
-
set集合的操作:-
添加元素:
sadd set value1 value2.... 如: sadd team xiaotuo datuo -
查看元素:
smembers set 如: smembers team -
移除元素:
srem set member... 如: srem team xiaotuo datuo -
查看集合中的元素個數(shù):
scard set 如: scard team1 -
獲取多個集合的交集:
sinter set1 set2 如: sinter team1 team2 -
獲取多個集合的并集:
sunion set1 set2 如: sunion team1 team2 -
獲取多個集合的差集:
sdiff set1 set2 如: sdiff team1 team2
-
-
hash哈希操作:-
添加一個新值:
hset key field value 如: hset website baidu baidu.com將哈希表
key中的域field的值設(shè)為value。
如果key不存在,一個新的哈希表被創(chuàng)建并進(jìn)行HSET操作。如果域field已經(jīng)存在于哈希表中,舊值將被覆蓋。 -
獲取哈希中的
field對應(yīng)的值:hget key field 如: hget website baidu -
刪除
field中的某個field:hdel key field 如: hdel website baidu -
獲取某個哈希中所有的
field和value:hgetall key 如: hgetall website -
獲取某個哈希中所有的
field:hkeys key 如: hkeys website -
獲取某個哈希中所有的值:
hvals key 如: hvals website -
判斷哈希中是否存在某個
field:hexists key field 如: hexists website baidu -
獲取哈希中總共的鍵值對:
hlen field 如: hlen website
-
-
事務(wù)操作:Redis事務(wù)可以一次執(zhí)行多個命令,事務(wù)具有以下特征:
隔離操作:事務(wù)中的所有命令都會序列化、按順序地執(zhí)行,不會被其他命令打擾。
原子操作:事務(wù)中的命令要么全部被執(zhí)行,要么全部都不執(zhí)行。
-
開啟一個事務(wù):
multi以后執(zhí)行的所有命令,都在這個事務(wù)中執(zhí)行的。
-
執(zhí)行事務(wù):
exec會將在
multi和exec中的操作一并提交。 -
取消事務(wù):
discard會將
multi后的所有命令取消。 -
監(jiān)視一個或者多個
key:watch key...監(jiān)視一個(或多個)key,如果在事務(wù)執(zhí)行之前這個(或這些) key被其他命令所改動,那么事務(wù)將被打斷。
-
取消所有
key的監(jiān)視:unwatch
-
發(fā)布/訂閱操作:
-
給某個頻道發(fā)布消息:
publish channel message -
訂閱某個頻道的消息:
subscribe channel
-