1. String類型
基礎(chǔ)命令
應(yīng)用場景
- 緩存功能:緩存數(shù)據(jù)庫查詢結(jié)果或網(wǎng)頁內(nèi)容。
- 計數(shù)器:統(tǒng)計訪問量或商品庫存。
- 分布式鎖:在分布式系統(tǒng)中實現(xiàn)互斥訪問。
- 共享session:在多服務(wù)器環(huán)境中共享用戶會話。
代碼示例
// 緩存商品信息
func cacheProductInfo(productID string, productInfo map[string]interface{}) {
cacheKey := generateProductCacheKey(productID)
productJSON, _ := json.Marshal(productInfo)
rdb.Set(ctx, cacheKey, string(productJSON), 0) // 0表示永不過期
}
// 生成商品緩存鍵
func generateProductCacheKey(productID string) string {
return "product:" + productID
}
2. List類型
基礎(chǔ)命令
- LPUSH key value:在列表頭部插入元素。
- RPUSH key value:在列表尾部插入元素。
- LRANGE key start stop:獲取列表指定范圍內(nèi)的元素。
應(yīng)用場景
- 排行榜:管理如文章點贊數(shù)的排行榜數(shù)據(jù)。
代碼示例
// 將新訂單添加到訂單處理隊列
func addOrderToQueue(order Order) {
redisClient.LPUSH(ctx, "order_queue", order.ToString())
}
// 從訂單處理隊列中獲取待處理的訂單
func getNextOrder() (Order, error) {
orderJSON, err := redisClient.RPOP(ctx, "order_queue").Result()
if err != nil {
return Order{}, err
}
var order Order
json.Unmarshal([]byte(orderJSON), &order)
return order, nil
}
3. Set類型
基礎(chǔ)命令
- SISMEMBER key member:檢查元素是否在集合中。
- **SINTER key [key ...]**:取多個集合的交集。
- **SUNION key [key ...]**:取多個集合的并集。
- **SDIFF key [key ...]**:取集合的差集。
應(yīng)用場景
- 標(biāo)簽系統(tǒng):存儲和管理文章或商品的標(biāo)簽。
- 社交網(wǎng)絡(luò)好友關(guān)系:表示用戶的好友列表。
代碼示例
// 給文章添加標(biāo)簽
func addTagToArticle(articleID string, tag string) {
redisClient.SADD(ctx, "article:"+articleID+":tags", tag)
}
// 根據(jù)標(biāo)簽獲取文章列表
func getArticlesByTag(tag string) []string {
return redisClient.SMEMBERS(ctx, "global:tags:"+tag).Val()
}
4. Sorted Set類型
基礎(chǔ)命令
- ZADD key score member:添加元素及其分?jǐn)?shù)。
- **ZRANGE key start stop [WITHSCORES]**:按分?jǐn)?shù)獲取元素。
- ZINCRBY key increment member:增加元素的分?jǐn)?shù)。
- ZCARD key:獲取集合中元素的數(shù)量。
應(yīng)用場景
- 實時數(shù)據(jù)統(tǒng)計:如商品銷量統(tǒng)計。
代碼示例
// 更新玩家得分
func updatePlayerScore(playerID string, score float64) {
sortedSetKey := "playerScores"
rdb.ZAdd(ctx, sortedSetKey, &redis.Z{Score: score, Member: playerID})
}
// 獲取排行榜
func getLeaderboard(start int, stop int) []string {
sortedSetKey := "playerScores"
leaderboard, _ := rdb.ZRangeWithScores(ctx, sortedSetKey, start, stop).Result()
var result []string
for _, entry := range leaderboard {
result = append(result, fmt.Sprintf("%s: %.2f", entry.Member.(string), entry.Score))
}
return result
}
5. Hash類型
基礎(chǔ)命令
- HSET key field value:設(shè)置字段的值。
- HINCRBY key field increment:增加字段的整數(shù)值。
應(yīng)用場景
- 購物車管理:記錄用戶選擇的商品及其數(shù)量。
代碼示例
// 存儲用戶信息到Redis Hash
func storeUserInfo(userID string, userInfo map[string]interface{}) {
hashKey := "user:" + userID
for field, value := range userInfo {
rdb.HSet(ctx, hashKey, field, value)
}
}
// 從Redis Hash獲取用戶信息
func getUserInfo(userID string) map[string]string {
hashKey := "user:" + userID
fields, err := rdb.HGetAll(ctx, hashKey).Result()
if err != nil {
return nil
}
var userInfo = make(map[string]string)
for k, v := range fields {
userInfo[k] = v
}
return userInfo
}
6. Bitmap類型
基礎(chǔ)命令
- SETBIT key offset value:設(shè)置位的值。
- **BITCOUNT key [start end]**:計算位值為1的數(shù)量。
- **BITOP operation destkey key [key ...]**:執(zhí)行位運算。
應(yīng)用場景
- 狀態(tài)監(jiān)控:監(jiān)控用戶在線狀態(tài)或設(shè)備狀態(tài)。
- 功能開關(guān):控制新功能的訪問權(quán)限。
代碼示例
// 更新玩家在線狀態(tài)
func updatePlayerStatus(playerID int, isOnline bool) {
bitmapKey := "playerStatus"
offset := playerID
if isOnline {
rdb.SetBit(ctx, bitmapKey, int64(offset), 1)
} else {
rdb.SetBit(ctx, bitmapKey, int64(offset), 0)
}
}
// 查詢玩家在線狀態(tài)
func checkPlayerStatus(playerID int) bool {
bitmapKey := "playerStatus"
offset := playerID
bitValue, err := rdb.GetBit(ctx, bitmapKey, int64(offset)).Result()
if err != nil {
return false
}
return bitValue == 1
}
7. HyperLogLog類型
基礎(chǔ)命令
- **PFADD key element [element ...]**:添加元素到HyperLogLog。
- **PFCOUNT key [key ...]**:獲取HyperLogLog中唯一元素的數(shù)量。
- **PFMERGE destkey sourcekey [sourcekey ...]**:合并多個HyperLogLog。
應(yīng)用場景
- 唯一用戶訪問統(tǒng)計:統(tǒng)計獨立訪客數(shù)量。
代碼示例
// 記錄用戶訪問
func recordUserVisit(userID string) {
uniqueSetKey := "uniqueVisitors"
rdb.PFAdd(ctx, uniqueSetKey, userID)
}
// 獲取唯一用戶訪問量
func getUniqueVisitorCount() int64 {
uniqueSetKey := "uniqueVisitors"
count, _ := rdb.PFCount(ctx, uniqueSetKey).Result()
return count
}
8. GEO類型
基礎(chǔ)命令
- GEOADD key longitude latitude member:添加地理位置信息。
- GEOPOS key member [member ...]:獲取成員的地理坐標(biāo)。
- GEODIST key member1 member2 [unit]:計算兩個成員之間的距離。
- GEOHASH key member [member ...]:獲取成員的Geohash。
- GEORADIUS key longitude latitude radius unit [options]:搜索指定半徑內(nèi)的位置。
應(yīng)用場景
- 附近地點搜索:查找用戶附近的服務(wù)或設(shè)施。
- 用戶定位與導(dǎo)航:記錄和匹配司機與乘客的位置。
代碼示例
// 搜索附近地點
func searchNearbyPlaces(
longitude float64, latitude float64, radius float64) []string {
geoSetKey := "touristSpots"
places, _ := rdb.GeoRadius(
ctx, geoSetKey, longitude, latitude, radius, "km",
&redis.GeoRadiusQuery{WithCoord: true, WithDist: true, WithHash: true}).Result()
var nearbyPlaces []string
for _, place := range places {
nearbyPlaces = append(nearbyPlaces, fmt.Sprintf("Name: %s, Distance: %.2f km", place.Member.(string), place.Dist))
}
return nearbyPlaces
}
注意事項
- 每種數(shù)據(jù)類型都有特定的應(yīng)用場景和優(yōu)勢。
- 選擇合適的數(shù)據(jù)類型可以優(yōu)化性能和存儲效率。
- Bitmap和HyperLogLog類型適合處理大量數(shù)據(jù)的場景,但需要注意內(nèi)存和性能的限制。
- GEO類型依賴于準(zhǔn)確的經(jīng)緯度信息,適用于需要地理位置服務(wù)的應(yīng)用。
該文章在 2024/9/13 10:28:08 編輯過