Redis 及其分布式應用場景


轉自:

https://zhuanlan.zhihu.com/p/126344521

Redis概況

Redis(Remote Dictionary Server,即遠程字典服務),是一個開源的(BSD 許可的)內存中的數據結構存儲器,用作數據庫、緩存和消息代理。它支持豐富的數據結構(如字符串、哈希、列表、集、帶范圍查詢的排序集、位圖、超日志、具有半徑查詢和流的地理空間索引)。Redis 具有內置復制、Lua 腳本、LRU eviction、事務和不同級別的磁盤持久性,並通過 Redis Sentinel 提供高可用性,並通過 Redis 群集自動分區。

從2010年3月15日起,Redis的開發工作由VMware主持;從2013年5月開始,Redis的開發由Pivotal贊助。

Redis 主要內容:

  • 性能:數據在內存中(避免了磁盤IO的成本),讀寫速度非常快,支持並發 10W QPS;
  • 進程、線程模型:單進程單線程,是線程安全的,采用 IO 多路復用機制模型(同步非阻塞)。
  • 豐富的數據結構:String字符串、Hash哈希映射、List列表、Set集合、ZSet帶范圍查詢的排序集合、bitmap位圖、hyperloglog超日志、具有半徑查詢和流的地理空間索引;
  • 數據持久化機制:可以將內存中數據保存在磁盤中,重啟時加載;
  • 高可用集群架構:通過 Redis Sentinel 提供高可用性,並通過 Redis 群集自動分區。(主從復制、哨兵架構);
  • 分布式應用場景:用作緩存;可用作消息中間件,支持發布訂閱;用作分布式鎖(redis的並發競爭key機制)等等;

核心數據結構-操作命令-應用場景

#macos簡單安裝redis brew install redis #配置文件 vim /usr/local/etc/redis.conf #啟動服務 redis-server #進入客戶端 redis-cli -p 127.0.0.1 -p 6379 #后續執行操作命令即可 127.0.0.1:6379> set owner Yoland OK 127.0.0.1:6379> get owner "Yoland" 127.0.0.1:6379> exists owner (integer) 1 127.0.0.1:6379> type onwer String 127.0.0.1:6379> del owner (integer) 1 127.0.0.1:6379> exists owner (integer) 0 # 設置過期時間 127.0.0.1:6379> expire key timeout(單位為秒)
  • 實現分布式鎖:

1.獲取鎖的時候,使用 setnx(SETNX key val:當且僅當 key 不存在時,set 一個 key 為 val 的字符串,返回 1;若 key 存在,則什么都不做,返回 0)加鎖,鎖的 value 值為一個隨機生成的 UUID,在釋放鎖的時候進行判斷。並使用 expire 命令為鎖添加一個超時時間,超過該時間則自動釋放鎖。

2. 獲取鎖的時候調用 setnx,如果返回 0,則該鎖正在被別人使用,返回 1 則成功獲取 鎖。 還設置一個獲取的超時時間,若超過這個時間則放棄獲取鎖。

3. 釋放鎖的時候,通過 UUID 判斷是不是該鎖,若是該鎖,則執行 delete 進行鎖釋放。

  • 事務操作

Redis事務可以一次執行多個命令,事務具有以下特征

  • 隔離操作:事務中的所有命令都會序列化、按順序地執行,不會被其他命令打擾。
  • 原子操作:事務中的命令要么全部被執行,要么全部都不執行
  • 開啟一個事務
multi
以后執行的所有命令,都在這個事務中執行的。

執行事務
1exec
  會將在multi和exec中的操作一並提交。

取消事務
1discard
  會將multi后的所有命令取消。

監視一個或者多個key
watch key...
  監視一個(或多個)key,如果在事務執行之前這個(或這些) key被其他命令所改動,那么事務將被打斷。

取消所有key的監視
unwatch 
  • 發布/訂閱操作
給某個頻道發布消息
publish channel message
訂閱某個頻道的消息
subscribe channel 

 

key-String

String 是 Redis 最基本的類型,可以理解成與 Memcached 一模一樣的類型;

  • 一個 Key 對應一個 Value, value是一個整體;
  • Value 可以是任何類型數據(因為String 類型是二進制安全的:意思是 String 類型可以包含任何數據,如:String、數字、 jpg 圖片、序列化的對象);
  • Value最大能存儲 512M;

操作命令:

#S聽類型 對字符串的支持
> SET mykey somevalue
OK
> GET mykey
"somevalue"

#String類型 對數字的支持
> set counter 100
OK
> incr counter
(integer) 101
> incr counter
(integer) 102
> incrby counter 50
(integer) 152

# 設置多數據
> mset a 10 b 20 c 30
OK
> mget a b c
1) "10"
2) "20"
3) "30"
> mget a
1) "10"

應用場景:

  • 單值緩存;
SET key value
GET key
  • 對象緩存(json格式,但不如使用hash更靈活):
