Redis基礎:基本介紹、redis的應用場景、五種數據類型、持久化操做、主從模式

1、Redis基本概念介紹和特性

1.1 Redis基本概念介紹

    clipboard.png

1.Redis是遠程的,有客戶端和服務端,咱們通常說的是服務端;

2.Redis是基於內存的,因此比基於硬盤的MySQL要快不少,但很是吃內存php

3.Redis是非關係型數據庫。本質上也是數據庫,但MySQL關係型數據庫存儲時必須定義數據詞典,而Redis則不須要。html

1.2 Redis 和 Memcached比較

    clipboard.png

    Redis數據類型都支持push/pop、add/remove及取交集並集和差集及更豐富的操做,並且這些操做都是原子性的。mysql

    與Memcached同樣,爲了保證效率,數據都是緩存在內存中。區別的是Redis會週期性的把更新的數據寫入磁盤或者把修改操做寫入追加的記錄文件,而且在此基礎上實現了master-slave(主從)同步。redis

1.3 Redis支持主從同步。

    數據能夠從主服務器向任意數量的從服務器上同步,從服務器能夠是關聯其餘從服務器的主服務器。這使得Redis可執行單層樹複製。存盤能夠有意無心的對數據進行寫操做。因爲徹底實現了發佈/訂閱機制,使得從數據庫在任何地方同步樹時,可訂閱一個頻道並接收主服務器完整的消息發佈記錄。同步對讀取操做的可擴展性和數據冗餘頗有幫助。sql

2、Redis的應用場景

2.1 緩存

    clipboard.png

Redis經常做爲 數據緩存

    當某些系統接口比較慢的時候,咱們能夠把一些數據放在Redis中緩存起來,下次取數據就不進行很是耗時的SQL操做了,直接從緩存中取數據,提高系統性能最經常使用的方法之一;數據庫

2.2 隊列

    push和pop操做保證了原子性的實現;windows

2.3 數據存儲

    全部的增刪改查都是在Redis中進行,Redis有硬盤的持久化機制,按期進行存儲,保證了數據的完整性和安全性。數組

    查看redis客戶端: which redis-cli
    登陸:redis-cli(默認登陸本機6379端口)
    info命令查看redis信息緩存

3、Redis數據類型

    在redis裏邊,除了\n和空格 不能做爲名字的組成內容外,其餘內容均可以做爲key的名字部分。名字長度不作要求。安全

*exists key          #測試指定key是否存在
del key1 key2 key3  #刪除給定的key
*type key            #返回給定的value的類型
keys pattern        #返回匹配指定模式的全部key
rename oldkey newkey#更名字
*dbsize              #返回當前數據庫的key數量
expire key seconds  #爲key指定過時時間
*ttl key             #返回key的剩餘過時秒數
*select db-index     #選擇數據庫,一共16個
move key db-index   #將key從當前數據庫移動到指定數據庫
*flushdb             #刪除當前數據庫中全部key
flushall            #刪除全部數據庫中的全部key

    clipboard.png

3.1 String字符串類型的操做

    clipboard.png

功能:提供字符串或者整型操做。
set key value(string/int/float)
get key
incr string  [value]//自增
decrby string [value] //自減
string是redis最基本的類型

    redisstring能夠包含任何數據。包括jpg圖片(二進制)或者序列化的對象。
    單個value值最大上限是1G字節。
    若是隻用string類型,redis就能夠被看做加上持久化特性的memcache

set key value                   #設置key對應的值爲string類型的value
*mset key1 value1 key2 value2    #一次設置多個key的值
*mget key1 key2                  #一次獲取多個key的值
*incr key                        #對key的值作加加操做,並返回新的值
decr key                        #對key的值作漸減操做,並返回新的值
incrby key integer              #同incr,加指定的值
decrby key integer              #同decr,減指定的值
*append key value                #給指定key的字符串值追加value
*substr key start end            #返回截取過的key的字符串值

3.2 List鏈表類型

    clipboard.png

功能:存儲序列集合,可用於隊列, pushpop操做
lpush 左進
rpop 右出
llen key  查看list有幾個元素

    List類型是先進先出,適合隊列;List不要求裏面的元素是惟一的

