goweb框架-gin

2024-08-21 09:52
文章标签 框架 gin goweb

本文主要是介绍goweb框架-gin,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

文章目录

    • Gin框架概览
      • Gin框架的特点
      • Gin框架的安装和基本使用
        • 安装
        • 基本使用
    • 路由系统
      • 路由的基本概念
      • Gin框架路由的特点
    • Radix Tree(基数树)
      • 基数树的定义和原理
      • 基数树在Gin框架中的应用
        • 节省空间的优化
        • 动态路由和通配符处理
    • 路由树的构建
      • 注册路由的过程
      • 路由树节点的定义和属性
      • 路由树的构建算法
    • 路由匹配机制
      • 路由匹配的入口函数
      • 路由匹配的流程
      • 尾随斜杠重定向(TSR)
    • 中间件机制
      • 中间件的定义和作用
      • Gin框架中间件的注册和执行流程
      • 常用中间件的介绍
    • 中间件的执行顺序和流程
      • 中间件链的构建
      • 中间件的执行逻辑
      • 中间件中的`Next()`方法
    • 源码解析
      • 重点代码段的解析
      • 路由注册和匹配的源码分析
    • 性能优化
      • 路由树的优先级排序
      • 路由匹配的性能考量

gin框架源码解析 - 李文周的博客

Gin框架概览

Gin框架的特点

Gin是一个高性能的Web框架,它具有以下显著特点:

  1. 性能优异:Gin框架在性能上非常出色,能够处理大量的并发请求。
  2. 路由灵活:支持动态路由和正则表达式路由,使得路由定义非常灵活。
  3. 中间件丰富:提供了丰富的中间件支持,如Logger、Recovery等,方便进行日志记录和错误恢复。
  4. 错误处理:内置的错误处理机制,可以方便地进行错误捕捉和响应。
  5. JSON****支持:内置对JSON的绑定和验证,简化了API开发流程。
  6. RESTful API:支持RESTful风格API的开发,符合现代Web API设计原则。
  7. 社区活跃:拥有活跃的社区和丰富的插件生态,便于开发者扩展功能。

Gin框架的安装和基本使用

安装

Gin框架的安装非常简单,通过Go的包管理工具go get即可安装:

bash

go get -u github.com/gin-gonic/gin
基本使用

安装完成后,可以通过以下步骤快速创建一个Gin Web应用:

  1. 导入Gin包:在Go文件中导入Gin框架。

go

import "github.com/gin-gonic/gin"
  1. 创建路由:定义HTTP路由和对应的处理函数。

go

func main() {router := gin.Default()router.GET("/", func(c *gin.Context) {c.JSON(200, gin.H{
{            "message": "hello world"}})})// 启动服务器router.Run()
}
  1. 启动服务器:使用router.Run()启动Gin服务器,默认监听在0.0.0.0:8080端口。
  2. 访问应用:在浏览器或使用工具如curl访问http://localhost:8080,可以看到返回的JSON消息。

路由系统

路由的基本概念

路由是Web框架中用于处理客户端请求并将其映射到特定处理函数的机制。在Web开发中,路由决定了当用户访问某个URL时,应该执行哪些代码。路由系统通常包含以下几个关键概念:

  • URL: 用户请求的网络地址,例如 http://example.com/api/users
  • HTTP方法: 请求的类型,如 GET, POST, PUT, DELETE 等。
  • 路由模式: 可以是静态的,如 /about,也可以是动态的,包含参数,如 /users/:id
  • 处理函数: 与特定路由匹配时执行的函数,用于生成响应。

Gin框架路由的特点

Gin框架的路由系统具有以下特点:

  1. 动态路由****与参数绑定:Gin支持在路由中使用参数,例如 /users/:id,方便获取URL中的数据。
  2. 正则表达式路由:Gin允许使用正则表达式来定义路由模式,提供了更复杂的路由匹配能力。
  3. 路由分组:通过分组可以组织相关路由,同时可以为分组应用中间件,简化配置。
  4. 中间件支持:可以在特定路由或路由组上使用中间件,进行日志记录、鉴权等操作。
  5. 路由匹配顺序:Gin会按照路由定义的顺序进行匹配,直到找到匹配的路由。
  6. 路由优先级:Gin使用基数树(Radix Tree)来优化路由匹配,提高匹配效率。
  7. 自动404处理:如果找不到匹配的路由,Gin会自动返回404错误。
  8. 路由参数验证:Gin支持对路由参数进行自动验证,确保数据的正确性。
  9. RESTful API支持:Gin的路由设计天然支持RESTful API风格,易于构建RESTful服务。
  10. 灵活的路由定义:支持使用GET, POST, PUT, DELETE等HTTP方法定义路由,以及ANY方法匹配所有HTTP方法。

