有時我們需要隨機地獲取數據記錄(實體),比如博客程序中的“隨機文章”的實現。
目前 GAE 并沒有 API 可以直接獲取隨機實體,要實現這樣的需求我們只能自己想辦法了 :-)
在 stackoverflow 上也有人提過該問題,總結如下:
- 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 在處理“隨機閱讀”上采用的是方法一,即在每個文章實體上添加一個屬性保存 0-1 的隨機浮點數。
在獲取隨機文章時生成一個 0-1 的隨機數(mid)作為查詢條件,以此查詢條件作為邊界(0 <= mid <=1)來過濾實體保存的隨機值屬性。
這個方法基本可以達到隨機的效果了,為了讓隨機的效果更動態一點,我們可以考慮經常更新文章實體中的隨機浮點值:
- 訪問文章時(即在更新文章瀏覽次數時一并更新該文章的隨機浮點值)
- 后臺定時任務(獲取一定數量的隨機文章然后更新它們的隨機浮點值)
- 用戶做文章更新時
加上以上處理后,隨機的效果比較好了 :-)
本文是使用 B3log Solo 從 簡約設計の藝術 進行同步發布的