- Redis 基礎

~ mac os 安裝 redis

1、官網下載redis:https://redis.io/download

2、將下載的文件解壓縮,複製到/usr/local/目錄下;

3、終端cd到/usr/local/redis-5.0.4目錄下,執行命令進行安裝:
$ cd redis-3.2.8
$ make
$ sudo make install

4、修改配置文件:/usr/local/redis-5.0.4/redis.conf,然後將配置文件複製到/usr/local/etc目錄下;

  • daemonize no改爲daemonize yes:以守護進程的方式啓動;
  • requirepass foobared改爲requirepass 123456:修改密碼;
  • bind 192.168.xx.xxx:設置可連接Redis的IP地址;127.0.0.1:6379> auth 123456
  • protected-mode no:設置成no,表示當沒有使用bind指令配置地址(不配置表示監聽任何地址)或沒有配置密碼時,Redis會啓動保護模式,攔截客戶的請求(可以建立連接,但是不能操作);如果沒有bind,且註釋了這個屬性,那麼protected-mode是開啓的;
  • logfile /usr/local/redis-5.0.4/redis_log/redis_log.log:設置日誌文件;
    $ sudo chmod 777 redis_log.log:修改文件權限;
  • dir ./改爲dir /usr/local/redis-5.0.4/redis_dbfiles/:修改rdb文件默認路徑;
    $ sudo mkdir /usr/local/redis-5.0.4/redis_dbfiles
    $ sudo chmod 777 /usr/local/redis-5.0.4/redis_dbfiles/
    pidfile /var/run/redis_6379.pid:當Redis在後臺運行時,Redis默認會把pid文件放在該目錄下,可以配置到其他地址;當運行多個Redis服務時,需要指定不同的pid文件和端口;
    loglevel notice:指定日誌級別;
    debug:調試記錄信息最多,用於開發和測試;
    verbose:默認,表示記錄有用的信息;
    notice:表示普通的verbose,常用於生產環境;
    warning:表示只有非常重要或嚴重的信息會記錄到日誌;
    rename-command CONFIG "":命令重命名;在一個共享環境下,可以重命名相對危險的命令;

5、開啓Redis服務:(T1)
$ cd /usr/local/bin
$ redis-server(交互式方式開啓,Ctrl+C停止服務)
$ redis-server ../etc/redis.conf(使用redis.conf以守護進程方式啓動Redis服務)
ps -ef|grep redis 確認服務是否已經啓動;

6、開啓Redis客戶端:(交互式開啓服務需要重新打開一個終端窗口T2,守護進程方式在當前窗口即可)
$ cd /usr/local/bin
$ redis-cliredis-cli -h 192.168.xx.xxx -p 6379 -a 123456

:啓動redis服務器後終端所在的窗口就不能輸入別的命令了,需要在終端打開新的窗口才能使用客戶端功能;

7、測試服務端和客戶端:(T2中)
127.0.0.1:6379> ping
PONG
127.0.0.1:6379> exit:退出客戶端;

8、關閉Redis服務:
(1)配置好config文件之後,直接shutdown客戶端:redis-cli shutdownredis-cli -h 192.168.xx.xxx -p 6379 -a 123456 shutdown
127.0.0.1:6379> shutdown,Ctrl+C
(2)暴力關閉服務:kill -9 pid號
ps -u zxj -o pid,rss,command | grep redis-server:查看
(3)oh my zsh下直接kill redis按tab,會自動替換成對應的pid;


~ Redis

Redis是一個開源的key-value存儲系統,將大部分數據存儲在內存中;支持的數據類型包括:字符串、哈希表、鏈表、集合、有序集合以及基於這些數據類型的相關操作;

Redis基於內存操作,讀寫速度快,100000讀寫/秒,可作爲內存型緩存服務器,提供持久化存儲方案,可作爲結構不復雜的數據庫使用;

1、Redis客戶端與服務器的關係: 客戶端請求連接服務器,將請求的命令交給服務器,服務器再去操作內存;

2、Redis與關係型數據庫區別: Redis裏面都是使用指令進行操作的,關係型數據庫使用SQL語言來操作數據;指令對於Redis的作用相當於SQL語句對於關係型數據庫的作用;

