go语言redis使用(redigo)
通过一个例子来学习redigo的使用,其中主要使用到了redis的订阅与发布功能,以及redis连接池的实现
redis操作:
// tcp连接redis
rs, err := redis.Dial("tcp", host)
// 操作完后自动关闭
defer rs.Close()
// 操作redis时调用Do方法,第一个参数传入操作名称(字符串),然后根据不同操作传入key、value、数字等
// 返回2个参数,第一个为操作标识,成功则为1,失败则为0;第二个为错误信息
value, err := redis.String(rs.Do("GET", key))
if err != nil {
fmt.Println("fail")
}
若value的类型为int,则用redis.Int转换
若value的类型为string,则用redis.String转换
若value的类型为json,则用redis.Byte转换
// 存json数据
key := "aaa"
imap := map[string]string{"key1": "111", "key2": "222"}
// 将map转换成json数据
value, _ := json.Marshal(imap)
// 存入redis
n, err := rs.Do("SETNX", key, value)
if err != nil {
fmt.Println(err)
}
if n == int64(1) {
fmt.Println("success")
}
// 取json数据
// 先声明imap用来装数据
var imap map[string]string
key := "aaa"
// json数据在go中是[]byte类型,所以此处用redis.Bytes转换
value, err := redis.Bytes(rs.Do("GET", key))
if err != nil {
fmt.Println(err)
}
// 将json解析成map类型
errShal := json.Unmarshal(value, &imap)
if errShal != nil {
fmt.Println(err)
}
fmt.Println(imap["key1"])
fmt.Println(imap["key2"])
订阅发布功能测试
package models
import (
"github.com/garyburd/redigo/redis"
"github.com/astaxie/beego"
"time"
"fmt"
)
var (
//定义常亮
RedisClient *redis.Pool
REDIS_HOST string
REDIS_PORT string
REDIS_DB int
)
func init() {
//从配置文件中获取redis的ip以及db
REDIS_HOST = beego.AppConfig.String("redis_host")
REDIS_PORT = beego.AppConfig.String("redis_port")
REDIS_DB = beego.AppConfig.DefaultInt("redis_db", 0)
// 建立连接池
RedisClient = &redis.Pool{
// 从配置文件获取maxidle以及maxactive,取不到则用后面的默认值
MaxIdle: beego.AppConfig.DefaultInt("redis_maxidle", 100),
MaxActive: beego.AppConfig.DefaultInt("redis_maxactive", 1024),
IdleTimeout: 180 * time.Second,
Dial: func() (redis.Conn, error) {
c, err := redis.Dial("tcp", REDIS_HOST+":"+REDIS_PORT)
if err != nil {
return nil, err
}
// 选择db
//c.Do("SELECT", REDIS_DB)
return c, nil
},
}
}
/**
*redis订阅信息
*
*/
func Subscribe() {
c := RedisClient.Get()
psc := redis.PubSubConn{c}
psc.Subscribe("redChatRoom")
defer func() {
c.Close()
psc.Unsubscribe("redChatRoom") //取消订阅
} ()
for {
switch v := psc.Receive().(type) {
case redis.Message:
fmt.Printf("%s: messages: %s\n", v.Channel, v.Data)
case redis.Subscription:
//fmt.Printf("%s: %s %d\n", v.Channel, v.Kind, v.Count)
continue
case error:
fmt.Println(v)
return
}
}
}
/**
*redis发布信息
*
*/
func Pubscribe(s string) {
c := RedisClient.Get()
defer c.Close()
_, err := c.Do("PUBLISH", "redChatRoom", s)
if err != nil {
fmt.Println("pub err: ", err)
return
}
}
func test() {
// 从池里获取连接
rc := RedisClient.Get()
// 用完后将连接放回连接池
defer rc.Close()
//rc.Do()
//n, _ := rc.Do("EXPIRE", key, 24*3600)
//value, err := redis.String(rs.Do("GET", key))
return
}
go语言redis使用(redigo)的更多相关文章
- 在Go语言中基础的Redis操作
在Go语言中基础的Redis操作 需要先安装redigo go get "github.com/garyburd/redigo/redis" Go语言Redis客户端的简单示例 连 ...
- GO学习-(24) Go语言操作Redis
Go语言操作Redis 在项目开发中redis的使用也比较频繁,本文介绍了Go语言中go-redis库的基本使用. Redis介绍 Redis是一个开源的内存数据库,Redis提供了多种不同类型的数据 ...
- golang操作redis/go-redis库
目录 Redis介绍 Redis支持的数据结构 Redis应用场景 准备Redis环境 go-redis库 安装 连接 普通连接 V8新版本相关 连接Redis哨兵模式 连接Redis集群 基本使用 ...
- Redis客户端之Spring整合Jedis,ShardedJedisPool集群配置
Jedis设计 Jedis作为推荐的java语言redis客户端,其抽象封装为三部分: 对象池设计:Pool,JedisPool,GenericObjectPool,BasePoolableObjec ...
- [redis] Jedis 与 ShardedJedis 设计
Jedis设计 Jedis作为推荐的java语言redis客户端,其抽象封装为三部分: 对象池设计:Pool,JedisPool,GenericObjectPool,BasePoolableObjec ...
- 分布式系列十一: Redis进阶
分布式锁 数据库 数据库是使用唯一索引不允许重复的特性(或自定义实现如乐观锁). 但持有锁的进程如果释放锁时异常则容易导致死锁. zookeeper 使用临时节点, watcher可以获得节点被删除的 ...
- 扩展 StackExchange.Redis 支持实体
一.StackExchange.Redis StackExchange.Redis是由Stack Overflow开发的C#语言Redis客户端,使用广泛,本文针对 StackExchange.Red ...
- Redis特性和应用场景
Redis特性 速度快 Redis使用标准C编写实现,而且将所有数据加载到内存中,所以速度非常快.官方提供的数据表明,在一个普通的Linux机器上,Redis读写速度分别达到81000/s和11000 ...
- Redis特性
Redis特性和应用场景 Redis特性 速度快 Redis使用标准C编写实现,而且将所有数据加载到内存中,所以速度非常快.官方提供的数据表明,在一个普通的Linux机器上,Redis读写速度分别达到 ...
随机推荐
- Python进阶(5)_进程与线程之协程、I/O模型
三.协程 3.1协程概念 协程:又称微线程,纤程.英文名Coroutine.一句话说明什么是线程:协程是一种用户态的轻量级线程. 协程拥有自己的寄存器上下文和栈.协程调度切换时,将寄存器上下文和栈保存 ...
- margin无法居中原因
1.要给居中的元素一个宽度,否者无效. 2.该元素一定不能浮动,否者无效. 3 在HTML中使用标签,需考虑好整体构架,否者全部元素都会居中的.
- iOS AVPlayer 学习
1 .使用环境: 在实际开发过程中 有需要展示流媒体的模块 ,需求非常简单 :播放 和 暂停 ,其实这个时候有很多选择 ,可以选择 MPMoviePlayerController(MediaPlaye ...
- OpenGL学习进程(4)第二课:绘制图形
本节是OpenGL学习的第二个课时,下面介绍如何用点和线来绘制图形: (1)用点的坐标来绘制矩形: #include <GL/glut.h> void display(void) ...
- 0625 Django 基础
相关命令: 1 创建项目 django-admin startproject 项目名称 2 创建应用 python manage.py startapp app名称 3 启动项目 python man ...
- no xxx find in java.library.path
JAVA系统运行时候load native lib时候会遇到下面错误,如 java.lang.UnsatisfiedLinkError: no JSTAF in java.library.path这可 ...
- hadoop实战项目:查找相同字母组成的字谜
前面我们学习了MapReduce编程思想和编程示例,那么本节课程同学们一起操练操练,动手完成下面的项目. 项目需求 一本英文书籍包含成千上万个单词或者短语,现在我们需要在大量的单词中,找出相同字母组成 ...
- 转:gdb相关学习
声明本文转自:http://www.cnblogs.com/rosesmall/archive/2012/04/12/2444431.html (查看内存部分有补充) 另推荐一个入门级的好文章:htt ...
- R语言学习笔记(4)
第四章:基本数据管理 一 贯穿整章的示例 二 变量的创建.重编码和重命名 三 日期值与缺失值 四 数据类型和类型转换 五 数据集的排序.合并与取子集 一 贯穿整章的示例(leadership) ,, ...
- volatile的特性
volatile的特性 当我们声明共享变量为volatile后,对这个变量的读/写将会很特别.理解volatile特性的一个好方法是:把对volatile变量的单个读/写,看成是使用同一个监视器锁对这 ...