[TOC]
# Redis 簡介
- Redis 支持數據的持久化,可以將內存中的數據保存在磁盤中,重啟的時候可以再次加載進行使用。
- Redis 不僅僅支持簡單的 key-value 類型的數據,同時還提供 list,set,zset,hash 等數據結構的存儲。
- Redis 支持數據的備份,即 master-slave 模式的數據備份。
優勢:
- 性能極高?– Redis 能讀的速度是110000 次/s,寫的速度是 81000次/s 。
- 豐富的數據類型 – Redis 支持二進制案例的 Strings, Lists, Hashes, Sets 及 Ordered Sets 數據類型操作。
- 原子 – Redis 的所有操作都是原子性的,意思就是要么成功執行要么失敗完全不執行。單個操作是原子性的。多個操作也支持事務,即原子性,通過 MULTI 和 EXEC 指令包起來。
- 豐富的特性?– Redis 還支持 publish/subscribe, 通知, key 過期等等特性。
## 配置
可以通過修改 redis.conf 文件或使用`CONFIG set`命令來修改配置。
```shell
redis 127.0.0.1:6379> CONFIG SET loglevel "notice"
```
## 數據類型
Redis 支持五種數據類型:string(字符串),hash(哈希),list(列表),set(集合)及 zset(sorted set:有序集合)
<span style="font-size:20px;">字符串</span>
```shell
redis 127.0.0.1:6379> SET name "runoob"
OK
redis 127.0.0.1:6379> GET name
"runoob"
```
使用`GET`和`SET`命令可以獲取和設置鍵值對
<span style="font-size:20px;">哈希</span>
```shell
redis 127.0.0.1:6379> DEL runoob
redis 127.0.0.1:6379> HMSET runoob field1 "Hello" field2 "World"
"OK"
redis 127.0.0.1:6379> HGET runoob field1
"Hello"
redis 127.0.0.1:6379> HGET runoob field2
"World"
```
Redis hash 是一個鍵值 key=>value 對集合。
Redis hash 是一個 string 類型的 field 和 value 的映射表,hash 特別適合用于存儲對象。
使用 `HMSET`, `HGET`命令,`HMSET`設置了兩個 field=>value 對, `HGET`獲取對應 field 對應的 value
<span style="font-size:20px;">列表</span>
Redis 列表是簡單的字符串列表,按照插入順序排序。你可以添加一個元素到列表的頭部(左邊)或者尾部(右邊)。
```shell
redis 127.0.0.1:6379> DEL runoob
redis 127.0.0.1:6379> lpush runoob redis
(integer) 1
redis 127.0.0.1:6379> lpush runoob mongodb
(integer) 2
redis 127.0.0.1:6379> lpush runoob rabitmq
(integer) 3
redis 127.0.0.1:6379> lrange runoob 0 10
1) "rabitmq"
2) "mongodb"
3) "redis"
redis 127.0.0.1:6379>
```
`lpush? name? value`在 key 對應 list 的頭部添加字符串元素
`rpush? name? value`在 key 對應 list 的尾部添加字符串元素
`lrem name? index`key 對應 list 中刪除 count 個和 value 相同的元素
`llen name`返回 key 對應 list 的長度
<span style="font-size:20px;">集合</span>
```shell
redis 127.0.0.1:6379> DEL runoob
redis 127.0.0.1:6379> sadd runoob redis
(integer) 1
redis 127.0.0.1:6379> sadd runoob mongodb
(integer) 1
redis 127.0.0.1:6379> sadd runoob rabitmq
(integer) 1
redis 127.0.0.1:6379> sadd runoob rabitmq
(integer) 0
redis 127.0.0.1:6379> smembers runoob
1) "redis"
2) "rabitmq"
3) "mongodb"
```
`sadd key member`添加一個 string 元素到 key 對應的 set 集合中,成功返回1,如果元素已經在集合中返回 0,如果 key 對應的 set 不存在則返回錯誤
`smembers runoob`列出集合中的元素
<span style="font-size:20px;">有序集合</span>
```shell
redis 127.0.0.1:6379> DEL runoob
redis 127.0.0.1:6379> zadd runoob 0 redis
(integer) 1
redis 127.0.0.1:6379> zadd runoob 0 mongodb
(integer) 1
redis 127.0.0.1:6379> zadd runoob 0 rabitmq
(integer) 1
redis 127.0.0.1:6379> zadd runoob 0 rabitmq
(integer) 0
redis 127.0.0.1:6379> > ZRANGEBYSCORE runoob 0 1000
1) "mongodb"
2) "rabitmq"
3) "redis"
```
`zadd key score member `添加元素到集合,元素在集合中存在則更新對應 score
Redis zset 和 set 一樣也是 string 類型元素的集合,且不允許重復的成員。
不同的是每個元素都會關聯一個 double 類型的分數。redis 正是通過分數來為集合中的成員進行從小到大的排序。
zset 的成員是唯一的,但分數 score 卻可以重復。
## 常用命令
`Keys pattern` 查找所有符合給定模式 pattern 的 key , * 表示匹配所有
`EXISTS key`檢查給定的 key 是否存在
`EXPIRE key seconds`為給定 key 設置過期時間,以秒計
`DEL key`該命令用于在 key 存在時刪除 key
*****
`SET key value`設置指定 key 的值
`GET key`獲取指定 key 的值
## questions
<span style="font-size:18px;">什么是 Redis 持久化?Redis 有哪幾種持久化方式?優缺點是什么?</span>
持久化就是把內存的數據寫到磁盤中去,防止服務宕機了內存數據丟失。
Redis 提供了兩種持久化方式:RDB(默認)?和 AOF
RDB 是 Redis DataBase 縮寫
核心函數:
- `rdbSave` 生成 RDB 文件
- `rdbLoad` 從文件加載內存

