利用redis實現多屬性快速查詢

2021-09-03 01:34:04 字數 1964 閱讀 4767

4.5k 次閱讀  ·  讀完需要 7 分鐘

拿京東舉例,如下圖

我們要找一款電子琴,牌子有:山葉、卡西歐,**有各種區間,各種顏色、不同的音色數。

現如今動不動就得整點高併發啥的,直接用mysql我們是不是真的扛不住?在前面加一層cache?怎麼加?各種屬性的組合存到乙個屬性組合成的key中?如何相對實時的更新屬性?

之前的文章我有介紹過redissetbitbitop的使用方法,就是將某一位標記為1或者0代表存在不存在,然後利用bitop進行and或者or計算,得到我們想要的結果,今天我們就從零開始打造乙個「高效能」的屬性篩選器!

假設現在我們有三款電子琴,一款山葉、兩款卡西歐,具體的屬性**為:

id品牌

顏色**音色1

山葉紅色

1000

1002

卡西歐黑色

2000

1503

卡西歐白色

2000

200我們將屬性+屬性值組合為key,id為對應的某位偏移量,這樣使用下面的語句初始化資料到redis

//初始化品牌

$redis->setbit('brand-山葉', 1, 1);

$redis->setbit('brand-卡西歐', 2, 1);

$redis->setbit('brand-卡西歐', 3, 1);

//初始化顏色

$redis->setbit('color-紅色', 1, 1);

$redis->setbit('color-黑色', 2, 1);

$redis->setbit('color-白色', 3, 1);

//初始化**

$redis->setbit('price-1000', 1, 1);

$redis->setbit('price-2000', 2, 1);

$redis->setbit('price-2000', 3, 1);

......

我想要搜一下,2000元的白色卡西歐,只需要這樣

$redis->bitop('and', 'cachekey', 'brand-卡西歐', 'color-白色');

$redis->bitop('and', 'cachekey1', 'cachekey', 'price-2000');

結果cachekey1的二進位制形式為001,這樣我們就知道搜尋的結果是id為3的商品。

然而redis並沒有提供查詢哪些位位1的方法,我們只能通過get方法將內容獲取出來,自己處理。提供一段參考**:

$bit = $redis->get($cachekey);

$bitlength = strlen($bit);

//redis返回的資料長度可能不是8的倍數,為了方便解包,我們將它補齊

while($bitlength % 8 != 0)

$bit = str_pad($bit, $bitlength, pack('n', 0));

$bit = unpack('n*', $bit);

$bit = array_filter($bit);

$ids = ;

foreach($bit as $k => $b)

foreach($bitpos as $pos)

}

我在本地試了一下,20w的資料(單個屬性-屬性值redis占用大概24k),同時搜尋4個屬性只需要不到10ms,當然現實中肯定沒這麼理想,但效果一定不會太差。

如果商品和屬性過多,對redis的寫入壓力是相當大的(商品數屬性數屬性值數的寫入數),我們可以先自行組合成字串,然後單個屬性-屬性值對寫入,具體實現細節就不寫了,就是利用pack函式打包。

VC MFC多屬性頁的實現

vc mfc多屬性頁的實現 在插入 資源 dialog,中選擇多個從idd proppage large繼承的屬性頁,如idd prop1。這些建立的對話方塊就是屬性中的每一頁。用classwizard為你的屬性頁定義新的cpropertypage繼承類,如cprop1和idd prop1等關聯。用...

MFC中多屬性頁的實現

在插入 資源 dialog 中選擇多個從 idd proppage large 繼承的屬性頁,如 idd prop1 這些建立的對話方塊就是屬性中的每一頁。用 classwizard 為你的屬性頁定義新的 cpropertypage 繼承類,如 cprop1 和idd prop1 等關聯。用 cla...

Python實現按物件多屬性排序

多屬性排序 把需要排序的屬性拿出來作為乙個 tuple,主要的放前面,次要的放後面。假如某物件有n個屬性,那麼先按某規則對屬性a進行排序,在屬性a相等的情況下再按某規則對屬性b進行排序,以此類推。終端列印結果如下 按照屬性name進行排序 按照ascii進行排序,本案例中,按照小寫字母的順序進行排序...