美文网首页vapor 实践
vapor MySQL 作为Cache

vapor MySQL 作为Cache

作者: 搞好关系 | 来源:发表于2018-11-06 10:54 被阅读15次

    之前做了将SQLite作为Cache的说明,现在由于把数据全部迁移到MySQL存储因此需要把Cache也转移到MySQL作为存储媒介,由于官方没有很好的实例于仿照SQLite的流程来梳理一遍:

    1. SQLite的流程

      注册Provide
      try services.register(FluentSQLiteProvider())
      > 设置SQLite作为cache
      config.prefer(SQLiteCache.self, for: KeyedCache.self)

    2. 仿照SQLite流程修改为MySQL

      注册Provide
      try services.register(FluentMySQLProvider())
      > 设置MySQL作为Cache
      config.prefer(MySQLDatabaseCache.self, for: KeyedCache.self)
      注意:typealias MySQLDatabaseCache = DatabaseKeyedCache<ConfiguredDatabase<MySQLDatabase>>

    3. 通用部分

    添加Cache Entity
    migrations.add(model: CacheEntry<MySQLDatabase>.self, database: .mysql)
    杜宇SQLite这么写Run之后没有错误而对于MySQL是无法运行的,看似如出一辙的流程为什么会有两种不同的结果呢?接下来我们就分析一下两者内部的不同
    一 Provide

    SQLite

     try services.register(FluentProvider())
            services.register { container -> SQLiteDatabase in
                let storage = try container.make(SQLiteStorage.self)
                return try SQLiteDatabase(storage: storage)
            }
            services.register(KeyedCache.self) { container -> SQLiteCache in
                let pool = try container.connectionPool(to: .sqlite)
                return .init(pool: pool)
            }
    

    MySQL

      try services.register(FluentProvider())
            try 
    services.register(MySQLProvider())
    

    共同点都是注册了FluentProvider,不同的是SQLite设置了自身的pool作为KeyedCache,那么我们接着翻看MySQLProvider内部做了什么

    MySQLProvider

     try services.register(DatabaseKitProvider())
            services.register(MySQLDatabaseConfig.self)
            services.register(MySQLDatabase.self)
            var databases = DatabasesConfig()
            databases.add(database: MySQLDatabase.self, as: .mysql)
            services.register(databases)
    

    可以看到内部只是做了初始化这只一些默认
    我们直接DatabaseKitProvider往里看

    DatabaseKitProvider

    services.register(Databases.self)
            services.register(DatabaseConnectionCache.self)
            services.register(DatabaseConnectionPoolConfig.self)
            services.register(DatabaseConnectionPoolCache.self)
            
            // keyed cache
            services.register(MemoryKeyedCache(), as: KeyedCache.self)
            services.register(DictionaryKeyedCache.self)
    

    终于找到了设置Cache的地方,在DatabaseKitProvider中设置MemoryKeyedCache作为KeyedCache
    我们简单的翻看了整个的流程,SQLite的Provide设置的是SQLite作为cache而MySQL这边的Provider采用的是内存作为cache,那么我们怎样将MySQL切换为caceh存储容器呢?很简单仿照SQLite将MySQL的pool家加进去即可:

     services.register(KeyedCache.self) { container -> MySQLDatabaseCache  in
             let pool = try container.connectionPool(to: .mysql)
            return MySQLDatabaseCache.init(pool: pool )
        }
    

    结果查看:


    结果查看

    相关文章

      网友评论

        本文标题:vapor MySQL 作为Cache

        本文链接:https://www.haomeiwen.com/subject/sspyxqtx.html