redis 數(shù)據(jù)庫的使用

django-redis 中文文檔
django-redis 基于 BSD 許可, 是一個使 Django 支持 Redis cache/session 后端的全功能組件
Django 使用 django-redis 作為緩存的正確用法
菜鳥redis 教程

純靜態(tài)頁面
讀取了數(shù)據(jù)庫信息搭独,但是不經(jīng)常變動的頁面,比如文章熱門排行榜,這個調(diào)用數(shù)據(jù)庫信息并且還要排序的完全可以使用緩存,因為不需要實時展現(xiàn)最新的
HTML 的片段,比如整個頁面都經(jīng)常變動薄疚,但是有個側(cè)邊欄不經(jīng)常變動,就可以緩存?zhèn)冗厵?br> 需要使用復(fù)雜邏輯生成的 HTML 片段,使用緩存可以減少多次重復(fù)操作

因為緩存直接是從內(nèi)存讀取瘾境,極大的節(jié)省時間,另外也可以對于復(fù)雜數(shù)據(jù)生成可以做到每隔比如十分鐘更新一次镰惦,如果每次請求都運行計算迷守,那么后臺有可能直接卡掉了。這一點可以用在抖音視頻接口上旺入,比如由用戶刷新兑凿,改為后臺刷新。返回地址讀完后再重新請求茵瘾,這個要好好搞一下

redis 優(yōu)勢

  • 性能極高 – Redis能讀的速度是110000次/s,寫的速度是81000次/s
  • 豐富的數(shù)據(jù)類型 – Redis支持二進制案例的 Strings, Lists, Hashes, Sets 及 Ordered Sets 數(shù)據(jù)類型操作
  • 豐富的特性 – Redis還支持 publish/subscribe, 通知, key 過期等等特性
  • Redis運行在內(nèi)存中但是可以持久化到磁盤礼华,所以在對不同數(shù)據(jù)集進行高速讀寫時需要權(quán)衡內(nèi)存,因為數(shù)據(jù)量不能大于硬件內(nèi)存

安裝忽略

Redis 配置

Redis 的配置文件位于 Redis 安裝目錄下拗秘,文件名為 redis.conf(Windows 名為 redis.windows.conf)

查看和設(shè)置 redis 配置 項:

命令 CONFIG

  • 查看配置項: CONFIG get
redis 127.0.0.1:6379> CONFIG GET loglevel

1) "loglevel"
2) "notice"
redis 127.0.0.1:6379> CONFIG GET *  # 查看所有配置項
  1) "dbfilename"
  2) "dump.rdb"
  3) "requirepass"
  4) ""
  5) "masterauth"
  6) ""
# 注意 一行是 名稱圣絮,一行是對應(yīng)的值

  • 編輯配置
    CONFIG set
    格式:
    CONFIG SET 配置項名 值
CONFIG SET  loglevel   "notice"
配置參數(shù)說明
daemonize no  # 使用 yes 啟用守護進程,windows 只能為 no
(ps 守護進程,啟動shell  關(guān)閉雕旨,啟動的服務(wù)依然會后臺運行)
pidfile /var/run/redis.pid   # Redis 以守護進程方式運行   pid 寫入 的文件
port 6379   # 監(jiān)聽端口
bind 127.0.0.1    #     綁定的主機地址 
timeout 300        # 客戶端閑置多久關(guān)閉連接 扮匠,如果指定為 0,表示關(guān)閉該功能
loglevel notice  # 日志級別  凡涩,支持四個級別:debug棒搜、verbose、notice活箕、warning力麸,默認(rèn)為 notice
logfile stdout  # 日志輸出,默認(rèn)為控制臺育韩, 守護進程運行克蚂,則日志將會發(fā)送給 /dev/null
databases 16   # 設(shè)置數(shù)據(jù)庫的數(shù)量,默認(rèn)數(shù)據(jù)庫為0座慰,可以使用SELECT 命令在連接上指定數(shù)據(jù)庫id
save <seconds> <changes>  # 指定多長時間內(nèi)陨舱,有多少條操作就將數(shù)據(jù)同步到數(shù)據(jù)庫
        Redis 默認(rèn)配置文件中提供了三個條件:
        save 900 1
        save 300 10
        save 60 10000
        分別表示 900 秒(15 分鐘)內(nèi)有 1 個更改,300 秒(5 分鐘)內(nèi)有 10 個                  
        更改以及 60 秒內(nèi)有 10000 個更改版仔。