#使用String緩存對象
SET user:1 value(json格式數據)
GET user:1 
#使用Hash緩存對象
MSET user:1:name yuan user:1:age 18
MGET user:1:name user:1:age 

key-Hash

Hash是一個鍵值(key-value)的集合。

  • 一個key對應一個Hash(key-value entry 的集合);
  • 適合存儲對象:

操作命令:HMSet、HGet、HGetAll、HLen、HDel、hincrby

//todo

應用場景:適合存儲對象,對象的每個屬性和值,可以用hash的key-value來存儲;雖然對象也可以通過json存儲到String值中,但是使用Hash更方便操作對象的某個屬性;

 

key-List

  • List 列表是簡單的字符串列表,按照插入順序排序。
  • 數據結構:List 就是鏈表,可以用來當消息隊列用。Redis 提供了 List 的 Push 和 Pop 操作,還提供了操作某一段的 API,可以直接查詢或者刪除某一段的元素。
  • 實現方式:Redis 的 List 的是實現是一個雙向鏈表,既可以支持反向查找和遍歷,更方便操作,不過帶來了額外的內存開銷。

操作命令:可以添加一個元素到列表的頭部(左邊)或者尾部(右邊) 常用命令:插入lpush/rpush、查詢lpop/rpop、范圍查詢lrange(獲取列表片段)、阻塞查詢BLPop/BRPop(list空時阻塞)、刪除LDrop/RDrop等。

//todo

應用場景:List 應用場景非常多,也是 Redis 最重要的數據結構之一,比如 :

  • 微博、Twitter 的關注列表、粉絲列表都可以用 List 結構來實現。
  • 公眾號、微博的新消息列表, 使用:LRange key start end;

 

key-Set

  • Set 是 String 類型的無序集合(集合即元素唯一)。Set 中的元素是無序的,而且是不重復的。
  • Set 是通過 hashtable 實現的;

操作命令:SADDSCARDSDIFFSDIFFSTORESINTERSINTERSTORESISMEMBERSMEMBERSSMOVESPOPSRANDMEMBERSREMSSCANSUNIONSUNIONSTORE

#添加集合中的成員
> sadd myset 1 2 3
(integer) 3
#查看集合中的成員
> smembers myset
1. 3
2. 1
3. 2
#成員是否屬於集合
> sismember myset 3
(integer) 1
> sismember myset 30
(integer) 0
#集合操作
#交集
SINTER set1 set2
#並集 set1 + set2
SUNION set1 set2
#差集 set1-(set2+set3)
SDIFF set1 set2 set3

應用場景:Redis 的 Set 對外提供的功能和 List 一樣是一個列表,特殊之處在於 Set 是自動去重的,而且 Set 提供了判斷某個成員是否在一個 Set 集合中。

  • 微信抽獎小程序
redis> SADD myset one two three
(integer) 3
# 從集合中隨機獲取n個成員
redis> SRANDMEMBER myset
"two"
redis> SRANDMEMBER myset 2
1) "one"
2) "three"
redis> SRANDMEMBER myset -5
1) "two"
2) "three"
3) "two"
4) "three"
5) "one"

# 從集合中隨機獲取n個成員,同時將取出的成員從集合中刪除
  • 微信/微博的點贊、收藏、標簽,用:
SREM
SISMEMBER
SMEMBER
SCARD

  • 實現微博、微信的關注模型:
#共同關注(關注某明星的粉絲也關注的其他明星)

#我關注的人也關注的明星

#推薦關注/可能認識的人(我的好友關注了,而我沒有關注的人)

key-ZSet

Zset 和 Set 一樣是 String 類型元素的集合,且不允許重復的元素,但是它時排序的( Sorted Set 結構)。

  • 和 Set 相比,Sorted Set關聯了一個 Double 類型權重的參數 Score,使得集合中的元素能夠按照 Score 進行有序排列,Redis 正是通過分數來為集合中的成員進行從小到大的排序。
  • 實現方式:Redis Sorted Set 的內部使用 HashMap 和跳躍表(skipList)來保證數據的存儲和有序,HashMap 里放的是成員到 Score 的映射。 而跳躍表里存放的是所有的成員,排序依據是 HashMap 里存的 Score,使用跳躍表的結構可以獲得比較高的查找效率,並且在實現上比較簡單。

常用命令:zadd、zrange、zrem、zcard 等。

使用場景:ZSet 可以通過用戶額外提供一個優先級(score)的參數來為成員排序,並且是插入有序的,即自動排序。

  • 排行榜/熱度榜
  • 帶優先級(權重)的消息隊列

 

Redis高可用、分布式集群架構(千萬級)

(待續)

SpringBoot 用 redis 作緩存

Spring Boot 使用的。一般有兩種方式,一種是直接通過 RedisTemplate 來使用,另一種是使用 Spring Cache 集成 Redis(也就是注解的方式)。

(待續)


免責聲明!

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



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