Error message here!

Hide Error message here!

忘记密码?

Error message here!

请输入正确邮箱

Hide Error message here!

密码丢失?请输入您的电子邮件地址。您将收到一个重设密码链接。

Error message here!

返回登录

Close

Golang 入门系列(七)Redis的使用

章为忠 2019-02-26 16:25:00 阅读数:228 评论数:0 点赞数:0 收藏数:0

安装

  1. Redis 的安装很简单,我这里测试直接用的是windows 的版本。如何安装就不细说了。想了解的可以看之前的文章:https://www.cnblogs.com/zhangweizhong/category/771056.html

 2. golang 客户端,用的是 go-redis,

1.   go get github.com/go-redis       2.  接着在代码中导入此包即可:  import "github.com/go-redis/redis"

 

基本操作

创建Redis连接客户端

通过 redis.NewClient 函数即可创建一个 redis 客户端, 这个方法接收一个 redis.Options 对象参数, 通过这个参数, 我们可以配置 redis 相关的属性, 例如 redis 服务器地址, 数据库名, 数据库密码等。

// 创建 redis 客户端

func GetRedisClient() /*Client { redisdb := NewClient(&Options{ Addr:"127.0.0.1:6379", Password:"", //no password set DB: 0, //use default DB }) pong, err :=redisdb.Ping().Result()if err !=nil { fmt.Println(pong, err) }returnredisdb }

通过 cient.Ping() 来检查是否成功连接到了 redis 服务器

 

String 操作

S et(key, value):给数据库中名称为key的string赋予值valueget(key):返回数据库中名称为key的string的value

GetSet(key, value):给名称为key的string赋予上一次的valueMGet(key1, key2,…, key N):返回库中多个string的value

SetNX(key, value):添加string,名称为key,值为valueSetXX(key, time, value):向库中添加string,设定过期时间time

MSet(key N, value N):批量设置多个string的值MSetNX(key N, value N):如果所有名称为key i的string都不存在

Incr(key):名称为key的string增1操作Incrby(key, integer):名称为key的string增加integer

Decr(key):名称为key的string减1操作Decrby(key, integer):名称为key的string减少integer

Append(key, value):名称为key的string的值附加valuesubstr(key, start, end):返回名称为key的string的value的子串

func StringDemo() { fmt.Println("-----------------------welcome to StringDemo-----------------------") redisClient:=GetRedisClient()if redisClient ==nil{ fmt.Errorf("StringDemo redisClient is nil")return} name := "张三"key :="name:zhangsan"redisClient.Set(key , name,1 /*time.Second) val :=redisClient.Get(key)if val ==nil { fmt.Errorf("StringDemo get error") } fmt.Println("name", val) }

 

List 操作

RPush(key, value):在名称为key的list尾添加一个值为value的元素

LPush(key, value):在名称为key的list头添加一个值为value的 元素LLen(key):返回名称为key的list的长度

LRange(key, start, end):返回名称为key的list中start至end之间的元素LTrim(key, start, end):截取名称为key的list

LIndex(key, index):返回名称为key的list中index位置的元素LSet(key, index, value):给名称为key的list中index位置的元素赋值

LRem(key, count, value):删除count个key的list中值为value的元素LPop(key):返回并删除名称为key的list中的首元素

RPop(key):返回并删除名称为key的list中的尾元素BLPop(key1, key2,… key N, timeout):lpop命令的block版本。

BRPop(key1, key2,… key N, timeout):rpop的block版本。RPopLPush(srckey, dstkey):返回并删除名称为srckey的list的尾元素,并将该元素添加到名称为dstkey的list的头部

func ListDemo(){ fmt.Println("-----------------------welcome to ListDemo-----------------------") redisClient:=GetRedisClient()if redisClient ==nil { fmt.Errorf("ListDemo redisClient is nil")return} articleKey := "article"result,err:=redisClient.RPush(articleKey, "a","b","c").Result() // if err!=nil { fmt.Println(err)return} fmt.Println("result:",result) result,err= redisClient.LPush(articleKey, "d").Result() // if err!=nil { fmt.Println(err)return} fmt.Println("result:",result) length, err :=redisClient.LLen(articleKey).Result()if err !=nil { fmt.Println("ListDemo LLen is nil") } fmt.Println("length:", length) //长度 mapOut,err1:=redisClient.LRange(articleKey,0,100).Result()if err1!=nil { fmt.Println(err1)return}for inx, item :=range mapOut { fmt.Printf("n %s:%s", inx, item) } }

Hash 操作

HSet(key, field, value):向名称为key的hash中添加元素field

HGet(key, field):返回名称为key的hash中field对应的valueHMget(key, (fields)):返回名称为key的hash中field i对应的value

HMset(key, (fields)):向名称为key的hash中添加元素fieldHIncrby(key, field, integer):将名称为key的hash中field的value增加integer

HExists(key, field):名称为key的hash中是否存在键为field的域HDel(key, field):删除名称为key的hash中键为field的域

HLen(key):返回名称为key的hash中元素个数HKeys(key):返回名称为key的hash中所有键

HVals(key):返回名称为key的hash中所有键对应的valueHGetall(key):返回名称为key的hash中所有的键(field)及其对应的value

 func HashDemo() { fmt.Println("-----------------------welcome to HashDemo-----------------------") redisClient :=GetRedisClient()if redisClient ==nil { fmt.Errorf("HashDemo redisClient is nil")return} article := Article{18, "测试文章内容22222", "测试文章内容22222测试文章内容22222测试文章内容22222", 10, 0} articleKey := "article:18"redisClient.HMSet(articleKey, ToStringDictionary(&article)) mapOut :=redisClient.HGetAll(articleKey).Val()for inx, item :=range mapOut { fmt.Printf("n %s:%s", inx, item) } fmt.Print("n") redisClient.HSet(articleKey,"Content", "测试文章内容") mapOut=redisClient.HGetAll(articleKey).Val()for inx, item :=range mapOut { fmt.Printf("n %s:%s", inx, item) } fmt.Print("n") view, err := redisClient.HIncrBy(articleKey, "Views", 1).Result()if err !=nil { fmt.Printf("n HIncrBy error=%s", err) }else{ fmt.Printf("n HIncrBy Views=%d", view) } fmt.Print("n") mapOut=redisClient.HGetAll(articleKey).Val()for inx, item :=range mapOut { fmt.Printf("n %s:%s", inx, item) } fmt.Print("n") }

 

连接池

go-redis 已经实现了 redis 的连接池管理, 因此我们不需要自己手动管理 redis 的连接。

默认情况下,连接池大小是10, 可以通过 redis.Options 的 PoolSize 属性, 我们设置了 redis 连接池的大小为5。func GetRedisClientPool() /*Client{ redisdb := NewClient(&Options{ Addr:"127.0.0.1:6379", Password:"", DB:0, PoolSize:5,}) pong, err :=redisdb.Ping().Result()if err !=nil { fmt.Println(pong, err) }returnredisdb }

//连接池测试 func connectPoolTest() { fmt.Println("-----------------------welcome to connect Pool Test-----------------------") client :=GetRedisClientPool() wg :=sync.WaitGroup{} wg.Add(10)for i := 0; i < 10; i++{ go func() { defer wg.Done()for j := 0; j < 1000; j++{ client.Set(fmt.Sprintf("name%d", j), fmt.Sprintf("xys%d", j), 0).Err() client.Get(fmt.Sprintf("name%d", j)).Result() } fmt.Printf("PoolStats, TotalConns: %d, IdleConns: %dn", client.PoolStats().TotalConns, client.PoolStats().IdleConns); }() } wg.Wait() }

完整代码

package main import ("fmt"."github.com/go-redis/redis"."redisDemo/models" "time" "sync") func main() { fmt.Println("-----------------------welcome to redisdemo-----------------------")//StringDemo()//ListDemo()//HashDemo() connectPoolTest() } func StringDemo() { fmt.Println("-----------------------welcome to StringDemo-----------------------") redisClient:=GetRedisClient()if redisClient ==nil{ fmt.Errorf("StringDemo redisClient is nil")return} name := "张三"key :="name:zhangsan"redisClient.Set(key , name,1 /time.Second) val :=redisClient.Get(key)if val ==nil { fmt.Errorf("StringDemo get error") } fmt.Println("name", val) } func ListDemo(){ fmt.Println("-----------------------welcome to ListDemo-----------------------") redisClient:=GetRedisClient()if redisClient ==nil { fmt.Errorf("ListDemo redisClient is nil")return} articleKey := "article"result,err:=redisClient.RPush(articleKey, "a","b","c").Result() //在名称为 key 的list尾添加一个值为value的元素 if err!=nil { fmt.Println(err)return} fmt.Println("result:",result) result,err= redisClient.LPush(articleKey, "d").Result() //在名称为 key 的list头添加一个值为value的元素 if err!=nil { fmt.Println(err)return} fmt.Println("result:",result) length, err :=redisClient.LLen(articleKey).Result()if err !=nil { fmt.Println("ListDemo LLen is nil") } fmt.Println("length:", length) //长度 mapOut,err1:=redisClient.LRange(articleKey,0,100).Result()if err1!=nil { fmt.Println(err1)return}for inx, item :=range mapOut { fmt.Printf("n %s:%s", inx, item) } } func HashDemo() { fmt.Println("-----------------------welcome to HashDemo-----------------------") redisClient :=GetRedisClient()if redisClient ==nil { fmt.Errorf("HashDemo redisClient is nil")return} article := Article{18, "测试文章内容22222", "测试文章内容22222测试文章内容22222测试文章内容22222", 10, 0} articleKey := "article:18"redisClient.HMSet(articleKey, ToStringDictionary(&article)) mapOut :=redisClient.HGetAll(articleKey).Val()for inx, item :=range mapOut { fmt.Printf("n %s:%s", inx, item) } fmt.Print("n") redisClient.HSet(articleKey,"Content", "测试文章内容") mapOut=redisClient.HGetAll(articleKey).Val()for inx, item :=range mapOut { fmt.Printf("n %s:%s", inx, item) } fmt.Print("n") view, err := redisClient.HIncrBy(articleKey, "Views", 1).Result()if err !=nil { fmt.Printf("n HIncrBy error=%s", err) }else{ fmt.Printf("n HIncrBy Views=%d", view) } fmt.Print("n") mapOut=redisClient.HGetAll(articleKey).Val()for inx, item :=range mapOut { fmt.Printf("n %s:%s", inx, item) } fmt.Print("n") } func GetRedisClient()/Client { redisdb := NewClient(&Options{ Addr:"127.0.0.1:6379", Password:"", //no password set DB: 0, //use default DB }) pong, err :=redisdb.Ping().Result()if err !=nil { fmt.Println(pong, err) }returnredisdb } func GetRedisClientPool()/*Client{ redisdb := NewClient(&Options{ Addr:"127.0.0.1:6379", Password:"", DB:0, PoolSize:5,}) pong, err :=redisdb.Ping().Result()if err !=nil { fmt.Println(pong, err) }returnredisdb }//连接池测试 func connectPoolTest() { fmt.Println("-----------------------welcome to connect Pool Test-----------------------") client :=GetRedisClientPool() wg :=sync.WaitGroup{} wg.Add(10)for i := 0; i < 10; i++{ go func() { defer wg.Done()for j := 0; j < 1000; j++{ client.Set(fmt.Sprintf("name%d", j), fmt.Sprintf("xys%d", j), 0).Err() client.Get(fmt.Sprintf("name%d", j)).Result() } fmt.Printf("PoolStats, TotalConns: %d, IdleConns: %dn", client.PoolStats().TotalConns, client.PoolStats().IdleConns); }() } wg.Wait() }

最后

1. go语言使用Redis 还是非常简单的,以上已经把Redis 的基本的用法讲完了。大家可以自己动手写代码试试。

2. 完整代码:点击下载

 

 

 

版权声明
本文为[章为忠]所创,转载请带上原文链接,感谢
https://www.cnblogs.com/zhangweizhong/p/10341460.html

编程之旅,人生之路,不止于编程,还有诗和远方。
阅代码原理,看框架知识,学企业实践;
赏诗词,读日记,踏人生之路,观世界之行;

支付宝红包,每日可领