3、應用場景:

  • 緩存
    (1) 對於一些要返回給前端數據的緩存,當有大量數據庫sql操作時候,爲了避免每次接口請求都要去查詢數據庫,可以把一些數據緩存到redis中,這樣是直接從內存中獲取數據,速度回增快很多;
    (2) web端用戶,用於登陸緩存session數據,登陸的一些信息存到session中,緩存到redis中 ;
  • 隊列
    redis中提供了list接口,這個list提供了lpush和rpop,這兩個方法具有原子性,可以插入隊列元素和彈出隊列元素;
  • 數據存儲
    redis是非關係型數據庫,可以把redis直接用於數據存儲,提供了增刪改查等操作,因爲redis有良好的硬盤持久化機制,redis數據就可以定期持久化到硬盤中,保證了redis數據的完整性和安全性
  • redis鎖實現防刷機制
    redis鎖可以處理併發問題,redis數據類型中有一個set類型,set類型在存儲數據的時候是無序的,而且每個值是不一樣的,不能重複,這樣就可以快速的查找元素中某個值是否存在,精確的進行增加刪除操作;

~ 在bin下可執行的程序

redis-server: Redis服務器;
redis-cli: 命令行客戶端;
redis-benchmark: Redis的性能測試工具;
redis-check-aof: AOF文件修復工具;
redis-check-dump: RDB文件檢測工具;
redis.conf: Redis的配置文件;


~ Redis數據結構及常用命令

命令參考:http://doc.redisfans.com

  • 卸載服務:redis-server –service-uninstall
  • 開啓服務:redis-server –service-start
  • 停止服務:redis-server –service-stop

Redis中用於操作鍵的命令可以分爲兩種:可以對任何類型的鍵進行操作的命令、只能對特定類型的鍵執行的命令;

指定類型的鍵只能執行某些特定的命令,否則會發生類型錯誤的提示;在執行一個類型特定的命令之前,Redis會先檢查輸入鍵的類型是否正確,然後再決定是否執行給定的命令;
類型特定命令所進行的類型檢查是通過redisObject對象的type屬性來實現的;
在這裏插入圖片描述

(0)操作任何類型的key:

基本操作:

  • 127.0.0.1:6379> keys *:查看所有key;
  • 127.0.0.1:6379> del k1 k2 k3:刪除key及對應的value;
  • 127.0.0.1:6379> exists k:查看指定key是否存在;
  • 127.0.0.1:6379> rename kOld kNew:給key重命名;
  • 127.0.0.1:6379> expire key second:設置過期時間,單位秒;
  • 127.0.0.1:6379> ttl key:查看key還剩多長時間就過期;若該key沒設置過超時時間,返回-1;
  • 127.0.0.1:6379> type key:獲取指定key的數據類型;
  • 127.0.0.1:6379> object encoding key:查看指定key使用的編碼和數據結構;
  • 127.0.0.1:6379> object refcount key:查看指定key的值對象redisObject的引用計數的值;
  • 127.0.0.1:6379> object idletime key:查看指定key的空轉時長;空轉時長=當前時間-lru屬性的時間,lru屬性記錄了對象最後一次被命令程序訪問的時間;

操作數據庫:

  • 127.0.0.1:6379> select 1:選擇index=1的數據庫;
  • 127.0.0.1:6379> move key 0:從當前數據庫移動key到db0,當前選擇的數據庫是db1;

操作事務:

  • 127.0.0.1:6379> multi:開啓事務;
  • 127.0.0.1:6379> exec:提交事務,執行所有事務塊內的所有命令;
  • 127.0.0.1:6379> discard:取消事務(回滾),放棄執行事務塊內的所有命令;

設置生存時間:
Redis有四個不同的命令用於設置鍵的生存時間(鍵可以生存多久)或過期時間(鍵什麼時候會被刪除),四個命令底層都是使用PEXPIREAT命令實現的,客戶端在執行四個命令時,經過轉換,最終的執行效果都是和執行PEXPIREAT命令一樣;

  • 127.0.0.1:6379> EXPIRE/PEXPIRE a 3600:設置緩存時間(秒);
    客戶端以秒或毫秒精度爲數據庫中的某個鍵設置生存時間(TTL,time to live),在經過指定的秒或毫秒之後,服務器就會自動刪除生存時間爲0的鍵;
  • 127.0.0.1:6379> EXPIREAT/PEXPIREAT a 3600:以秒或毫秒精度給數據庫中的某個鍵設置過期時間;
    過期時間是一個Unix時間戳,當鍵的過期時間來臨時,服務器就會自動從數據庫中刪除這個鍵;通過計算鍵的過期時間和當前時間之間的差來實現;
  • 127.0.0.1:6379> TTL/PTTL a:接收一個帶有緩存時間/過期時間的鍵,返回這個鍵的剩餘生存時間,也就是返回距離這個鍵被服務器自動刪除還有多長時間;
  • 127.0.0.1:6379> TIME:查看時間;
  • 127.0.0.1:6379> PERSIST:移除一個鍵的過期時間;

