redis基礎筆記

2020-12-11 體娛放映室

圖片源於網絡

一日一

採菊東籬下,悠然見南山。

——陶淵明《飲酒》

前言

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過濾重複連結

相關焦點

  • Redis安裝筆記
    安裝Redis 44.1 準備redis-4.0.10.tar.gz4.2 下載安裝包4.3 安裝redistar -xzvf redis-4.0.10.tar.gzcd redis-4.0.10makecd srcmake installmkdir -p /tongfu.net/env/redis-4.0.10/mkdir
  • redis學習筆記(四)主從數據同步
    在redis恢復數據時我們可以依賴於aof日誌或rdb日誌,但是redis在運行中該如何保證服務的可靠性,就需要依賴redis主從和哨兵集群
  • acl redis C++ 庫被 redis 官方收錄 - OSCHINA - 中文開源技術...
    acl 庫中的新增模塊 redis C++ 客戶端庫被 redis 官方正式收錄,參見 http://redis.io/clients 中的 C++ 部分,其中 「redis-client
  • Hunt Redis 1.0.0 發布,D 語言 Redis 客戶端
    基礎特性: 排序 連結管理 不同類型的value的命令處理 String類型的命令處理 Hashes類型的命令處理 Lists類型的命令處理 Sets類型的命令處理 Sorted Sets類型的命令處理 事務
  • Redis服務​之Redis Cluster
    redis cluster 機制。redis,應用程式需要寫全部的 redis 伺服器 IP。redis cluster 把所有的 redis node 映射到0-16383 個槽位(slot)上,讀寫需要到指定的 redis node 上進行操作,因此有多少個 reids node 相當於 redis 並發擴展了多少倍。
  • 從零開始學習大數據系列(六十五) Redis入門及基礎實踐
    linux系統l 解壓redis壓縮包# tar -zxvf redis-3.2.8.tar.gz -C apps/l 編譯解壓縮之後的redis文件# cd apps/redis-3.2.8# make
  • Redis Sentinel-深入淺出原理和實戰
    container_name: redis-slave-1    ports:      - 6381:6379    command:  redis-server --slaveof redis-master 6379  slave2:    image: redis    container_name: redis-slave-2    ports
  • RedisShake
    環境: OS:Centos 7 1.下載安裝介質 redis-shake-1.6.19.tar.gz 2.解壓安裝 tar -xvf redis-shake-1.6.19.tar.gz 3.修改配置文件 [root@localhost redis-shake]# more redis-shake.conf
  • 【深入學習Redis】Redis內存模型
    在了解Redis的5種對象類型的用法和特點的基礎上,進一步了解Redis的內存模型,對Redis的使用有很大幫助,例如:估算Redis內存使用量。目前為止,內存的使用成本仍然相對較高,使用內存不能無所顧忌;根據需求合理的評估Redis的內存使用量,選擇合適的機器配置,可以在滿足需求的情況下節約成本。優化內存佔用。
  • redis——內存滿了應該怎麼辦?
    我們的redis使用的是內存空間來存儲數據的,但是內存空間畢竟有限,隨著我們存儲數據的不斷增長,當超過了我們的內存大小時,即在redis中設置的緩存大小(maxmeory 4GB),redis會怎麼處理呢?今天就來聊聊redis的緩存淘汰策略。
  • 還不懂Redis是什麼?一文帶你深入Redis基本結構,準備向開發進軍
    #運行redis容器〉docker run - name myredis -d -p6379:6379 redis .#執行容器中的redis-cli, 可以直接使用命令行操作redis> docker exec -it myredis redis-cliGithub源碼編譯方式#下載源碼> git
  • acl 框架中的 Redis 庫已經支持集群版 Redis 3.0
    redis 進行分庫了,之前人們為了使單機版的 redis 能支持集群方式,往往是在客戶端或通過加一個中間的代理層(比如使用 tweaproxy)做很多工作,現在有了集群版的 redis3.0 ,這些額外的操作都不再需要。
  • window中安裝redis
    redis.windows.conf,或者運行redis-server.exe,下圖 啟動redis3.再次打開一個cmd窗口,這個cmd窗口不可關閉,不然Redis服務端就關閉了還是進入redis目錄,運行redis-cli.exe -h 127.0.0.1 -p 6379設置鍵值對 set key 123取出鍵值對 get key 存儲數據
  • Redis的各項功能解決了哪些問題
    然後我們就盯上了redis。。。至於如何配置部署redis這裡不解釋了,redis官方有詳細的介紹。隨後我們就用上了一臺單獨的伺服器作為Redis的伺服器,API伺服器的內存壓力得以解決。 3.1 持久化(Persistence) 單臺的Redis伺服器一個月總有那麼幾天心情不好,心情不好就罷工了,導致所有的緩存都丟失了(redis的數據是存儲在內存的嘛)。
  • 三歪推薦:Redis常見的面試題
    基於這些基礎的數據結構,redis封裝了自己的對象系統,包含字符串對象string、列表對象list、哈希對象hash、集合對象set、有序集合對象zset,每種對象都用到了至少一種基礎的數據結構。redis的速度非常的快,單機的redis就可以支撐每秒10幾萬的並發,相對於mysql來說,性能是mysql的幾十倍。速度快的原因主要有幾點:C語言實現,優化過的數據結構,基於幾種基礎的數據結構,redis做了大量的優化,性能極高那為什麼Redis6.0之後又改用多線程呢?
  • Python | Python學習之Redis交互詳解
    前言最近在學習scrapy redis,順便複習了redis。本篇為redis篇,包含實例演示,主從服務配置,python交互等內容。log file /xx/xx/xx/redis-server.log 日誌文件位置slaveof ip port 主從複製的ip埠啟動redis:sudo server redis start停止redis:sudo server redis stop重啟redis:sudo server redis restart加載指定的redis
  • Spring Data Redis使用
    文件作為redis的配置文件,如下:redis.host=192.168.248.128redis.port=6379redis.maxIdle=300redis.maxTotal=600redis.maxWait=1000redis.testOnBorrow=true在spring的配置文件中,添加如下bean:<!
  • 《Redis入門指南》第1集:Redis的5種數據類型
    作為PHP開發來說,關係資料庫最長用到的是mysql,非關係資料庫經常打交道的是redis。想起最近學習了redis資料庫,所以嘗試用redis來搭建這個博客。首先第一個功能,發布文章,文章的發布有兩部分內容,一個是標題,一個是內容。
  • 5分鐘完全掌握 Redis
    基於這些基礎的數據結構,redis封裝了自己的對象系統,包含字符串對象string、列表對象list、哈希對象hash、集合對象set、有序集合對象zset,每種對象都用到了至少一種基礎的數據結構。redis的速度非常的快,單機的redis就可以支撐每秒10幾萬的並發,相對於mysql來說,性能是mysql的幾十倍。速度快的原因主要有幾點:C語言實現,優化過的數據結構,基於幾種基礎的數據結構,redis做了大量的優化,性能極高那為什麼Redis6.0之後又改用多線程呢?
  • 如何實現redis主從複製?
    一、多臺伺服器上配置主從複製Redis從5.0以後主從配置屬性發生了變化,在5.0之前配置的是slaveof,5.0以後變成了replicaof伺服器用途redis埠號備註centos7 192.168.1.6主機Master(寫)6379redis5.0centos7 192.168.1.4從機Slave(讀)6379redis5.0centos7 192.168.1.5