Най-добра практика за заявки за кеш на запазени обекти в Play/Scala

Изпробвам кеширане в моето приложение за игра и изглежда, че работи, но кодът изглежда по-подробен, отколкото очаквах, и ще се радвам на коментари относно опростяването или нещо, което пропускам. Този въпрос е малко разширение на този основен въпрос за кеша. Кодът (леко опростен за представяне тук) е както следва:

def findById(id: Int): Option[Learner] = {
  Cache.getAs[Learner]("learner." + id) match {
    case None => DB.withConnection { implicit c => //-- no cache, read DB
      SQL("select * from learner where id={id}")
        .on('id -> id)
        .as(learnerP.singleOpt) match {
        case Some(learner) => { //-- found, set cache
          Cache.set("learner." + learner.id, learner)
          Some(learner)
        }
        case _ => None //-- no find in DB, do not set cache
      }
    }
    case Some(learner) => Some(learner) //-- return value in cache
  }
}

Редактиране: Важно е да зададете стойностите на кеша навсякъде, където Learner (в този случай) се актуализира или вмъква. Настройката при вмъкване е необходима, в противен случай заявка преди вмъкването ще настрои кеша на None и след това бъдещи getAs или getOrElse извиквания ще върнат None, въпреки че вече съществува стойност.


person wwkudu    schedule 22.04.2014    source източник


Отговори (1)


Можете да използвате метода getOrElse по този начин:

Cache.getOrElse[Option[Learner]]("learner." + id, expiration_time) {
   DB.withConnection { implicit c => //-- no cache, read DB
      SQL("select * from learner where id={id}")
        .on('id -> id)
        .as(learnerP.singleOpt)
   }
}

Ако Option[Learner] бъде намерен в паметта, той се връща незабавно, ако не е, извикването към DB се извършва и резултатът се кешира с време на изтичане expiration_time.

person Peter    schedule 22.04.2014
comment
Страхотно, това изглежда перфектно, благодаря. Всъщност бях опитал нещо подобно, но мисля, че проблемът беше, че бях забравил да изчистя кеша по време на вмъкване, така че продължаваше да излиза като Няма. И моля за съвет относно срока на годност, въпреки че не съм сигурен, че ще го използвам веднага. - person wwkudu; 22.04.2014