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. redis的5种数据类型

    卸载服务:redis-server --service-uninstall 开启服务:redis-server --service-start 停止服务:redis-server --service- ...

  2. 2019-2020-1 20199308《Linux内核原理与分析》第九周作业

    <Linux内核分析> 第八章 可执行程序工作原理进程的切换和系统的一般执行过程 8.1 知识点 进程调度的时机 ntel定义的中断类型主要有以下几种 硬中断(Interrupt) 软中断 ...

  3. 自动获取时间html代码

    <button type="button" onclick="document.getElementById('demo').innerHTML = Date()& ...

  4. vue项目中上拉加载和下拉刷新页面的实现

    功能:上拉加载,下拉刷新 使用方法: 自己创建一个.vue的文件(我自己是创建了一个PullToRefresh.vue的文件),将代码粘贴进去,具体的样式问题自己在该文件中调整. <templa ...

  5. Vue Router路由守卫妙用:异步获取数据成功后再进行路由跳转并传递数据,失败则不进行跳转

    问题引入 试想这样一个业务场景: 在用户输入数据,点击提交按钮后,这时发起了ajax请求,如果请求成功, 则跳转到详情页面并展示详情数据,失败则不跳转到详情页面,只是在当前页面给出错误消息. 难点所在 ...

  6. 微服务为什么一定要用docker

    引言 早在2013年的时候,docker就已经发行,然而那会还是很少人了解docker.一直到2014年,Martin Fowler提出了微服务的概念,两个不相干的技术终于走在了一起,创造了今天的辉煌 ...

  7. 【mybatis xml】数据层框架应用--Mybatis(三)关系映射之一对一关系映射

    实际的开发中,对数据库的操作常常会涉及到多张表,这在面向对象中就涉及到了对象与对象之间的关联关系. 针对多表之间的操作,MyBatis提供了关联映射,通过关联映射就可以很好的处理对象与对象之间的关联关 ...

  8. Spring MVC的Controller接受请求方式以及编写请求处理方法

    Controller接受请求参数的常见方法: 1.通过Bean接受请求参数: 创建POJO实体类 创建pojo包,并在该包中创建实体类UserForm,代码: package pojo; public ...

  9. ubuntu16.04安装FastDFS-5.08

    fastdfs github地址: https://github.com/happyfish100/ 1.FastDFS上传原理 - storage定时向tracker上传状态信息 - client上 ...

  10. python call java jar

    python脚本如何调用Java的jar文件呢? HelloWorld.java public class HelloWorld { public static void main(String[] ...