Golang_实战_连接redis
Golang
文章目录
- Golang
- 1 何为redis
- 2 连接redis
- 2.1 读写
- 2.2 检测值是否存在
- 2.3 删除
- 2.4 读写json到redis
- 2.5 设置过期时间
- 2. 6 列表操作
- 3 管道
1 何为redis
Redis是一个开源的、使用C语言编写的、支持网络交互的、可基于内存也可持久化的Key-Value数据库。
Redis 优势
性能极高 – Redis能读的速度是110000次/s,写的速度是81000次/s 。
丰富的数据类型 – Redis支持二进制案例的 Strings, Lists, Hashes, Sets 及 Ordered Sets 数据类型操作。
原子 – Redis的所有操作都是原子性的,同时Redis还支持对几个操作全并后的原子性执行。
Redis与其他key-value存储有什么不同?
Redis有着更为复杂的数据结构并且提供对他们的原子性操作,这是一个不同于其他数据库的进化路径。Redis的数据类型都是基于基本数据结构的同时对程序员透明,无需进行额外的抽象。
Redis运行在内存中但是可以持久化到磁盘,所以在对不同数据集进行高速读写时需要权衡内存,因为数据量不能大于硬件内存。在内存数据库方面的另一个优点是,相比在磁盘上相同的复杂的数据结构,在内存中操作起来非常简单,这样Redis可以做很多内部复杂性很强的事情。同时,在磁盘格式方面他们是紧凑的以追加的方式产生的,因为他们并不需要进行随机访问。
2 连接redis
package main
import ("fmt""github.com/garyburd/redigo/redis"
)func main() {c, err := redis.Dial("tcp", "127.0.0.1:6379")if err != nil {fmt.Println("Connect to redis error", err)return}defer c.Close()
}
2.1 读写
这里写入的值永远不会过期
package mainimport ("fmt""github.com/garyburd/redigo/redis"
)func main() {c, err := redis.Dial("tcp", "127.0.0.1:6379")if err != nil {fmt.Println("Connect to redis error", err)return}defer c.Close()_, err = c.Do("SET", "mykey", "superWang")if err != nil {fmt.Println("redis set failed:", err)}username, err := redis.String(c.Do("GET", "mykey"))if err != nil {fmt.Println("redis get failed:", err)} else {fmt.Printf("Get mykey: %v \n", username)}
}
如何设置过期呢,可以使用SET的附加参数
package mainimport ("fmt""time""github.com/garyburd/redigo/redis"
)func main() {c, err := redis.Dial("tcp", "127.0.0.1:6379")if err != nil {fmt.Println("Connect to redis error", err)return}defer c.Close()_, err = c.Do("SET", "mykey", "superWang", "EX", "5")if err != nil {fmt.Println("redis set failed:", err)}username, err := redis.String(c.Do("GET", "mykey"))if err != nil {fmt.Println("redis get failed:", err)} else {fmt.Printf("Get mykey: %v \n", username)}time.Sleep(8 * time.Second)username, err = redis.String(c.Do("GET", "mykey"))if err != nil {fmt.Println("redis get failed:", err)} else {fmt.Printf("Get mykey: %v \n", username)}
}
输出:
Get mykey: superWang
redis get failed: redigo: nil returned
2.2 检测值是否存在
EXISTS key
package mainimport ("fmt""github.com/garyburd/redigo/redis"
)func main() {c, err := redis.Dial("tcp", "127.0.0.1:6379")if err != nil {fmt.Println("Connect to redis error", err)return}defer c.Close()_, err = c.Do("SET", "mykey", "superWang")if err != nil {fmt.Println("redis set failed:", err)}is_key_exit, err := redis.Bool(c.Do("EXISTS", "mykey1"))if err != nil {fmt.Println("error:", err)} else {fmt.Printf("exists or not: %v \n", is_key_exit)}}
输出:
exists or not: false
2.3 删除
DEL key [key …]
package mainimport ("fmt""github.com/garyburd/redigo/redis"
)func main() {c, err := redis.Dial("tcp", "127.0.0.1:6379")if err != nil {fmt.Println("Connect to redis error", err)return}defer c.Close()_, err = c.Do("SET", "mykey", "superWang")if err != nil {fmt.Println("redis set failed:", err)}username, err := redis.String(c.Do("GET", "mykey"))if err != nil {fmt.Println("redis get failed:", err)} else {fmt.Printf("Get mykey: %v \n", username)}_, err = c.Do("DEL", "mykey")if err != nil {fmt.Println("redis delelte failed:", err)}username, err = redis.String(c.Do("GET", "mykey"))if err != nil {fmt.Println("redis get failed:", err)} else {fmt.Printf("Get mykey: %v \n", username)}
}
输出:
Get mykey: superWang
redis get failed: redigo: nil returned
2.4 读写json到redis
package mainimport ("encoding/json""fmt""github.com/garyburd/redigo/redis"
)func main() {c, err := redis.Dial("tcp", "127.0.0.1:6379")if err != nil {fmt.Println("Connect to redis error", err)return}defer c.Close()key := "profile"imap := map[string]string{"username": "666", "phonenumber": "888"}value, _ := json.Marshal(imap)n, err := c.Do("SETNX", key, value)if err != nil {fmt.Println(err)}if n == int64(1) {fmt.Println("success")}var imapGet map[string]stringvalueGet, err := redis.Bytes(c.Do("GET", key))if err != nil {fmt.Println(err)}errShal := json.Unmarshal(valueGet, &imapGet)if errShal != nil {fmt.Println(err)}fmt.Println(imapGet["username"])fmt.Println(imapGet["phonenumber"])
}
2.5 设置过期时间
EXPIRE key seconds
// 设置过期时间为24小时
n, _ := rs.Do("EXPIRE", key, 24*3600)
if n == int64(1) { fmt.Println("success")
}
2. 6 列表操作
代码:
package mainimport ("fmt""github.com/garyburd/redigo/redis"
)func main() {c, err := redis.Dial("tcp", "127.0.0.1:6379")if err != nil {fmt.Println("Connect to redis error", err)return}defer c.Close()_, err = c.Do("lpush", "runoobkey", "redis")if err != nil {fmt.Println("redis set failed:", err)}_, err = c.Do("lpush", "runoobkey", "mongodb")if err != nil {fmt.Println("redis set failed:", err)}_, err = c.Do("lpush", "runoobkey", "mysql")if err != nil {fmt.Println("redis set failed:", err)}values, _ := redis.Values(c.Do("lrange", "runoobkey", "0", "100"))for _, v := range values {fmt.Println(string(v.([]byte)))}
}
输出:
mysql
mongodb
redis
3 管道
请求/响应服务可以实现持续处理新请求,即使客户端没有准备好读取旧响应。这样客户端可以发送多个命令到服务器而无需等待响应,最后在一次读取多个响应。这就是管道化(pipelining),这个技术在多年就被广泛使用了。距离,很多POP3协议实现已经支持此特性,显著加速了从服务器下载新邮件的过程。
Redis很早就支持管道化,所以无论你使用任何版本,你都可以使用管道化技术
连接支持使用Send(),Flush(),Receive()方法支持管道化操作
Send(commandName string, args ...interface{}) error
Flush() error
Receive() (reply interface{}, err error)
Send向连接的输出缓冲中写入命令。Flush将连接的输出缓冲清空并写入服务器端。Recevie按照FIFO顺序依次读取服务器的响应。下例展示了一个简单的管道:
c.Send("SET", "foo", "bar")
c.Send("GET", "foo")
c.Flush()
c.Receive() // reply from SET
v, err = c.Receive() // reply from GET
Do方法组合了Send,Flush和 Receive方法。Do方法先写入命令,然后清空输出buffer,最后接收全部挂起响应包括Do方发出的命令的结果。如果任何响应中包含一个错误,Do返回错误。如果没有错误,Do方法返回最后一个响应。
应用
package mainimport ("fmt""github.com/go-redis/redis"
)func main() {client := redis.NewClient(&redis.Options{Addr: "127.0.0.1:6379",Password: "", // no password setDB: 0, // use default DB})pong, err := client.Ping().Result()fmt.Println(pong, err)err = client.Set("key", "value", 0).Err()if err != nil {panic(err)}val, err := client.Get("key").Result()if err != nil {panic(err)}fmt.Println("key", val)val2, err := client.Get("key2").Result()if err == redis.Nil {fmt.Println("key2 does not exists")} else if err != nil {panic(err)} else {fmt.Println("key2", val2)}
}
输出:
PONG
key value
key2 does not exists
Golang_实战_连接redis相关推荐
- linux连接redis 命令_在Docker中使用Redis
1. 简介 本文章将介绍如何使用 Docker 探索 Redis.我们可以在 Docker for Windows .Docker for mac 或者 Linux 模式下运行 Docker 命令. ...
- Redis概述_使用命令对redis的数据进行增删改查_Jedis连接redis进行数据操作_redis进行数据缓存案例
学习目标 redis 概念 下载安装 命令操作 1. 数据结构 持久化操作 使用Java客户端操作redis Redis 前言(从百度上抄的, 看看了解一下, 懒得排版了) 1. 概念: redis是 ...
- redis 主从配置_应用 | Redis实现 主从,单例,集群,哨兵,配置应用
小小经过一天的休整 公众号更新规则:每周六将会停更一次,进行短期的休整,其余时间继续每天一更. 思维导图如下 Redis 主从配置 这里配置Redis主从 什么是主从 主从复制,是指把一台Redis服 ...
- php连接redis的操作库predis操作大全
predis是php连接redis的操作库,由于它完全使用php编写,大量使用命名空间以及闭包等功能,只支持php5.3以上版本,故实测性能一般,每秒25000次读写,相信改换c语言编写的php扩展后 ...
- go语言连接redis(已测试)
自己做测试了没有问题,虚拟机连不上可以把包下载到本地. 下面使用的是groe库连接redis简单展示如何操作. 先下载gore,命令行输入 go get github.com/keimoon/gore ...
- Redis 学习笔记-NoSQL数据库 常用五大数据类型 Redis配置文件介绍 Redis的发布和订阅 Redis_事务_锁机制_秒杀 Redis应用问题解决 分布式锁
1.NoSQL数据库 1.1 NoSQL数据库概述 NoSQL(NosQL = Not Only sQL ),意即"不仅仅是sQL",泛指非关系型的数据库.NoSQL不依赖业务逻辑 ...
- (需求实战_进阶_07)SSM集成RabbitMQ 订阅模式 关键代码讲解、开发、测试
接上一篇:(企业内部需求实战_进阶_06)SSM集成RabbitMQ 订阅模式 关键代码讲解.开发.测试 https://gblfy.blog.csdn.net/article/details/104 ...
- (需求实战_进阶_03)SSM集成RabbitMQ 路由模式关键代码讲解、开发、测试
接上一篇:(企业内部需求实战_进阶_02)SSM集成RabbitMQ 关键代码讲解.开发.测试 https://gblfy.blog.csdn.net/article/details/10421403 ...
- (需求实战_进阶_02)SSM集成RabbitMQ 关键代码讲解、开发、测试
接上一篇:(企业内部需求实战_进阶_01)SSM集成RabbitMQ 关键代码讲解.开发.测试 https://gblfy.blog.csdn.net/article/details/10419730 ...
最新文章
- do_exit——exit_notify()【转】
- InnoDB调优-索引优化策略
- Win10操作系统不能访问共享文件夹
- [PHP]对Json字符串解码返回NULL的一般解决方案
- react-native中的动画
- 02-06 Python库-random
- 百度Android在线语音识别SDK用法
- openg es 之一
- 数据库系统教程-面试汇总-合集
- 分享 AI 圣经 PRML《模式识别与机器学习》百度云链接
- C#华氏度转换成摄氏度的代码QVQ
- AQS框架原文翻译 - The java.util.concurrent Synchronizer Framework
- 台式电脑接路由器步骤_台式电脑连接网络步骤
- 【数据库学习】非关系数据库(NoSQL:“non-relational”)
- D-Link DCS系列监控账号密码信息泄露
- before和after怎么区分_before和after区别 关于before和after
- 为什么安装了python桌面没有图标怎嘛办_python在程序中没有找到图标
- 面试题:strcpy考虑内存重叠
- LeetCode——1104. 二叉树寻路(Path In Zigzag Labelled Binary Tree)[中等]——分析及代码(Java)
- 达人深度评测vivos7e和OPPOK7x参数对比 vivos7e和OPPOK7x哪个好
热门文章
- javaScript读取txt文档的FSO对象和ADODB.Stream对象
- 为什么mac系统没有有注册表一说?不需要注册表?
- 基于RGB的偏色检测(实用)
- Arduino+esp8266+1.4寸TFT屏(st7735驱动)解决显示图片偏色以及屏幕边缘花边问题
- 工业互联网2022:第一梯队成型、专精玩家突围
- 如何恢复android误删的文件夹,手机里的文件删了怎么恢复?这里有最全面的恢复方法...
- 噪声系数测试的几种方案选择
- 锥形锁紧衬套的全球与中国市场2022-2028年:技术、参与者、趋势、市场规模及占有率研究报告
- wmv在线播放器代码
- 入门级node+uni-app开发即时通讯聊天室(1)项目准备