这是我参与「第五届青训营 」笔记创作活动的第2天
session共享问题产生的原因
如果网站请求流量较大,那么单台服务器(tmocat)设备是无法承接这些流量的,这个时候就需要开始对服务器做集群,采用了多台机器做集群以后,就要通过一种机制来实现请求的路由。因为对于用户来说,访问的是一个域名,至于后端请求到哪一台服务器,用户并不需要关心,这里一般会使用负载均衡设备。当有多台web服务器时就需要用到session共享
例如:当我们有两台服务器时,用户登绿后在服务器1存下一个用户登绿的session,而我们负载均衡的方式又不是采用的哈希算法,当用户访问别的网页时,恰好使用的服务器不是服务器1而是服务器2,这样服务器2
就取不到用户的session,会提示用户要登录,这样不符合常理,所以就有了session共享。
如果你的网站是存放在一个机器上,那么是不存在这个问题的,因为会话数据就在这台机器,但是如果你使用了负载均衡把清求分发到不同的机器呢?这个时候会话在客户端是没有问题的,但是如果用户的两次清
求到了两台不同的机器,而它的session数据可能存在其中一台机器,这个时候就会出现取不session数据的情况,于是session的共享就成了一个问题。
Gorm相关注意事项:
1.First()如果没有查到数据返回为ErrRecordNotFound类型
- 当使用结构作为条件查询时,GORM 只会查询非零值字段。这意味着如果您的字段值为 0、''、false 或其他 零值,该字段不会被用于构建查询条件
db.Where(&User{Name: "jinzhu", Age: 0}).Find(&users)
// SELECT * FROM users WHERE name = "jinzhu";
您可以使用 map 来构建查询条件,例如:
db.Where(map[string]interface{}{"Name": "jinzhu", "Age": 0}).Find(&users)
// SELECT * FROM users WHERE name = "jinzhu" AND age = 0;
在写操作时,没有使用关联创建或者hook时可以通过SkipDefaultTransaction关闭事务提高性能
使用PrepareStmt缓存预编译语句可以提高后续调用速度