一、Redis概述
Redis是一個開源(遵循BSD協議)Key-Value數據結構的內存存儲系統,用作數據庫、緩存和消息代理。它支持5種數據結構:字符串string、哈希hash、列表list、集合set和有序的集合sorted-set。Redis支持Lua腳本,哨兵機制和集群實現高可用。適用場景:緩存、投票、抽獎、分布式session、排行榜、計數、隊列、發布訂閱等;具體介紹見Redis官網。
二、Redis安裝
① 下載地址:https://redis.io/download
② 安裝gcc:yum install gcc

③ 把第一步下載好的redis‐5.0.2.tar.gz上傳到服務器的/root/svr/packages目錄或者直接 cd /root/svr/packages然后執行:wget http://download.redis.io/releases/redis-5.0.2.tar.gz

④ 執行 cp redis‐5.0.2.tar.gz ../

⑤ cd /root/svr 然后執行:tar -xvf redis‐5.0.2.tar.gz:

cd redis‐5.0.2:

⑥ 執行:make install PREFIX=/root/svr/redis-5.0.2

⑦ 啟動redis 執行:bin/redis-server ../redis.conf (注意:如果要后台啟動需要把redis.conf配置里面的daemonize改為yes)

⑧ 驗證是否啟動成功 ps -ef|grep redis

⑨ 進去redis客戶端:bin/redis-cli

⑩ 退出客戶端:quit

三、redis.conf主要配置詳解
| 參數 | 解釋 |
| bind | 指定 Redis 只接收來自於該 IP 地址的請求,如果不進行設置,那么將處理所有請求 |
| port | 監聽端口,默認6379 |
| timeout | 設置客戶端連接時的超時時間,單位為秒。當客戶端在這段時間內沒有發出任何指令,那么關閉該連接 |
| daemonize | 默認情況下,redis不是在后台運行的,如果需要在后台運行,把該項的值更改為yes |
| loglevel | log等級分為4級,debug, verbose, notice, 和 warning。生產環境下一般開啟notice |
| logfile | 配置log文件地址,默認使用標准輸出,即打印在命令行終端的窗口上 |
| save | save <seconds> <changes>比如save 60 10000意思60秒(1分鍾)內至少10000個key值改變(則進行數據庫保存--持久化rdb) |
| dbfilename | rdb文件的名稱 |
| dir | 數據目錄,2種持久化rdb、aof文件就在這個目錄 |
| replicaof | replicaof <masterip> <masterport>:該配置是主從的配置表示該redis實例是masterip:masterport的從節點 |
| masterauth | master連接密碼 |
| replica-serve-stale-data | 當slave跟master失去連接或者正在同步數據,slave有兩種運行方式: 1) 如果replica-serve-stale-data設置為yes(默認設置),slave會繼續響應客戶端的請求。 2) 如果replica-serve-stale-data設置為no,除去指定的命令之外的任何請求都會返回一個錯誤”SYNC with master in progress” |
| replica-read-only | 是否設置slave只讀 |
| repl-diskless-sync | 同步策略: 磁盤或socket,默認磁盤方式 |
| repl-diskless-sync-delay | 如果非磁盤同步方式開啟,可以配置同步延遲時間,以等待master產生子進程通過socket傳輸RDB數據給slave。默認值為5秒,設置為0秒則每次傳輸無延遲 |
| repl-ping-replica-period | slave根據指定的時間間隔向master發送ping請求。默認10秒 |
| repl-timeout | 同步的超時時間 |
| repl-disable-tcp-nodelay | 是否在slave套接字發送SYNC之后禁用 TCP_NODELAY |
| repl-backlog-size | 設置數據備份的backlog大小 |
| repl-backlog-ttl | slave斷開開始計時多少秒后,backlog緩沖將會釋放 |
| replica-priority | slave的優先級,當master掛了,優先級數字小的salve會優先考慮提升為master,0作為一個特殊的優先級,標識這個slave不能作為master |
| requirepass | 客戶端在處理任何命令時都要密碼驗證 |
| rename-command | 命令重命名,可以給危險命令改變名字 |
| maxclients | 設置最多同時連接的客戶端數量,默認這個限制是10000個客戶端。 |
| maxmemory | 設置最大內存,一旦內存使用達到最大內存,redis會根據選定的回收策略(maxmemmory-policy)刪除key |
| maxmemory-policy | 最大內存策略:如果達到內存限制了,redis如何選擇刪除key: |
| maxmemory-samples | 設置樣本量的個數 |
| appendonly | 是否開啟AOF,如果開啟那么在啟動時Redis將加載AOF文件,它更能保證數據的可靠性,aof的文件內容就是RESP協議 |
| appendfilename | AOF文件名(默認:"appendonly.aof") |
| appendfsync | 配置 Redis 多久才將數據 fsync 到磁盤一次 |
| auto-aof-rewrite-percentage | 自動重寫AOF文件。如果AOF日志文件增大到指定百分比,默認100。Redis能夠通過 BGREWRITEAOF 自動重寫AOF日志文件 |
| auto-aof-rewrite-min-size | 自動重寫AOF文件。如果AOF日志文件到達最小的指定大小,默認64mb |
| aof-use-rdb-preamble | Redis 4.0之后配置混合持久化,需要配置 aof-use-rdb-preamble yes |
| lua-time-limit | Lua腳本的最大執行時間,單位為毫秒 |
| cluster-enabled | 是否開啟集群 cluster-enabled yes |
| cluster-config-file | redis自動生成集群配置信息的文件名 |
| cluster-node-timeout | 集群節點超時毫秒數。超時的節點將被視為不可用狀態。 |
| aof-rewrite-incremental-fsync | 當一個子進程重寫AOF文件時,如果配置aof-rewrite-incremental-fsync yes,則文件每生成32M,數據會被同步 |
| rdb-save-incremental-fsync | 當redis保存RDB文件時,如果啟用了以下選項,每生成32MB數據,文件將被fsync到磁盤 |
四、Redis五種數據結構