rdbcompression yes  # 保存到本地數(shù)據(jù)庫是否要進行壓縮游盲,默認(rèn) LZF 壓縮误墓,
                                  # 會增加cpu使用,益缎,不壓縮數(shù)據(jù)會很大谜慌,綜合考慮吧
dbfilename dump.rdb   # 指定本地數(shù)據(jù)庫文件名,默認(rèn)值為 dump.rdb
dir ./                # 本地數(shù)據(jù)庫存放目錄
requirepass foobared  #  設(shè)置 Redis 連接密碼莺奔,
                      #    如果配置了連接密碼   客戶端在連接 Redis 
                      #  時需要通過 AUTH <password> 命令提供密碼欣范,默認(rèn)關(guān)閉
 maxclients 128   # 設(shè)置同一時間最大客戶端連接數(shù)    0 為不限制  同 sokcet `的listen(128)

maxmemory <bytes>   # 指定 Redis 最大內(nèi)存限制,
                    # Redis 在啟動時會把數(shù)據(jù)加載到內(nèi)存中令哟,達到最大內(nèi)存后恼琼,
              #Redis 會先嘗試清除已到期或即將到期的 Key,當(dāng)此方法處理 后屏富,
              #  仍然到達最大內(nèi)存設(shè)置晴竞,將無法再進行寫入操作,但仍然可以進行讀取
              # 操作狠半。Redis 新的 vm 機制噩死,會把 Key 存放內(nèi)存,Value 會存放在 swap 區(qū)
appendonly no  # 指定是否在每次更新操作后進行日志記錄,默認(rèn)不開啟
appendfilename appendonly.aof    # 日志名 默認(rèn)為 appendonly.aof
appendfsync everysec   # 指定更新日志條件神年,共有 3 個可選值:
                       #  no:表示等操作系統(tǒng)進行數(shù)據(jù)緩存同步到磁盤(快)
                       # always:表示每次更新操作后手動調(diào)用 fsync() 將數(shù)據(jù)寫到磁盤(慢已维,安全)
                       # everysec:表示每秒同步一次(折中,默認(rèn)值)
vm-max-threads 4  # 訪問swap文件的線程數(shù)  已日,默認(rèn)為4
include /path/to/local.conf   # 指定包含其它的配置文件垛耳,可以在同一主機上多 
                 # 個Redis實例之間使用同一份配置文件,而同時各個實例又擁有自
                # 己的特定配置文件

redis 數(shù)據(jù)類型

Redis支持五種數(shù)據(jù)類型:string(字符串)飘千,hash(哈希)艾扮,list(列表),set(集合)及zset(sorted set:有序集合)占婉。

  • string
    是redis最基本的類型了,可以包含二進制圖片等數(shù)據(jù)甫恩。(可以認(rèn)為可以包含任何數(shù)據(jù))
    string 類型的值最大能存儲 512MB逆济。
  • Hash(哈希 字典 )
    存儲、讀取磺箕、修改用戶屬性
    Redis hash 是一個鍵值(key=>value)對集合奖慌。特別適合存儲對象數(shù)據(jù)類型
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"

HMSET 設(shè)置了兩個 field=>value 對, HGET 獲取對應(yīng) field 對應(yīng)的 value。
每個hash 存儲的鍵值對是無限制的

  • List(列表 雙向鏈表結(jié)構(gòu))
    1,最新消息排行等功能(比如朋友圈的時間線) 2,消息隊列
    簡單的字符串列表松靡。按照插入順序排列简僧。也可以指定插入頭或尾
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>

列表存儲的數(shù)據(jù)默認(rèn)無限制

  • Set(集合 )
    共同好友 2、利用唯一性,統(tǒng)計訪問網(wǎng)站的所有獨立ip 3雕欺、好友推薦時,根據(jù)tag求交集,大于某個閾值就可以推薦
    set 是字符串的無序集合岛马,
    集合是通過哈希表實現(xiàn) 棉姐,取值復(fù)雜度為 O(1)
    sadd 添加一個set 元素
sadd key member  
# 添加一個 string 元素到 key 對應(yīng)的 set 集合中,
成功返回 1啦逆,如果元素已經(jīng)在集合中返回  0伞矩。并且忽略插入

