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. How to permit SSH root Login in Ubuntu 18.04

    https://www.ubuntu18.com/ssh-permitrootlogin/ SSH root login is disabled by default in Ubuntu 18.04. ...

  2. 多线程并行请求问题及SplashActivity预加载问题解决方案

    1. 问题描述(一): 现有3个线程thread1, thread2, thread3.这3个线程是并发执行的,当着3个线程都执行完成以后,需要执行一个finish()事件. 1.1 实现方法: /* ...

  3. 《Cisco防火墙》一2.4 总结

    本节书摘来自异步社区<Cisco防火墙>一书中的第2章,第2.4节,作者 [巴西]Alexandre M.S.P. Moraes,更多章节内容可以访问云栖社区"异步社区" ...

  4. Java实现zip文件解压[到指定目录]

    2019独角兽企业重金招聘Python工程师标准>>> package com.ljheee.ziptool.core; import java.io.File; import ja ...

  5. webpack4.x下babel的安装、配置及使用

    前言 目前,ES6(ES2015)这样的语法已经得到很大规模的应用,它具有更加简洁.功能更加强大的特点,实际项目中很可能会使用采用了ES6语法的模块,但浏览器对于ES6语法的支持并不完善.为了实现兼容 ...

  6. CF思维联系– Codeforces-987C - Three displays ( 动态规划)

    ACM思维题训练集合 It is the middle of 2018 and Maria Stepanovna, who lives outside Krasnokamensk (a town in ...

  7. POJ 3267为什么优先队列超时,DP就能过,难过

    The Cow Lexicon Time Limit: 2000MS Memory Limit: 65536K Total Submissions: 11846 Accepted: 5693 Desc ...

  8. 2019 Multi-University Training Contest 10 I Block Breaker

    Problem Description Given a rectangle frame of size n×m. Initially, the frame is strewn with n×m squ ...

  9. 洛谷 P1352 没有上司的舞会(树形 DP)

    题目描述 某大学有N个职员,编号为1~N.他们之间有从属关系,也就是说他们的关系就像一棵以校长为根的树,父结点就是子结点的直接上司.现在有个周年庆宴会,宴会每邀请来一个职员都会增加一定的快乐指数Ri, ...

  10. Jenkins 构建 Jmeter 项目

    1.启动 Jenkins(windows 版本) 2.新建自由风格的项目 定时任务 构建操作 安装 HTML Publisher 插件 构建后操作 最后保存构建,查看报告