连接

func RedisConPoint(db int) *redis.Client {addr := beego.AppConfig.String("redis_host")password := beego.AppConfig.String("redis_password")client := redis.NewClient(&redis.Options{Addr:         addr,Password:     password,DB:           db,ReadTimeout:  time.Duration(10) * time.Second,WriteTimeout: time.Duration(10) * time.Second,PoolSize: 5,})_, err := client.Ping().Result()if err != nil {fmt.Println(err)}return client}//退出redis
func RedisQuit(client redis.Client) {err := client.Close()if err != nil {fmt.Println(err)}}

string操作

set(key, value):给数据库中名称为key的string赋予值value
get(key):返回数据库中名称为key的string的value
getset(key, value):给名称为key的string赋予上一次的value
mget(key1, key2,…, key N):返回库中多个string的value
setnx(key, value):添加string,名称为key,值为value
setex(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的值附加value
substr(key, start, end):返回名称为key的string的value的子串

在 go-redis 中, 我们可以直接找到对应的操作方法, 直接上代码:

// String 操作
func stringOperation(client *redis.Client) {// 第三个参数是过期时间, 如果是0, 则表示没有过期时间.err := client.Set("name", "xys", 0).Err()if err != nil {panic(err)}val, err := client.Get("name").Result()if err != nil {panic(err)}fmt.Println("name", val)// 这里设置过期时间.err = client.Set("age", "20", 1 * time.Second).Err()if err != nil {panic(err)}client.Incr("age") // 自增client.Incr("age") // 自增client.Decr("age") // 自减val, err = client.Get("age").Result()if err != nil {panic(err)}fmt.Println("age", val) // age 的值为21// 因为 key "age" 的过期时间是一秒钟, 因此当一秒后, 此 key 会自动被删除了.time.Sleep(1 * time.Second)val, err = client.Get("age").Result()if err != nil {// 因为 key "age" 已经过期了, 因此会有一个 redis: nil 的错误.fmt.Printf("error: %v\n", err)}fmt.Println("age", 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的头部

同样地, 在 go-redis 中也可以找到对应的方法, 下面是一个简单的示例:

// list 操作
func listOperation(client *redis.Client) {client.RPush("fruit", "apple") //在名称为 fruit 的list尾添加一个值为value的元素client.LPush("fruit", "banana") //在名称为 fruit 的list头添加一个值为value的 元素length, err := client.LLen("fruit").Result() //返回名称为 fruit 的list的长度if err != nil {panic(err)}fmt.Println("length: ", length) // 长度为2value, err := client.LPop("fruit").Result() //返回并删除名称为 fruit 的list中的首元素if err != nil {panic(err)}fmt.Println("fruit: ", value)value, err = client.RPop("fruit").Result() // 返回并删除名称为 fruit 的list中的尾元素if err != nil {panic(err)}fmt.Println("fruit: ", value)
}

set 操作

sadd(key, member):向名称为key的set中添加元素member
srem(key, member) :删除名称为key的set中的元素member
spop(key) :随机返回并删除名称为key的set中一个元素
smove(srckey, dstkey, member) :移到集合元素
scard(key) :返回名称为key的set的基数
sismember(key, member) :member是否是名称为key的set的元素
sinter(key1, key2,…key N) :求交集
sinterstore(dstkey, (keys)) :求交集并将交集保存到dstkey的集合
sunion(key1, (keys)) :求并集
sunionstore(dstkey, (keys)) :求并集并将并集保存到dstkey的集合
sdiff(key1, (keys)) :求差集
sdiffstore(dstkey, (keys)) :求差集并将差集保存到dstkey的集合
smembers(key) :返回名称为key的set的所有元素
srandmember(key) :随机返回名称为key的set的一个元素

接下来是 go-redis 的 set 操作:

// set 操作
func setOperation(client *redis.Client) {client.SAdd("blacklist", "Obama") // 向 blacklist 中添加元素client.SAdd("blacklist", "Hillary") // 再次添加client.SAdd("blacklist", "the Elder") // 添加新元素client.SAdd("whitelist", "the Elder") // 向 whitelist 添加元素// 判断元素是否在集合中isMember, err := client.SIsMember("blacklist", "Bush").Result()if err != nil {panic(err)}fmt.Println("Is Bush in blacklist: ", isMember)// 求交集, 即既在黑名单中, 又在白名单中的元素names, err := client.SInter("blacklist", "whitelist").Result()if err != nil {panic(err)}// 获取到的元素是 "the Elder"fmt.Println("Inter result: ", names)// 获取指定集合的所有元素all, err := client.SMembers("blacklist").Result()if err != nil {panic(err)}fmt.Println("All member: ", all)
}

hash 操作

redis 的 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

go-redis 中的 hash 操作:

// hash 操作
func hashOperation(client *redis.Client) {client.HSet("user_xys", "name", "xys"); // 向名称为 user_xys 的 hash 中添加元素 nameclient.HSet("user_xys", "age", "18"); // 向名称为 user_xys 的 hash 中添加元素 age// 批量地向名称为 user_test 的 hash 中添加元素 name 和 ageclient.HMSet("user_test", map[string]string{"name": "test", "age":"20"})// 批量获取名为 user_test 的 hash 中的指定字段的值.fields, err := client.HMGet("user_test", "name", "age").Result()if err != nil {panic(err)}fmt.Println("fields in user_test: ", fields)// 获取名为 user_xys 的 hash 中的字段个数length, err := client.HLen("user_xys").Result()if err != nil {panic(err)}fmt.Println("field count in user_xys: ", length) // 字段个数为2// 删除名为 user_test 的 age 字段client.HDel("user_test", "age")age, err := client.HGet("user_test", "age").Result()if err != nil {fmt.Printf("Get user_test age error: %v\n", err)} else {fmt.Println("user_test age is: ", age) // 字段个数为2}
}

发布

//参数1 频道名 字符串类型
//参数2 发送的内容 他是个 interface{} 类型 因为我要和前端对接 所以data是我转的json字符err := RedisClient.Publish("message", data).Err()if err != nil {return errors.New("发布失败")}

订阅

func Subscribe(){//参数1 频道名 字符串类型pubsub := redis.Redis.Subscribe("homework")_, err := pubsub.Receive()if err != nil {return}ch := pubsub.Channel()for msg := range ch {fmt.Println( msg.Channel, msg.Payload, "\r\n")}
}
//这里的订阅了频道,阻塞了代码继续执行,所以我们 需要 go Subscribe() 来让我们的程序 继续执行 并且go Subscribe() 写在init方

golang中的goredis相关推荐

  1. Go实战--golang中使用redis(redigo和go-redis/redis这个已测试)

    自己做测试了没有问题,虚拟机连不上可以把包下载到本地. 版权声明:本文为博主原创文章,未经博主允许不得转载. http://blog.csdn.net/wangshubo1989/article/de ...

  2. Go实战--golang中使用redis(redigo和go-redis/redis)

    生命不止,继续 go go go !!! 以前介绍过golang中如何使用sqlite3: <Go实战–go语言操作sqlite数据库(The way to go)> 今天跟大家分享的是如 ...

  3. Golang中Buffer高效拼接字符串以及自定义线程安全Buffer

    本文原创文章,转载注明出处,博客地址 https://segmentfault.com/u/to... 第一时间看后续精彩文章.觉得好的话,顺手分享到朋友圈吧,感谢支持. Go中可以使用"+ ...

  4. 如何在golang中关闭bufio.reader_Golang 并发模型系列:1. 轻松入门流水线模型

    Go语言中文网,致力于每日分享编码.开源等知识,欢迎关注我,会有意想不到的收获! Golang作为一个实用主义的编程语言,非常注重性能,在语言特性上天然支持并发,它有多种并发模型,通过流水线模型系列文 ...

  5. go语言的iota是什么意思_关于Golang中的iota

    快速一览 iota是Golang中提供的一个简化常量和枚举编程的标识符,合理的使用这个标识符可以让代码变得更简洁,省去大量的不必要的代码. 比如下面的这个常量定义 const ( a = 1 b = ...

  6. Golang中的panic和recover(捕获异常)

    Golang中的panic和recover(捕获异常) 参考文章: (1)Golang中的panic和recover(捕获异常) (2)https://www.cnblogs.com/zhzhlong ...

  7. golang 中string和int类型相互转换

    总结了golang中字符串和各种int类型之间的相互转换方式: string转成int: test_int, err := strconv.Atoi(test_string) if err != ni ...

  8. golang中并发sync和channel

    golang中并发sync和channel chenbaoke · 2014-12-08 13:00:01 · 19151 次点击 · 预计阅读时间 5 分钟 · 不到1分钟之前 开始浏览 这是一个创 ...

  9. golang中的sync.WaitGroup

    golang中的sync.WaitGroup Posted on 2015/04/09刚才看golang的sync的包,看见一个很有用的功能.就是WaitGroup. 先说说WaitGroup的用途: ...

最新文章

  1. QT 子窗体 最大化 界面显示不对
  2. 【.NET Core项目实战-统一认证平台】第五章 网关篇-自定义缓存Redis
  3. prim——最小连接路径和(hdu1301)
  4. linux4.9下alsa架构,[Alsa]4, wm8524 Kernel音频子系统入口
  5. Ubuntu 10.4速配指南
  6. java的百度编辑器插件下载安装_ueditor-extend
  7. matlab自定义颜色代码,自定义颜色为matlab表面图
  8. linux 下librtmp源码,linux下基于libRTMP的接收流媒体的程序
  9. 数字化转型— 华为业务流程模型学习
  10. 对四旋翼飞行器的分析
  11. java获取当前年第一天_java中如何获取系统时间的当前年份以及年份的第一天和最后一天...
  12. ARC093 F - Dark Horse
  13. apipost中文版
  14. 基于PHP的驾校预约管理系统
  15. 如何让Div层悬浮在Flash Object对象之上!
  16. D. Fixed Point Guessing
  17. 虚言妙诀终虚见,面试躬行是致知,Python技术面试策略与技巧实战记录
  18. python彩色蟒蛇绘制方向_python绘制蟒蛇,绘制五彩蟒蛇
  19. 北京个体户税务申报如何办理?
  20. 数据库服务器压缩文件,服务器数据库怎么压缩文件

热门文章

  1. 【计算机网络】网络层 : 移动 IP 技术 ( 移动节点 | 本地代理 | 外部代理 | 永久地址 | 转交地址 | 移动 IP 通信过程 )
  2. 【Android 内存优化】Android 原生 API 图片压缩代码示例 ( PNG 格式压缩 | JPEG 格式压缩 | WEBP 格式压缩 | 动态权限申请 | Android10 存储策略 )
  3. 【Android 应用开发】多点触控 ( 多点触控事件 | PointerId | PointerIndex | 坐标获取 | 触摸点个数 )
  4. 【已解决】wepy中使用分包加载报错
  5. (2.10)备份与还原--利用T-SQL进行备份还原
  6. centos7.3安装MongoDB
  7. nested exception is java.lang.IllegalStateException: Context namespace element 'annotation-config' a
  8. 客户端与服务器cookie
  9. c# java数据类型不同点
  10. 酒店管理系统房态图的效果制作