(一)介紹

    得到最新的10個登陸用戶信息: select * from user order by logintime desc limit 10;
以上sql語句能夠實現用戶需求,可是數據多的時候,所有數據都要受到影響,對數據庫的負載比較高。必要狀況還須要給關鍵字段(id或logintime)設置索引,索引也比較耗費系統資源。

    若是經過list鏈表實現以上功能,能夠在list鏈表中只保留最新的10個數據,每進來一個新數據就刪除一箇舊數據。每次就能夠從鏈表中直接得到須要的數據。極大節省各方面資源消耗

(二)應用

    list類型其實就是一個雙向鏈表。經過push,pop操做從鏈表的頭部或者尾部添加刪除元素。
這使得list既能夠用做棧,也能夠用做隊列。

上進上出 :棧
上進下出 :隊列

    clipboard.png

lpush key string    #在key對應list的頭部添加字符串元素
rpop key            #在list的尾部刪除元素,並返回刪除元素
llen key 返回key      #對應list的長度,key不存在返回0,若是key對應類型不是list返回錯誤
lrange key start end  #返回指定區間內的元素,下標從0開始
rpush key string        #同上,在尾部添加
lpop key            #從list的頭部刪除元素,並返回刪除元素
ltrim key start end  #截取list,保留指定區間內元素

1.lrange key 0 -1 取出全部元素。
2.lrem key n/-n X 刪除指定元素n次。
3.linsert key after/before key1 key2key1後/前插入key2
4.rpoplpush key1 key2key1右邊key左入key2鏈表,原子性
的操做使用

    clipboard.png

功能:無序集合, 每一個元素都不同
添加元素:sadd key value
判斷有多少個元素:scard key
判斷某個元素是否在set裏面:sismember key value
刪除某個元素:srem key value
獲取所有值,並以數組方式返回:$redis->sMembers('dst'));
int(2)
array(2) {
  [0]=>
  string(1) "4"
  [1]=>
  string(1) "2"
}

3.3 Set類型

  set類型,無序的方式存儲多個不一樣的元素,對元素能夠進行快速的添加、查找和刪除;相同的元素只算一個

    redis的set是string類型的無序集合。
    set元素最大能夠包含(2的32次方-1)個元素。
    關於set集合類型除了基本的添加刪除操做,
    其餘有用的操做還包含集合的取並集(union),交集(intersection),    差集(difference)。經過這些操做能夠很容易的實現sns中的好友推薦功能
    注意:每一個集合中的各個元素不能重複。

sadd key member             #添加一個string元素到key對應的set集合中,成功返回1,若是元素已經在集合中,返回0,key對應的set不存在返回錯誤
srem key member [memeber]    #從key對應set中移除給定元素,成功返回1
smove p1 p2 member          #從p1 對應set中移除member並添加到p2對應set中
scard key                   #返回set的元素個數
sismember key member        #判斷member是否在set中
sinter key1 key2...keyn     #返回全部給定key的交集
sunion key1 key2...keyn      #返回全部給定key的並集
sdiff key1 key2...keyn      #返回全部給定key的差集
smembers key                #返回key對應set的全部元素,結果是無序的

該類型應用場合:qq好友推薦。

tom朋友圈(與某某是好友):mary jack xiaoming wang5 wang6 
linken朋友圈(與某某是好友):yuehan daxiong luce wang5 wang6

    clipboard.png

3.4 hash類型

    clipboard.png

功能:存儲的是 key-value結構, key必須是string

    常常用於存儲比較複雜的結構,Hash只要求鍵不同,好比姓名,年齡等等

插入/修改:hset hash1 key1 12
獲取:hget hash1 key1
查看hash長度:hlen key
一次性獲取:hmget hash1 key1 key2

    clipboard.png

    clipboard.png

3.5 Sort Set排序集合類型

    clipboard.png

功能:存儲是帶分數的有序集合, 常常用於排行榜

    sort set 常常被用做排名例如 班級成績排名

    存儲和hash同樣,都是一個映射。存儲的是分數與元素的映射。能夠看出是排行榜。
    value必須是全局惟一。
    score 是浮點型。
    sort set類型操做,若是兩個元素的score同樣,按照字節順序排列前後

