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相关推荐

  1. linux连接redis 命令_在Docker中使用Redis

    1. 简介 本文章将介绍如何使用 Docker 探索 Redis.我们可以在 Docker for Windows .Docker for mac 或者 Linux 模式下运行 Docker 命令. ...

  2. Redis概述_使用命令对redis的数据进行增删改查_Jedis连接redis进行数据操作_redis进行数据缓存案例

    学习目标 redis 概念 下载安装 命令操作 1. 数据结构 持久化操作 使用Java客户端操作redis Redis 前言(从百度上抄的, 看看了解一下, 懒得排版了) 1. 概念: redis是 ...

  3. redis 主从配置_应用 | Redis实现 主从,单例,集群,哨兵,配置应用

    小小经过一天的休整 公众号更新规则:每周六将会停更一次,进行短期的休整,其余时间继续每天一更. 思维导图如下 Redis 主从配置 这里配置Redis主从 什么是主从 主从复制,是指把一台Redis服 ...

  4. php连接redis的操作库predis操作大全

    predis是php连接redis的操作库,由于它完全使用php编写,大量使用命名空间以及闭包等功能,只支持php5.3以上版本,故实测性能一般,每秒25000次读写,相信改换c语言编写的php扩展后 ...

  5. go语言连接redis(已测试)

    自己做测试了没有问题,虚拟机连不上可以把包下载到本地. 下面使用的是groe库连接redis简单展示如何操作. 先下载gore,命令行输入 go get github.com/keimoon/gore ...

  6. Redis 学习笔记-NoSQL数据库 常用五大数据类型 Redis配置文件介绍 Redis的发布和订阅 Redis_事务_锁机制_秒杀 Redis应用问题解决 分布式锁

    1.NoSQL数据库 1.1 NoSQL数据库概述 NoSQL(NosQL = Not Only sQL ),意即"不仅仅是sQL",泛指非关系型的数据库.NoSQL不依赖业务逻辑 ...

  7. (需求实战_进阶_07)SSM集成RabbitMQ 订阅模式 关键代码讲解、开发、测试

    接上一篇:(企业内部需求实战_进阶_06)SSM集成RabbitMQ 订阅模式 关键代码讲解.开发.测试 https://gblfy.blog.csdn.net/article/details/104 ...

  8. (需求实战_进阶_03)SSM集成RabbitMQ 路由模式关键代码讲解、开发、测试

    接上一篇:(企业内部需求实战_进阶_02)SSM集成RabbitMQ 关键代码讲解.开发.测试 https://gblfy.blog.csdn.net/article/details/10421403 ...

  9. (需求实战_进阶_02)SSM集成RabbitMQ 关键代码讲解、开发、测试

    接上一篇:(企业内部需求实战_进阶_01)SSM集成RabbitMQ 关键代码讲解.开发.测试 https://gblfy.blog.csdn.net/article/details/10419730 ...

最新文章

  1. do_exit——exit_notify()【转】
  2. InnoDB调优-索引优化策略
  3. Win10操作系统不能访问共享文件夹
  4. [PHP]对Json字符串解码返回NULL的一般解决方案
  5. react-native中的动画
  6. 02-06 Python库-random
  7. 百度Android在线语音识别SDK用法
  8. openg es 之一
  9. 数据库系统教程-面试汇总-合集
  10. 分享 AI 圣经 PRML《模式识别与机器学习》百度云链接
  11. C#华氏度转换成摄氏度的代码QVQ
  12. AQS框架原文翻译 - The java.util.concurrent Synchronizer Framework
  13. 台式电脑接路由器步骤_台式电脑连接网络步骤
  14. 【数据库学习】非关系数据库(NoSQL:“non-relational”)
  15. D-Link DCS系列监控账号密码信息泄露
  16. before和after怎么区分_before和after区别 关于before和after
  17. 为什么安装了python桌面没有图标怎嘛办_python在程序中没有找到图标
  18. 面试题:strcpy考虑内存重叠
  19. LeetCode——1104. 二叉树寻路(Path In Zigzag Labelled Binary Tree)[中等]——分析及代码(Java)
  20. 达人深度评测vivos7e和OPPOK7x参数对比 vivos7e和OPPOK7x哪个好

热门文章

  1. javaScript读取txt文档的FSO对象和ADODB.Stream对象
  2. 为什么mac系统没有有注册表一说?不需要注册表?
  3. 基于RGB的偏色检测(实用)
  4. Arduino+esp8266+1.4寸TFT屏(st7735驱动)解决显示图片偏色以及屏幕边缘花边问题
  5. 工业互联网2022:第一梯队成型、专精玩家突围
  6. 如何恢复android误删的文件夹,手机里的文件删了怎么恢复?这里有最全面的恢复方法...
  7. 噪声系数测试的几种方案选择
  8. 锥形锁紧衬套的全球与中国市场2022-2028年:技术、参与者、趋势、市场规模及占有率研究报告
  9. wmv在线播放器代码
  10. 入门级node+uni-app开发即时通讯聊天室(1)项目准备