golang常用库包:redis操作库go-redis使用(01)-Redis数据类型简介和连接Redis的几种方式
第一篇:go-redis使用,介绍Redis基本数据结构和其他特性,以及 go-redis 连接到Redis(本篇)
https://www.cnblogs.com/jiujuan/p/17207166.html
第二篇:go-redis使用,Redis5种基本数据类型操作
https://www.cnblogs.com/jiujuan/p/17215125.html
第三篇:go-redis使用,Redis高级数据结构和其它特性
https://www.cnblogs.com/jiujuan/p/17231723.html
一、Redis数据结构和一些特性介绍
redis7.0
先来了解一下 Redis 的数据结构有哪些,它有什么特性功能。
- 基本的 5 种数据结构:
- 字符串 string
- 列表 list
- 哈希 hash
- 集合 set
- 有序集合 sorted set
- 其他比较高级的数据结构:
- HyperLogLog 基数统计算法
- Geospatial index 地理空间索引
- Stream 流
- Bitmap 位图
- 其它特性功能
还有 BloomFilter 布隆过滤器的插件RedisBloom。
还有一些其它功能:
- pub/sub
- transaction
- Lua Scripts
- pipeline
它还有一些扩展功能,比如 server-side functions in Lua,支持 module 开发等等。
它还有一个 Redis Stack 包含了 5 项功能: RedisJSON, RediSearch, RedisGraph, RedisTimeSeries, and RedisBloom.
要了解更多功能:https://redis.io/docs/data-types/
https://redis.io/docs/data-types/tutorial/
- Redis 命令使用
Redis 官方有一个很详细的文档:https://redis.io/commands/
可以分类查询命令怎么使用:
二、go-redis 安装
如果使用 Redis 版本小于等于 6,安装 v8 版本:
go get github.com/go-redis/redis/v8
如果使用 Redis 版本大于等于 7,安装 v9 版本:
go get github.com/go-redis/redis/v9
三、connect连接Redis
3.1 普通模式
连接到单个 Redis。
- 第一种方法
import "github.com/go-redis/redis/v8"
rdb := redis.NewClient(&redis.Options{
Addr: "localhost:6379",
Password: "", // 如果密码为空
DB: 0, // 使用默认db
})
- 第二种方法
opt, err := redis.ParseURL("redis://<user>:<pass>@localhost:6379/<db>")
if err != nil {
panic(err)
}
rdb := redis.NewClient(opt)
3.2 sentinel 模式
- 连接到 Redis 服务器
import "github.com/go-redis/redis/v8"
rdb := redis.NewFailoverClient(&redis.FailoverOptions{
MasterName: "master-name",
SentinelAddrs: []string{":9126", ":9127", ":9128"},
})
- Redis v8 版本中一个实验性质的方法 NewFailoverClusterClient,只读方式连接到 Redis 从节点
import "github.com/go-redis/redis/v8"
rdb := redis.NewFailoverClusterClient(&redis.FailoverOptions{
MasterName: "master-name",
SentinelAddrs: []string{":9126", ":9127", ":9128"},
// To route commands by latency or randomly, enable one of the following.
//RouteByLatency: true,
//RouteRandomly: true,
})
- 连接到 Redis Sentinel 自身
import "github.com/go-redis/redis/v8"
sentinel := redis.NewSentinelClient(&redis.Options{
Addr: ":9126",
})
addr, err := sentinel.GetMasterAddrByName(ctx, "master-name").Result()
3.3 Redis Cluster 模式
连接到 Redis Cluster:
import "github.com/go-redis/redis/v8"
rdb := redis.NewClusterClient(&redis.ClusterOptions{
Addrs: []string{":7000", ":7001", ":7002", ":7003", ":7004", ":7005"},
// To route commands by latency or randomly, enable one of the following.
//RouteByLatency: true,
//RouteRandomly: true,
})
遍历集群中每个 shard 方法:
err := rdb.ForEachShard(ctx, func(ctx context.Context, shard *redis.Client) error {
return shard.Ping(ctx).Err()
})
if err != nil {
panic(err)
}
如果要遍历 master node,可以用 ForEachMaster
方法。遍历 slave nodes ,可以用 ForEachSlave
方法
还可以改变连接到一些shard分片的信息选项:
rdb := redis.NewClusterClient(&redis.ClusterOptions{
NewClient: func(opt *redis.Options) *redis.NewClient {
user, pass := userPassForAddr(opt.Addr)
opt.Username = user
opt.Password = pass
return redis.NewClient(opt)
},
})
3.4 Redis Ring 模式
Ring 也是 Redis 的客户端之一,它使用一致性 hash 算法在多台 Redis Server 之间分配数据。它可以在多个 goroutine 之间安全操作数据。
Ring 会监控每个分片的状态并且会移除无用的分片数据。当有一个新的 Redis 分片时,该分片会加入到一致性 hash 环中。这实现了最大的可用性和分区容错性,但是 Ring 这种方式不保证不同分片之间数据的一致性,每个客户端使用自己可用的分片数据,分片状态变更时不会与其它客户端协调。
当你用多台 Redis 服务器进行缓存时,可以容忍其中某台服务器上的数据丢失,那么你可以使用 Ring 模式。否则,请使用 Redis Cluster 模式、sentinel 模式 或普通模式。
- 3 台分片组成的 Ring Cluster
import "github.com/go-redis/redis/v8"
rdb := redis.NewRing(&redis.RingOptions{
Addrs: map[string]string{
"shard1": ":7000",
"shard2": ":7001",
"shard3": ":7002",
},
})
if err := rdb.Set(ctx, "foo", "bar", 0).Err(); err != nil {
panic(err)
}
- 也可以改变连接的信息
rdb := redis.NewRing(&redis.RingOptions{
NewClient: func(opt *redis.Options) *redis.NewClient {
user, pass := userPassForAddr(opt.Addr)
opt.Username = user
opt.Password = pass
return redis.NewClient(opt)
},
})
- keys 的分布算法
Ring 采用的默认一致性 hash 算法是 Rendezvous,Ring 使用这个算法将数据分布到多台分片服务器上。
如果想修改默认的一致性 hash 算法:
import "github.com/golang/groupcache/consistenthash"
ring := redis.NewRing(&redis.RingOptions{
NewConsistentHash: func() {
return consistenthash.New(100, crc32.ChecksumIEEE)
},
})
3.5 通用客户端连接
go-redis 也有一个通用的客户端连接方法:NewUniversalClient
。它 Wrapper 了原来的客户端,根据不同的选项此方法可以返回不同的客户端,比如返回 ClusterClient、FailoverClient 或单节点客户端。
这个方法对于在本地测试具体的集群模式或应用程序中需要用到不同的客户端,它就很有用。
NewUniversalClient
方法返回客户端类型的选项条件:
如果指定了 MasterName 选项,那么返回哨兵模式的客户端 - FailoverClient
如果选项 Addrs 的数量为两个或多个,那么返回集群模式的客户端 - ClusterClient
否则就返回单节点的客户端
代码例子:
// rdb is *redis.Client.
rdb := NewUniversalClient(&redis.UniversalOptions{
Addrs: []string{":6379"},
})
// rdb is *redis.ClusterClient.
rdb := NewUniversalClient(&redis.UniversalOptions{
Addrs: []string{":6379", ":6380"},
})
// rdb is *redis.FailoverClient.
rdb := NewUniversalClient(&redis.UniversalOptions{
Addrs: []string{":6379"},
MasterName: "mymaster",
})
完整代码请查看 github:https://github.com/jiujuan/go-exercises/tree/main/redis/go-redis/v8
第二篇:go-redis使用,Redis5种基本数据类型操作
https://www.cnblogs.com/jiujuan/p/17215125.html
第三篇:go-redis使用,Redis高级数据结构和其它特性
https://www.cnblogs.com/jiujuan/p/17231723.html
也可以到我的公众号 九卷技术录:golang常用库包:redis操作库go-redis使用(01)-Redis数据类型简介和连接Redis的几种方式 讨论
四、参考
golang常用库包:redis操作库go-redis使用(01)-Redis数据类型简介和连接Redis的几种方式的更多相关文章
- php版的redis操作库predis操作大全
转载于:http://www.itxuexiwang.com/a/shujukujishu/redis/2016/0216/146.html predis是php连接redis的操作库,由于它完全使用 ...
- golang常用的http请求操作
之前用python写各种网络请求的时候写的非常顺手,但是当打算用golang写的时候才发现相对来说还是python的那种方式用的更加顺手,习惯golang的用法之后也就差别不大了,下面主要整理了常用的 ...
- Golang: 常用的文件读写操作
Go 语言提供了很多文件操作的支持,在不同场景下,有对应的处理方式,今天就来系统地梳理一下,几种常用的文件读写的形式. 一.读取文件内容 1.按字节读取文件 这种方式是以字节为单位来读取,相对底层一些 ...
- java poi操作创建xslx或xsl文件,存本地和进行网络传输两种方式集成
package com.java.zxf.util; import java.io.IOException; import java.io.OutputStream; import java.net. ...
- NoSQL初探之人人都爱Redis:(2)Redis API与常用数据类型简介
一.Redis API For .Net 首先,不得不说Redis官方提供了众多的API开发包,但是目前Redis官方版本不支持.Net直接进行连接,需要使用一些第三方的开源类库.目前最流行的就是Se ...
- 【转】NoSQL初探之人人都爱Redis:(2)Redis API与常用数据类型简介
一.Redis API For .Net 首先,不得不说Redis官方提供了众多的API开发包,但是目前Redis官方版本不支持.Net直接进行连接,需要使用一些第三方的开源类库.目前最流行的就是Se ...
- Redis API与常用数据类型简介
Redis API与常用数据类型简介 一.Redis API For .Net 首先,不得不说Redis官方提供了众多的API开发包,但是目前Redis官方版本不支持.Net直接进行连接,需要使用一些 ...
- php redis 操作
在php里边,redis就是一个功能类,该类中有许多成员方法(名字基本与redis指令的名字一致,参数也一致). 实例: <?php $redis = new Redis(); //连接本地的 ...
- [Android]使用Gradle提交自己开源Android库到Maven中心库
以下内容为原创,欢迎转载,转载请注明 来自天天博客:http://www.cnblogs.com/tiantianbyconan/p/4388175.html 此文针对开源爱好者. 如果你想让别人使用 ...
- redis操作封装整理
<?php /** * redis操作类 * 说明,任何为false的串,存在redis中都是空串. * 只有在key不存在时,才会返回false. * 这点可用于防止缓存穿透 * */ cla ...
随机推荐
- [转帖]07、kvm虚拟机的克隆
操作前先关闭虚拟机 虚拟机的克隆 一.命令行克隆virt-clone(方法一) virt-clone -o vm1 -n vm2 -f /kvmdata/vm2.img 参数说明: -o:指定需要被c ...
- [转帖]为非root用户添加NOPASSWD权限
https://www.jianshu.com/p/d1e71bda4b34 查看树莓派默认是怎么为pi用户免去密码 所有配置文件都在 /etc 目录下,免去密码配置文件也不例外.在/etc/sudo ...
- [转帖]wiki Rust
Rust[编辑] 维基百科,自由的百科全书 跳到导航跳到搜索 此条目介绍的是由Mozilla主导开发的编程语言.关于"rust"在英文中的本意,请见"铁锈 ...
- 【转帖】通过pip命令安装好包之后,在pycharm中不显示此库,也不能调用
目录 1. 问题描述 2. 解决方法1 3. 解决方法2 1. 问题描述 在cmd输入pip list 命令可以看到我的库都已经安装好了,但是pycharm中却没有显示. 在PyCharm查找,并没有 ...
- Sysbench 开启超线程/关闭超线程以及容器运行数据库的性能损耗
Sysbench 开启超线程/关闭超线程性能损耗 摘要 Stress-NG 测试完之后 突然想 使用sysbenchen也进行一次压测 验证一把 超线程对数据的性能影响. 压测命令 ./sysbenc ...
- 查找linux下面某目录下重名出现的文件以及次数
find . -name '*.data' -exec basename {} \;| sort | uniq -w32 --all-repeated=separate | uniq -c | sor ...
- Ubuntu18.04 安装Postgresql12
Postgresql 12 是有很多新增特性的,但是最关键的一点是Postgresql 12 的SQL备份文件是不能直接使用psql命令导入到Postgresql 10 的. Ubuntu18.04 ...
- 数据结构与算法 第二章线性表(48课时课程笔记)Data Structure and Algorithms
2.1 线性表的类型定义 一个线性表是n个数据元素的有限序列. (1)结构初始化 InitList(&L) 构造一个空的线性表L. (2)销毁结构 DestroyList(&L) (3 ...
- js获取字符串最后几位字符数
截取字符串 为什要截取字符串呢??? 因为有些时候,我们需要判断某一个字符串中是不是,含有特定的字符 substring(a)从起始位置开始(包含a这个位置),一直到字符串的末尾(截取字符串最后6个) ...
- vim 从嫌弃到依赖(12)——打开及保存文件
在前几篇文章中,我们从vim各种模式的使用着手介绍了vim如何进行文本本身的编辑.也通过缓冲区列表的介绍了解到了vim是如何进行打开文件的管理.这篇我们将会着眼于文件的打开和保存的基本操作.通过这篇的 ...