通过这些特点,Gin框架提供了一个强大而灵活的路由系统,使得Web应用开发更加高效和易于管理。接下来,我们可以深入探讨Gin路由系统的内部实现,特别是基数树的使用和路由匹配机制。

Radix Tree(基数树)

基数树的定义和原理

基数树(Radix Tree),又称前缀树(Trie),是一种用于快速检索的数据结构,特别适用于处理字符串的前缀匹配问题。以下是基数树的一些基本定义和原理:

  • 节点:基数树由多个节点组成,每个节点代表字符串中的一个字符。
  • 根节点:代表空字符串,是树的起点。
  • 路径:从根节点到某一节点的序列,代表一个字符串的前缀。
  • 叶子节点:代表一个完整的字符串或模式。
  • 压缩:如果一个节点的所有子节点都只有一个子节点,该节点可以被压缩,从而节省空间。

基数树的工作原理基于字符串的公共前缀,通过共享这些前缀来减少存储空间。当插入或查询字符串时,树会沿着公共前缀向下遍历,直到达到字符串的末尾或树的末端。

基数树在Gin框架中的应用

节省空间的优化

Gin框架使用定制版本的基数树来优化路由的存储和匹配。以下是一些节省空间的优化措施:

  1. 节点合并:如果一个节点的所有子节点都只有一个子节点,Gin会将这些节点合并,减少节点的数量。
  2. 公共前缀共享:通过共享公共前缀,减少了重复的字符串存储,从而节省内存。
  3. 路径压缩:Gin在构建路由树时,会压缩不必要的路径,避免冗余。
动态路由和通配符处理

Gin框架的基数树还支持动态路由和通配符处理:

  1. 动态路由:Gin允许在路由中使用参数,如 /users/:id,这些参数在基数树中以特殊节点处理,可以匹配任意字符串。
  2. 通配符:Gin支持使用通配符,如 *,来匹配任意数量的任意字符。在基数树中,这通常通过特殊的节点来实现,这些节点可以匹配多个字符或子路径。
  3. 优先级排序:Gin在构建路由树时,会根据请求方法和路径的长度等因素对节点进行排序,以优化路由匹配的效率。

通过使用基数树,Gin框架能够高效地处理大量的路由,同时保持较低的内存占用和快速的匹配速度。基数树的结构使得Gin能够快速地找到匹配的路由,即使在面对复杂的路由配置时也能保持良好的性能。

路由树的构建

注册路由的过程

在Gin框架中,注册路由是一个将URL模式与处理函数相关联的过程。以下是注册路由的基本步骤:

  1. 创建路由实例:首先,创建一个gin.Engine的实例,这是路由注册和管理的核心。

go

router := gin.Default()
  1. 定义路由:使用GET, POST, PUT, DELETE等HTTP方法来定义路由,并指定URL模式。

go

router.GET("/user/:id", getUserByID)
  1. 指定处理函数:为每个路由指定一个处理函数,当路由匹配时,该函数将被调用。

go

func getUserByID(c *gin.Context) {// 处理请求
}
  1. 添加中间件:可以在特定路由或全局添加中间件来处理日志、鉴权等。

go

router.Use(middleware.Logger())
  1. 启动服务器:最后,启动Gin服务器监听和处理请求。

go

router.Run(":8080")

路由树节点的定义和属性

Gin框架中的路由树由多个节点组成,每个节点可能包含以下属性:

  • Path: 节点的路径字符串。
  • Handlers: 与该节点关联的处理函数链。
  • Priority: 节点的优先级,用于路由匹配时的排序。
  • Children: 子节点列表,用于表示路由的下一个字符或通配符。
  • Params: 路由参数列表,用于动态路由。
  • WildCard: 是否包含通配符,如*

路由树的构建算法

