輕鬆搞定高併發:詳解Redis的五種數據類型及應用場景分析!

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

  • 1.1 Redis基本概念介紹

輕鬆搞定高併發:詳解Redis的五種數據類型及應用場景分析!

1.Redis是遠程的,有客戶端和服務端,我們一般說的是服務端;

2.Redis是基於內存的,所以比基於硬盤的MySQL要快很多,但非常吃內存

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

  • 1.2 Redis 和 Memcached比較

輕鬆搞定高併發:詳解Redis的五種數據類型及應用場景分析!

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

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

  • 1.3 Redis支持主從同步

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

二、Redis的應用場景

  • 2.1 緩存

輕鬆搞定高併發:詳解Redis的五種數據類型及應用場景分析!

Redis常常作爲數據緩存

當某些系統接口比較慢的時候,我們可以把一些數據放在Redis中緩存起來,下次取數據就不進行非常耗時的SQL操作了,直接從緩存中取數據,提升系統性能最常用的方法之一;

  • 2.2 隊列

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

  • 2.3 數據存儲

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

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

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

輕鬆搞定高併發:詳解Redis的五種數據類型及應用場景分析!

  • 3.1 String字符串類型的操作

輕鬆搞定高併發:詳解Redis的五種數據類型及應用場景分析!

功能:提供字符串或者整型操作。

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鏈表類型

輕鬆搞定高併發:詳解Redis的五種數據類型及應用場景分析!

功能:存儲序列集合,可用於隊列,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既可以用作棧,也可以用作隊列。

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

輕鬆搞定高併發:詳解Redis的五種數據類型及應用場景分析!

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鏈表,原子性
的操作使用

輕鬆搞定高併發:詳解Redis的五種數據類型及應用場景分析!

功能:無序集合,每個元素都不一樣

添加元素: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 

輕鬆搞定高併發:詳解Redis的五種數據類型及應用場景分析!

  • 3.4 hash類型

輕鬆搞定高併發:詳解Redis的五種數據類型及應用場景分析!

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

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

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

輕鬆搞定高併發:詳解Redis的五種數據類型及應用場景分析!

輕鬆搞定高併發:詳解Redis的五種數據類型及應用場景分析!

  • 3.5 Sort Set排序集合類型

輕鬆搞定高併發:詳解Redis的五種數據類型及應用場景分析!

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

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帖子信息

輕鬆搞定高併發:詳解Redis的五種數據類型及應用場景分析!

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

輕鬆搞定高併發:詳解Redis的五種數據類型及應用場景分析!

我們只做一個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]> 

共同學習,資料分享

本文深入淺出的介紹了Redis的五種數據類型,並通過多個實用示例展示了Redis的用法。除此之外還講述了Redis的優化方法和擴展方法。

一共由三個部分組成;
第一部分對Redis進行了介紹,說明了Redis的基本使用方法、它擁有的5種數據結構以及操作5種數據結構的命令,並詳解了如何使用Redis去構建文章聚合網站、cookie、購物車、網頁緩存。數據庫行緩存等一系列程序。
第二部分對Redis命令進行了更詳細的介紹,並展示瞭如何使用Redis去構建更爲複雜的輔助工具和應用程序,並在最後展示瞭如何使用Redis去構建一個簡單的社交網站。
第三部分對Redis用戶會經常遇到的一些問題進行了介紹,講解了降低Redis內存佔用的方法、擴展Redis性能的方法以及使用Lua語言進行腳本編程的方法。

本書既覆蓋了命令用法等入門主題,也包含了複製、集羣、性能擴展等深入主題,所以無論是Redis新手還是對Redis有一定經驗的使用者,應該都能從書中獲益。

如果需要獲取到這個【Redis實戰文檔】文檔的可以關注我的公衆號【風平浪靜如碼】免費獲取!(內容細節比較多,所以把知識點粗略的截圖出來了)

一、Redis入門介紹

1.1:初認redis

  • redis簡介(redis與其他數據庫和原價對比,附加特性,使用redis的理由)
  • redis數據結構簡介(redis字符串,redis列表,redis集合,redis散列,redis有序集合)

輕鬆搞定高併發:詳解Redis的五種數據類型及應用場景分析!

1.2:使用Redis構建Web應用

  • 登錄和cookie緩存
  • 使用Redis實現購物車
  • 網頁緩存
  • 數據行緩存
  • 網頁分析

輕鬆搞定高併發:詳解Redis的五種數據類型及應用場景分析!

二、Redis核心概念

2.1:redis命令

  • 字符串
  • 列表
  • 集合
  • 散列
  • 有序集合
  • 發佈與訂閱
  • 其他命令(排序,基本的redis事務,鍵的過期時間)

輕鬆搞定高併發:詳解Redis的五種數據類型及應用場景分析!

2.2:數據安全與性能保障

  • 持久化選項
  • 複製
  • 處理系統故障
  • Redis事務
  • 非事務型流水線
  • 關於性能方面的注意事項

輕鬆搞定高併發:詳解Redis的五種數據類型及應用場景分析!

2.3:使用redis的構建支持程序

  • 使用redis來記錄日誌
  • 計數器和統計數據
  • 查找IP所屬城市及國家
  • 服務的發展與配置

輕鬆搞定高併發:詳解Redis的五種數據類型及應用場景分析!

2.4:使用redis構建應用程序組件

  • 自動補全
  • 分佈式鎖
  • 計數信號量
  • 任務隊列
  • 消息拉取
  • 使用redis進行文件分發

輕鬆搞定高併發:詳解Redis的五種數據類型及應用場景分析!

2.5:基於搜索的應用程序

  • 使用redis進行搜索
  • 有序索引
  • 廣告定向
  • 職位搜索

輕鬆搞定高併發:詳解Redis的五種數據類型及應用場景分析!

2.6:構建簡單的社交網站

  • 用戶和狀態
  • 主頁時間線
  • 關注者列表和正在關注列表
  • 狀態消息的發佈與刪除
  • 流API

輕鬆搞定高併發:詳解Redis的五種數據類型及應用場景分析!

三、Redis進階詳解

3.1:降低內存佔用

  • 短結構
  • 分片結構
  • 打包存儲二進制位和字節

輕鬆搞定高併發:詳解Redis的五種數據類型及應用場景分析!

3.2:擴展redis

  • 擴展讀性能
  • 擴展寫性能和內存容量
  • 擴展複雜的查詢

輕鬆搞定高併發:詳解Redis的五種數據類型及應用場景分析!

3.3:redis的Lua 腳本編程

  • 在不編寫 C代碼的情況下添加新功能
  • 使用Lua重寫鎖和信號量
  • 移除WATCH/MULTI/EXEC事務
  • 使用Lua對列表進行分片

輕鬆搞定高併發:詳解Redis的五種數據類型及應用場景分析!

最後

如果需要獲取到這個【Redis實戰文檔】文檔的可以關注我的公衆號【風平浪靜如碼】免費獲取!(內容細節比較多,所以把知識點粗略的截圖出來了)

最後祝大家工作順利,升職加薪,面試都能通過,offer拿到手軟,早日找到心儀的工作~

輕鬆搞定高併發:詳解Redis的五種數據類型及應用場景分析!

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