redis 使用GETRANGE 來獲取一組bitmap狀態
在使用 redis 的 bitmap 來儲存業務狀態。經常需要順序獲取一個範圍內 bitmap。 業務程式碼裡,一般會使用 pipeline 來優化查詢邏輯。虛擬碼如下
def get_bits_pipe(pipe, key, cur, num=10):
""" 使用pipeline gitbit"""
for i in xrange(num + 1):
pipe.getbit(key, cur + i)
return [cur + i for i, v in enumerate(pipe.execute()) if v]
這裡減少了和 redis 的資料交換。提高了查詢效能,但是隨著查詢數量的增加,效能急劇下降。
其實 redis 有更高效的方式來獲取順序的 bitmap。就是通過 getrange 來獲取 bitmap 所在的字串,然後計算出每位的值。需要注意:由於 redis 的 bit 並非按照自然二進位制位增加, 比如:'\x01' 對應的 ascii 為 1。其二進位制表示'1', 在 redis 中表示 offset 為 7。感興趣可以看看 redis 的實現邏輯。
以下提供 golang 和 python 版本的樣例。 實現程式碼: https://gist.github.com/luw2007/692d4a615dd71aa2bfa42190ad6a12e3
var nums = [8]uint8{1, 2, 4, 8, 16, 32, 64, 128}
// BitRange 計算下標表
// str: 計算的字串
// start: 開始的座標
// offset: 偏移值
// size: 查詢個數
func BitRange(str []byte, start int, offset int, size int) []int {
bits := []int{}
k := 0
for i, b := range str {
for j, num := range nums {
if b&num != num {
continue
}
k = int(i*8 + 7 - j)
if offset <= k && k < offset+size {
bits = append(bits, start*8+k)
}
}
}
return bits
}
// GetBitRange 按位查詢 返回bit位為1的下標
// client: redis的client
// key: redis 儲存的key
// cur: 開始位置
// size: 查詢個數
func (p *Pool) BitRange(key string, cur int, size int) ([]int, error) {
start := cur / 8
// end必須按8取整
end := (cur+size+7)/8
str, err := r.Bytes(p.ExecuteCMD("GETRANGE", key, start, end))
if err != nil {
return nil, err
}
bits := BitRange(str, start, cur%8, size)
return bits, nil
}
更多原創文章乾貨分享,請關注公眾號
- 加微信實戰群請加微信(註明:實戰群):gocnio
相關文章
- 獲取bitmap大小
- Android獲取狀態列高度Android
- 獲取Mysql的狀態、變數MySql變數
- [React Native]獲取網路狀態React Native
- Jquery獲取radio的狀態jQuery
- 完美獲取Android狀態列高度Android
- 在狀態列中加入BitMap (轉)
- [Android Framework]獲取U盤 SD 狀態AndroidFramework
- [Android]獲取網路連線狀態Android
- 微信小程式直播狀態介面如何獲取微信小程式
- DB2_獲取系統引數狀態DB2
- Redis 中 BitMap 的使用場景Redis
- Fresco的封裝和使用說明以及獲取快取中的Bitmap物件封裝快取物件
- Redis-BitMapRedis
- Arcgis For Android 中MapView 截圖獲取BitmapAndroidView
- 根據使用者來獲取渠道
- 直播平臺原始碼,快速獲取當前狀態列高度原始碼
- Android APP如何獲取裝置網線插拔的狀態AndroidAPP
- java獲取redis的日誌資訊和動態監控資訊JavaRedis
- 索引組織表上建立BITMAP索引(一)索引
- Redis 中 Bitmap 詳解Redis
- 第七篇:使用 fcntl 函式 獲取,設定檔案的狀態標誌函式
- [100分求助]如何使用VC程式設計獲取網路卡當前的狀態 - IT者C程式程式設計
- 如何獲取Vivo系統的懸浮窗許可權狀態
- Android Bitmap快取池使用詳解Android快取
- 使用列舉實現狀態機來優雅你的狀態變更邏輯
- 清除 Nuxt 狀態快取:clearNuxtStateUX快取
- php動態獲取常量PHP
- React Native 跳轉到 APP 推送頁面並獲取推送狀態React NativeAPP
- Android 監聽鍵盤狀態變化,並獲取鍵盤高度Android
- HarmonyOS 如何獲取裝置資訊(系統、版本、網路連線狀態)
- C++ 使用 hiredis 封裝redis 的資料獲取介面C++Redis封裝
- Revit獲取元素的巢狀族巢狀
- 區分http請求狀態碼來理解快取(協商快取和強制快取)HTTP快取
- 根據微信code獲取換取使用者登入態資訊
- Redis Cluster 獲取主從關係Redis
- Unity 中用有限狀態機來實現一個 AIUnityAI
- Laravel 分組獲取最新記錄Laravel