redis
是一種支持分佈式的nosql
數據庫,他的數據是保存在內存中,同時redis
能夠定時把內存數據同步到磁盤,便可以將數據持久化,而且他比memcached
支持更多的數據結構(string
,list列表[隊列和棧]
,set[集合]
,sorted set[有序集合]
,hash(hash表)
)。相關參考文檔:http://redisdoc.com/index.htmlphp
redis
中,與memcached
相比,數據不會丟失。celery
就是使用redis
做爲中間人。BBS
論壇,板塊不會常常變化的,可是每次訪問首頁都要從mysql
中獲取,能夠在redis
中緩存起來,不用每次請求數據庫。redis
實現。redis
和memcached
的比較:memcached | redis | |
---|---|---|
類型 | 純內存數據庫 | 內存磁盤同步數據庫 |
數據類型 | 在定義value時就要固定數據類型 | 不須要 |
虛擬內存 | 不支持 | 支持 |
過時策略 | 支持 | 支持 |
存儲數據安全 | 不支持 | 能夠將數據同步到dump.db中 |
災難恢復 | 不支持 | 能夠將磁盤中的數據恢復到內存中 |
分佈式 | 支持 | 主從同步 |
訂閱與發佈 | 不支持 | 支持 |
redis
在ubuntu
系統中的安裝與啓動sudo apt-get install redis-server
sudo apt-get purge --auto-remove redis-server
啓動:redis
安裝後,默認會自動啓動,能夠經過如下命令查看:html
ps aux|grep redis
若是想本身手動啓動,能夠經過如下命令進行啓動:python
sudo service redis-server start
中止:mysql
sudo service redis-server stop
redis
安裝所在的路徑而後執行redis-server.exe redis.windows.conf
就能夠運行了。redis
和mysql
以及mongo
是同樣的,都提供了一個客戶端進行鏈接。輸入命令redis-cli
(前提是redis安裝路徑已經加入到環境變量中了)就能夠鏈接到redis
服務器了。想要讓其餘機器訪問本機的redis服務器。那麼要修改redis.conf的配置文件,將bind改爲bind [本身的ip地址或者0.0.0.0]
,其餘機器才能訪問。
注意:bind綁定的是本機網卡的ip地址,而不是想讓其餘機器鏈接的ip地址。若是有多塊網卡,那麼能夠綁定多個網卡的ip地址。若是綁定到額是0.0.0.0,那麼意味着其餘機器能夠經過本機全部的ip地址進行訪問。git
redis
的操做對redis
的操做能夠用兩種方式,第一種方式採用redis-cli
,第二種方式採用編程語言,好比Python
、PHP
和JAVA
等。 github
使用redis-cli
對redis
進行字符串操做:web
啓動redis
:redis
sudo service redis-server start
redis-server
: redis-cli -h [ip] -p [端口]
添加:sql
set key value 如: set username xiaotuo
將字符串值value
關聯到key
。若是key
已經持有其餘值,set
命令就覆寫舊值,無視其類型。而且默認的過時時間是永久,即永遠不會過時。數據庫
刪除:
del key 如: del username
設置過時時間:
expire key timeout(單位爲秒)
也能夠在設置值的時候,一同指定過時時間:
set key value EX timeout 或: setex key timeout value
查看過時時間:
ttl key 如: ttl username
查看當前redis
中的全部key
:
keys *
列表操做:
在列表左邊添加元素:
lpush key value
將值value
插入到列表key
的表頭。若是key
不存在,一個空列表會被建立並執行lpush
操做。當key
存在但不是列表類型時,將返回一個錯誤。
在列表右邊添加元素:
rpush key value
將值value插入到列表key的表尾。若是key不存在,一個空列表會被建立並執行RPUSH操做。當key存在但不是列表類型時,返回一個錯誤。
查看列表中的元素:
lrange key start stop
返回列表key
中指定區間內的元素,區間以偏移量start
和stop
指定,若是要左邊的第一個到最後的一個lrange key 0 -1
。
移除列表中的元素:
key
的頭元素: lpop key
rpop key
移除並返回列表key
的中間元素:
lrem key count value
將刪除key
這個列表中,count
個值爲value
的元素。
指定返回第幾個元素:
lindex key index
將返回key
這個列表中,索引爲index
的這個元素。
獲取列表中的元素個數:
llen key 如: llen languages
刪除指定的元素:
lrem key count value 如: lrem languages 0 php
根據參數 count 的值,移除列表中與參數 value 相等的元素。count
的值能夠是如下幾種:
value
相等的元素,數量爲count
。value
相等的元素,數量爲count
的絕對值。value
相等的值。set
集合的操做:
sadd set value1 value2.... 如: sadd team xiaotuo datuo
smembers set 如: smembers team
srem set member... 如: srem team xiaotuo datuo
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
的值設爲value
。
若是key
不存在,一個新的哈希表被建立並進行 HSET
操做。若是域 field
已經存在於哈希表中,舊值將被覆蓋。
獲取哈希中的field
對應的值:
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
事務操做:Redis事務能夠一次執行多個命令,事務具備如下特徵:
開啓一個事務:
multi
之後執行的全部命令,都在這個事務中執行的。
執行事務:
exec
會將在multi
和exec
中的操做一併提交。
取消事務:
discard
會將multi
後的全部命令取消。
監視一個或者多個key
:
watch key...
監視一個(或多個)key,若是在事務執行以前這個(或這些) key被其餘命令所改動,那麼事務將被打斷。
取消全部key
的監視:
unwatch
發佈/訂閱操做:
publish channel message
subscribe channel
Scrapy
是一個框架,他自己是不支持分佈式的。若是咱們想要作分佈式的爬蟲,就須要藉助一個組件叫作Scrapy-Redis
,這個組件正是利用了Redis
能夠分佈式的功能,集成到Scrapy
框架中,使得爬蟲能夠進行分佈式。能夠充分的利用資源(多個ip、更多帶寬、同步爬取)來提升爬蟲的爬行效率。
經過pip install scrapy-redis
便可安裝。
Scrapy架構圖:
Scrapy-Redis架構圖:
分佈式爬蟲架構圖:
以上兩個圖片對比咱們能夠發現。Item Pipeline
在接收到數據後發送給了Redis
、Scheduler
調度器調度數據也是從Redis
中來的、而且其實數據去重也是在Redis
中作的。
要將一個Scrapy
項目變成一個Scrapy-redis
項目只需修改如下三點就能夠了:
scrapy.Spider
變成scrapy_redis.spiders.RedisSpider
;或者是從scrapy.CrawlSpider
變成scrapy_redis.spiders.RedisCrawlSpider
。 start_urls
刪掉。增長一個redis_key="xxx"
。這個redis_key
是爲了之後在redis
中控制爬蟲啓動的。爬蟲的第一個url,就是在redis中經過這個發送出去的。 # Scrapy-Redis相關配置 # 確保request存儲到redis中 SCHEDULER = "scrapy_redis.scheduler.Scheduler" # 確保全部爬蟲共享相同的去重指紋 DUPEFILTER_CLASS = "scrapy_redis.dupefilter.RFPDupeFilter" # 設置redis爲item pipeline ITEM_PIPELINES = { 'scrapy_redis.pipelines.RedisPipeline': 300 } # 在redis中保持scrapy-redis用到的隊列,不會清理redis中的隊列,從而能夠實現暫停和恢復的功能。 SCHEDULER_PERSIST = True # 設置鏈接redis信息 REDIS_HOST = '127.0.0.1' REDIS_PORT = 6379
scrapy runspider [爬蟲名字]
。Redis
服務器上,推入一個開始的url連接:redis-cli> lpush [redis_key] start_url
開始爬取。