Ce que cet article vous apporte est une introduction à la méthode d'implémentation du cache secondaire avec MySQL et Redis (exemples de code). Il a une certaine valeur de référence. Les amis dans le besoin peuvent s'y référer. .
Introduction à redis
Redis est entièrement open source et gratuit, respecte le protocole BSD et est une base de données clé-valeur hautes performances
Redis possède les trois fonctionnalités suivantes avec d'autres produits de cache clé-valeur :
Redis prend en charge la persistance des données et peut enregistrer les données en mémoire sur le disque et redémarrer Il peut être chargé à nouveau pour être utilisé
Redis prend non seulement en charge les données de type clé-valeur simples, mais fournit également le stockage de listes, d'ensembles, de zset, de hachage et d'autres structures de données
Redis prend en charge la sauvegarde des données, c'est-à-dire la sauvegarde des données en mode maître-esclave
Performances extrêmement élevées - Redis peut lire à une vitesse de 110 000 fois/s et écrire à une vitesse de 81 000 fois/s
Types de données riches - Redis prend en charge les chaînes et les listes dans les cas binaires , Hachages, ensembles et ensembles ordonnés Opérations de type de données
Atomique – Toutes les opérations dans Redis sont atomiques, ce qui signifie qu'elles sont soit exécutées avec succès, soit pas exécutées du tout en cas d'échec. Les opérations individuelles sont atomiques. Plusieurs opérations prennent également en charge les transactions, c'est-à-dire l'atomicité, encapsulées via les instructions MULTI et EXEC
Télécharger et décompresser
wget http://download.redis.io/releases/redis-5.0.3.tar.gz tar xzf redis-5.0.3.tar.gz
Déplacez le dossier vers /usr/local/
mv redis-5.0.3 /usr/local/
Entrez le dossier et compiler et tester
cd /usr/local/redis-5.0.3 sudo make test
Compiler et installer
sudo make install
Démarrer redis
redis-server
Si l'écran suivant apparaît, cela signifie que la base de données redis a été démarrée :
jpg
Pour les données avec un volume d'accès relativement important, afin d'obtenir les données plus rapidement, nous devons mettre en cache les données obtenues à partir de la base de données.
Utiliser le processus de mise en cache Redis dans le projet
La mise en cache des données doit prendre en compte les problèmes de synchronisation : si les données sont mises en cache, lors de l'interrogation des données, si les données sont mis en cache, S'il y a des données, les données mises en cache seront renvoyées directement sans interroger la base de données. Lorsque les données de la base de données changent, une incohérence de la base de données peut se produire. Vous pouvez envisager de supprimer les données mises en cache correspondantes à chaque fois que vous modifiez la base de données, de sorte que lors d'une nouvelle requête, la base de données soit interrogée et mise en cache
lors de l'interrogation de la requête. dans le cache
S'il n'y a pas de données dans le cache, interrogez la base de données et enregistrez les données dans le cache
Si les données est interrogé dans le cache Retour directement, plus besoin d'interroger la base de données
Créer le fichier redisPool.go pour l'initialisation du pool de connexion
package redigo_pool import ( "flag" "github.com/garyburd/redigo/redis" "time" ) var ( Pool *redis.Pool RedisServer = flag.String("redisServer", ":6379", "") ) func init() { Pool = &redis.Pool{ MaxIdle: 3, //最大空闲链接数,表示即使没有redis链接事依然可以保持N个空闲链接,而不被清除 MaxActive: 3, //最大激活连接数,表示同时最多有多少个链接 IdleTimeout: 240 * time.Second,//最大空闲链接等待时间,超过此时间,空闲将被关闭 Dial: func() (redis.Conn, error) { c, err := redis.Dial("tcp", *RedisServer) if err != nil { return nil, err } return c, err }, TestOnBorrow: func(c redis.Conn, t time.Time) error { if time.Since(t) < time.Minute { return nil } _, err := c.Do("PING") return err }, } }
Créer le fichier main.go pour implémenter le cache de deuxième niveau
package main import ( "database/sql" "encoding/json" "fmt" "github.com/garyburd/redigo/redis" _ "github.com/go-sql-driver/mysql" "strconv" "web/redis/redigo_pool" _ "web/redis/redigo_pool" ) type Person struct { Id int `db:"id"` Name string `db:"name"` Age int `db:"age"` Rmb int `db:"rmb"` } func main() { var cmd string for{ fmt.Println("输入命令") fmt.Scan(&cmd) switch cmd { case "getall": getAll() default: fmt.Println("不能识别其他命令") } fmt.Println() } } func getAll() { //从连接池当中获取链接 conn := redigo_pool.Pool.Get() //先查看redis中是否有数据 //conn,_ :=redis.Dial("tcp","localhost:6379") defer conn.Close() values, _ := redis.Values(conn.Do("lrange", "mlist",0,-1)) if len(values) > 0 { //如果有数据 fmt.Println("从redis获取数据") //从redis中直接获取 for _,key := range values{ pid :=string(key.([]byte)) id ,_:= strconv.Atoi(pid) results,_ := redis.Bytes(conn.Do("GET",id)) var p Person err := json.Unmarshal(results,&p) if err != nil { fmt.Println("json 反序列化出错") }else { fmt.Printf("name = %s\n",p.Name) } } }else { fmt.Println("从mysql中获取") //查询数据库 db,_ := sql.Open("mysql","root:Szt930708@tcp(localhost:3306)/mydb") defer db.Close() var persons []Person rows,_ := db.Query("select id,name,age,rmb from person") for rows.Next() { var id int var name string var age int var rmb int rows.Scan(&id,&name,&age,&rmb) per := Person{id,name,age,rmb} persons = append(persons,per) } //写入到redis中:将person以hash的方式写入到redis中 for _,p := range persons{ p_byte,_ := json.Marshal(p) _,err1 := conn.Do("SETNX",p.Id,p_byte) _,err2 := conn.Do("lpush","mlist",p.Id) // 设置过期时间 conn.Do("EXPIRE",p.Id,60*5) if err1 != nil || err2 != nil { fmt.Println("写入失败") }else { fmt.Println("写入成功") } } conn.Do("EXPIRE","mlist",60*5) } }
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!