操作緩存:

  • 127.0.0.1:6379> set a 123;:設置緩存:a=>123;
  • 127.0.0.1:6379> flushall:清空緩存;執行該命令後會清空redis服務器的所有緩存;
  • 127.0.0.1:6379> flushdb:清空數據庫;
  • 127.0.0.1:6379> dbsize:返回數據庫鍵的數量;

數據庫配置:

  • 127.0.0.1:6379> info stats:查看數據庫的配置屬性;

(1)字符串(String)

string存儲的元素類型可以是string/int/float,int類型可以進行增加和減少操作;

127.0.0.1:6379> set key value: 設置鍵key的值爲value;
127.0.0.1:6379> append key value2: 在鍵key的值後面加上value2;
127.0.0.1:6379> get key :查看鍵key的值;
127.0.0.1:6379> getset key value :先獲取key,再賦值;(值覆蓋)
127.0.0.1:6379> incr key/decr key:將指定key對應的value遞增(遞減)1;若value不存在,則初始爲0,再遞增1,結果就是1;若value的值不能轉成整型,報錯;
127.0.0.1:6379> incrby key num/incrby key num:value+=num/value-=1;
127.0.0.1:6379> strlen

(2)哈希(hash)

String Key 和 String Value 的map容器;

127.0.0.1:6379> hset key field value:將鍵值對作爲value存入key
127.0.0.1:6379> hmset key field1 value1 field2 value2
127.0.0.1:6379> hget key field:獲取鍵值對中的值
127.0.0.1:6379> hmget key field1 field2:獲取多個值
127.0.0.1:6379> hgetall key:獲取指定key中的多個鍵值對
127.0.0.1:6379> hdel key field1 field2:刪除key中指定鍵值對;
127.0.0.1:6379> del key:刪除整個集合;包括key
127.0.0.1:6379> hincrby key field num:value+=num;
127.0.0.1:6379> hexists key field:判斷指定key中的某個屬性是否存在;
127.0.0.1:6379> hlen key:查看指定key中存儲的屬性的個數;
127.0.0.1:6379> hkeys key:獲取指定key中存儲的所有屬性的名稱;
127.0.0.1:6379> hvals key:獲取指定key中存儲的所有屬性對應的值;

(4)字符串列表(List)

List:按插入順序排列的字符串列表,數據可重複;
List存儲數據有3種方式:

  • ArrayList使用數組方式存儲數據,根據索引查詢查詢速度快,增刪速度慢;
  • LinkList使用雙向鏈表方式存儲數據,兩端插入刪除,速度快;
  • 雙向鏈表的方式雙向添加刪除;

127.0.0.1:6379> lpush/rpush key v1 v2 v3:左側/右側添加;
127.0.0.1:6379> lrange key startIndex endOIndex:查看數據,endIndex是-1時表示尾部元素,-2表示倒數第二個元素;
127.0.0.1:6379> lpop/rpop key:彈出指定key對應的valueList中左側/右側第一個元素;
127.0.0.1:6379> llen key:獲取指定key對應的valueList列表中元素的個數;
127.0.0.1:6379> lpushx/rpushx key x:僅當指定key存在時,纔在關聯的list頭部/尾部插入值x,若不存在,則不插入;
127.0.0.1:6379> lrem key count value:刪除count個值爲value的元素;count>0:從頭到尾遍歷刪除count個value元素,count<0:從後向前,count=0:刪除list中所有value元素;
127.0.0.1:6379> lrange key index value:在key對應的list中指定index位置插入value;
127.0.0.1:6379> linsert key before/after value x:在keylist的value前/後插入x;
127.0.0.1:6379> rpoplpush key1 key2:將key1List中最右元素彈出,壓入key2List左側; 常用於消息隊列的服務,來完成多個程序之間的消息的交互

