圖片源於網絡
一日一言
採菊東籬下,悠然見南山。
——陶淵明《飲酒》
前言
reference: https://www.tutorialspoint.com/redis/redis_quick_guide.htmscrapy過濾重複連結使用到了redis,所以就先熟悉了下redis的基礎。這篇筆記記錄了redis的安裝、配置、操作數據類型等
優勢和劣勢
redis優勢 (remote dictionary server)
Redis將其資料庫完全保存在內存中,僅將磁碟用於持久性每秒可以處理超過10萬次讀寫操作Redis具有相對豐富的數據類型集所有Redis操作都是原子操作適用場景如緩存,消息隊列(Redis本身支持發布/訂閱)redis劣勢
也正因純內存操作,受到物理內存限制,不能用作海量數據高性能讀寫,局限適用在較小數據場景安裝與配置
安裝 (ubuntu)
root@78a543194a68:/# apt-get updateroot@78a543194a68:/# apt install redis-server # 安裝redisroot@78a543194a68:/# redis-server & # 後臺啟動[1] 355......355:M19 Jun 09:12:47.653 * Ready to accept connectionsroot@78a543194a68:/# redis-cli # redis默認未設置密碼127.0.0.1:6379> PING # 可用tab補全PONGroot@78a543194a68:/# redis-cli -h host_or_ip -p port -a password # 如有設置密碼則需要提供密碼登錄root@78a543194a68:/# redis-cli # 或進入後用`auth password`驗證用戶127.0.0.1:6379> AUTH password配置
要更新配置,可以直接編輯redis.conf文件(推薦),也可以通過CONFIG SET命令更新配置。
通過redis.conf修改配置(不同安裝方式可能存放目錄不同)root@78a543194a68:/# cd /etc/redis/root@78a543194a68:/etc/redis# lsredis.confroot@78a543194a68:/etc/redis# vim redis.conf # 修改配置考慮更改或啟用這幾項,其他配置項保持默認基本滿足需求。
bind0.0.0.0# 為了能夠遠程連接redis,可以這樣設置,最好設置成允許特定地址段dbfilename dump-vickey.rdb # 資料庫文件名稱,默認dump.rdbdir /data # 資料庫數據存放路徑,可指定其他路徑requirepass self_defined_passwd # 此redis的密碼,默認未啟用# slaveof <masterip> <masterport> # redis默認沒有打開,當此redis作為其他redis的slave節點時,填上master redis的ip和port# masterauth <master-password> # 當slaveof打開且master redis設置了密碼時需要填上no-appendfsync-on-rewrite yes# 如果您有延遲問題設為yes。否則no是最安全的選擇。redis.conf已啟用的配置項root@78a543194a68:/etc/redis# grep -v "^$" redis.conf |grep -v "^#"daemonize nopidfile /var/run/redis.pidport 6379tcp-backlog 511bind 0.0.0.0timeout 0tcp-keepalive 0loglevel noticedatabases 16save 900 1save 300 10save 60 10000stop-writes-on-bgsave-error yesrdbcompression yesrdbchecksum yesdbfilename dump-vickey.rdbdir /dataslave-serve-stale-data yesslave-read-only yesrepl-diskless-syncnorepl-diskless-sync-delay 5repl-disable-tcp-nodelaynoslave-priority100requirepass self_defined_passwdappendonly noappendfilename "appendonly.aof"appendfsync everysecno-appendfsync-on-rewrite yesauto-aof-rewrite-percentage 100auto-aof-rewrite-min-size64mbaof-load-truncated yeslua-time-limit5000slowlog-log-slower-than10000slowlog-max-len128latency-monitor-threshold 0notify-keyspace-events""hash-max-ziplist-entries 512hash-max-ziplist-value64list-max-ziplist-entries 512list-max-ziplist-value64set-max-intset-entries 512zset-max-ziplist-entries 128zset-max-ziplist-value64hll-sparse-max-bytes3000activerehashing yesclient-output-buffer-limitnormal000client-output-buffer-limitslave256mb 64mb 60client-output-buffer-limit pubsub 32mb 8mb 60hz 10aof-rewrite-incremental-fsync yes通過127.0.0.1:6379> CONFIG SET,這種配置方式redis重啟後會失效!127.0.0.1:6379> CONFIGGETloglevel1) "loglevel"2) "notice"127.0.0.1:6379> CONFIGSETloglevel "debug"OK127.0.0.1:6379> CONFIGGETloglevel1) "loglevel"2) "debug"使用redis鏡像直接用redis的docker鏡像的話,它沒有留有配置文件在裡面,要修改的話只能自己掛載一個配置文件進去。reference: https://hub.docker.com/_/redis
root@ubuntu:/home/vickey/scrapy_project/db# docker run -itd --name scrapy_redis -v /home/vickey/scrapy_project/db/redis.conf:/usr/local/etc/redis/redis.conf -p 8889:6379 redis redis-server /usr/local/etc/redis/redis.conffa2b076097e99deee696d6451e32a9457be86578a9eaea1558a8bf8ca6b5ed1froot@ubuntu:/home/vickey/scrapy_project/db# docker psCONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMESfa2b076097e9 redis "docker-entrypoint.s…" About a minute ago Up About a minute 0.0.0.0:8889->6379/tcp scrapy_redisroot@ubuntu:/home/vickey/scrapy_project/db# docker exec -it scrapy_redis /bin/bashroot@fa2b076097e9:/data# lsdump-vickey.rdbroot@fa2b076097e9:/data# redis-cli 127.0.0.1:6379> KEYS *(error) NOAUTH Authentication required.127.0.0.1:6379> AUTH 123123OK127.0.0.1:6379> KEYS *(empty list or set)操作redis數據類型
如需查看所有命令請查看:https://www.tutorialspoint.com/redis/redis_quick_guide.htm
概覽
Redis支持5種類型的數據。
strings:redis字符串命令用於管理redis中的字符串類型鍵的值hashes:redis哈希類型是字符串鍵和字符串值之間的映射lists:redis列表只是按插入順序排序(後插入的排前面)的字符串列表。sets:redis具有唯一字符串(值不能重複)的無序集合。sorted sets:redis的有序集合語法
127.0.0.1:6379> COMMANDKEY_NAMEstrings例子
redis字符串命令用於管理redis中的字符串類型鍵的值。
使用場景增刪改查一個獨立的屬性,屬性經常變動的場景,如點讚數,關注數127.0.0.1:6379> SETnamevickey # 設置一個名為name,值為vickey的鍵OK127.0.0.1:6379> GETname # 獲取名為name的鍵的值,存在返回它的值vickey, 不存在則返回nil"vickey"127.0.0.1:6379> SETnamewu # 再次設置則相當於修改鍵name的值OK127.0.0.1:6379> GETname # 鍵name的值vickey已被更改為wu"wu"127.0.0.1:6379> STRLENname # 獲取鍵name的值wu的長度為2(integer) 2127.0.0.1:6379> SETnamevickeyOK127.0.0.1:6379> STRLENname(integer) 6127.0.0.1:6379> APPENDnamewu # 向鍵name拼接一個值wu,返回值的長度8(integer) 8127.0.0.1:6379> GETname # 新值為vickeywu"vickeywu"127.0.0.1:6379> STRLENname(integer) 8127.0.0.1:6379> DELname # 刪除鍵name,成功返回1(integer) 1127.0.0.1:6379> GETname # 不存在鍵name, 則返回nil(nil)127.0.0.1:6379> EXISTSname # 判斷是否存在一個名為name的鍵,不存在返回0(integer) 0hashes例子
redis哈希類型是字符串鍵和字符串值之間的映射
使用場景由多個屬性構成一個屬性的場景,如用戶信息等127.0.0.1:6379> HMSET hash_test name vickey age 18# 設置一個名為hash_test表,值是包括名為name值為vickey的鍵,和名為age值為18的鍵,可以同時設置多個鍵OK127.0.0.1:6379> HGETALL hash_test # 獲取哈希表所有鍵和值1) "name"2) "vickey"3) "age"4) "18"127.0.0.1:6379> HLEN hash_test # 獲取哈希表的長度(integer) 2127.0.0.1:6379> HKEYS hash_test # 哈希表包含的鍵1) "name"2) "age"127.0.0.1:6379> HVALS hash_test # 哈希表包含的值1) "vickey"2) "18"127.0.0.1:6379> HGET hash_test name # 獲取哈希表hash_test的鍵name的值"vickey"127.0.0.1:6379> HGET hast_test vickey # vickey是鍵name的值,不是hash_test的鍵,所以返回nil(nil)127.0.0.1:6379> HEXISTS hash_test name # 判斷哈希表hash_test是否存在鍵name(integer) 1127.0.0.1:6379> HDEL hash_test age # 刪除表hash_test中的鍵name,刪除成功返回1(integer) 1127.0.0.1:6379> HGETALL hash_test # 的確已經刪除鍵name1) "name"2) "vickey"lists例子
redis列表只是按插入順序排序(後插入的排前面)的字符串列表。
使用場景作為消息隊列127.0.0.1:6379> LPUSH list_test vickey # 向列表list_test插入一個值為vickey的字符串,成功返回列表長度(integer) 1127.0.0.1:6379> LRANGE list_test 0# lrange需要指定列表名list_test和列表下限和上限,缺失則報錯。(error) ERR wrong number of arguments for'lrange' command127.0.0.1:6379> LRANGE list_test 09# 獲取列表list_test第1到第10個值,但只有一個值,所以只返回一個值1) "vickey"127.0.0.1:6379> LPUSH list_test wu(integer) 2127.0.0.1:6379> LLEN list_test # 查詢列表list_test長度(integer) 2127.0.0.1:6379> LRANGE list_test 0 -1# 獲取列表list_test所有值,可以看到後插入的wu排在了先插入的vickey之前1) "wu"2) "vickey"127.0.0.1:6379> LINDEX list_test 0# 從索引也可以看到後插入的wu排在了第一位,使用了索引0"wu"127.0.0.1:6379> LINDEX list_test 1"vickey"127.0.0.1:6379> LPUSH list_test lastsecond lastone # 同時向列表list_test插入lastsecond和lastone兩個值,返回列表總長度4(integer) 4127.0.0.1:6379> LPUSH list_test lastone # 列表值可以重複插入(integer) 5127.0.0.1:6379> LPOP list_test # 刪除並返回列表第一個值,也就是後插入的值先被刪除"lastone"127.0.0.1:6379> LPOP list_test"lastsecond"127.0.0.1:6379> LPOP list_test"wu"127.0.0.1:6379> LPOP list_test"vickey"127.0.0.1:6379> LPOP list_test # 繼續執行將繼續刪除倒數第二個值,直到全部刪完返回nil(nil)sets例子
redis集合是唯一字符串(值不能重複)的無序集合。
使用場景發現用戶之間的交集屬性,進行相關好友、話題推薦統計訪問網站ip127.0.0.1:6379> SADDset_testvickey # 向集合set_test插入值vickey,插入成功返回插入的值數量(integer) 1127.0.0.1:6379> SADDset_testwu(integer) 1127.0.0.1:6379> SADDset_testage 18 # 向集合set_test同時插入值age,18,插入成功返回插入的值數量為2(integer) 2127.0.0.1:6379> SMEMBERSset_test # 發現跟列表不同,集合是隨機排列的1) "wu"2) "age"3) "18"4) "vickey"127.0.0.1:6379> SADDset_testvickey # 插入重複值vickey失敗,返回0(integer) 0127.0.0.1:6379> SMEMBERSset_test # 的確沒有重複值vickey,並且執行插入操作後集合的排列順序又變了1) "age"2) "18"3) "vickey"4) "wu"127.0.0.1:6379> SCARDset_test # 查詢集合中包含元素總量(integer) 4127.0.0.1:6379> SPOPset_test # 刪除操作也是隨機刪除"vickey"sorted sets
redis的有序集合
使用場景如計算用戶得分等有權重區分的場景127.0.0.1:6379> ZADDzset_test 0 vickey # 向有序集合zset_test的索引0即第1個位置插入值vickey(integer) 1127.0.0.1:6379> ZADDzset_test 1 wu(integer) 1127.0.0.1:6379> ZADDzset_test 0 age 1 18 # 同時在第1和第2個索引位置插入age, 18兩個值(integer) 1127.0.0.1:6379> ZRANGEzset_test 0 -1 # 獲取有序集合zset_test的所有值1) "age"2) "18"3) "vickey"4) "wu"127.0.0.1:6379> ZCARDzset_test # 獲取有序集合zset_test的值的總數(integer) 4127.0.0.1:6379> ZRANKzset_testvickey # 獲取值vickey在有序集合zset_test中的索引,vickey在第3,所以返回索引為2(integer) 2127.0.0.1:6379> ZRANKzset_testwu # 獲取值wu在有序集合zset_test中的索引,wu在第4,所以返回索引為3(integer) 3結語
這篇筆記熟悉了redis的安裝、配置、操作數據類型等,篇幅有限,下一篇開始正題---scrapy過濾重複連結