路由树的构建算法是Gin框架高效路由匹配的核心。以下是构建算法的关键步骤:

  1. 初始化:创建根节点,作为路由树的起点。
  2. 遍历路径:对于每个注册的路由,遍历其路径字符串。
  3. 节点创建与合并:对于路径中的每个字符或参数,创建新的节点或与现有节点合并。
  4. 参数处理:识别并处理路由参数(如:id)和通配符(如*)。
  5. 节点插入:将处理函数与相应的节点关联,并根据优先级排序。
  6. 压缩优化:优化树结构,合并连续的单子节点,减少内存占用。
  7. 中间件注册:为路由或路由组注册中间件,并将其与处理函数链合并。
  8. 构建完成:所有路由注册完成后,路由树构建完成,可用于请求匹配。

路由树的构建算法需要考虑多种因素,包括路由的动态性、通配符、中间件的注册顺序等,以确保路由匹配的准确性和效率。

路由匹配机制

路由匹配的入口函数

路由匹配的入口点通常是ServeHTTP方法,这是Gin框架处理每个HTTP请求的起点。ServeHTTP方法会调用路由匹配逻辑来找到并执行相应的处理函数。

go

func (engine *Engine) ServeHTTP(w http.ResponseWriter, req *http.Request) {// 省略其他代码c := engine.createContext(req)c.Writer = wengine.handleHTTPRequest(c)
}

handleHTTPRequest方法中,会调用路由树的查找逻辑,以确定哪个处理函数应该被执行。

路由匹配的流程

  1. 初始化上下文:为每个请求创建一个新的上下文对象,其中包含请求和响应相关的信息。
  2. 解析请求路径:提取请求的URL路径,并对其进行必要的解码。
  3. 遍历路由树:从根节点开始,根据请求路径中的每个字符或参数,逐级遍历路由树。
  4. 匹配节点:在遍历过程中,匹配节点的路径与请求路径。如果遇到动态路由或通配符,将捕获相应的参数。
  5. 执行中间件:如果路由匹配成功,会先执行与该路由关联的中间件链。
  6. 执行处理函数:中间件执行完毕后,调用最终的处理函数来生成响应。
  7. 处理不匹配情况:如果找不到匹配的路由,Gin会返回404错误。

尾随斜杠重定向(TSR)

尾随斜杠重定向(Trailing Slash Redirect)是一种常见的Web路由行为,用于处理URL路径末尾的斜杠问题。在Gin中,如果请求的URL路径与某个路由模式匹配,但该模式的末尾有一个斜杠,而请求的URL没有,Gin会自动进行重定向。

  1. 检测尾随斜杠:在路由匹配过程中,如果发现请求路径与某个路由模式匹配,但模式的末尾有斜杠而请求路径没有,或者相反,Gin会触发TSR。
  2. 执行重定向:Gin会构造一个新的URL,将请求重定向到正确的路径。例如,如果请求/users而路由模式是/users/,Gin会重定向到/users/
  3. 配置TSR:Gin允许开发者通过配置禁用或启用TSR行为。

go

router := gin.New()
router.RedirectTrailingSlash = true // 默认为true
  1. 处理重定向响应:客户端接收到重定向响应后,会根据响应头中的Location字段重新发起请求。

通过这种方式,Gin确保了URL的一致性,避免了因尾随斜杠不一致导致的潜在问题。

中间件机制

中间件的定义和作用

中间件在Web框架中充当一个处理链,它能够介入处理HTTP请求和响应的流程。中间件的主要作用包括:

  • 处理请求前逻辑:在主处理函数执行前,进行日志记录、鉴权、跨域处理等。
  • 处理请求后逻辑:在主处理函数执行后,进行响应修改、日志记录、错误处理等。
  • 流程控制:中间件可以决定是否继续执行链中的下一个处理函数或直接结束请求处理。

Gin框架中间件的注册和执行流程

在Gin框架中,中间件的注册和执行遵循以下流程:

  1. 注册中间件:在路由或全局级别注册中间件。

go

// 全局中间件
router.Use(middleware.Logger())
// 特定路由中间件
router.GET("/user/:id", middleware.Auth(), getUserByID)
  1. 创建处理链:Gin将注册的中间件和处理函数组合成一个处理链。
  2. 执行中间件:当请求到来时,Gin会按照注册顺序依次执行中间件。
  3. 调用**Next()**:每个中间件可以调用c.Next()来传递控制权给链中的下一个中间件或处理函数。
  4. 终止链执行:中间件可以通过调用c.Abort()来终止链的进一步执行。
  5. 执行处理函数:如果中间件链执行完毕且没有中间件调用c.Abort(),则执行最终的处理函数。
  6. 响应客户端:处理函数执行完毕后,Gin会发送响应回客户端。

