Redis系列(一):Redis簡介


一、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:
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到磁盤

四、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的核心原理。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM