---
# System prepended metadata

title: Redis
tags: [GCP]

---

---
title: Redis # 簡報的名稱
tags: GCP   # 簡報的標籤
---

Redis
===

> [name=佩穎]
> [time=MON, JAN 20, 2021 15:00 PM]

---

## Agenda

* 簡介
* 特性
* 資料型別
* GCP Memorystore
* 可視化的客戶端
* 實際操作

---

## 簡介
* 全名REmote DIctionary Server，簡稱Redis
* Redis採用的是基於記憶體的是單程序單執行緒模型的 KV 資料庫，由C語言編寫
* 提供多語言的API

----

## 起源 
* 2008年意大利一家創業公司Merzia的創始人Salvatore Sanfilippo為了避免MySQL的低性能而做一個數據庫，並於2009年開發完成了Redis的最初版本。

---

## 特性

- Redis不僅僅支持簡單的鍵值類型的數據，同時還提供list，set，zset，hash等數據結構的存儲。
- Redis支持數據的備份，即master-slave模式的數據備份。
- 持久化儲存是將 Redis 儲存在記憶體中的資料儲存在硬碟中，重啟的時候可以再次加載進行使用。

----

## 相同類型比較
| - | REDIS | Memcache |
| --------  | -------- | -------- |
| 讀寫分    | 有     | 無     |
| 執行緒    | 單     | 多     |
| 持久性    | 有     | 無     |
| 備份/還原 | 有     | 無     |
| 資料型態  | 多     | 單一    |

----

## 優勢
* 每秒可執行大約110000次的設置(SET)操作，每秒大約可執行81000次的讀取/獲取(GET)操作。
* 操作具有原子性 - 所有Redis操作都是原子操作，這確保如果兩個客戶端併發訪問，Redis服務器能接收更新的值。

---

![](https://i.imgur.com/XUwn6wZ.png)

----

## Redis持久性
* RDB持久性按指定的時間間隔執行數據集的時間點快照。
* AOF(Append-only file)持久性會記錄服務器接收的每個寫入操作，這些操作將在服務器啟動時再次播放，以重建原始數據集。

|  | RDB | AOF |
| -------- | -------- | -------- |
|安全性     | 低    | 高     |
| 效能     | 高     | 低     |
| 優先權     | 低     | 高     |

---

## Redis常用資料型別

* 字串String 
常用命令:  set,get,decr,incr,mget 等 encoding可以是raw或者是int
* 雜湊/雜湊Hash 
常用命令：hget,hset,hgetall 等 encoding為zipmap、ht(序列化/反序列化、map)
* 列表List 
常用命令：lpush,rpush,lpop,rpop,lrange等 (雙向連結串列，即可以支援反向查詢和遍歷、佇列)

---

## Redis常用資料型別
* 集合Set 
常用命令：sadd,spop,smembers,sunion 等 (交集、並集、差集 快速排重)
* 可排序集合Sorted set 
常用命令：zadd,zrange,zrem,zcard等 (有序的 權重)

---

![](https://i.imgur.com/NIXflE6.png)

---

## Redis壓力測試工具benchmark

```
redis-benchmark [option] [option value]
```

----

## 健康指標
| 健康指標| |
| -------- | -------- |
| 存活情況 | ping |
| 連接數 | redis-cli info Clients | grep connected_clients  |
| 阻塞客户端數量 | blocked_clients |
| 使用内存峰值 | maxmemory |
| 内存碎片率 | mem_fragmentation_ratio=used_memory_rss/used_memory|
| 缓存命中率 |keyspace_misses/keyspace_hits|
| OPS |instantaneous_ops_per_sec|
| 持久化 |instantaneous_ops_per_sec|rdb_last_bgsave_status/aof_last_bgrewrite_status
| 失效KEY |redis-cli info Keyspace
| 慢日志 |slowlog get

---

## Memorystore Redis
建立redis instances
```=
gcloud redis instances create myredis --size=1 --region=asia-east1 --project=iamrich-lab \
  --network=projects/iamrich-lab/global/networks/default \
  --connect-mode=private-service-access
```

----

## 執行個體層級
![](https://i.imgur.com/S4PiRmx.png)

[連結](https://cloud.google.com/memorystore/docs/redis/redis-tiers)
區域與分區 是選擇與您的 後端服務 相同地區為優先。才不會變成跨地域性、增加耗時的存取 Redis 服務。

---

## 計價成本
[連結](https://cloud.google.com/memorystore/pricing?hl=zh-tw)

----

## 連線Memorystore Redis
```=
redis-cli -h 10.117.96.3
```
![](https://i.imgur.com/JzUcoO5.png)

---

## redis-commander可視化的客戶端
```=
docker run --rm --name redis-commander -d \
  --env REDIS_HOSTS=172.24.241.165 \
  -p 8081:8081 \
  rediscommander/redis-commander:latest
  
gcloud compute ssh redis-forwarder --zone asia-east1-b -- -N -L 6380:10.117.96.11:6379 
```

----

![](https://i.imgur.com/wgvKIpQ.png)

---

# 實際操作

---

[參考](https://www.itread01.com/content/1546849564.html)
https://redis.io/commands
https://kknews.cc/code/vlao8nq.html
https://kknews.cc/code/5xaa592.html
https://github.com/joeferner/redis-commander