set 元素個數(shù) 無限制 (無限制即 40 億個 )

  • zset(sorted set:有序集合)
    1、排行榜 2夏志、帶權(quán)重的消息隊列
    基本和set 類似乃坤,元素都不會重復(fù),到那時zset 會對元素進行排序
    zadd 命令 添加一個zset 元素
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"
由于Redis非常輕量級沟蔑,一個空Redis實例占用的內(nèi)在只有1M左右湿诊,所以不用擔(dān)心多個Redis實例會額外占用很多內(nèi)存。

數(shù)據(jù)庫 名為 數(shù)字編號 瘦材,不支持自定義名字
每個數(shù)據(jù)庫對外都是一個從0開始的遞增數(shù)字命名厅须,默認(rèn)連接 0 ,選擇數(shù)據(jù)庫使用 select 如 SELECT 1

Redis 命令

客戶端命令 :

$ redis-cli
連接本地 :

$redis-cli
redis 127.0.0.1:6379>
redis 127.0.0.1:6379> PING

PONG
# 在以上實例中我們連接到本地的 redis 服務(wù)并執(zhí)行 PING 命令宇色,該命令用于檢測 redis 服務(wù)是否啟動九杂。

連接遠程:$ redis-cli -h host -p port -a password

$redis-cli -h 127.0.0.1 -p 6379 -a "mypass"
redis 127.0.0.1:6379>
redis 127.0.0.1:6379> PING

PONG
Redis 鍵(key) 命令

key 命令 用于管理 redis 的key
格式 : COMMAND key_name
如:

redis 127.0.0.1:6379> DEL runoobkey
(integer) 1

如果鍵被刪除成功,命令執(zhí)行后輸出 (integer) 1宣蠕,否則將輸出 (integer) 0

所有命令
DEL key key 存在時例隆,刪除key
DUMP key 序列化給定 key ,并返回被序列化的值抢蚀。
EXISTS key檢查 key 是否存在
EXPIRE key seconds 設(shè)置key 過期時間 秒 計
KEYS pattern 找出所有符合 pattern 的 key
MOVE key db 把key 移到給定的數(shù)據(jù)庫db
PERSIST key 移除key的過期時間
TTL key 返回秒單位的key 剩余過期時間

更多命令參考:
https://redis.io/commands

Redis 字符串命令(String)

SET key value
設(shè)置key 的值
GET key
獲取指定key 的值
GETRANGE key start end
返回 key 對應(yīng)字符串的子字符串
GETSET key value
給 key 設(shè)置指定的值镀层,并且返回舊的值
GETBIT key offset
對字符串的值偏移一定位,然后返回偏移量上的位
MGET key1 [key2..]
獲取一個或多個key 的值
SETBIT key offset value
設(shè)置或清除指定位的值
SETEX key seconds value
將值 value 關(guān)聯(lián)到 key 皿曲,并將 key 的過期時間設(shè)為 seconds (以秒為單位)唱逢。
SETNX key value
key不存在時,設(shè)置key 的值
SETRANGE key offset value
用 value 覆蓋給定key 偏移后面 的值
STRLEN key
獲得key字符傳的長度
MSET key value [key value ...]
同時設(shè)置一個或多個key 對應(yīng)的值
MSETNX key value [key value ...]
同時設(shè)置多個key 的值屋休,當(dāng)key 都不存在 時
PSETEX key milliseconds value
同 SETEX ,只不過是以毫秒為單位
INCR key
key 中存儲的數(shù)字坞古,加1
INCRBY key increment
key 中存儲的值 加上給定的增量值
INCRBYFLOAT key increment
key 中存儲的值 加上給定的增量浮點值
DECR key
將 key 中儲存的數(shù)字值減一。
DECRBY key decrement
key 所儲存的值減去給定的減量值
APPEND key value
如果 key 已經(jīng)存在并且是一個字符串劫樟, APPEND 命令將指定的 value 追加到該 key 原來值(value)的末尾

更多命令請參考:https://redis.io/commands

Redis 哈希(Hash)

Redis hash 是一個 string 類型的 field 和 value 的映射表痪枫,hash 特別適合用于存儲對象。

127.0.0.1:6379>  HMSET runoobkey name "redis tutorial" description "redis basic commands for caching" likes 20 visitors 23000
OK
127.0.0.1:6379>  HGETALL runoobkey
1) "name"
2) "redis tutorial"
3) "description"
4) "redis basic commands for caching"
5) "likes"
6) "20"
7) "visitors"
8) "23000"

