10.2 Go redis

redis是NoSQL数据, 不是传统的关系型数据库。linux,windows环境皆可安装。

https://redis.io
http://www.redis.cn

redis(Remote Dictionary Server)远程字典服务器,性能非常高,单机15W QPS,适合缓存,持久化数据。

1.1. Go操作redis

使用第三方开源的 redis 库: github.com/garyburd/redigo/redis

go get github.com/garyburd/redigo/redis

获取、设置redis的key-value

string类型

package main

import (
"fmt"
"github.com/garyburd/redigo/redis"
) func main() {
conn, err := redis.Dial("tcp", "127.0.0.1:6379")
if err != nil {
fmt.Println("连接redis出错,", err)
return
} defer conn.Close()
//连接redis,写入数据 string
res, err := conn.Do("Set", "name", "alexdsb")
if err != nil {
fmt.Println("写入数据出错,", err)
return
}
fmt.Println(res) //读取redis数据
data, err := redis.String(conn.Do("Get", "name"))
if err != nil {
fmt.Println("读取数据出错,", err)
return
}
fmt.Println("读取出redis数据:", data)
}

Go操作redis hash类型

127.0.0.1:6379> HSET key field value

package main

import (
"fmt"
"github.com/garyburd/redigo/redis"
) func main() {
conn, err := redis.Dial("tcp", "127.0.0.1:6379")
if err != nil {
fmt.Println("连接redis出错,", err)
return //如果函数异常,直接退出
}
//函数推出前,关闭redis连接
defer conn.Close() //写入hash类型数据
//写入哈希类型,新闻01,标题
_, err = conn.Do("HSet", "news01", "title", "golang")
if err != nil {
fmt.Println("HSet err:", err)
return //如果函数异常,直接退出
} //写入哈希类型,新闻01,内容
_, err = conn.Do("HSet", "news01", "content", "life is short ,i use golang")
if err != nil {
fmt.Println("HSet err:", err)
return //如果函数异常,直接退出
} //读取hash数据类型
data, err := redis.String(conn.Do("HGet", "news01", "title"))
if err != nil {
fmt.Println("HGet err:", err)
return
}
fmt.Println("HGet data is :", data)
//读取hash数据类型
d2, err := redis.String(conn.Do("HGet", "news01", "content"))
if err != nil {
fmt.Println("HGet err:", err)
return
}
fmt.Println("HGet data is :", d2)
}

go操作redis,hash类型,写入多个field-value

127.0.0.1:6379> HMSET key field value [field value ...]

package main

import (
"fmt"
"github.com/garyburd/redigo/redis"
) func main() {
conn, err := redis.Dial("tcp", "127.0.0.1:6379")
if err != nil {
fmt.Println("连接redis出错,", err)
return //如果函数异常,直接退出
} //函数推出前,关闭redis连接
defer conn.Close() //写入多个字段
_, err = conn.Do("HMSet", "news02", "title", "gogogogogogog", "content", "pypypypypypy")
if err != nil {
fmt.Println("HMSet err:", err)
return
} ////读取多个数据
data, err := redis.Strings(conn.Do("HMGet", "news02", "title", "content"))
if err != nil {
fmt.Println("HMGet err:", err)
return
}
//for i, v := range data {
// fmt.Printf("data[%d]=%s\n", i, v)
//} fmt.Println(data)
}

设置redis数据过期时间

package main

import (
"fmt"
"github.com/garyburd/redigo/redis"
) func main() {
conn, err := redis.Dial("tcp", "127.0.0.1:6379")
if err != nil {
fmt.Println("连接redis出错,", err)
return //如果函数异常,直接退出
}
defer conn.Close()
//给redis的key设置过期时间,必选保证key存在!!
res, err := conn.Do("expire", "age2", 20)
if err != nil {
fmt.Println(err)
return
} fmt.Println(res) //data, err := redis.String(conn.Do("Get", "age2"))
//if err != nil {
// fmt.Println(err)
//}
//fmt.Println(data)
}

golang操作redis的list

package main

import (
"fmt"
"github.com/garyburd/redigo/redis"
) func main() {
conn, err := redis.Dial("tcp", "127.0.0.1:6379")
if err != nil {
fmt.Println("连接redis出错,", err)
return //如果函数异常,直接退出
} //go操作list
//注意坑,这里不能再次写入,数据追加写入队列
_, err = conn.Do("lpush", "duilie", "alex", "wupeiqi", "wenzhou", "大西瓜")
if err != nil {
fmt.Println(err)
return
} data, err := redis.Strings(conn.Do("lrange", "duilie", "0", "-1"))
if err != nil {
fmt.Println(err)
return
}
fmt.Println(data)
}

1.2. redis链接池

1.初始化一定数量的链接放入到链接池

2.go需要操作redis时,直接从链接池取出链接

3.节省临时获取redis链接的时间,提高效率

package main

import (
"fmt"
"github.com/garyburd/redigo/redis"
) //全局变量类型声明
var pool *redis.Pool //初始化函数,进行链接池初始化
func init() {
//redis.pool结构体中提供了参数用法
pool = &redis.Pool{
MaxIdle: 8, //最大空闲链接数
MaxActive: 0, //保持链接数,0是没限制
IdleTimeout: 100, //最大空闲时间
//初始化连接的代码,匿名函数
Dial: func() (redis.Conn, error) {
return redis.Dial("tcp", "127.0.0.1:6379")
},
}
} func main() {
//从pool中取出一个链接
conn := pool.Get()
defer conn.Close() //设置redis数据
_, err := conn.Do("set", "name", "大狗子")
if err != nil {
fmt.Println(err)
return
}
//取出redis数据
data, err := redis.String(conn.Do("get", "name"))
if err != nil {
fmt.Println(err)
return
}
fmt.Println(data) //想要从pool取出redis连接,必须保证链接池没关闭
//pool.Close() //关闭Pool池后,就无法取出redis链接了
conn2 := pool.Get()
_, err = conn2.Do("Set", "name2", "大狗子222")
if err != nil {
fmt.Println(err)
return
} //取出数据
//取出redis数据
data2, err := redis.String(conn.Do("get", "name2"))
if err != nil {
fmt.Println(err)
return
}
fmt.Println(data2)
}