增長/修改:zadd zset1 10.1 val1
查看個數:zcard zset1
查看排名:zrange zset1 0 2 withscores
查看某個value排名:zrank zset1 val2
set同樣 sorted set也是 string類型元素的集合,不一樣的是每一個元素都會關聯一個 。 經過權值能夠有序的獲取集合中的元素。

    Sort set類型適合場合:
    得到熱門帖子(回覆量)信息:select * from message order by backnum desc limit 5;
    (以上需求能夠經過簡單sql語句實現,可是sql語句比較耗費mysql數據庫資源)

    案例:利用sort set實現獲取最熱門的前5帖子信息

    clipboard.png

    排序集合中的每一個元素都是值、權的組合 (以前的set集合類型每一個元素就只是一個 值)

    clipboard.png

咱們只作一個sort set排序集合,裏邊只保留5個元素信息,該5個元素是回覆量最高的
每一個帖子被回覆的時候,都有機會進入該集合裏邊,可是隻有回覆量最高的前5個帖子會存在於在集合,回覆量低的就被刪除。
127.0.0.1:6379> select 2
OK
127.0.0.1:6379[2]> zadd hotmessage 102 11  //添加
(integer) 1
127.0.0.1:6379[2]> zadd hotmessage 141 12
(integer) 1
127.0.0.1:6379[2]> zadd hotmessage 159 13
(integer) 1
127.0.0.1:6379[2]> zadd hotmessage 72 14
(integer) 1
127.0.0.1:6379[2]> zadd hotmessage 203 15
(integer) 1
127.0.0.1:6379[2]> keys *
1) "hotmessage"
127.0.0.1:6379[2]> zrevrange hotmessage 0 100
//按照權由高到低的順序得到具體元素值的信息
1) "15"
2) "13"
3) "12"
4) "11"
5) "14"
127.0.0.1:6379[2]> zadd hotmessage 189 16
(integer) 1
127.0.0.1:6379[2]> zrevrange hotmessage 0 100
1) "15"
2) "16"
3) "13"
4) "12"
5) "11"
6) "14"
127.0.0.1:6379[2]> zremrangebyrank hotmessage 0 0
(integer) 1
//把權最低的那個刪掉 0 0表示刪除第一個權;0 1表示刪除第一個,第二個權;
127.0.0.1:6379[2]> zrevrange hotmessage 0 100
1) "15"
2) "16"
3) "13"
4) "12"
5) "11"
127.0.0.1:6379[2]> zrank hotmessage 12
//權由低到高得到元素排名
(integer) 1
127.0.0.1:6379[2]> zrank hotmessage 11
(integer) 0
127.0.0.1:6379[2]> zrevrank hotmessage 13
//權由高到低得到元素排名
(integer) 2
127.0.0.1:6379[2]> zcard hotmessage
//得到集合中元素個數
(integer) 5
127.0.0.1:6379[2]> zscore hotmessage 16
//根據元素值得到對應的權
"189"
127.0.0.1:6379[2]> zincrby hotmessage 100 12
//給指定的元素值增長一些權信息
"241"
127.0.0.1:6379[2]> zrevrange hotmessage 0 100
1) "12"
2) "15"
3) "16"
4) "13"
5) "11"
127.0.0.1:6379[2]>

4、持久化操做

    Redis爲了內部數據的安全考慮,會把自己的數據以文件形式保存到硬盤中一份,在服務器重啓以後會自動把硬 盤的數據恢復到內存(redis)的裏邊。 數據保存到硬盤的過程就稱爲持久化效果

    相關指令:

./redis-cli bgsave  //異步保存數據到磁盤(快照保存)
./redis-cli 1h 127.0.0.1 -p 6379 bgsave
./redis-cli lastsave //返回上次成功保存到磁盤的unix時間戳
./redis-cli shutdown //同步保存到服務器並關閉redis服務器
./redis-cli bgrewriteaof //當日志文件過長時優化AOF日誌文件存儲