可以看出就像設(shè)置叠艳,字典一樣
我們設(shè)置了 redis 的一些描述信息(name, description, likes, visitors) 到哈希表的 runoobkey 中奶陈。

哈希表命令:
HDEL key field1 [field2]
刪除一個后者多個哈希表的字段
HEXISTS key field
查看哈希表指定 字段 是否存在
HGET key field
查看哈希表指定字段的值
HGETALL key
獲取所有字段和值
HINCRBY key field increment
給指定字段的整數(shù)值 加上 增量 increment
HINCRBYFLOAT key field increment
字段的浮點值加 increment
HKEYS key
獲取哈希表的所有字段
HLEN key
獲取哈希表 字段的數(shù)量
HMGET key field1 [field2]
獲取指定字段的值
HMSET key field1 value1 [field2 value2 ]
同時設(shè)置多個字段的值 (會覆蓋指定的值,哈希表不存在附较,則創(chuàng)建)
HSET key field value
設(shè)置一個字段的值
HSETNX key field value
只有在 字段不存在時吃粒,設(shè)置值
HVALS key
獲取所有字段的值
HSCAN key cursor [MATCH pattern] [COUNT count]
迭代哈希表中的鍵值對。

Redis 列表(List)

Redis列表是簡單的字符串列表拒课,按照插入順序排序徐勃。你可以添加一個元素到列表的頭部(左邊)或者尾部(右邊)

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"

在以上實例中我們使用了 LPUSH 將三個值插入了名為 runoobkey 的列表當(dāng)中事示。
Redis 列表命令
BLPOP key1 [key2 ] timeout
移除并獲取列表第一個值,沒有元素則等待超時時間以內(nèi)
BRPOP key1 [key2 ] timeout
移除并獲取列表最后一個元素
BRPOPLPUSH source destination timeout
彈出一個元素并加到另一個列表(左邊)疏旨,并返回它很魂。無值則等超時
LINDEX key index
索引獲取元素(可 -1 表示最后一個,類推)
LINSERT key BEFORE|AFTER pivot value
在指定的元素前 或 后 插入元素
LLEN key
獲取列表長度
LPOP key
移除并獲取列表第一個元素
LPUSH key value1 [value2]
插入多值到表頭
LPUSHX key value
已存在的表 頭加一個值 返回列表長度 (列表不存在時操作無效)
LRANGE key start stop
獲取指定范圍的值
LREM key count value
移除列表的值(移除數(shù)量為 +-count 值是value 的值檐涝,正數(shù)左邊開始遏匆,負(fù)數(shù)右邊開始,0 移除所有)
LSET key index value
通過索引設(shè)置元素的值
LTRIM key start stop
只保留范圍內(nèi)的值谁榜,其他刪掉
RPOP key
移除最后一個值幅聘,并返回它
RPOPLPUSH source destination
移除最后一個值,并加到另外一個列表(頭)窃植,并返回它
RPUSH key value1 [value2]
從右邊插值
RPUSHX key value
已存在右邊插入一個值 (返回列表長度)

  • Redis 集合(Set)

不重復(fù)的string集合
Redis 中集合是通過哈希表實現(xiàn)的帝蒿,所以添加,刪除巷怜,查找的復(fù)雜度都是 O(1)
最多40億個成員
實例:

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"

1 代表執(zhí)行正確

Redis 集合命令

向集合添加一個或多個成員
SADD key member1 [member2]
獲取集合的成員數(shù)
SCARD key
返回給定所有集合的差集
SDIFF key1 [key2] |

返回給定所有集合的差集并存儲在 destination 中
SDIFFSTORE destination key1 [key2]
返回給定所有集合的交集
SINTER key1 [key2]
返回給定所有集合的交集并存儲在 destination 中
SINTERSTORE destination key1 [key2]

判斷 member 元素是否是集合 key 的成員
SISMEMBER key member
返回集合中的所有成員
SMEMBERS key
將 member 元素從 source 集合移動到 destination 集合.
SMOVE source destination member
移除并返回集合中的一個隨機元素
SPOP key
返回集合中一個或多個隨機數(shù).
SRANDMEMBER key [count]
移除集合中一個或多個成員
SREM key member1 [member2]
返回所有給定集合的并集
SUNION key1 [key2]
所有給定集合的并集存儲在 destination 集合中
SUNIONSTORE destination key1 [key2]
迭代集合中的元素
SSCAN key cursor [MATCH pattern] [COUNT count]

  • Redis 有序集合(sorted set)

