Redis 與 MongoDB 的操作速查,前半是 Redis 的環境設定與各型別語法,後半是 Mongo 的查詢、索引與增刪改。
1. Redis
Redis Client 套件
- ServiceStack.Redis(主流)
- StackExchange.Redis
- CSRedisCore
Redis Client 主流套件:ServiceStack.Redis
Redis Server 前置作業
跑 Redis Container(沒有密碼版本):
docker run -d --name redis_server2 --restart unless-stopped -p 6380:6379 -v redis-data:/data redis:7 redis-server --appendonly yes
跑 Redis Container(密碼版本):
docker run -d --name redis_server --restart unless-stopped -p 6379:6379 -v redis-data:/data redis:7 redis-server --requirepass '{mystrongpassword}' --appendonly yes
進入 Container:
docker exec -it redis_test /bin/bash
開啟沒有設密碼的 Redis Client:
redis-cli
開啟設密碼的 Redis Client:
redis-cli -h 127.0.0.1 -p 6379 -a '{mypassword}'
離開 redis:
quit or exit
確認 redis 版本:
redis-cli --version
Config 設定
- LRU:最近最少使用,優先淘汰
- LFU:使用次數最少,優先淘汰
最大使用記憶體限制:
config get maxmemory
config set maxmemory 512mb
記憶體釋放策略:
config get maxmemory-policy
config set maxmemory-policy allkeys-lru
noeviction:預設策略。不進行淘汰,記憶體滿時回傳錯誤。allkeys-lru:所有 key 均使用 LRU 策略進行淘汰。volatile-lru:僅針對設有 TTL 的 key 使用 LRU。allkeys-lfu:所有 key 均使用 LFU 策略。volatile-lfu:僅淘汰設有 TTL 的 key,依據使用頻率。allkeys-random:隨機淘汰任意 key,不考慮使用狀況。volatile-random:隨機淘汰設有 TTL 的 key。volatile-ttl:淘汰 TTL 剩餘時間最短的 key。
快取效果觀察:
info stats
Redis 語法參考網路資源:https://www.runoob.com/redis/redis-sets.html
Redis 語法:新增
設定值,key 不存在新增,存在則覆蓋:
set [key] [value]
設定值,並且 10 秒後自動過期:
set [key] [value] ex 10
Redis 語法:查詢
取值(沒有值,回傳 nil):
get [key]
keys 查詢,正式運行的伺服器中勿使用:
keys *
keys 查詢:
scan 0
資料型態查詢:
type [key]
Redis 語法:數值計算
值遞增:
INCR [key]
指定遞增數 +5:
INCR [key] 5
指定遞減數 -3:
DECR [key] 3
Redis 語法:字串處理
傳回字串長度:
strlen [key]
在字串結尾串接新字串:
append [key] [appendString]
Redis 語法:列表
把 a 元素塞進 list1 之中(往左側塞入),若無 list1 則自動建立新的:
lpush list a
把 a 元素塞進 list1 之中(往右側塞入),若無 list1 則自動建立新的:
rpush list a
把 a 元素塞進 list1 之中(往右側塞入),若無 list1 則塞入失敗:
lpushx list a
看 arr 0 到 100 的元素(-1 代表最後一個項目):
lrange arr 0 100
Redis 語法:不重複集合
新增元素:
sadd [key] [itemName1] [itemName2]
取得集合數:
scard [key]
列出元素清單:
sdiff [key]
smembers [key]
Redis 語法:Hash
設定 hash 表 key 與 value:
hset [HashTableName] [key] [value]
設定 hashmap(一次設定多個 set):
hmset [HashTableName] [key1] [value1] [key2] [value2].....
取得 hash 表所有鍵與值:
hgetall [HashTableName]
取得 hash 表某個鍵的值:
hget [HashTableName] [key]
集合
Redis Client - StackExchange.Redis 網路資源:https://maxlin0523.github.io/2022/06/15/redis-usage/
2. Mongo 語法
查看所有資料庫清單:
show dbs
切換資料庫,沒有此資料庫,新增資料就會自動建立:
use mydb
查看目前在哪個資料庫:
db
列出所有集合(資料表):
show collections
查詢運算子
$gt大於$lt小於$gte大於等於$lte小於等於$ne不等於$in在陣列中
索引
查詢索引:
db.users.getIndexKeys()
db.users.getIndexes()
建立索引:
db.users.createIndex(
{
'Name': 1, // 1 代表升序 (Ascending)
'Age': 1, // 1 代表升序 (Ascending)
'_id': -1
},
{
'name': 'Name_1_Age_1__id_-1' // (選填) 幫索引取個名字,方便日後管理
}
)
確認查詢狀態(有無命中索引):
db.users.find({ roleId: { $in: [1,2,3] } }).explain('executionStats')
db.runCommand({
explain: {
count: 'users',
query: {
roleId: { $in: [1,2,3] } }
},
verbosity: 'executionStats'
})
查詢
db.users.find({ roleId: { $in: [1,2,3] } })
db.users.find({ name: { $in: ['mary','joe'] } })
db.users.find({ age: { $gt: 30, $lt: 60 } })
同時符合多個條件:
db.users.find({ age: { $gte: 18 }, status: 'active' })
db.users.find({ $and: [ { age: { $gte: 18,$lte: 18 } }, { status: 'active' } ] })
Or 條件:
db.users.find({
$or: [
{ status: 'active' },
{ age: { $lt: 18 } }
]
})
更新
單筆資料更新單一欄位:
db.collection.updateOne(
{ _id: ObjectId('64fa8fcb5e4b2c12a1d9f123') },
{ $set: { status: 'active' } }
)
單筆資料更新多個欄位:
db.collection.updateOne(
{ _id: ObjectId('64fa8fcb5e4b2c12a1d9f123') },
{
$set: {
status: 'active',
lastUpdate: new Date()
}
}
)
多筆資料更新多個欄位:
db.collection.updateMany(
{ status: 'inactive' },
{ $set: { status: 'active' } }
)
刪除資料:
db.collection.updateOne(
{ _id: ObjectId('64fa8fcb5e4b2c12a1d9f123') },
{ $unset: { tempField: '' } }
)
排序、分頁
排序、限制筆數:
db.users.find().sort({ age: -1 }).limit(5)
age: -1:依照 age 由大到小排序。age: 1:依照 age 由小到大排序。limit(5):只取前 5 筆
分頁查詢:skip + limit
db.users.find().skip(10).limit(5) // 跳過前10筆,顯示5筆
使用 .pretty() 美化輸出:
db.users.find().pretty()
陣列查詢:
db.posts.find({ tags: 'mongodb' }) // 查找含有這個 tag 的文章
find() 的參數
- 第一個參數:查詢條件(filter)
- 第二個參數(可選):欄位投影(哪些欄位要顯示);若要全部顯示,則省略此參數。
範例:
db.users.find({
Time: {
$gte: ISODate('2025-10-21T00:00:00Z'),
$lte: ISODate('2025-10-21T14:55:00Z')
},
Type: { $in: [1, 6] }
}, {
_id: 0,
Time: 1,
HumanType: 1
})
用參數實現查詢結果:
let name = 'John'
db.users.find({ name: name })
新增與刪除
建立資料,如果沒有此資料表則會自動建立:
db.testcollection.insertOne({ name: 'Alice', age: 28 })
刪除第一筆符合條件的資料:
db.users.deleteOne({ name: 'Alice' })
刪除符合條件的資料:
db.users.deleteMany({ status: 'inactive' })
清空整個集合:
db.logs.deleteMany({})
刪除整個集合:
db.logs.drop()
刪除整個資料庫:
use myDatabase
db.dropDatabase()