有時我們需要隨機(jī)地獲取數(shù)據(jù)記錄(實體),比如博客程序中的“隨機(jī)文章”的實現(xiàn)。
目前 GAE 并沒有 API 可以直接獲取隨機(jī)實體,要實現(xiàn)這樣的需求我們只能自己想辦法了 :-)
在 stackoverflow 上也有人提過該問題,總結(jié)如下:
- Generate and store a random number on your entities as you create them, then pick a random number and look (via a query) for the closet record(s) to it.
- Implement some mechanism to ensure your entity ids are "densely" populated, then fetch within the known range using keys.
- Periodically generate random lists of the entities and return entities from those lists. This may take the form of a stack that entities are popped off of, or as actual lists that are returned.
目前 B3log Solo 在處理“隨機(jī)閱讀”上采用的是方法一,即在每個文章實體上添加一個屬性保存 0-1 的隨機(jī)浮點數(shù)。
在獲取隨機(jī)文章時生成一個 0-1 的隨機(jī)數(shù)(mid)作為查詢條件,以此查詢條件作為邊界(0 <= mid <=1)來過濾實體保存的隨機(jī)值屬性。
這個方法基本可以達(dá)到隨機(jī)的效果了,為了讓隨機(jī)的效果更動態(tài)一點,我們可以考慮經(jīng)常更新文章實體中的隨機(jī)浮點值:
- 訪問文章時(即在更新文章瀏覽次數(shù)時一并更新該文章的隨機(jī)浮點值)
- 后臺定時任務(wù)(獲取一定數(shù)量的隨機(jī)文章然后更新它們的隨機(jī)浮點值)
- 用戶做文章更新時
加上以上處理后,隨機(jī)的效果比較好了 :-)