常用中间件的介绍

Gin框架提供了一些常用的中间件,以下是几个示例:

  1. Logger:记录请求的日志信息,包括时间、方法、路径、状态码等。
  2. Recovery:恢复panic状态,确保服务稳定性,记录panic信息。
  3. Auth:一个示例中间件,用于进行用户认证。
  4. Cors:处理跨源资源共享(CORS)问题,允许跨域请求。
  5. Gzip:对响应内容进行Gzip压缩,减少传输数据量。
  6. RateLimit:限流中间件,控制客户端请求频率。
  7. Secure:增强应用安全性,如设置HTTP头部以防止某些类型的攻击。
  8. Session:管理用户会话,存储用户状态。
  9. BasicAuth:提供基本的HTTP认证。
  10. JWTAuth:使用JSON Web Tokens进行用户认证。

中间件的使用可以使Web应用更加模块化和灵活,开发者可以根据需要选择和组合不同的中间件来构建功能丰富的Web服务。

中间件的执行顺序和流程

中间件链的构建

在Gin框架中,中间件链的构建是通过将多个中间件函数按顺序注册到路由或全局处理器上实现的。以下是构建中间件链的步骤:

  1. 定义中间件:编写中间件函数,这些函数将接收一个*gin.Context作为参数。

go

func MyMiddleware(c *gin.Context) {// 在这里编写中间件逻辑
}
  1. 注册中间件:使用Use方法将中间件添加到全局中间件链,或添加到特定路由的中间件链。

go

// 注册全局中间件
engine.Use(middleware.Logger())
// 注册特定路由中间件
engine.GET("/user/:id", MyMiddleware, getUserByID)
  1. 组合中间件:中间件可以被组合,形成一个处理链,请求将按注册顺序依次通过它们。
  2. 创建处理链:Gin内部会根据注册的中间件和最终的处理函数,构建一个完整的处理链。

中间件的执行逻辑

中间件的执行遵循以下逻辑:

  1. 接收请求:当一个请求到达服务器时,Gin会创建一个新的Context
  2. 执行第一个中间件:Gin开始执行中间件链的第一个中间件。
  3. 调用**Next()**:如果中间件需要将控制权传递给下一个中间件或最终的处理函数,它会调用c.Next()

go

func MyMiddleware(c *gin.Context) {// 执行中间件逻辑c.Next() // 传递给下一个中间件或处理函数
}
  1. 按顺序执行:Gin会按注册顺序继续执行下一个中间件,直到最后一个中间件。
  2. 执行处理函数:最后一个中间件调用c.Next()后,Gin会执行最终的处理函数。
  3. 响应客户端:处理函数执行完毕后,Gin会构建HTTP响应并发送给客户端。

中间件中的Next()方法

Next()方法是中间件中的关键,它的作用是:

  • 继续执行链:告诉Gin继续执行中间件链中的下一个中间件或处理函数。
  • 控制流程:如果中间件中没有调用Next(),那么链中的后续中间件和处理函数将不会被执行。

使用Next()的示例:

go

func MyMiddleware(c *gin.Context) {// 执行一些前置逻辑// 继续执行中间件链c.Next()// 执行一些后置逻辑
}

如果中间件需要提前终止中间件链的执行,可以使用c.Abort()

go

func MyMiddleware(c *gin.Context) {// 执行一些逻辑,如果需要终止链执行c.Abort()// 后面的中间件和处理函数将不会执行
}

中间件的执行顺序和流程对于构建高效、可维护的Web服务至关重要。正确使用中间件可以提供额外的功能,如日志记录、鉴权、错误处理等,同时保持代码的清晰和组织性。

源码解析

重点代码段的解析

在Gin框架中,路由注册和匹配是核心功能,涉及到的源码主要集中在engine.gotree.go等文件中。以下是一些重点代码段的解析:

  1. 路由注册 (engine.go):
    1. Gin框架使用Engine结构体来维护路由信息,其中包括一个trees字段,用于存储不同的HTTP方法对应的路由树。

go

func (engine *Engine) addRoute(method, path string, handlers HandlersChain) {tree := engine.trees.get(method)if tree == nil {tree = NewMethodTree()engine.trees.set(method, tree)}tree.addRoute(path, handlers)
}
  1. 路由树的添加逻辑 (tree.go):
    1. MethodTree是存储特定HTTP方法路由的树结构,addRoute方法用于向树中添加新的路由。