https://www.runoob.com/redis/redis-sorted-sets.html
和set 一樣葛超,
不同的是每個元素都會關(guān)聯(lián)一個double類型的分?jǐn)?shù)。redis正是通過分?jǐn)?shù)來為集合中的成員進行從小到大的排序延塑。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末绣张,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子关带,更是在濱河造成了極大的恐慌侥涵,老刑警劉巖,帶你破解...
    沈念sama閱讀 217,826評論 6 506
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件宋雏,死亡現(xiàn)場離奇詭異芜飘,居然都是意外死亡,警方通過查閱死者的電腦和手機磨总,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,968評論 3 395
  • 文/潘曉璐 我一進店門嗦明,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人蚪燕,你說我怎么就攤上這事招狸。” “怎么了邻薯?”我有些...
    開封第一講書人閱讀 164,234評論 0 354
  • 文/不壞的土叔 我叫張陵,是天一觀的道長乘凸。 經(jīng)常有香客問我厕诡,道長,這世上最難降的妖魔是什么营勤? 我笑而不...
    開封第一講書人閱讀 58,562評論 1 293
  • 正文 為了忘掉前任灵嫌,我火速辦了婚禮壹罚,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘寿羞。我一直安慰自己猖凛,他們只是感情好,可當(dāng)我...
    茶點故事閱讀 67,611評論 6 392
  • 文/花漫 我一把揭開白布绪穆。 她就那樣靜靜地躺著辨泳,像睡著了一般。 火紅的嫁衣襯著肌膚如雪玖院。 梳的紋絲不亂的頭發(fā)上菠红,一...
    開封第一講書人閱讀 51,482評論 1 302
  • 那天,我揣著相機與錄音难菌,去河邊找鬼试溯。 笑死,一個胖子當(dāng)著我的面吹牛郊酒,可吹牛的內(nèi)容都是我干的遇绞。 我是一名探鬼主播,決...
    沈念sama閱讀 40,271評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼燎窘,長吁一口氣:“原來是場噩夢啊……” “哼摹闽!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起荠耽,我...
    開封第一講書人閱讀 39,166評論 0 276
  • 序言:老撾萬榮一對情侶失蹤钩骇,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后铝量,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體倘屹,經(jīng)...
    沈念sama閱讀 45,608評論 1 314
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,814評論 3 336
  • 正文 我和宋清朗相戀三年慢叨,在試婚紗的時候發(fā)現(xiàn)自己被綠了纽匙。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 39,926評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡拍谐,死狀恐怖烛缔,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情轩拨,我是刑警寧澤践瓷,帶...
    沈念sama閱讀 35,644評論 5 346
  • 正文 年R本政府宣布,位于F島的核電站亡蓉,受9級特大地震影響晕翠,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 41,249評論 3 329
  • 文/蒙蒙 一淋肾、第九天 我趴在偏房一處隱蔽的房頂上張望硫麻。 院中可真熱鬧,春花似錦樊卓、人聲如沸拿愧。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,866評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽浇辜。三九已至,卻和暖如春七扰,著一層夾襖步出監(jiān)牢的瞬間奢赂,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 32,991評論 1 269
  • 我被黑心中介騙來泰國打工颈走, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留膳灶,地道東北人。 一個月前我還...
    沈念sama閱讀 48,063評論 3 370
  • 正文 我出身青樓立由,卻偏偏與公主長得像轧钓,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子锐膜,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 44,871評論 2 354

推薦閱讀更多精彩內(nèi)容

  • 育兒的過程中道盏,我們會遇到各種各樣的問題而柑,如果父母不成長學(xué)習(xí),有時候一句無意的話荷逞,可能就會傷害到孩子小小的心靈媒咳。養(yǎng)育...
    顏妍陪你堅持閱讀 276評論 2 2
  • 堅持分享147天 兒子回來之前我和老公商量,忙完工作盡量在家多陪陪孩子种远。孩子在家的這三天涩澡,老公做的真不錯。盡管工作...
    夜色雨色閱讀 102評論 0 1
  • 我以一個觀察者的身份坠敷,來說說我看到的“移民”妙同,特別是華人移民,所面臨的尷尬情境膝迎。 以下是分享的Slides.
    大魚_BigFish閱讀 214評論 1 1