


La pratique consistant à utiliser le cache pour accélérer l'efficacité de l'accès à la base de données dans Golang.
La pratique consistant à utiliser le cache pour accélérer l'efficacité de l'accès à la base de données dans Golang
À mesure que les applications Web deviennent de plus en plus complexes, l'accès à la base de données devient de plus en plus fréquent. L’accès à la base de données est généralement une opération très chronophage, surtout lorsque la quantité de données est importante. Afin d'améliorer l'efficacité de l'accès aux bases de données, des stratégies telles que la mise en cache peuvent être utilisées pour optimiser l'accès aux bases de données.
Cet article présentera la pratique de l'utilisation du cache pour accélérer l'accès aux bases de données dans Golang. Nous utiliserons Golang comme langage de développement, Redis comme serveur de cache et MySQL comme serveur de base de données pour les expériences.
1. Configurer l'environnement
Avant de commencer, nous devons configurer l'environnement. Installez d'abord les serveurs Golang et MySQL et Redis, qui ne seront pas décrits ici.
Ensuite, installez le pilote Go pour Redis et MySQL locaux dans Golang :
go get github.com/go-redis/redis/v8 go get github.com/go-sql-driver/mysql
2. Écrivez le code
Ensuite, nous écrivons le code pour implémenter la mise en cache afin d'accélérer l'accès à la base de données.
Le premier est le code d'accès à la base de données. Nous avons défini une variable globale appelée DB pour la connexion à MySQL. Ensuite, nous avons défini une fonction getUserByID pour interroger les informations d'un utilisateur depuis MySQL :
package main import ( "database/sql" "fmt" "log" _ "github.com/go-sql-driver/mysql" ) var DB *sql.DB type User struct { ID int Username string Password string Age int } func init() { db, err := sql.Open("mysql", "root:password@tcp(127.0.0.1:3306)/test?charset=utf8") if err != nil { log.Fatal("Open mysql failed,err:", err) return } DB = db fmt.Println("Connect to mysql success") } func getUserByID(id int) (*User, error) { var user User query := "SELECT id, username, password, age FROM users WHERE id=?" err := DB.QueryRow(query, id).Scan(&user.ID, &user.Username, &user.Password, &user.Age) if err != nil { log.Println(err) return nil, err } return &user, nil }
Ensuite, nous avons ajouté une logique de mise en cache à cette fonction getUserByID. Plus précisément, nous essayons d'abord de lire les informations utilisateur demandées à partir du cache Redis via la fonction getUserByID. S'il n'y a aucun enregistrement d'informations pour l'utilisateur dans Redis, les informations utilisateur sont lues à partir de MySQL et stockées dans Redis pour le prochain accès. Si les informations utilisateur sont enregistrées dans Redis, les informations utilisateur sont renvoyées directement depuis Redis :
package main import ( "database/sql" "encoding/json" "fmt" "log" "strconv" "github.com/go-redis/redis/v8" _ "github.com/go-sql-driver/mysql" ) var DB *sql.DB var RedisClient *redis.Client type User struct { ID int Username string Password string Age int } func init() { db, err := sql.Open("mysql", "root:password@tcp(127.0.0.1:3306)/test?charset=utf8") if err != nil { log.Fatal("Open mysql failed,err:", err) return } DB = db fmt.Println("Connect to mysql success") RedisClient = redis.NewClient(&redis.Options{ Addr: "127.0.0.1:6379", }) pong, err := RedisClient.Ping(RedisClient.Context()).Result() if err != nil { panic(err) return } fmt.Println("Connect to redis success: ", pong) } func getUserByID(id int) (*User, error) { var user User key := "user-" + strconv.Itoa(id) // 1.尝试从Redis中读取用户信息 val, err := RedisClient.Get(RedisClient.Context(), key).Result() if err == redis.Nil { fmt.Println("Cache miss") } else if err != nil { log.Println("Get from Redis fail:", err) } else { fmt.Println("Get from Redis:", val) if err := json.Unmarshal([]byte(val), &user); err != nil { // 将json字符串转换为结构体 log.Panicln("Unmarshal to user fail:", err) } return &user, nil } // 2.如果Redis中没有,从MySQL中查询 query := "SELECT id, username, password, age FROM users WHERE id=?" err = DB.QueryRow(query, id).Scan(&user.ID, &user.Username, &user.Password, &user.Age) if err != nil { log.Println(err) return nil, err } // 3.然后更新Redis缓存 val, err = json.Marshal(user) // 将结构体转换为json字符串 if err != nil { log.Panicln("Marshal user fail:", err) } err = RedisClient.Set(RedisClient.Context(), key, val, 0).Err() if err != nil { log.Panicln("Cache to Redis fail:", err) } return &user, nil }
3 Test
Nous avons terminé l'écriture de la logique du cache. Testons maintenant ce code et voyons comment il fonctionne.
Tout d'abord, notre programme de test doit lire les informations utilisateur de MySQL pour la première fois :
func main() { id := 1 user, err := getUserByID(id) if err != nil { log.Fatal(err) return } fmt.Printf("User info: id=%d, username=%s, password=%s, age=%d ", user.ID, user.Username, user.Password, user.Age) }
Exécutez le programme, le résultat est le suivant :
Cache miss User info: id=1, username=kirito, password=123456, age=18
Vous pouvez voir que le programme extrait les informations utilisateur de MySQL et le stocke dans le cache Redis.
Après avoir interrogé le même utilisateur pour la deuxième fois, le programme lira les informations utilisateur de Redis au lieu d'accéder à la base de données MySQL :
func main() { id := 1 user, err := getUserByID(id) if err != nil { log.Fatal(err) return } fmt.Printf("User info: id=%d, username=%s, password=%s, age=%d ", user.ID, user.Username, user.Password, user.Age) }
Exécutez le programme et le résultat est le suivant :
Get from Redis: {"ID":1,"Username":"kirito","Password":"123456","Age":18} User info: id=1, username=kirito, password=123456, age=18
Vous pouvez voir que le programme lit l'utilisateur directement à partir des informations Redis sans accéder à la base de données MySQL, ce qui prouve l'utilité de la mise en cache.
Résumé
Dans cet article, nous avons présenté la pratique consistant à utiliser le mécanisme de mise en cache Redis dans Golang pour optimiser l'efficacité de l'accès à la base de données. En écrivant la fonction getUserByID, lors de l'interrogation des informations utilisateur, nous essayons d'abord de lire les informations de Redis pour accélérer la requête. Si les informations utilisateur n'existent pas dans Redis, nous les lisons depuis MySQL et les stockons dans Redis. Une fois les données mises en cache, lorsque le programme accède plusieurs fois aux mêmes données, il peut lire directement à partir du cache sans accéder à la base de données à chaque fois.
Il est à noter que l'utilisation du cache doit éviter la génération de données sales. Pour les opérations CRUD sur les données, le cache doit également suivre les opérations sur les données pour garantir la cohérence des données dans le cache et la base de données.
En général, l'utilisation du mécanisme de mise en cache peut améliorer considérablement les performances du programme et est particulièrement efficace lors du traitement de grandes quantités de données. Cette stratégie est également très pratique dans les systèmes à haute concurrence, et il est recommandé aux développeurs de l'essayer.
Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Outils d'IA chauds

Undresser.AI Undress
Application basée sur l'IA pour créer des photos de nu réalistes

AI Clothes Remover
Outil d'IA en ligne pour supprimer les vêtements des photos.

Undress AI Tool
Images de déshabillage gratuites

Clothoff.io
Dissolvant de vêtements AI

AI Hentai Generator
Générez AI Hentai gratuitement.

Article chaud

Outils chauds

Bloc-notes++7.3.1
Éditeur de code facile à utiliser et gratuit

SublimeText3 version chinoise
Version chinoise, très simple à utiliser

Envoyer Studio 13.0.1
Puissant environnement de développement intégré PHP

Dreamweaver CS6
Outils de développement Web visuel

SublimeText3 version Mac
Logiciel d'édition de code au niveau de Dieu (SublimeText3)

Lire et écrire des fichiers en toute sécurité dans Go est crucial. Les directives incluent : Vérification des autorisations de fichiers Fermeture de fichiers à l'aide de reports Validation des chemins de fichiers Utilisation de délais d'attente contextuels Le respect de ces directives garantit la sécurité de vos données et la robustesse de vos applications.

Comment configurer le pool de connexions pour les connexions à la base de données Go ? Utilisez le type DB dans le package base de données/sql pour créer une connexion à la base de données ; définissez MaxOpenConns pour contrôler le nombre maximum de connexions simultanées ; définissez MaxIdleConns pour définir le nombre maximum de connexions inactives ; définissez ConnMaxLifetime pour contrôler le cycle de vie maximum de la connexion ;

Le framework Go se distingue par ses hautes performances et ses avantages en matière de concurrence, mais il présente également certains inconvénients, tels qu'être relativement nouveau, avoir un petit écosystème de développeurs et manquer de certaines fonctionnalités. De plus, les changements rapides et les courbes d’apprentissage peuvent varier d’un cadre à l’autre. Le framework Gin est un choix populaire pour créer des API RESTful en raison de son routage efficace, de sa prise en charge JSON intégrée et de sa puissante gestion des erreurs.

Meilleures pratiques : créer des erreurs personnalisées à l'aide de types d'erreurs bien définis (package d'erreurs) fournir plus de détails consigner les erreurs de manière appropriée propager correctement les erreurs et éviter de masquer ou de supprimer les erreurs Wrap si nécessaire pour ajouter du contexte

Les données JSON peuvent être enregistrées dans une base de données MySQL à l'aide de la bibliothèque gjson ou de la fonction json.Unmarshal. La bibliothèque gjson fournit des méthodes pratiques pour analyser les champs JSON, et la fonction json.Unmarshal nécessite un pointeur de type cible pour désorganiser les données JSON. Les deux méthodes nécessitent la préparation d'instructions SQL et l'exécution d'opérations d'insertion pour conserver les données dans la base de données.

La différence entre le framework GoLang et le framework Go se reflète dans l'architecture interne et les fonctionnalités externes. Le framework GoLang est basé sur la bibliothèque standard Go et étend ses fonctionnalités, tandis que le framework Go se compose de bibliothèques indépendantes pour atteindre des objectifs spécifiques. Le framework GoLang est plus flexible et le framework Go est plus facile à utiliser. Le framework GoLang présente un léger avantage en termes de performances et le framework Go est plus évolutif. Cas : gin-gonic (framework Go) est utilisé pour créer l'API REST, tandis qu'Echo (framework GoLang) est utilisé pour créer des applications Web.

Comment résoudre les problèmes de sécurité courants dans le framework Go Avec l'adoption généralisée du framework Go dans le développement Web, il est crucial d'assurer sa sécurité. Ce qui suit est un guide pratique pour résoudre les problèmes de sécurité courants, avec un exemple de code : 1. Injection SQL Utilisez des instructions préparées ou des requêtes paramétrées pour empêcher les attaques par injection SQL. Par exemple : constquery="SELECT*FROMusersWHEREusername=?"stmt,err:=db.Prepare(query)iferr!=nil{//Handleerror}err=stmt.QueryR

La fonction FindStringSubmatch recherche la première sous-chaîne correspondant à une expression régulière : la fonction renvoie une tranche contenant la sous-chaîne correspondante, le premier élément étant la chaîne entière correspondante et les éléments suivants étant des sous-chaînes individuelles. Exemple de code : regexp.FindStringSubmatch(text,pattern) renvoie une tranche de sous-chaînes correspondantes. Cas pratique : Il peut être utilisé pour faire correspondre le nom de domaine dans l'adresse email, par exemple : email:="user@example.com", pattern:=@([^\s]+)$ pour obtenir la correspondance du nom de domaine [1].
