reference: https://www.tutorialspoint.com/redis/redis_quick_guide.htmnode
scrapy過濾重複連接要使用到redis,因此就先熟悉了下redis的基礎。這篇筆記記錄了redis的安裝、配置、操做數據類型等redis
10萬次讀寫
操做root@78a543194a68:/# apt-get update root@78a543194a68:/# apt install redis-server # 安裝redis root@78a543194a68:/# redis-server & # 後臺啓動 [1] 355 ...... 355:M 19 Jun 09:12:47.653 * Ready to accept connections root@78a543194a68:/# redis-cli # redis默認未設置密碼 127.0.0.1:6379> PING # 可用tab補全 PONG root@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命令更新配置。docker
redis.conf
修改配置(不一樣安裝方式可能存放目錄不一樣)root@78a543194a68:/# cd /etc/redis/ root@78a543194a68:/etc/redis# ls redis.conf root@78a543194a68:/etc/redis# vim redis.conf # 修改配置
考慮更改或啓用這幾項,其餘配置項保持默認基本知足需求。數據庫
bind 0.0.0.0 # 爲了可以遠程鏈接redis,能夠這樣設置,最好設置成容許特定地址段 dbfilename dump-vickey.rdb # 數據庫文件名稱,默認dump.rdb dir /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是最安全的選擇。
root@78a543194a68:/etc/redis# grep -v "^$" redis.conf |grep -v "^#" daemonize no pidfile /var/run/redis.pid port 6379 tcp-backlog 511 bind 0.0.0.0 timeout 0 tcp-keepalive 0 loglevel notice databases 16 save 900 1 save 300 10 save 60 10000 stop-writes-on-bgsave-error yes rdbcompression yes rdbchecksum yes dbfilename dump-vickey.rdb dir /data slave-serve-stale-data yes slave-read-only yes repl-diskless-sync no repl-diskless-sync-delay 5 repl-disable-tcp-nodelay no slave-priority 100 requirepass self_defined_passwd appendonly no appendfilename "appendonly.aof" appendfsync everysec no-appendfsync-on-rewrite yes auto-aof-rewrite-percentage 100 auto-aof-rewrite-min-size 64mb aof-load-truncated yes lua-time-limit 5000 slowlog-log-slower-than 10000 slowlog-max-len 128 latency-monitor-threshold 0 notify-keyspace-events "" hash-max-ziplist-entries 512 hash-max-ziplist-value 64 list-max-ziplist-entries 512 list-max-ziplist-value 64 set-max-intset-entries 512 zset-max-ziplist-entries 128 zset-max-ziplist-value 64 hll-sparse-max-bytes 3000 activerehashing yes client-output-buffer-limit normal 0 0 0 client-output-buffer-limit slave 256mb 64mb 60 client-output-buffer-limit pubsub 32mb 8mb 60 hz 10 aof-rewrite-incremental-fsync yes
127.0.0.1:6379> CONFIG SET
,這種配置方式redis重啓後會失效
!127.0.0.1:6379> CONFIG GET loglevel 1) "loglevel" 2) "notice" 127.0.0.1:6379> CONFIG SET loglevel "debug" OK 127.0.0.1:6379> CONFIG GET loglevel 1) "loglevel" 2) "debug"
直接用redis的docker鏡像的話,它沒有留有配置文件在裏面,要修改的話只能本身掛載一個配置文件進去。ubuntu
reference: https://hub.docker.com/_/redisvim
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.conf fa2b076097e99deee696d6451e32a9457be86578a9eaea1558a8bf8ca6b5ed1f root@ubuntu:/home/vickey/scrapy_project/db# docker ps CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES fa2b076097e9 redis "docker-entrypoint.s…" About a minute ago Up About a minute 0.0.0.0:8889->6379/tcp scrapy_redis root@ubuntu:/home/vickey/scrapy_project/db# docker exec -it scrapy_redis /bin/bash root@fa2b076097e9:/data# ls dump-vickey.rdb root@fa2b076097e9:/data# redis-cli 127.0.0.1:6379> KEYS * (error) NOAUTH Authentication required. 127.0.0.1:6379> AUTH 123123 OK 127.0.0.1:6379> KEYS * (empty list or set)
如需查看全部命令請查看:https://www.tutorialspoint.com/redis/redis_quick_guide.htm緩存
Redis支持5種類型的數據。安全
127.0.0.1:6379> COMMAND KEY_NAME
redis字符串命令用於管理redis中的字符串類型鍵的值。bash
127.0.0.1:6379> SET name vickey # 設置一個名爲name,值爲vickey的鍵 OK 127.0.0.1:6379> GET name # 獲取名爲name的鍵的值,存在返回它的值vickey, 不存在則返回nil "vickey" 127.0.0.1:6379> SET name wu # 再次設置則至關於修改鍵name的值 OK 127.0.0.1:6379> GET name # 鍵name的值vickey已被更改成wu "wu" 127.0.0.1:6379> STRLEN name # 獲取鍵name的值wu的長度爲2 (integer) 2 127.0.0.1:6379> SET name vickey OK 127.0.0.1:6379> STRLEN name (integer) 6 127.0.0.1:6379> APPEND name wu # 向鍵name拼接一個值wu,返回值的長度8 (integer) 8 127.0.0.1:6379> GET name # 新值爲vickeywu "vickeywu" 127.0.0.1:6379> STRLEN name (integer) 8 127.0.0.1:6379> DEL name # 刪除鍵name,成功返回1 (integer) 1 127.0.0.1:6379> GET name # 不存在鍵name, 則返回nil (nil) 127.0.0.1:6379> EXISTS name # 判斷是否存在一個名爲name的鍵,不存在返回0 (integer) 0
redis哈希類型是字符串鍵和字符串值之間的映射app
127.0.0.1:6379> HMSET hash_test name vickey age 18 # 設置一個名爲hash_test表,值是包括名爲name值爲vickey的鍵,和名爲age值爲18的鍵,能夠同時設置多個鍵 OK 127.0.0.1:6379> HGETALL hash_test # 獲取哈希表全部鍵和值 1) "name" 2) "vickey" 3) "age" 4) "18" 127.0.0.1:6379> HLEN hash_test # 獲取哈希表的長度 (integer) 2 127.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) 1 127.0.0.1:6379> HDEL hash_test age # 刪除表hash_test中的鍵name,刪除成功返回1 (integer) 1 127.0.0.1:6379> HGETALL hash_test # 的確已經刪除鍵name 1) "name" 2) "vickey"
redis列表只是按插入順序排序(後插入的排前面)的字符串列表。
127.0.0.1:6379> LPUSH list_test vickey # 向列表list_test插入一個值爲vickey的字符串,成功返回列表長度 (integer) 1 127.0.0.1:6379> LRANGE list_test 0 # lrange須要指定列表名list_test和列表下限和上限,缺失則報錯。 (error) ERR wrong number of arguments for 'lrange' command 127.0.0.1:6379> LRANGE list_test 0 9 # 獲取列表list_test第1到第10個值,但只有一個值,因此只返回一個值 1) "vickey" 127.0.0.1:6379> LPUSH list_test wu (integer) 2 127.0.0.1:6379> LLEN list_test # 查詢列表list_test長度 (integer) 2 127.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) 4 127.0.0.1:6379> LPUSH list_test lastone # 列表值能夠重複插入 (integer) 5 127.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)
redis集合是惟一字符串(值不能重複)的無序集合。
127.0.0.1:6379> SADD set_test vickey # 向集合set_test插入值vickey,插入成功返回插入的值數量 (integer) 1 127.0.0.1:6379> SADD set_test wu (integer) 1 127.0.0.1:6379> SADD set_test age 18 # 向集合set_test同時插入值age,18,插入成功返回插入的值數量爲2 (integer) 2 127.0.0.1:6379> SMEMBERS set_test # 發現跟列表不一樣,集合是隨機排列的 1) "wu" 2) "age" 3) "18" 4) "vickey" 127.0.0.1:6379> SADD set_test vickey # 插入重複值vickey失敗,返回0 (integer) 0 127.0.0.1:6379> SMEMBERS set_test # 的確沒有重複值vickey,而且執行插入操做後集合的排列順序又變了 1) "age" 2) "18" 3) "vickey" 4) "wu" 127.0.0.1:6379> SCARD set_test # 查詢集合中包含元素總量 (integer) 4 127.0.0.1:6379> SPOP set_test # 刪除操做也是隨機刪除 "vickey"
redis的有序集合
127.0.0.1:6379> ZADD zset_test 0 vickey # 向有序集合zset_test的索引0即第1個位置插入值vickey (integer) 1 127.0.0.1:6379> ZADD zset_test 1 wu (integer) 1 127.0.0.1:6379> ZADD zset_test 0 age 1 18 # 同時在第1和第2個索引位置插入age, 18兩個值 (integer) 1 127.0.0.1:6379> ZRANGE zset_test 0 -1 # 獲取有序集合zset_test的全部值 1) "age" 2) "18" 3) "vickey" 4) "wu" 127.0.0.1:6379> ZCARD zset_test # 獲取有序集合zset_test的值的總數 (integer) 4 127.0.0.1:6379> ZRANK zset_test vickey # 獲取值vickey在有序集合zset_test中的索引,vickey在第3,因此返回索引爲2 (integer) 2 127.0.0.1:6379> ZRANK zset_test wu # 獲取值wu在有序集合zset_test中的索引,wu在第4,因此返回索引爲3 (integer) 3
這篇筆記熟悉了redis的安裝、配置、操做數據類型等,篇幅有限,下一篇開始正題---scrapy過濾重複連接