1、String
1.1 字符串操作
SET key value //設置字符串鍵值對 MSET key value [key value ...] //批量設置字符串鍵值對 SETNX key value //設置字符串鍵值對,當key存在就不做處理直接返回0,否則跟set命令一樣 GET key //獲取一個字符串鍵值 MGET key [key ...] //批量獲取字符串鍵值 DEL key [key ...] //刪除一個鍵 EXPIRE key seconds //設置一個鍵的過期時間(秒)
1.2 原子操作
INCR key //將key中儲存的數字值加1 DECR key //將key中儲存的數字值減1 INCRBY key increment //將key所儲存的值加上increment DECRBY key decrement //將key所儲存的值減去decrement
2、Hash
2.1 常用操作
HSET key field value //設置哈希表key中的字段field的值設為value HSETNX key field value //設置哈希表key中的字段field的值設為value,當key存在不做處理,返回0,否則跟hset命令一樣 HMSET key field value [field value ...] //批量設置哈希表key中的字段field的值設為value HGET key field //獲取哈希表key對應的field字段的值 HMGET key field [field ...] //批量獲取哈希表key中多個field字段的值 HDEL key field [field ...] //刪除哈希表key中的field字段 HLEN key //返回哈希表key中field的數量 HGETALL key //返回哈希表key中所有的鍵值 HINCRBY key field increment //為哈希表key中field鍵的值加上增量increment
3、List
3.1 常用操作
LPUSH key value [value ...] //將一個或多個值value插入到key列表的表頭(最左邊) RPUSH key value [value ...] //將一個或多個值value插入到key列表的表尾(最右邊) LPOP key //移除並返回key列表的頭元素 RPOP key //移除並返回key列表的尾元素 LRANGE key start stop //返回列表key中指定區間內的元素,區間以偏移量start和stop指定 BLPOP key [key ...] timeout //從key列表表頭彈出一個元素,若列表中沒有元素,阻塞等待timeout秒,如果timeout=0,一直阻塞等待 BRPOP key [key ...] timeout //從key列表表尾彈出一個元素,若列表中沒有元素,阻塞等待timeout秒,如果timeout=0,一直阻塞等待
4、Set
4.1 常用操作
SADD key member [member ...] //往集合key中存入元素,元素存在則忽略,key不存在則新建 SREM key member [member ...] //從集合key中刪除元素 SMEMBERS key //獲取集合key中所有元素 SCARD key //獲取集合key的元素個數 SISMEMBER key member //判斷member元素是否存在於集合key中 SRANDMEMBER key [count] //從集合key中選出count個元素,元素不從key中刪除 SPOP key [count] //從集合key中選出count個元素,元素從key中刪除
4.2 運算操作
SINTER key [key ...] //交集運算 SINTERSTORE destination key [key ..] //將交集結果存入新集合destination中 SUNION key [key ..] //並集運算 SUNIONSTORE destination key [key ...] //將並集結果存入新集合destination中 SDIFF key [key ...] //差集運算 SDIFFSTORE destination key [key ...] //將差集結果存入新集合destination中
5、Sorted-Set
5.1 常用操作
ZADD key score member [[score member]...] //往有序集合key中加入帶分值元素 ZREM key member [member ...] //從有序集合key中刪除元素 ZSCORE key member //返回有序集合key中元素member的分值 ZINCRBY key increment member //為有序集合key中元素member的分值加上increment ZCARD key //返回有序集合key中元素個數 ZRANGE key start stop [WITHSCORES] //正序獲取有序集合key從start下標到stop下標的元素 ZREVRANGE key start stop [WITHSCORES] //倒序獲取有序集合key從start下標到stop下標的元素
5.2 運算操作
ZUNIONSTORE destkey numkeys key [key ...] //並集計算
ZINTERSTORE destkey numkeys key [key ...] //交集計算
五、Redis核心原理
1、Redis單線程為什么還能這么快
Redis所有的數據都是在內存中,所有的運算都是內存級別的運算,而且單線程避免了多線程的切換性能損耗的問題。正因為Redis是單線程,所以要小心使用Redis指令,對於那些耗時的指令(比如keys),一定要謹慎使用,一不小心就可能會導致 Redis 卡頓。
2、Redis單線程為何能處理那么多的並發客戶端連接
Redis的IO多路復用:redis利用epoll來實現IO多路復用,將連接信息和事件放到隊列中,依次放到文件事件分派器,事件分派器將事件分發給事件處理器。(IO多路復用在后續的netty系列里面詳細講解)
總結:Redis是一個Key-Value數據結構的內存存儲系統,他支持5種數據結構,分別是String結構、Hash結構、List結構、Set結構、Sorted-Set結構;Redis支持Lua腳本,哨兵機制和集群實現高可用;介紹了安裝Redis的步驟,詳細的解釋了redis.conf的主要配置,以及Redis的核心原理。
