
什么是redis
redis是一種支持Key-Value等多種數(shù)據(jù)結(jié)構(gòu)的存儲系統(tǒng)。可用于緩存、事件發(fā)布或訂閱、高速隊(duì)列等場景。該數(shù)據(jù)庫使用ANSI C語言編寫,支持網(wǎng)絡(luò),提供字符串、哈希、列表、隊(duì)列、集合結(jié)構(gòu)直接存取,基于內(nèi)存,可持久化,支持多種開發(fā)語言。

redis在高并發(fā)場景下的作用不言而喻,今天主要分享Redis大家比較關(guān)心的以下幾個(gè)方面。

redis的數(shù)據(jù)類型
支持多種數(shù)據(jù)類型:
1.string(字符串)
String數(shù)據(jù)結(jié)構(gòu)是簡單的key-value類型,value其實(shí)不僅可以是String,也可以是數(shù)字。
常規(guī)key-value緩存應(yīng)用;
2.list(列表)
Redis的list是每個(gè)子元素都是String類型的雙向鏈表,可以通過push和pop操作從列表的頭部或者尾部添加或者刪除元素,這樣List即可以作為棧,也可以作為隊(duì)列。
使用List結(jié)構(gòu),我們可以輕松地實(shí)現(xiàn)最新消息排行等功能。
3.hash(散列)
Redis hash是一個(gè)string類型的field和value的映射表,hash特別適合用于存儲對象。
存儲部分變更的數(shù)據(jù),如用戶信息等。
4.sets (集合)
set就是一個(gè)集合,集合的概念就是一堆不重復(fù)值的組合。利用Redis提供的set數(shù)據(jù)結(jié)構(gòu),可以存儲一些集合性的數(shù)據(jù)。set中的元素是沒有順序的。
5.sorted set(有序集合)
和set相比,sorted set增加了一個(gè)權(quán)重參數(shù)score,使得集合中的元素能夠按score進(jìn)行有序排列。
redis的特點(diǎn)
1.單線程,利用redis隊(duì)列技術(shù)并將訪問變?yōu)榇性L問,消除了傳統(tǒng)數(shù)據(jù)庫串行控制的開銷
2.redis具有快速和持久化的特征,速度快,因?yàn)閿?shù)據(jù)存在內(nèi)存中。
3.分布式 讀寫分離模式
4.支持豐富數(shù)據(jù)類型
5.支持事務(wù),操作都是原子性,所謂原子性就是對數(shù)據(jù)的更改要么全部執(zhí)行,要不全部不執(zhí)行。
6.可用于緩存,消息,按key設(shè)置過期時(shí)間,過期后自動(dòng)刪除
redis的持久化存儲
Redis支持兩種數(shù)據(jù)持久化方式:RDB方式和AOF方式。前者會根據(jù)配置的規(guī)則定時(shí)將內(nèi)存中的數(shù)據(jù)持久化到硬盤上,后者則是在每次執(zhí)行寫命令之后將命令記錄下來。兩種持久化方式可以單獨(dú)使用,但是通常會將兩者結(jié)合使用。
1.RDB持久化
原理是將Reids在內(nèi)存中的數(shù)據(jù)庫記錄定時(shí)dump到磁盤上的RDB持久化。
指定的時(shí)間間隔內(nèi)將內(nèi)存中的數(shù)據(jù)集快照寫入磁盤,實(shí)際操作過程是fork一個(gè)子進(jìn)程,先將數(shù)據(jù)集寫入臨時(shí)文件,寫入成功后,再替換之前的文件,用二進(jìn)制壓縮存儲。

2.AOF(append only file)持久化
原理是將Reids的操作日志以追加的方式寫入文件。
以日志的形式記錄服務(wù)器所處理的每一個(gè)寫、刪除操作,查詢操作不會記錄,以文本的方式記錄,可以打開文件看到詳細(xì)的操作記錄。

redis的集群方案有哪些
redis 集群方案主要有兩類,一是使用類 codis 的架構(gòu),按組劃分,實(shí)例之間互相獨(dú)立;
另一套是基于官方的 redis cluster 的方案。
1.codis 架構(gòu)

codis是一個(gè)豌豆莢團(tuán)隊(duì)開源的使用Go語言編寫的Redis
Proxy使用方法和普通的redis沒有任何區(qū)別,設(shè)置好下屬的多個(gè)redis實(shí)例后就可以了,使用時(shí)在本需要連接redis的地方改為連接codis,它會以一個(gè)代理的身份接收請求
并使用一致性hash算法,將請求轉(zhuǎn)接到具體redis,將結(jié)果再返回codis,和之前比較流行的twitter開源的Twemproxy功能類似。
這套架構(gòu)的特點(diǎn):
- 分片算法:基于 slot hash桶;
- 分片實(shí)例之間相互獨(dú)立,每組 一個(gè)master 實(shí)例和多個(gè)slave;
- 路由信息存放到第三方存儲組件,如 zookeeper 或etcd
- 旁路組件探活
codis是目前用的最多的集群方案,codis一個(gè)比較大的優(yōu)點(diǎn)是可以不停機(jī)動(dòng)態(tài)新增或刪除數(shù)據(jù)節(jié)點(diǎn),舊節(jié)點(diǎn)的數(shù)據(jù)也可以自動(dòng)恢復(fù)到新節(jié)點(diǎn)。
2.基于官方 redis cluster 的方案

- Redis官網(wǎng)推出,可線性擴(kuò)展到1000個(gè)節(jié)點(diǎn)
- 無中心架構(gòu)
- 一致性哈希思想
- 客戶端直連redis服務(wù),免去了proxy代理的損耗
具體的redis cluster的搭建方案可以參考官方的搭建方案。
redis的應(yīng)用場景

1、最全頁面緩存
如果你使用的是服務(wù)器端內(nèi)容渲染,你又不想為每個(gè)請求重新渲染每個(gè)頁面,就可以使用 Redis 把常被請求的內(nèi)容緩存起來,能夠大大的降低頁面請求的延遲。
2.排行榜/計(jì)數(shù)
Redis 基于內(nèi)存,可以非常快速高效的處理增加和減少的操作,相比于使用 SQL 請求的處理方式,性能的提升是非常巨大的。
Redis可以實(shí)現(xiàn)快速計(jì)數(shù)、查詢緩存的功能,同時(shí)數(shù)據(jù)可以異步落地到其他數(shù)據(jù)源。
典型應(yīng)用場景:
1)播放數(shù)計(jì)數(shù)的基礎(chǔ)組件,用戶每播放一次視頻,相應(yīng)的視頻播放數(shù)就會自增1。
2)排行榜:按照時(shí)間、按照數(shù)量、按照獲得的贊數(shù)等排行。
3. 共享Session
典型應(yīng)用場景:用戶登陸信息,Redis將用戶的Session進(jìn)行集中管理,每次用戶更新或查詢登陸信息都直接從Redis中集中獲取。
4、消息隊(duì)列
例如 email 的發(fā)送隊(duì)列、等待被其他應(yīng)用消費(fèi)的數(shù)據(jù)隊(duì)列,Redis 可以輕松而自然的創(chuàng)建出一個(gè)高效的隊(duì)列。
5、發(fā)布/訂閱
pub/sub 是 Redis 內(nèi)置的一個(gè)非常強(qiáng)大的特性,例如可以創(chuàng)建一個(gè)實(shí)時(shí)的聊天系統(tǒng)、社交網(wǎng)絡(luò)中的通知觸發(fā)器等等。
本文由博客一文多發(fā)平臺 OpenWrite 發(fā)布!