發布時間:2024-01-24閱讀(12)

Redis 是一個速度非常快的非關系型數據庫(non-relational database)/ NoSQL 數據庫。
Redis 不使用表,也不會預定義或者強制去要求用戶對 Redis 存儲不同的數據進行關聯。
Redis 為什么速度非常快?
Redis 存儲鍵(key)和 5 種不同類型的值(value)之間的映射。這 5 中類型分別為:
STRING(字符串)、LIST(列表)、HASH(散列)、SET(集合)和 ZSET(有序集合)。

1. STRING(字符串)
字符串示例,鍵為 hello,值為 world:
①. 字符串命令:

②. 使用
127.0.0.1:6379> set hello worldOK127.0.0.1:6379> get hello"world"127.0.0.1:6379> del hello(integer) 1127.0.0.1:6379> get hello(nil)
127.0.0.1:6379> set num 1OK127.0.0.1:6379> incr num(integer) 2127.0.0.1:6379> get num"2"
2. LIST(列表)
list-key 是一個包含 3 個元素的列表鍵,列表中的元素是可以重復的:
①. 列表命令

②. 使用
127.0.0.1:6379> rpush list-key item(integer) 1127.0.0.1:6379> rpush list-key item2(integer) 2127.0.0.1:6379> rpush list-key item(integer) 3 # 返回的列表長度
127.0.0.1:6379> lrange list-key 0 -11) "item"2) "item2"3) "item"# 使用 0 為范圍的開始索引,-1 為范圍索引的結束索引,可以去除列表包含的所有元素127.0.0.1:6379> lindex list-key 1"item2"
127.0.0.1:6379> lpop list-key"item"127.0.0.1:6379> lrange list-key 0 -11) "item2"2) "item"
3. HASH(散列)
hash-key 是一個包含兩個鍵值對的散列鍵:
①. 散列命令

②. 使用
127.0.0.1:6379> hset hash-key sub-key1 value1(integer) 1127.0.0.1:6379> hset hash-key sub-key2 value2(integer) 1127.0.0.1:6379> hset hash-key sub-key1 value2(integer) 0127.0.0.1:6379> hgetall hash-key1) "sub-key1"2) "value2"3) "sub-key2"4) "value2"
127.0.0.1:6379> hdel hash-key sub-key2(integer) 1127.0.0.1:6379> hdel hash-key sub-key2(integer) 0127.0.0.1:6379> hget hash-key sub-key1"value2"127.0.0.1:6379> hgetall hash-key1) "sub-key1"2) "value2"
4. SET(集合)
set-key 是一個包含 3 個元素的集合鍵:
①. 集合命令

②. 使用
127.0.0.1:6379> sadd set-key item(integer) 1127.0.0.1:6379> sadd set-key item2(integer) 1127.0.0.1:6379> sadd set-key item3(integer) 1127.0.0.1:6379> sadd set-key item(integer) 0127.0.0.1:6379> smembers set-key1) "item"2) "item3"3) "item2"
127.0.0.1:6379> sismember set-key item4(integer) 0127.0.0.1:6379> sismember set-key item(integer) 1
127.0.0.1:6379> srem set-key item(integer) 1127.0.0.1:6379> srem set-key item(integer) 0127.0.0.1:6379> smembers set-key1) "item3"2) "item2"
5. ZSET(有序集合)
zset-key 是已一個包含 2 個元素的有序集合鍵:
①. 有序集合命令:

②. 使用
127.0.0.1:6379> zadd zset-key 728 member1(integer) 1127.0.0.1:6379> zadd zset-key 982 member2(integer) 1127.0.0.1:6379> zadd zset-key 982 member2(integer) 0127.0.0.1:6379> zrange zset-key 0 -1 withscores1) "member1"2) "728"3) "member2"4) "982"
127.0.0.1:6379> zrangebyscore zset-key 0 800 withscores1) "member1"2) "728"
127.0.0.1:6379> zrem zset-key member1(integer) 1127.0.0.1:6379> zrem zset-key member1(integer) 0127.0.0.1:6379> zrange zset-key 0 -1 withscores1) "member2"2) "982"
兩者都是非關系型內存鍵值數據庫,主要有以下不同:
1. 數據類型
2. 數據持久化
3. 分布式
4. 內存管理機制
5. 線程模型
Redis 是內存型數據庫,為了保證數據斷電后不丟失,需要將內存中的數據持久化到磁盤上;另一方面,保存中間結果,不必重新計算。
持久化有 2 種:
Redis 提供的持久化配置選項:
# 快照持久化save 60 1000stop-writes-on-bgsave-error yesrdbcompression no# AOF 持久化appendonly yesappendfsync always # 同步選項auto-aof-rewrite-percentage 100auto-aof-rewrite-min-size 64mb# 共享選項,決定了快照文件和 AOF 文件的保存位置dir ./
1. 快照持久化
快照持久化是通過創建快照來獲得 Redis 存儲在內存中數據在某個時間點上的副本。在創建快照后,用戶可對快照備份,可將快照留在原地以便重啟 Redis 時使用。
①. 快照持久化配置
save 60 10000 # 在60秒(1分鐘)之后,如果至少有10000個鍵發生變化,Redis 就會自動觸發 BGSAVE 命令創建快照。stop-writes-on-bgsave-error yes # 表示備份進程出錯的時候,主進程就停止接收新的寫入操作,是為了保護持久化數據的一致性。rdbcompression no# RDB 的壓縮設置為 no,因為壓縮會占用更多的 CPU 資源。
②. 創建快照的方法
save 60 10000# 從 redis 最近一次創建快照之后算起,滿足 “60 s 內 10000 次寫入”,Redis 會自動觸發 BGSAVE 命令
③. 存在的問題
2. AOF 持久化
AOF 持久化將被執行的寫命令寫到 AOF 文件末尾,記錄數據發生的變化。Redis 值要從頭到尾重新執行一次 AOF
文件包含的所有寫命令,就可恢復 AOF 文件所記錄的數據。
默認情況下,Redis 沒有開啟 AOF(append only file)方式的持久化,可以通過 appendonly 參數開啟:
appendonly yes
①. 快照持久化配置
appendonly yesappendfsync always # 同步選項auto-aof-rewrite-percentage 100 auto-aof-rewrite-min-size 64mb
②. 同步選項
使用 AOF 持久化需要設置同步選項,從而確保寫命令什么時候會同步到磁盤文件上。

