redis基礎筆記

公衆號原文

前言

reference: https://www.tutorialspoint.com/redis/redis_quick_guide.htmnode

scrapy過濾重複連接要使用到redis,因此就先熟悉了下redis的基礎。這篇筆記記錄了redis的安裝、配置、操做數據類型等redis

優點和劣勢

redis優點 (remote dictionary server)

  • Redis將其數據庫徹底保存在內存中,僅將磁盤用於持久性
  • 每秒能夠處理超過10萬次讀寫操做
  • Redis具備相對豐富的數據類型集
  • 全部Redis操做都是原子操做
  • 適用場景如緩存,消息隊列(Redis自己支持發佈/訂閱)

redis劣勢

  • 也正因純內存操做,受到物理內存限制,不能用做海量數據高性能讀寫,侷限適用在較小數據場景

安裝與配置

安裝 (ubuntu)

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是最安全的選擇。
  • redis.conf已啓用的配置項
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鏡像

直接用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)

操做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> COMMAND KEY_NAME

strings例子

redis字符串命令用於管理redis中的字符串類型鍵的值bash

  • 使用場景
  1. 增刪改查一個獨立的屬性,屬性常常變更的場景,如點贊數,關注數
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

hashes例子

redis哈希類型是字符串鍵字符串值之間的映射app

  • 使用場景
  1. 由多個屬性構成一個屬性的場景,如用戶信息等
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"

lists例子

redis列表只是按插入順序排序(後插入的排前面)的字符串列表

  • 使用場景
  1. 做爲消息隊列
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)

sets例子

redis集合是惟一字符串(值不能重複)的無序集合

  • 使用場景
  1. 發現用戶之間的交集屬性,進行相關好友、話題推薦
  2. 統計訪問網站ip
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"

sorted sets

redis的有序集合

  • 使用場景
  1. 如計算用戶得分等有權重區分的場景
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過濾重複連接

相關文章
相關標籤/搜索