AOF 是 Append-only file 縮寫
每當執行服務器(定時)任務或者函數時 flushAppendOnlyFile?函數都會被調用, 這個函數執行以下兩個工作
- WRITE:根據條件,將?aof\_buf?中的緩存寫入到 AOF 文件
- SAVE:根據條件,調用?fsync?或?fdatasync?函數,將 AOF 文件保存到磁盤中。

**比較**:
1、aof 文件比 rdb 更新頻率高,優先使用 aof 還原數據。
2、aof 比 rdb 更安全也更大
3、rdb 性能比 aof 好
4、如果兩個都配了優先加載 AOF
<span style="font-size:18px;">Redis 有哪些架構模式?</span>

特點:簡單
問題:內存容量有限、處理能力有限、無法高可用
<span style="font-size:18px;">什么是緩存穿透?如何避免?什么是緩存雪崩?何如避免?</span>
- 緩存穿透
一般的緩存系統,都是按照 key 去緩存查詢,如果不存在對應的 value,就應該去后端系統查找(比如 DB)。一些惡意的請求會故意查詢不存在的 key,請求量很大,就會對后端系統造成很大的壓力。這就叫做緩存穿透。
如何避免?
1:對查詢結果為空的情況也進行緩存,緩存時間設置短一點,或者該 key 對應的數據 insert 了之后清理緩存。
2:對一定不存在的 key 進行過濾。可以把所有的可能存在的 key 放到一個大的 Bitmap 中,查詢時通過該 bitmap 過濾。
- 緩存雪崩
當緩存服務器重啟或者大量緩存集中在某一個時間段失效,這樣在失效的時候,會給后端系統帶來很大壓力。導致系統崩潰。
如何避免?
1:在緩存失效后,通過加鎖或者隊列來控制讀數據庫寫緩存的線程數量。比如對某個 key 只允許一個線程查詢數據和寫緩存,其他線程等待。
2:做二級緩存,A1 為原始緩存,A2 為拷貝緩存,A1 失效時,可以訪問 A2,A1 緩存失效時間設置為短期,A2 設置為長期
3:不同的 key,設置不同的過期時間,讓緩存失效的時間點盡量均勻。
# 參考鏈接
[https://www.cnblogs.com/jasontec/p/9699242.html](https://www.cnblogs.com/jasontec/p/9699242.html)
[https://www.runoob.com/redis/redis-pub-sub.html](https://www.runoob.com/redis/redis-pub-sub.html)
- 序言 & 更新日志
- H5
- Canvas
- 序言
- Part1-直線、矩形、多邊形
- Part2-曲線圖形
- Part3-線條操作
- Part4-文本操作
- Part5-圖像操作
- Part6-變形操作
- Part7-像素操作
- Part8-漸變與陰影
- Part9-路徑與狀態
- Part10-物理動畫
- Part11-邊界檢測
- Part12-碰撞檢測
- Part13-用戶交互
- Part14-高級動畫
- CSS
- SCSS
- codePen
- 速查表
- 面試題
- 《CSS Secrets》
- SVG
- 移動端適配
- 濾鏡(filter)的使用
- JS
- 基礎概念
- 作用域、作用域鏈、閉包
- this
- 原型與繼承
- 數組、字符串、Map、Set方法整理
- 垃圾回收機制
- DOM
- BOM
- 事件循環
- 嚴格模式
- 正則表達式
- ES6部分
- 設計模式
- AJAX
- 模塊化
- 讀冴羽博客筆記
- 第一部分總結-深入JS系列
- 第二部分總結-專題系列
- 第三部分總結-ES6系列
- 網絡請求中的數據類型
- 事件
- 表單
- 函數式編程
- Tips
- JS-Coding
- Framework
- Vue
- 書寫規范
- 基礎
- vue-router & vuex
- 深入淺出 Vue
- 響應式原理及其他
- new Vue 發生了什么
- 組件化
- 編譯流程
- Vue Router
- Vuex
- 前端路由的簡單實現
- React
- 基礎
- 書寫規范
- Redux & react-router
- immutable.js
- CSS 管理
- React 16新特性-Fiber 與 Hook
- 《深入淺出React和Redux》筆記
- 前半部分
- 后半部分
- react-transition-group
- Vue 與 React 的對比
- 工程化與架構
- Hybird
- React Native
- 新手上路
- 內置組件
- 常用插件
- 問題記錄
- Echarts
- 基礎
- Electron
- 序言
- 配置 Electron 開發環境 & 基礎概念
- React + TypeScript 仿 Antd
- TypeScript 基礎
- React + ts
- 樣式設計
- 組件測試
- 圖標解決方案
- Storybook 的使用
- Input 組件
- 在線 mock server
- 打包與發布
- Algorithm
- 排序算法及常見問題
- 劍指 offer
- 動態規劃
- DataStruct
- 概述
- 樹
- 鏈表
- Network
- Performance
- Webpack
- PWA
- Browser
- Safety
- 微信小程序
- mpvue 課程實戰記錄
- 服務器
- 操作系統基礎知識
- Linux
- Nginx
- redis
- node.js
- 基礎及原生模塊
- express框架
- node.js操作數據庫
- 《深入淺出 node.js》筆記
- 前半部分
- 后半部分
- 數據庫
- SQL
- 面試題收集
- 智力題
- 面試題精選1
- 面試題精選2
- 問答篇
- 2025面試題收集
- Other
- markdown 書寫
- Git
- LaTex 常用命令
- Bugs