---
# System prepended metadata

title: Redis學習散記

---

# Redis學習散記
<!--**2024/7/2 : 加上一些額外的學習心得**-->

## Redis的五種資料型態
### 1. Key: 
使用起來原則跟memcached相同，key-value架構

    適用design pattern: 
    * 緩存模式 (Caching Pattern)：存儲簡單的鍵值對數據。
    * 計數器模式 (Counter Pattern)：使用INCR和DECR命令實現高效的計數器。
    * 分佈式鎖 (Distributed Lock)：使用SETNX命令實現簡單的分佈式鎖。


***example:***
```
redis 127.0.0.1:6379> SET runoobkey redis
OK
redis 127.0.0.1:6379> DEL runoobkey
(integer) 1
```
### 2. List: 
相同使用key值，但可以如同陣列一樣順序性的放東西進去

> 一个列表最多可以包含 232 - 1 个元素 (4294967295, 每个列表超过40亿个元素)。

    適用design pattern: 
    * 生產者-消費者模式 (Producer-Consumer Pattern)：實現消息隊列。
    * 發布-訂閱模式 (Publish-Subscribe Pattern)：實現一個簡單的消息發布系統。
    * 最新N個項目模式 (Latest N Items Pattern)：保存最新的N條數據，如最新評論。
    
***example:***
```
redis 127.0.0.1:6379> LPUSH runoobkey redis
(integer) 1
redis 127.0.0.1:6379> LPUSH runoobkey mongodb
(integer) 2
redis 127.0.0.1:6379> LPUSH runoobkey mysql
(integer) 3
redis 127.0.0.1:6379> LRANGE runoobkey 0 10

1) "mysql"
2) "mongodb"
3) "redis"
```
### 3.Set: 
有點像是List，但是插入的字串，是沒有順序性的，且成員是唯一的，不可以出現重複
> 集合中最大的成员数为 232 - 1 (4294967295, 每个集合可存储40多亿个成员)。

    適用design pattern: 
    * 標籤系統 (Tagging System)：管理和查詢標籤。
    * 唯一訪客統計 (Unique Visitor Tracking)：記錄唯一訪客。
    * 黑名單/白名單模式 (Blacklist/Whitelist Pattern)：管理特定的用戶群。
    * 社交圖譜 (Social Graph)：管理用戶關係，如好友、粉絲等。
    
***example:***

```
redis 127.0.0.1:6379> SADD runoobkey redis
(integer) 1
redis 127.0.0.1:6379> SADD runoobkey mongodb
(integer) 1
redis 127.0.0.1:6379> SADD runoobkey mysql
(integer) 1
redis 127.0.0.1:6379> SADD runoobkey mysql
(integer) 0
redis 127.0.0.1:6379> SMEMBERS runoobkey

1) "mysql"
2) "mongodb"
3) "redis"
```

### 4.Sorted Set: 
顧名思義跟Set有同樣的特性，差別是每個內容都有一個double型態的分數，用來作為排序

    適用design pattern: 
    * 排行榜模式 (Leaderboard Pattern)：實現高效的排名系統。
    * 優先級隊列模式 (Priority Queue Pattern)：根據優先級處理任務。
    * 延遲隊列模式 (Delayed Queue Pattern)：實現定時任務或延遲執行。
    * 地理位置索引 (Geospatial Indexing)：存儲和查詢地理位置信息。
    
    
***example:***
```
redis 127.0.0.1:6379> ZADD runoobkey 1 redis
(integer) 1
redis 127.0.0.1:6379> ZADD runoobkey 2 mongodb
(integer) 1
redis 127.0.0.1:6379> ZADD runoobkey 3 mysql
(integer) 1
redis 127.0.0.1:6379> ZADD runoobkey 3 mysql
(integer) 0
redis 127.0.0.1:6379> ZADD runoobkey 4 mysql
(integer) 0
redis 127.0.0.1:6379> ZRANGE runoobkey 0 10 WITHSCORES

1) "redis"
2) "1"
3) "mongodb"
4) "2"
5) "mysql"
6) "4"
```



### 5.Hash
類似python中的dictionary或javascript的object的資料結構，用來存特定對象的多樣屬性，看example可以理解 (假設我們有一個用戶信息的 hash)
> Redis 中每个 hash 可以存储 232 - 1 键值对（40多亿）。

    適用design pattern: 
    * 對象緩存模式 (Object Caching Pattern)：緩存複雜對象，如用戶信息。
    * 短URL系統 (URL Shortener)：存儲URL映射。
    * 會話存儲 (Session Storage)：管理用戶會話數據。
    * 配置管理 (Configuration Management)：存儲和管理應用配置。


***example:***
```
HSET user:1001 name "Alice"
HSET user:1001 age 30
HSET user:1001 email "alice@example.com"

HGET user:1001 name       # 返回 "Alice"
HGET user:1001 age        # 返回 "30"
HGETALL user:1001         # 返回所有鍵值對
```

<!--
---
連上
redis-cli -h {URL of AWS elastic cache}} -p 6379

這裡有一些跟Redis列表(list)相關的指令:
- 確認list裡面目前有多少數量的工作
LLEN key
- 直接幹掉整個Key
DEL key

---
# supervisor的安裝/使用/貓逆
下指令supervisord或 service supervisor start如果出現如下
```
Starting supervisor: Error: Another program is already listening on a port that one of our HTTP servers is configured to use.  Shut this program down first before starting supervisord.
For help, use /usr/bin/supervisord -h
```

則使用
`sudo unlink /var/run/supervisor.sock`
可以參考這裡的說明
https://stackoverflow.com/questions/25121838/supervisor-on-debian-wheezy-another-program-is-already-listening-on-a-port-that

在ubuntu 上面的安裝步驟for php 7.4
sudo apt-get update
sudo apt-get install -y php7.4-redis
sudo phpenmod -v 7.4 redis
sudo systemctl restart apache2  # 如果使用 Apache
sudo systemctl restart php7.4-fpm  # 如果使用 PHP-FPM

-->