4.1 snap shotting快照持久化

該持久化默認開啓,一次性把 redis中所有的數據保存一份存儲在硬盤中,若是數據很是多( 10-20G)就不適合頻繁進行該持久化操做。

    1.快照持久化在本地硬盤保留的數據備份文件

    clipboard.png

    2.快照持久化的備份頻率:

    在redis.conf配置文件中

    clipboard.png

save 900 1 #900 秒內若是超過 1 個 key 被修改,則發起快照保存 
save 300 10 #300秒超過10個key被修改,發起快照 
save 60 10000 #60秒超過10000個key被修改,發起快照

    以上三個save的意思:
    數據修改的頻率很是高,備份的頻率也高
    數據修改的頻率低,備份的頻率也低

    3.快照持久化文件的命名和存儲位置:

    在redis.conf配置文件中

    clipboard.png

    4.手動發起快照持久化

./redis-cli -h 192.168.10.138 -p 6379 bgsave
//給定ip地址發起快照持久化
./redis-cli bgsave   //本機發起快照持久化

4.2 append only file (AOF持久化)

    本質:把用戶執行的每一個「寫」指令(添加、修改、刪除)都備份到文件中,還原數據的時候就是執行具體寫指令而已。

    1.開啓AOF持久化(會清空redis內部的數據):
    (同時能夠修改備份文件的名字,默認是appendonly.aof)
    在redis.conf配置文件中

    clipboard.png

    2.配置文件被修改,須要刪除舊進程,再根據新的配置文件啓動新進程:

    clipboard.png

    3.新進程啓動好後會看到對應的aof持久化備份文件appendonly.aof:

    clipboard.png

    4.aof追加持久化的備份頻率:
    在redis.conf配置文件中

    clipboard.png

    5.爲aof備份文件作優化處理
    對appendonly.aof文件內容作優化壓縮處理。(例如:多個inr指令變爲一個set指令)

    clipboard.png

    6.持久化相關指令

    clipboard.png

5、Redis的主從模式

5.1 使用背景

    爲了下降每一個redis服務器的負載,能夠多設置幾個服務器,並作主從模式 一個服務器負載「寫」(添加、修改、刪除)數據,其餘服務器負載「讀」數據。主服務器數據會「自動」同步給從服務器。

    clipboard.png

5.2 設置主從模式

    1.在從Redis服務器中,找到配置文件redis.conf

    clipboard.png

    默認是關閉主從模式的,修改後

    clipboard.png

    2.關閉從Redis服務器,從新加載配置文件

./redis-cli shutdown
./redis-server redis.conf

    3.從服務器默認禁止寫入操做(能夠修改以下圖參數使得其能夠寫入數據):

    clipboard.png

Redis主從複製哨兵模式

windows下安裝redis 以及phpredis的擴展 (windows redis php&php7)

6、建立鏈接redis的客戶端

    鏈接redis
    建立connect.php文件

<?php
$redis = new \Redis(); //實例化
$redis->connect('127.0.0.1',6379);

//string操做
$redis->delete("string1");
$redis->set("string1","val1");
$val = $redis->get("string1");
var_dump($val); //val1

$redis->set("string1",4);
$redis->incr("string1",2);
$val = $redis->get("string1");
var_dump($val); //6


# 字符串(string)  存儲key/value,至關於設一個變量。例如對一個key值執行INCR操做,統計實時點擊量。set/get

# 哈希(hash) 用於存儲對象信息,一個key就是一個對象。field/value構成鍵值對。hset key field value 

# 列表(list) lpush/lrange/lpop

# 集合(set)  用於交集並集,例如新浪微博的共同關注 sadd/smembers/sunion/sinter 

# 有序集合(zset)  用於排序,例如top N的獲取 zadd/zrangebyscore

    命令記憶總結:

字符串和哈希,是key/value相關,用set建立。 set/hset/hmset

集合和有序集合,是集合相關,用add建立。sadd/zadd

列表用push建立。lpush

參考資料以下:
1. 傳智播客redis基礎視頻教程
2. Redis-傳智播客-學習筆記

相關文章
相關標籤/搜索