10.2 Go redis的更多相关文章

  1. Win10 + Nginx 1.10 + PHP 7 + Redis 配置方法

    软件包版本 软件 版本 - 链接 - Nginx nginx-x32-1.10.2.zip 下载 PHP php-7.0.12-nts-Win32-VC14-x64 下载 Redis php_redi ...

  2. redis实战笔记(10)-第10章 扩展Redis

    本章主要内容   扩展读性能 扩展写性能以及内存容量 扩展复杂的查询   随着Redis的使用越来越多, 只使用一台Redis服务器没办法存储所有数据或者没办法处理所有读写请求的问题迟早都会出现, 这 ...

  3. Win 10下安装 Redis

    目录 写在前面 一.安装环境 二.下载windows版本的Redis 三.安装Redis 四.安装服务 五.启动服务 六.测试Redis 七.常用的Redis服务. 写在前面 Redis 是一个开源使 ...

  4. 10.27-Redis-mz 深入浅出Redis

    深入浅出Redis 1.Redis的发展史     Redis[Remote Directory Server]:远程服务器字典 2.下载安装Redis 1>Linux下安装Reids     ...

  5. 10分钟快速入门Redis

    Redis安装 来源:https://github.com/jaywcjlove/handbook 官方编译安装 $ wget http://download.redis.io/releases/re ...

  6. 10.Redis分布式集群

    10.Redis分布式集群10.1 数据分布10.1.1 数据分布理论10.1.2 Redis数据分区10.1.3 集群功能限制10.2 搭建集群10.2.1 准备节点10.2.2 节点握手10.2. ...

  7. Redis(二)CentOS7安装Redis4.0.10与集群搭建

    一 Redis单机安装 1 Redis下载安装 1.1 检查依赖环境(Redis是C语言开发,编译依赖gcc环境) [root@node21 redis-]$ gcc -v -bash: gcc: c ...

  8. swoole1.8.0+版本异步redis安装(本实例为swoole1.8.10版本)详解

    Swoole-1.8.0+版本增加了对异步Redis客户端的支持,基于redis官方提供的hiredis库实现.Swoole提供了__call魔术方法,来映射绝大部分Redis指令(本次安装实例为sw ...

  9. 10万用户一年365天的登录情况如何用redis存储,并快速检索任意时间窗内的活跃用户

    1.redsi的bitmap数据结构介绍 bitmap本质上是一个string类型,只是他操作的是string的某个位是0还是1. setbit和getbit 两条命令是对字符串的位操作.每个位只能是 ...

随机推荐

  1. Apache Rewrite实现URL的跳转和域名跳转

    Apache Rewrite实现URL的跳转和域名跳转   Rewirte主要的功能就是实现URL的跳转,它的正则表达式是基于Perl语言.可基 于服务器级的(httpd.conf)和目录级的 (.h ...

  2. ELK6.3版本安装部署

    一.Elasticsearch 安装 1.部署系统以及环境准备 cat /etc/redhat-release CentOS Linux release 7.4.1708 (Core) uname - ...

  3. Docker安装Alibaba Nacos教程(单机)

    SpringCloudAlibaba实战教程系列 阿里巴巴Nacos官方文档 docker:官网 docker:镜像官网:镜像官网可以所有应用,选择安装环境:会给出安装命令,例如:docker pul ...

  4. js 之 object

    js之object 对象 ECMA-262 把对象(object)定义为“属性的无序集合,每个属性存放一个原始值.对象或函数”.严格来说,这意味着对象是无特定顺序的值的数组. 尽管 ECMAScrip ...

  5. POJ1651:Multiplication Puzzle(区间dp)

    Multiplication Puzzle Time Limit: 1000MS Memory Limit: 65536K Total Submissions: 9419 Accepted: 5850 ...

  6. FastJson踩坑:@JsonField在反序列化时失效

    问题描述 一个对象(某个字段为枚举类型,为了不采用默认的序列化过程,用@JSONField指定了序列化器和反序列器,过程见旧博文),将其放到JSONArray中再序列化JSONArray对象,用得到的 ...

  7. 01-复杂度2 Maximum Subsequence Sum

    01-复杂度2 Maximum Subsequence Sum   (25分) 时间限制:200ms 内存限制:64MB 代码长度限制:16kB 判题程序:系统默认 作者:陈越 单位:浙江大学 htt ...

  8. VMware15.5.0安装MacOS10.15.0系统 安装步骤(下)

    VMware15.5.0安装MacOS10.15.0系统安装步骤(下)超详细! 接上文第5条如果没看过上篇的话传送门:https://www.cnblogs.com/Top-chen/p/128024 ...

  9. vue element select多选回显

    我们经常在使用 Element组件里面的 select多选 场景:添加账号的时候需要选择可见分公司(分公司为多选),添加成功之后可以编辑,需要回显添加时所提交的分公司 代码如下: 多选框: data( ...

  10. tomcat多个springboot项目启动失败

    多个springboot项目打包成war包并放到tomcat下运行时出错了错误信息: Caused by: org.springframework.jmx.export.UnableToRegiste ...