周五上班的主要任务是在公司老平台上用redis处理一个队列问题,顺便复习了一下redis操作的基础知识,回来后就想着在自己的博客demo里,用redis来优化一些使用场景,学习一下golang开发下redis的使用。
Redis简单介绍
简介
关于Redis的讨论,其实在现在的后台开发中已经是个老生常谈的问题,基本上也是后端开发面试的基本考察点。其中 Redis的背景介绍和细节说明在这里就不赘述。不管怎么介绍,核心在于Redis是一个基于内存的key-value的多数据结构存储,并可以提供持久化服务。基于内存的特性决定了Redis天然适合高并发的数据读写缓存优化,同时也带来了内存开销过大的问题。所以在一些特定情景下,Redis是一把无往不利的大杀器,值得深入学习。
学习Redis的一个难点或者说入门点,我个人感觉在于对象存储理念的转变。刚接触 Redis 时,我刚从大学毕业,脑子里基本都是关系型数据存储的理念,使用时总想着靠数据内的关系来建立数据之间的联系,用起来很不顺手。后来慢慢入门了才感受到了一些操作的好处。举个栗子,比如查询用户在某个文章下的评论,用 sql 的思路就是搜索评论表里面用户ID和文章ID匹配的数据,有时还需要联合查询出其他信息,但是如果是 Redis 操作,以'前缀:文章ID:用户ID'为key,比如'comment:666:888'就可以快速取出用户评论,十分方便。 Redis 的强大远不仅如此,可以在实践中慢慢体会。
主要数据结构
Redis主要有五种基本数据结构,满足了绝大多数缓存结构的需要,如果你在使用一种结构存储时感觉别扭时,很有可能是选错了存储结构,可以考虑一下其他结构的正确实现。
常见使用场景
Golang连接Redis
使用 Golang 开发的一大直观感受就是,基本上你日常遇到的开发问题,都有官方或者第三方包帮你辅助实现,同时这些包都是开源的,只要你感兴趣,都可以深入到包的内部实现去学习理解包的实现思路和方法。当然这也有利有弊,第三包的不稳定和质量参差不齐也增加了一些开发成本,目前还是感受利大于弊。研究好的包源码实现,也是目前我的一个学习方向。
garyburd/redigo 包简介
garyburd/redigo 包是网上很多博文都在推荐使用的一个高Star的 Redis 连接包,但是当我自己去 Github 的项目地址 garyburd/redigo 上查看 API 时,发现这个项目目前是归档状态,项目已经迁移到了 gomodule/redigo ,同时包的获取也理所当然地改成了 go get github.com/gomodule/redigo/redis ,这已经不是我第一次感受了第三方包的不稳定,之前用 dep 进行包管理时,就遇到过 dep 拉取的包版本和本地包版本 API 冲突的问题,这个有时间单独再说。总之,暂时不管这两个包的详细区别,以下就以新包为准,介绍下 redigo 包使用。
建立连接池
Redigo Pool 结构维护一个 Redis 连接池。应用程序调用 Get 方法从池中获取连接,并使用连接的 Close 方法将连接的资源返回到池中。一般我们在系统初始化时声明一个全局连接池,然后在需要操作 redis 时获得连接,执行指令。
pool := &redis.Pool{ MaxIdle: 3, /*最大的空闲连接数*/ MaxActive: 8, /*最大的激活连接数*/ Dial: func() (redis.Conn, error) { c, err := redis.Dial("tcp", '链接地址,例如127.0.0.1:6379', redis.DialPassword('密码')) if err != nil { return nil, err } return c, nil } } c:=pool.Get() defer c.Close()
执行指令
查看源码,发现 Conn 接口有一个执行 Redis 命令的通用方法:
``` //gomodule/redigo/redis/redis.go // Conn represents a connection to a Redis server. type Conn interface { // Close closes the connection. Close() error // Err returns a non-nil value when the connection is not usable. Err() error // Do sends a command to the server and returns the received reply. Do(commandName string, args ...interface{}) (reply interface{}, err error) // Send writes the command to the client's output buffer. Send(commandName string, args ...interface{}) error // Flush flushes the output buffer to the Redis server. Flush() error // Receive receives a single reply from the Redis server Receive() (reply interface{}, err error) } ```
http://redis.io/commands 中的 Redis 命令参考列出了可用的命令。 do 的参数和 redis-cli 命令参数格式一致,比如 SET key value EX 360 对应函数调用为 Do("SET", "key", "value","EX",360) ,常用的命令示例有:
c:=pool.Get() defer c.Close() //存值, _, err := c.Do("SET", "key", "value") //设置过期时间 _, err := c.Do("SET", "key", "value","EX",360) //存int _, err := c.Do("SET", "key", 2) //取值 v,err:=redis.String(c.Do("GET","key")) bytes, err := redis.Bytes(c.Do("GET", "key"))
总结
golang 中连接使用 redis 相对比较简单,所以暂时也没什么其他好说的,如果后面自己使用过程中发现有遗漏再进行补充,关键还是在于熟悉 redis-cli 原生的指令操作。
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持小牛知识库。
本文向大家介绍spring boot中内嵌redis的使用方法示例,包括了spring boot中内嵌redis的使用方法示例的使用技巧和注意事项,需要的朋友参考一下 redis介绍 Redis是目前业界使用最广泛的内存数据存储。相比memcached,Redis支持更丰富的数据结构,例如hashes, lists, sets等,同时支持数据持久化。除此之外,Redis还提供一些类数据库的特性,比
本文向大家介绍在Node.js应用中使用Redis的方法简介,包括了在Node.js应用中使用Redis的方法简介的使用技巧和注意事项,需要的朋友参考一下 在开始本文之前请确保安装好 Redis 和 Node.js 以及 Node.js 的 Redis 扩展 —— node_redis 首先创建一个新文件夹并新建文本文件 app.js 文件内容如下: 当连接到 Redis 后会调用 runS
本文向大家介绍在Laravel中使用MongoDB的方法示例,包括了在Laravel中使用MongoDB的方法示例的使用技巧和注意事项,需要的朋友参考一下 MongoDB实用场景 产品用户访问日志,点击埋点统计信息 业务系统环境参数配置信息 业务系统运行时日志,如laravel.log,nginx.log 使用Homebrew在macoOS安装MongoDB PHP Driver 在macOS中,
本文向大家介绍在vue中使用setInterval的方法示例,包括了在vue中使用setInterval的方法示例的使用技巧和注意事项,需要的朋友参考一下 昨天在用vue开发项目的时候遇到一个坑,在群友的探讨中,成功的解决了这一问题。 具体情形如下:使用vue开发,在页面中有一个人数统计组件,人数统计是要动态变化数据的,由于目前没有真实数据,那么我想的是用随机数和setInterval来改变dat
本文向大家介绍clipboard在vue中的使用的方法示例,包括了clipboard在vue中的使用的方法示例的使用技巧和注意事项,需要的朋友参考一下 简介 页面中用 clipboard 可以进行复制粘贴,clipboard能将内容直接写入剪切板 安装 使用方法一 使用方法二 以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持呐喊教程。
问题内容: 我需要一个示例来使用GoLang在MongoDB中实现事务。 我正在使用此golang驱动程序用于mongodb https://github.com/mongodb/mongo-go-driver 没有有关如何实现事务的清晰文档。 谁能帮我? 问题答案: 可能会造成混乱。以下是一个简单的示例。 您可以在此处查看完整的示例。