zhangyuang / ssr

A most advanced ssr framework support React17/React18/Vue2/Vue3 on Earth that implemented serverless-side render specification.
http://doc.ssr-fc.com/
MIT License
2.61k stars 284 forks source link

希望能增加服务器端缓存的解决方案 #105

Closed wocanbe closed 3 years ago

wocanbe commented 3 years ago

因为性能原因,想要对常用页面增加缓存,提高响应速度,降低服务器压力。但发现没有相关配置。希望能在ssr-core-vuerender方法中增加相关配置。 示例1

import LRU from 'lru-cache'
// ...
async function render<T=string> (ctx: ISSRContext, options?: UserConfig): Promise<T> {
  const { renderToStream, renderToString } = createRenderer({
    cache: new LRU({
      max: 1000,
      maxAge: 1000 * 15
    })
  })
// ...

示例2

// ...
async function render<T=string> (ctx: ISSRContext, options?: UserConfig, cache:any): Promise<T> {
  const { renderToStream, renderToString } = createRenderer({
    cache: cache
  })
// ...
const cache:any = {
    get: (key:string, cb:Function) => {
      redisClient.get(key, (err, res) => {
        // handle error if any
        cb(res)
      })
    },
    set: (key:string, val:string) => {
      redisClient.set(key, val)
    }
  }
zhangyuang commented 3 years ago

你自己在业务代码里加就行了啊,缓存这种东西根本跟底层无关。 你自己在外层用redis, 或者内部缓存渲染的结果就行了。前提是你用的是字符串而不是流 耗时都在接口io上,组件渲染的耗时跟io比几乎可以忽略。缓存接口结果比缓存组件有用多了 不推荐用lru这种东西去cache component,出了问题很难排查。

wocanbe commented 3 years ago

原来这儿的代码是

// ...

const defaultConfig = loadConfig()
const { renderToStream, renderToString } = createRenderer()

async function render<T=string> (ctx: ISSRContext, options?: UserConfig): Promise<T> {
  const config = Object.assign({}, defaultConfig, options ?? {})
// ...

我没法在不修改库的情况下添加。

zhangyuang commented 3 years ago

...我意思是你根本就不需要在这里加,为什么一定要在框架底层做缓存呢,上层完全可以做。底层做缓存出了bug你完全查不到

zhangyuang commented 3 years ago

ssr天生就是动态的根本不适合做缓存,如果你大部分情况下是静态的或者你的数据在一段时间是不变的,你完全可以上层用redis缓存整个render返回的html或者接口数据。而不是去组件层面做缓存。

wocanbe commented 3 years ago

好的,理解。可以直接在controller里面缓存。