1 Redis簡介
Redis,全稱遠程字典服務(REmote DIctionary Server),是一個開源、基於內存、高性能、可數據持久化的key-value存儲系統,遵守BSD協議,可用作數據庫、緩存和消息中間件。
在Redis中文官網上是這么描述的:
redis是一個開源(BSD許可)的,內存中的數據結構存儲系統,它可以用作數據庫、緩存和消息中間件。它支持多種類型的數據結構,如字符串strings,散列hashes,列表lists,集合sets,有序集合sorted sets的范圍查詢,bitmaps,hyperloglogs 和地理空間geospatial索引半徑查詢。Redis內置了復制replication,LUA腳本Lua scripting,LRU驅動事件LRU eviction,事務transactions和不同級別的磁盤持久化persistence,並通過 Redis哨兵Sentinel和自動分區Cluster提供高可用性high availability。
在日常應用中,Redis主要適用於以下幾個場景:
(1)緩存
(2)排行榜
(3)計數器
(4)分布式會話
(5)分布式鎖
(6)社交網絡
(7)最新列表
(8)消息系統
2 Redis的基本特性
Redis具有許多優秀特性,包括:支持多種數據類型、支持數據的持久化機制、支持事務控制、支持主從復制功能等。
2.1 數據類型
Redis的數據存儲是通過Key映射Value的方式,建立字典以保存數據。Redis共支持五種數據類型。
(1)String(字符串)
Redis最基本的類型,一個key對應一個value。
(2)Hash(哈希表)
鍵值對集合,是一個string類型的數據域field和值value的映射表。
(3)List(列表)
字符串列表,按照插入順序排序。支持在列表的頭部或者尾部添加數據元素。
(4)Set(集合)
字符串類型的無序集合,支持添加、刪除、查找,Redis還能對set進行交集、並集、差集等集合操作。
(5)Zset(有序集合)
字符串類型的有序集合,集合中的每個元素都會關聯一個double類型的分數。Redis通過這個分數為集合進行排序。
2.2 數據的持久化機制
Redis支持持久化,在運行情況下,Redis以數據結構的形式將數據維持在內存中,通過將內存中的數據保持到磁盤,讓這些數據在Redis重啟之后可用來持久化。Redis分別提供了兩種持久化模方式。
(1)RDB方式
即Snapshotting(快照)方式,是Redis默認的持久化方式。在Redis運行時,每隔幾分鍾或者幾次操作后,RDB程序將內存中的數據以快照的方式保存到磁盤二進制文件dump.rdb中。在Redis重啟時,RDB程序通過載入RDB文件的方式做快照持久化。RDB的配置信息保存在reedis.conf文件中。
RDB快照實現的數據持久化方式,存在的問題是:當在RDB程序保存數據的指定間隔之間,Redis斷開連接,那么在上一次保存到此刻的數據就無法被保存。因此,為了解決這個問題,Redis還提供了AOF的持久化。
下面是RDB的默認配置(redis.conf)
save 900 1 # 900秒內如果超過1個key被修改,進行快照
save 300 10
save 60 10000
(2)AOF方式
AOF以協議文本的方式,在使用AOF持久化時,Redis會將所有對數據庫進行的命令(及其參數)寫入到AOF日志文件appendonly.aof中,以此達到記錄數據庫狀態的目的,當Redis重啟時,就會通過執行AOF日志記錄的命令進行數據的快速恢復。
Redis還設計了AOF重寫機制:掃描數據庫數據,轉化為Redis命令存入臨時AOF文件中,在掃描完成后用臨時文件代替AOF文件。這使得AOF文件中記錄的命令是最簡潔的,在一定程度上避免了AOF隨着時間的增長,占據磁盤的過多空間。
下面是默認的aof配置(redis.conf)
appendonly no # 是否啟動aof持久化方式
appendfilename "appendonly.aof" #aof 文件名稱
\# appendfsync always \# 每收到命令就寫一次
appendfsync everysec \# 每秒鍾寫一次
\# appendfsync no # 完全依賴os
2.3 事務控制
Redis事務的本質是一組命令的集合。在事務執行過程,隊列中的命令會按照順序串行化執行,此時,其他命令請求都不會插入到事務執行序列中。Redis可以通過MULTI/EXEC支持簡單的事務控制:當客戶端使用MULTI命令時,這個連接將會進入一個事務上下文,連接后續的命令都會放在事務隊列中。當連接收到exec命令時,Redis將順序地執行事務隊列中的所有命令。
2.4 主從復制
主從復制就是使當前的服務器復制指定服務器的內容。被復制的服務器稱為主服務器(master),對主服務器進行復制操作的服務器稱為從服務器(slave)。
Redis通過修改redis.conf文件來使用和配置主從復制,復制過程上大體分為建立連接、數據同步、命令傳播三個階段。Redis主從復制功能強大,一個master支持多個slave連接,slave支持其他slave的連接,主從復制時,不會阻塞master和slave。
利用Redis主從復制的特效,可以實現以下功能:實現讀寫分離,比如用主服務器寫數據,用從服務器讀;支持備份數據分離,利用主從復制的方便,用slave服務器的一個或兩個服務器來進行數據備份。
下面是默認的Master-Slave replication配置(redis.conf)
\# slaveof <masterip> <masterport> # 當前節點是slave時配置
slave-serve-stale-data yes # master失去聯系時,slave是否會反饋客戶端的請求
slave-read-only yes # salve實例是否接受寫操作
slave-priority 100 # slave的優先級
3 Redis安裝與使用
3.1 安裝Redis
(1)從官網下載redis安裝包
(2)解壓到文件
(3)啟動cmd,切換到redis目錄,輸入命令 redis-server redis.windows.conf
輸入之后,會顯示如下界面:
(4)另啟一個 cmd 窗口,切換目錄,輸入命令 redis-cli.exe -h 127.0.0.1 -p 6379
這里的-h表示redis的bind的ip地址,-p指端口,輸入之后顯示:
(5)開始使用redis
設置鍵值對 set akey am
取出鍵值對 get akey
3.2 在Spring中使用Redis
工具:Redis Desktop Manager
(1)導入redis依賴
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-redis</artifactId>
<version>2.2.1.RELEASE</version>
</dependency>
(2)配置文件配置redis和連接池的信息
spring:
redis:
host: localhost
port: 6379
# password: root # 根據需要
# 連接超時時間(毫秒)
timeout: 10000
# Redis默認情況下有16個分片,這里配置具體使用的分片,默認是0
database: 0
lettuce:
pool:
# 連接池最大連接數(使用負值表示沒有限制) 默認 8
max-active: 8
# 連接池最大阻塞等待時間(使用負值表示沒有限制) 默認 -1
max-wait: -1
# 連接池中的最大空閑連接 默認 8
max-idle: 8
# 連接池中的最小空閑連接 默認 0
min-idle: 0
(3)RedisTemplate配置
public class RedisCacheAutoConfiguration {
@Bean
public RedisTemplate<String, Serializable>
redisCacheTemplate(LettuceConnectionFactory redisConnectionFactory){
RedisTemplate<String, Serializable> template = new RedisTemplate<>();
//設置key序列化方式,StringRedisSerializer的序列化方式
template.setKeySerializer(new StringRedisSerializer());
//設置value序列化方式,序列化為json
template.setValueSerializer(new GenericJackson2JsonRedisSerializer());
//設置連接池
template.setConnectionFactory(redisConnectionFactory);
return template;
}
}
(4)使用Redis
聲明RedisTemplate
@Autowired
private RedisTemplate redisTemplate;
Redis操作代碼
String akey = "akey";
if(redisTemplate.hasKey(akey)){
redisTemplate.delete(akey);
}
redisTemplate.opsForValue().set(key, "am");
Object value = redisTemplate.opsForValue().get(akey);
啟動redis服務端,啟動可視化工具並連接到redis
3.3 Redis操作命令
(1)對value操作的命令
(2)對String操作的命令
(3)對List操作的命令
(4)對Set操作的命令
(5)對Zset操作的命令
(6)對Hash操作的命令
(7)持久化操作命令
(8)遠程服務控制命令
詳見:Redis中文官網命令手冊
4 Redis與中間件
Redis中文官網的首頁這么寫到
—— Redis可以用作數據庫、緩存和消息中間件。
4.1 中間件
百度百科是這么定義中間件的:
中間件是介於應用系統和系統軟件之間一類軟件,它使用系統軟件所提供的基礎服務(功能),銜接網絡上應用系統各個部分或不同應用,達到資源、功能共享的目的。
中間件是一種獨立的系統軟件服務程序,分布式應用軟件借助這種軟件在不同的技術之間共享資源,中間件位於客戶機服務器的操作系統之上,管理計算資源和網絡通信。
使用中間件,我們能夠達到的效果是:使用這項服務的人,不需要知道底層邏輯的具體實現,就可以直接拿着中間件的結果來用。
顯然,Redis屬於中間件。
4.2 Redis消息中間件
消息中間件關注於數據的發送和接受,利用高效可靠的異步消息傳遞機制進行平台無關的數據交流,並基於數據通信集成分布式系統。
Redis消息隊列通常采用廣播發布及訂閱模式:基於Redis的Pub/Sub機制,此模式允許生產者只生產一次消息,由中間件負責將消息復制到多個消息隊列,每個消息隊列由對應的消費組消費。訂閱者可以通過subscribe向redis server訂閱自己感興趣的消息類型。redis將信息類型稱為通道(channel)。當發布者通過publish命令向redis server發送特定類型的信息時,訂閱該消息類型的全部訂閱者都會收到此消息。
Redis的Pub/Sub實現:
(1)啟動Redis服務器
(2)啟動客戶端,訂閱am頻道
(3)啟動另一客戶端,向服務器推送am頻道的信息
此時,訂閱了am頻道的客戶端接收到了信息
5 參考
[1] 馬豫星. Redis數據庫特性分析[J]. 物聯網技術, 2015(3):105-106.
[2] 曾超宇,李金香. Redis在高速緩存系統中的應用[J]. 微型機與應用, 2013, 32(12):11-13.
[3] 楊雪嬋.針對Redis主從復制[J]. 網絡安全和信息化. 2017(03)
[4] Xhan. Redis學習筆記之持久化[EP/OL]. 2011-02-07.