简单方便的在Golang中使用Redis【Golang 入门系列】七
安装
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 setDB: 0, // use default DB})pong, err := redisdb.Ping().Result()if err != nil {fmt.Println(pong, err)}return redisdb}
通过 cient.Ping() 来检查是否成功连接到了 redis 服务器
String 操作
Set(key, value):给数据库中名称为key的string赋予值valueget(key):返回数据库中名称为key的string的value
GetSet(key, value):给名称为key的string赋予上一次的value
MGet(key1, key2,…, key N):返回库中多个string的value
SetNX(key, value):添加string,名称为key,值为value
SetXX(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,,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对应的value
HMget(key, (fields)):返回名称为key的hash中field i对应的value
HMset(key, (fields)):向名称为key的hash中添加元素field
HIncrby(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中所有键对应的value
HGetall(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, }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)}return redisdb}
// 连接池测试func connectPoolTest() {fmt.Println("-----------------------welcome to connect Pool Test-----------------------")client :=GetRedisClientPool()wg := sync.WaitGroup{}wg.Add(10)for i := ; i < 10; i++ {go func() {defer wg.Done()for j := ; j < 1000; j++ {client.Set(fmt.Sprintf("name%d", j), fmt.Sprintf("xys%d", j), ).Err()client.Get(fmt.Sprintf("name%d", j)).Result()}fmt.Printf("PoolStats, TotalConns: %d, IdleConns: %d\n", client.PoolStats().TotalConns, client.PoolStats().IdleConns);}()}wg.Wait()}
完整代码
package mainimport ("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,,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, }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 setDB: , // use default DB})pong, err := redisdb.Ping().Result()if err != nil {fmt.Println(pong, err)}return redisdb}func GetRedisClientPool() *Client{redisdb := NewClient(&Options{Addr: "127.0.0.1:6379",Password: "",DB: ,PoolSize: 5,})pong, err := redisdb.Ping().Result()if err != nil {fmt.Println(pong, err)}return redisdb}// 连接池测试func connectPoolTest() {fmt.Println("-----------------------welcome to connect Pool Test-----------------------")client :=GetRedisClientPool()wg := sync.WaitGroup{}wg.Add(10)for i := ; i < 10; i++ {go func() {defer wg.Done()for j := ; j < 1000; j++ {client.Set(fmt.Sprintf("name%d", j), fmt.Sprintf("xys%d", j), ).Err()client.Get(fmt.Sprintf("name%d", j)).Result()}fmt.Printf("PoolStats, TotalConns: %d, IdleConns: %d\n", client.PoolStats().TotalConns, client.PoolStats().IdleConns);}()}wg.Wait()}
后
1. go语言使用Redis 还是非常简单的,以上已经把Redis 的基本的用法讲完了。大家可以自己动手写代码试试。
2. 完整代码:点击下载
相关文章