(4)字符串集合(set)

Set:沒有排序的字符集合,和list類型一樣,但是set不允許出現重複元素;
使用場景:

  • 1、使用Redis的set數據類型跟蹤具有唯一性的數據:訪問某一博客唯一IP地址信息;在每次訪問該博客時將訪問者的IP存儲到set中,set自動保證IP地址的唯一性;
  • 2、維護數據對象之間的關聯關係:用戶購買商品時將購買商品1的用戶ID存入一個set1,商品2的用戶ID存入set2,若想查詢同時購買兩個商品的用戶,只需獲取兩個set的交集即可;

127.0.0.1:6379> sadd key v1 v2 v3:添加
127.0.0.1:6379> srem key v1 v2:刪除
127.0.0.1:6379> smembers key:查詢元素
127.0.0.1:6379> sismember key value:判斷元素是否在set中;返回1存在,0不存在;
127.0.0.1:6379> sdiff key1 key2:差集,獲取k1中有,k2中沒有的元素;
127.0.0.1:6379> sinter k1 k2:交集
127.0.0.1:6379> sunion k1 k2:並集,去除重複元素;
127.0.0.1:6379> scard key:獲取set中元素數量;
127.0.0.1:6379> srandmember key:隨機返回set中的一個成員;
127.0.0.1:6379> sdiffstore/sinterstore/sunionstore k k1 k2:將k1 k2兩個set的差集/交集/並集存儲到kSet 中;

(5)有序字符串集合(sorted set)

每一個成員都會有一個分數與之關聯,Redis通過這個分數來爲集合中的成員進行從小到大的排序;成員唯一,但是分數可重複;

**應用場景:**遊戲排名:遊戲玩家分數變化的時候使用zadd更新分數,微博熱點話題排名;

127.0.0.1:6379> zadd key score1 v1 score2 v2 s3 v3:添加元素和分數,若元素已存在,則分數覆蓋;
127.0.0.1:6379> zscore key value:獲取指定key中指定元素的分數;
127.0.0.1:6379> zcard key:獲取指定key中元素個數;
127.0.0.1:6379> zrem key v1 v1:刪除元素;
127.0.0.1:6379> zrange key start end [withscore]:範圍查找[按照分數從小到大排序];
127.0.0.1:6379> zrevrange key start end [withscore]:範圍查找[按照分數從大到小排序];
127.0.0.1:6379> zremrangebyrank key start end:按排名範圍刪除;
127.0.0.1:6379> zremrangebyscore key scoreStart scoreEnd:按分數範圍刪除;
127.0.0.1:6379> zrangebyscore key start end [withscores] [limit start end]:按分數範圍查找(顯示分數)(只顯示範圍之間的元素);
127.0.0.1:6379> zincrby key num value:設置指定成員增加的分數;
127.0.0.1:6379> zcount key start end:查看指定範圍之間的元素的個數;


~ redis特性:多數據庫、事務

1、多數據庫:
一個Redis實例可以包含多個數據庫,客戶端可以指定連接某個Redis實例的哪個數據庫;一個Redis實例最多可以提供16個數據庫,下標從0開始,客戶端默認連接第0號數據庫;也可以通過select選擇具體連接哪個數據庫;select 1

2、事務特性:

(1)事務中的命令都是串行執行的;
(2)事務執行期間redis不會再對其它的客戶端提供任何服務,從而保證事務中的命令能夠原子化執行;
(3)單個 Redis 命令的執行是原子性的,但 Redis 沒有在事務上增加任何維持原子性的機制,所以 Redis 事務的執行並不是原子性的;事務可以理解爲一個打包的批量執行腳本,但批量指令並非原子化的操作,中間某條指令的失敗不會導致前面已做指令的回滾,也不會造成後續的指令不做;

~ redis數據持久化 - RDB/AOF

RDB數據持久化方式:

redis默認方式;在指定時間間隔內將內存中的數據集快照寫入到磁盤,比如指定30秒寫入磁盤一次,生成dump.rdb文件;
快照:把內存中存的東西記錄一份,存到文件中去;