3. 重寫 / 壓縮 AOF 文件
AOF 持久化存在的問題:
為了解決 AOF 文件不斷增大的問題,我們采用重寫 / 壓縮 AOF 文件的方式:
用戶 Redis 發送 BGREWRITEAOF 命令,通過移除 AOF 文件中冗余命令來重寫 AOF 文件來減小 AOF 文件的體積。
(新的 AOF 文件和原有的 AOF 文件所保存的數據狀態是一致的,但是體積更小)。
BGREWRITEAOF 原理:

Redis 維護 AOF 重寫緩沖區和 AOF 緩沖區。子進程創建新的 AOF 文件期間,記錄服務器執行的所有寫命令會同時寫入 2 個緩沖區中,使得新舊兩個 AOF 文件中所保存的數據狀態一致。
4. 對比

5. 優化
Redis 4.0 以后將快照和 AOF 混合持久化(默認關閉,使用 aof-user-rdb-preamble開啟),AOF 重寫時將快照寫入 AOF 文件開頭。
這樣做的好處是可以結合 RDB 和 AOF 的優點, 快速加載同時避免丟失過多的數據,當然缺點也是有的, AOF 里面的 RDB 部分是壓縮格式不再是 AOF 格式,可讀性較差。
五. Redis事務1. 命令
2. 簡述
Redis 通過 MULTI、EXEC、WATCH 等命令來實現事務功能。
事務提供了一種將多個命令請求打包,然后一次性、按順序地執行多個命令的機制。服務器在執行事務期間,不會改去執行其它客戶端的命令請求,它會將事務中的所有命令都執行完畢,然后才去處理其他客戶端的命令請求。
事務中的多個命令被一次性發送給服務器,而不是一條一條發送,這種方式被稱為pipeline。
注意:


1. 什么是Redis?簡述它的優缺點?
Redis的全稱是:Remote Dictionary.Server,本質上是一個Key-Value類型的內存數據庫,很像 memcached,整個數據庫統統加載在內存當中進行操作,定期通過異步操作把數據庫數據flush到硬盤 上進行保存。
因為是純內存操作,Redis的性能非常出色,每秒可以處理超過 10萬次讀寫操作,是已知性能最快的 Key-Value DB。
Redis的出色之處不僅僅是性能,Redis最大的魅力是支持保存多種數據結構,此外單個value的最大限 制是1GB,不像 memcached只能保存1MB的數據,因此Redis可以用來實現很多有用的功能。
比方說用他的List來做FIFO雙向鏈表,實現一個輕量級的高性 能消息隊列服務,用他的Set可以做高 性能的tag系統等等。
另外Redis也可以對存入的Key-Value設置expire時間,因此也可以被當作一 個功能加強版的 memcached來用。 Redis的主要缺點是數據庫容量受到物理內存的限制,不能用作海量數據的高性能 讀寫,因此Redis適合的場景主要局限在較小數據量的高性能操作和運算上。
2. Redis與memcached相比有哪些優勢?
3. Redis支持哪幾種數據類型?
String、List、Set、Sorted Set、hashes
4. Redis主要消耗什么物理資源?
內存。
5. Redis有哪幾種數據淘汰策略?
6. Redis官方為什么不提供Windows版本?
因為目前Linux版本已經相當穩定,而且用戶量很大,無需開發windows版本,反而會帶來兼容性等問 題。
7. 一個字符串類型的值能存儲最大容量是多少?
512M
8. 為什么Redis需要把所有數據放到內存中?
Redis為了達到最快的讀寫速度將數據都讀到內存中,并通過異步的方式將數據寫入磁盤。 所以redis具有快速和數據持久化的特征,如果不將數據放在內存中,磁盤I/O速度為嚴重影響redis的 性能。 在內存越來越便宜的今天,redis將會越來越受歡迎, 如果設置了最大使用的內存,則數據已有記錄數達 到內存限值后不能繼續插入新值。
9. Redis集群方案應該怎么做?都有哪些方案?
10. Redis集群方案什么情況下會導致整個集群不可用?
有A,B,C三個節點的集群,在沒有復制模型的情況下,如果節點B失敗了,那么整個集群就會以為缺少 5501-11000這個范圍的槽而不可用。
11. Redis有哪些適合的場景?

歡迎分享轉載→http://www.avcorse.com/read-255572.html
Copyright ? 2024 有趣生活 All Rights Reserve吉ICP備19000289號-5 TXT地圖HTML地圖XML地圖