首頁  >  問答  >  主體

java - mongodb配合redis缓存有没有成熟的方案?

业务系统采用了Mongodb,现在想针对部分数据用redis进行缓存优化。
原来看到过一个mongoose-redis-cache:https://github.com/conancat/mongoose-red...,我理解它相当于建立一个查询语句和查询结果的键值对,但这种情况下,如果数据库业务改变后是无法同步到缓存的。想请教下各位有没有其他方案?

怪我咯怪我咯2766 天前733

全部回覆(3)我來回復

  • 巴扎黑

    巴扎黑2017-04-17 17:37:48

    用 spring-data 很好。有 mongodb 的也有 redis 的,直接使用spring-data-jpa 操作mongodb 方便快速。而且spring有快取的註解cacheable,可以實現自動存入快取。
    spring-data 位址

    回覆
    0
  • 高洛峰

    高洛峰2017-04-17 17:37:48

    建議redis與mongo處理資料時分開。先從mongo取得數據,在set到redis。你用的mongoose-redis-cache這個,感覺在以後的擴充性上會很差,bug定位也不容易

    回覆
    0
  • ringa_lee

    ringa_lee2017-04-17 17:37:48

    不太懂js,簡單看了下你給的連接的程式碼:
    1.mongoose-redis-cache:相當於在mongo前麵包了一層redis,就像你說的那樣,會對查詢語句進行cache ,
    key = [prefix, collectionName, hash].join ':'
    使用prefix,collName和查詢語句產生redis中的key,先是返回redis的查詢結果;如果沒有,去查mongo;mongo的查詢結果返回首先set redis,並設定超時時間,然後呼叫callback;
    2.題主所說“mongoose-redis-cache 對語句進行cache,如果資料庫業務改變後是無法同步到快取的”,這種是不需要擔心的;一個可用的cache 肯定會考慮到資料的有效性,一般是透過設定逾時時間來設定的;在程式碼中也可以看到,回填redis的時候會設定逾時時間。

        hash = crypto.createHash('md5')
          .update(JSON.stringify query)
          .update(JSON.stringify options)
          .update(JSON.stringify fields)
          .update(JSON.stringify populate)
          .digest('hex')
    
        key = [prefix, collectionName, hash].join ':'
    
        cb = (err, result) ->
          if err then return callback err
    
          if not result
            # If the key is not found in Redis, executes Mongoose original
            # exec() function and then cache the results in Redis
    
            for k, path of populate
              path.options ||= {}
              _.defaults path.options, cache: false
    
            mongoose.Query::_exec.call self, (err, docs) ->
              if err then return callback err
              str = JSON.stringify docs
              client.setex key, expires, str
              callback null, docs
          else
            # Key is found, yay! Return the baby!
            docs = JSON.parse(result)
            return callback null, docs
    
        client.get key, cb

    回覆
    0
  • 取消回覆