RDB方式的持久化是通過快照完成的,當符合一定條件時,Redis會自動將內存中的所有數據進行快照並存儲到硬盤中;進行快照的條件可以在配置文件中自行定義;定義由兩個參數組成:時間和改動的鍵的個數;當在指定的時間內被改動的鍵的個數大於指定的數值時就會進行快照;配置文件中預置了3個條件,可存在多個條件,條件之間是“或”的關係,只要滿足其中一個條件就會進行快照;若想禁用快照,只需將所有save參數刪除即可;

Redis默認會將快快照文件存儲在當前目錄的dump.rdb文件中,可通過配置dir和dbfilename兩個參數分別指定快照的存儲路徑和文件名;

1、優勢:

  • Redis數據庫只包含一個文件存儲在硬盤中,對於文件備份會很簡單;
  • 對於災難恢復,RDB是更好的選擇,因爲一個文件可以直接拷貝走,拷貝回來;
  • 性能最大化,redis開始持久化的時候只分出一些子進程,之後這些子進程會完成持久化工作,避免了服務器進程執行io的操作;數據集很大的時候,啓動效率會更高;

2、缺點:

  • 數據可能丟失:系統一定在定時持久化之前出現一些檔期的情況,還沒有來得及往硬盤上寫,數據已經丟失掉;
  • 因爲RDB是通過開啓子進程的方式來進行持久化操作的,因此當數據集比較大的時候,這個過程可能會導致服務器停止一定時間,幾十毫秒甚至1秒;

3、配置:/usr/local/etc/redis-conf文件中:

save 900 1     // 900秒,也就是15分鐘至少有一個key發生變化就會持久化一次
save 300 10    // 300秒,至少有10個key發生變化就會往硬盤中持久化一次
save 60 10000  // 60秒,至少有10000個key發生變化就會往硬盤中持久化一次

dbfilename dump.rdb  // dump是數據庫的名字
dir ./         // 保存路徑位置,就是當前目錄下的上面的名字,就是持久化的數據庫

AOF數據持久化方式:

(append only file)以日誌的形式記錄服務器所處理的每一個操作,生成歷史記錄文件,Redis服務器啓動的時候,會讀取該文件,然後重新去構建數據庫,這樣來保證服務啓動後數據是完整的;

1、優勢:

  • 可以帶來更高的數據安全性,這種數據持久化方式有三種同步策略,每秒同步,每修改同步(每一次發生數據的變化都會立即被記錄到磁盤中,效率最低但是最安全),不同步;
  • 日誌的寫入操作是採用append追加的模式,在寫入過程中即使出現服務器檔期問題,也不會破壞日誌文件中已經寫入的內容;
  • 如果日誌過大,redis可以自動啓動重寫機制,redis會不斷的將修改的數據寫入到老的磁盤當中,同時redis會創建一個新的文件來記錄此期間產生了哪些修改命令被執行了;
  • AOF包含一個格式非常清晰易於理解的日誌文件,用於記錄所有的修改操作,通過這個文件就可以完成數據的重建;

2、缺點:

  • 對於相同的數據集文件,AOF要比RDB文件大;
  • 根據同步策略的不同,AOF在運行效率上往往低於RDB,AOF每修改就同步到硬盤上效率肯定是沒有RDB高的;

3、配置:

appendonly no   // 如果使用AOF的持久化方式,需要把appendonly 後面的屬性變爲yes
# The name of the append only file(default:"appendonly.aof")
appendfilename "appendonly.aof"  // appendonly.aof是用來記錄所有修改操作的文件,這個文件還可以用來進行數據的恢復等,例如一條刪除操作成功後,我們在appendonly.aof文件中把刪除命令去掉,重新運行redis,之前的數據又都會恢復;

# 設置同步策略
# appendfsync always  // 每次修改就同步 持久化
appendfsync everysec  // 每秒同步持久化一次
# appendfsync no      // 不同步持久化

~ Redis性能測試:

1、測試存取大小爲100字節的數據包的性能:redis-benchmark -h 127.0.0.1 -p 6379 -q -d 100;-d:date

2、100個併發連接(模擬100個用戶連接Redis服務),100000個請求,檢測host爲localhost端口爲6379的Redis服務器的性能:redis-benchmark -h 127.0.0.1 -p 6379 -c 100 -n 100000;-c:client


~ 常見問題

1、Redis: Failed opening .rdb for saving: Permission denied
redis服務器會生成dump.rdb文件存儲緩存,如果文件權限不夠則無法讀寫該文件;
cd /usr/loal/bin
chmod 777 dump.rdb


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章