go

func (tree *MethodTree) addRoute(path string, handlers HandlersChain) {node := tree.rootfor _, p := range path {// 遍历路径,构建树结构// ...}node.handlers = append(node.handlers, handlers)
}
  1. 请求处理 (engine.go):
    1. handleRequest是处理请求的核心方法,它使用路由树来匹配请求路径,并执行相应的处理函数。

go

func (engine *Engine) handleRequest(c *Context) {handlers := engine.trees.get(c.Request.Method).getValue(c.Request.URL.Path, c.Params)if handlers != nil {// 执行匹配到的路由的处理函数和中间件// ...} else {// 没有找到匹配的路由,调用404处理函数// ...}
}
  1. 路由匹配 (tree.go):
    1. getValue是路由树中用于匹配请求路径的方法,它返回与路径匹配的路由的处理函数和参数。

go

func (node *node) getValue(path string, params *Params) HandlersChain {for _, n := range node.children {if n.path == path {// 匹配到路由return n.handlers}}// 没有匹配到路由return nil
}

路由注册和匹配的源码分析

  1. 路由注册:
    1. 用户通过调用GET, POST等方法注册路由时,Gin会调用addRoute方法,将路由信息添加到对应的HTTP方法树中。
  2. 构建路由树:
    1. 路由树的构建是通过递归地为每个路径片段创建或找到节点来完成的。如果路径片段是动态的(如:id),则会创建一个特殊的节点来存储参数。
  3. 请求处理:
    1. 当请求到达时,Gin会根据请求的HTTP方法和URL路径,在相应的路由树中查找匹配的路由。
  4. 执行匹配的路由:
    1. 如果找到匹配的路由,Gin会执行该路由对应的处理函数和中间件链。如果没有找到匹配的路由,则会执行404或其他错误处理函数。
  5. 中间件的执行:
    1. 中间件的执行是通过HandlersChain来管理的,每个中间件可以决定是否调用c.Next()来继续执行链中的下一个处理函数。

性能优化

路由树的优先级排序

路由树的优先级排序是Gin框架性能优化的关键策略之一。以下是优先级排序的一些要点:

  1. 优先级的定义:在Gin中,路由的优先级通常由其在路由树中的位置决定。优先级高的路由会先被匹配。
  2. 最长路径优先:Gin框架倾向于先匹配最长的路径,以减少不必要的节点遍历,提高匹配效率。
  3. 静态路由优先于动态路由:在路由树中,静态路由(即不包含参数的路由)通常具有比动态路由(包含参数的路由)更高的优先级。
  4. 精确匹配优先:如果存在精确匹配的路由,Gin会优先选择精确匹配而不是通配符匹配。
  5. 中间件的影响:中间件的使用也会影响路由的优先级。例如,如果一个路由注册了多个中间件,那么这个路由的匹配可能会稍微慢一些,因为需要执行更多的中间件逻辑。
  6. 路由树的构建:在构建路由树时,Gin会根据路由的注册顺序和上述规则来安排节点的顺序,优化匹配性能。

路由匹配的性能考量

  1. 减少节点遍历:Gin通过优先匹配最长路径和静态路由来减少节点的遍历次数,从而提高匹配速度。
  2. 避免重复匹配:Gin框架的设计避免了对同一请求路径的重复匹配,每个请求只会在路由树中匹配一次。
  3. 使用Radix树:Radix树(基数树)的结构使得Gin能够在O(m)时间复杂度内完成路由匹配,其中m是URL路径的长度。
  4. 缓存机制:Gin框架可以使用缓存中间件来缓存常见的请求结果,减少处理时间和数据库查询。
  5. 并发处理:Gin框架支持高并发处理,通过使用goroutines来同时处理多个请求。
  6. 中间件链优化:合理组织中间件链,避免在链中执行耗时的操作,或者将耗时操作放在处理链的末尾。
  7. 错误处理:Gin框架提供了错误处理中间件,可以统一处理错误,避免在每个处理函数中重复错误处理逻辑。
  8. 监控和分析:使用性能监控工具来分析路由匹配的性能瓶颈,并根据分析结果进行优化。

通过这些性能优化策略,Gin框架能够在保持易用性的同时,提供高性能的Web服务。

这篇关于goweb框架-gin的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1092827

相关文章

cross-plateform 跨平台应用程序-03-如果只选择一个框架,应该选择哪一个?

跨平台系列 cross-plateform 跨平台应用程序-01-概览 cross-plateform 跨平台应用程序-02-有哪些主流技术栈? cross-plateform 跨平台应用程序-03-如果只选择一个框架,应该选择哪一个? cross-plateform 跨平台应用程序-04-React Native 介绍 cross-plateform 跨平台应用程序-05-Flutte

Spring框架5 - 容器的扩展功能 (ApplicationContext)

private static ApplicationContext applicationContext;static {applicationContext = new ClassPathXmlApplicationContext("bean.xml");} BeanFactory的功能扩展类ApplicationContext进行深度的分析。ApplicationConext与 BeanF

数据治理框架-ISO数据治理标准

引言 "数据治理"并不是一个新的概念,国内外有很多组织专注于数据治理理论和实践的研究。目前国际上,主要的数据治理框架有ISO数据治理标准、GDI数据治理框架、DAMA数据治理管理框架等。 ISO数据治理标准 改标准阐述了数据治理的标准、基本原则和数据治理模型,是一套完整的数据治理方法论。 ISO/IEC 38505标准的数据治理方法论的核心内容如下: 数据治理的目标:促进组织高效、合理地

ZooKeeper 中的 Curator 框架解析

Apache ZooKeeper 是一个为分布式应用提供一致性服务的软件。它提供了诸如配置管理、分布式同步、组服务等功能。在使用 ZooKeeper 时,Curator 是一个非常流行的客户端库,它简化了 ZooKeeper 的使用,提供了高级的抽象和丰富的工具。本文将详细介绍 Curator 框架,包括它的设计哲学、核心组件以及如何使用 Curator 来简化 ZooKeeper 的操作。 1

【Kubernetes】K8s 的安全框架和用户认证

K8s 的安全框架和用户认证 1.Kubernetes 的安全框架1.1 认证:Authentication1.2 鉴权:Authorization1.3 准入控制:Admission Control 2.Kubernetes 的用户认证2.1 Kubernetes 的用户认证方式2.2 配置 Kubernetes 集群使用密码认证 Kubernetes 作为一个分布式的虚拟

Spring Framework系统框架

序号表示的是学习顺序 IoC(控制反转)/DI(依赖注入): ioc:思想上是控制反转,spring提供了一个容器,称为IOC容器,用它来充当IOC思想中的外部。 我的理解就是spring把这些对象集中管理,放在容器中,这个容器就叫Ioc这些对象统称为Bean 用对象的时候不用new,直接外部提供(bean) 当外部的对象有关系的时候,IOC给它俩绑好(DI) DI和IO

Sentinel 高可用流量管理框架

Sentinel 是面向分布式服务架构的高可用流量防护组件,主要以流量为切入点,从限流、流量整形、熔断降级、系统负载保护、热点防护等多个维度来帮助开发者保障微服务的稳定性。 Sentinel 具有以下特性: 丰富的应用场景:Sentinel 承接了阿里巴巴近 10 年的双十一大促流量的核心场景,例如秒杀(即突发流量控制在系统容量可以承受的范围)、消息削峰填谷、集群流量控制、实时熔断下游不可用应

利用Django框架快速构建Web应用:从零到上线

随着互联网的发展,Web应用的需求日益增长,而Django作为一个高级的Python Web框架,以其强大的功能和灵活的架构,成为了众多开发者的选择。本文将指导你如何从零开始使用Django框架构建一个简单的Web应用,并将其部署到线上,让世界看到你的作品。 Django简介 Django是由Adrian Holovaty和Simon Willison于2005年开发的一个开源框架,旨在简

Yii框架relations的使用

通过在 relations() 中声明这些相关对象,我们就可以利用强大的 Relational ActiveRecord (RAR) 功能来访问资讯的相关对象,例如它的作者和评论。不需要自己写复杂的 SQL JOIN 语句。 前提条件 在组织数据库时,需要使用主键与外键约束才能使用ActiveReocrd的关系操作; 场景 申明关系 两张表之间的关系无非三种:一对多;一对一;多对多; 在

laravel框架实现redis分布式集群原理

在app/config/database.php中配置如下: 'redis' => array('cluster' => true,'default' => array('host' => '172.21.107.247','port' => 6379,),'redis1' => array('host' => '172.21.107.248','port' => 6379,),) 其中cl