Redis系列(一):Redis簡介

1、Redis概述

  Redis是一個開源(遵循BSD協議)Key-Value數據結構的內存存儲系統,用做數據庫、緩存和消息代理。它支持5種數據結構:字符串string、哈希hash、列表list、集合set和有序的集合sorted-set。Redis支持Lua腳本,哨兵機制和集羣實現高可用。適用場景:緩存、投票、抽獎、分佈式session、排行榜、計數、隊列、發佈訂閱等;具體介紹見Redis官網node

2、Redis安裝

   下載地址:https://redis.io/downloadredis

    安裝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.2session

    啓動redis 執行:bin/redis-server ../redis.conf (注意:若是要後臺啓動須要把redis.conf配置裏面的daemonize改成yes數據結構

    驗證是否啓動成功 ps -ef|grep redis多線程

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

    退出客戶端:quit

 3、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:
1)volatile-lru -> 根據LRU算法刪除設置過時時間的key
2)allkeys-lru -> 根據LRU算法刪除任何key
3)volatile-random -> 隨機移除設置過過時時間的key
4)allkeys-random -> 隨機移除任何key
5)volatile-ttl -> 移除即將過時的key(minor TTL)
6)noeviction -> 不移除任何key,只返回一個寫錯誤

maxmemory-samples

設置樣本量的個數

appendonly

是否開啓AOF,若是開啓那麼在啓動時Redis將加載AOF文件,它更能保證數據的可靠性,aof的文件內容就是RESP協議

appendfilename

AOF文件名(默認:"appendonly.aof")

appendfsync

配置 Redis 多久纔將數據 fsync 到磁盤一次
Redis支持三種不一樣的模式:
1)no:不要馬上刷,只有在操做系統須要刷的時候再刷。比較快。
2)always:每次寫操做都馬上寫入到aof文件。慢,可是最安全。
3)everysec:每秒寫一次。折中方案。

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到磁盤

4、Redis五種數據結構

  一、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

  二、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

  三、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,一直阻塞等待

  四、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中

  五、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 ...]         //交集計算

5、Redis核心原理

  一、Redis單線程爲何還能這麼快

  Redis全部的數據都是在內存中,全部的運算都是內存級別的運算,並且單線程避免了多線程的切換性能損耗的問題。正由於Redis是單線程,因此要當心使用Redis指令,對於那些耗時的指令(好比keys),必定要謹慎使用,一不當心就可能會致使 Redis 卡頓。

  二、Redis單線程爲什麼能處理那麼多的併發客戶端鏈接

  Redis的IO多路複用:redis利用epoll來實現IO多路複用,將鏈接信息和事件放到隊列中,依次放到文件事件分派器,事件分派器將事件分發給事件處理器。(IO多路複用在後續的netty系列裏面詳細講解)

  總結:Redis是一個Key-Value數據結構的內存存儲系統,他支持5種數據結構,分別是String結構、Hash結構、List結構、Set結構、Sorted-Set結構;Redis支持Lua腳本,哨兵機制和集羣實現高可用;介紹了安裝Redis的步驟,詳細的解釋了redis.conf的主要配置,以及Redis的核心原理。

相關文章
相關標籤/搜索