go-redis | 青训营笔记

158 阅读5分钟

这是我参与「 第五届青训营 」伴学笔记创作活动的第 15 天 本文将分享在Golang中如何操作Redis,文章中演示的组件库为go-redis。

安装依赖包

go get -u github.com/go-redis/redis

Sample

// 根据redis配置初始化一个客户端
rdClient := redis.NewClient(&redis.Options{
    Addr:     "localhost:6379", // redis地址
    Password: "",               // redis密码,没有则留空
    DB:       0,                // 默认数据库,默认是0
})
// 设置一个key,过期时间为无限长
err := rdClient.Set("key", "value", 0).Err()
// 检测设置是否成功
if err != nil {
    panic(err)
}
// 获取key的值
val, err := rdClient.Get("key").Result()
if err != nil {
    panic(err)
}
fmt.Println("key", val)

详细介绍

连接redis

// 初始化一个新的redis client
rdClient := redis.NewClient(&redis.Options{
    Addr:     "localhost:6379", // redis地址
    Password: "",               // redis没密码,没有设置,则留空
    DB:       0,                // 使用默认数据库
})

go-redis包自带了连接池,会自动维护redis连接,因此创建一次client即可,不要查询一次redis就关闭client。

Options参数详解

type Options struct {
    Network string // 网络类型 tcp 或者 unix 默认是 tcp    
    Addr string // redis地址,格式 host:port    
    OnConnect func(*Conn) error // 新建一个redis连接的时候,会回调这个函数   
    Password string // redis密码,redis server没有设置可以为空。    
    DB int // redis数据库,序号从0开始,默认是0,可以不用设置    
    MaxRetries int // redis操作失败最大重试次数,默认不重试。    
    MinRetryBackoff time.Duration // 最小重试时间间隔 默认是8ms -1表示关闭    
    MaxRetryBackoff time.Duration // 最大重试时间间隔 默认是512ms -1 表示关闭    
    DialTimeout time.Duration // redis连接超时时间 默认是 5 秒   
    ReadTimeout time.Duration // socket读取超时时间 默认 3 秒
    WriteTimeout time.Duration // socket写超时时间
    PoolSize int // redis连接池的最大连接数 默认连接池大小等于 cpu个数 * 10
    MinIdleConns int // redis连接池最小空闲连接数.
    MaxConnAge time.Duration // redis连接最大的存活时间,默认不会关闭过时的连接.
    PoolTimeout time.Duration // 当你从redis连接池获取一个连接之后,连接池最多等待这个拿出去的连接多长时间。 // 默认是等待 ReadTimeout + 1     
    IdleTimeout time.Duration // redis连接池多久会关闭一个空闲连接 默认是 5 分钟 -1 则表示关闭这个配置项
    IdleCheckFrequency time.Duration // 多长时间检测一下,空闲连接
    readOnly bool // 只读设置,如果设置为true, redis只能查询缓存不能更新
}

string

Set("key", "value", 0) //设置一个key的值 0代表不会过期
Get("key").Result() // 查询key的值
GetSet("key", "new value") // 设置一个key的值,并返回这个key的旧值
SetNX("key", "value", 0) // 如果key不存在,则设置这个key的值
MGet("key1", "key2", "key3") // 批量查询key的值
MSet("key1", "value1", "key2", "value2", "key3", "value3") // 批量设置key的值
Strlen("key") // 返回字符串长度
Incr("key") // 针对一个key的数值进行递增操作
Decr("key") // 针对一个key的数值进行递减操作
Del("key") // 删除key操作,可以批量删除
Expire("key", 3) // 设置key的过期时间 单位秒

hash

HSet("user_1", "username", "name") // 根据key和field字段设置,field字段的值
HGet("user_1", "username") // 根据key和field字段,查询field字段的值
HGetAll("user_1") // 根据key查询所有字段和值
HIncrBy("user_1", "count", 1) // 根据key和field字段,累加数值。
HKeys("user_1") // 根据key返回所有字段名
HLen("key") // 根据key,查询hash的字段数量
HMGet("key","field1", "field2") // 根据key和多个字段名,批量查询多个hash字段值
HMSet("key", data) // 根据key和多个字段名和字段值,批量设置hash字段值
HSetNX("key", "id", 10) // 如果field字段不存在,则设置hash字段值
HDel("key", "id") // 根据key和字段名,删除hash字段,支持批量删除hash字段
HExists("key", "id") // 检测hash字段名是否存在。

不管我们选择redis什么类型的数据,操作的时候都必须要有一个唯一的Key, 用来唯一标识一个数据。

list

LPush("key", "data1") //从列表左边插入数据
LPushX("key", "data1") // 跟LPush的区别是,仅当列表存在的时候才插入数据
RPop("key") // 从列表的右边删除第一个数据,并返回删除的数据
RPush("key", "data1") // 从列表右边插入数据
RPushX("key", "data1") // 跟RPush的区别是,仅当列表存在的时候才插入数据
LPop("key") // 从列表左边删除第一个数据,并返回删除的数据
LLen("key") // 返回列表的大小
LRange("key",0,-1) // 返回列表的一个范围内的数据,也可以返回全部数据
LRem("key",1,100) // 删除列表中的数据
LIndex("key",5) // 根据索引坐标,查询列表中的数据,返回第6个元素
LInsert("key","before", 5, 4) // 在指定位置插入数据 在列表中5的前面插入4

set

SAdd("key",100) // 添加集合元素
SCard("key") // 获取集合元素个数
SIsMember("key", 100) // 判断元素是否在集合中
SMembers("key") // 获取集合中所有的元素
SRem("key", 100) // 删除集合元素
SPop("key") // 随机返回集合中的元素,并且删除返回的元素
SPopN("key", 5) // 随机返回5个,并且删除返回的元素

zset

ZAdd("key", redis.Z{2.5,"tizi"}) // 添加一个或者多个元素到集合,如果元素已经存在则更新分数
ZCard("key") // 返回集合元素个数
ZCount("key", "1","5") // 统计某个分数范围内的元素个数
ZIncrBy("key", 2,"5") // 增加元素的分数
ZRange("key", 0,-1) // 返回集合中某个索引范围的元素,根据分数从小到大排序
ZRevRange("key", 0,-1) // 返回 根据分数从大到小排序
ZRangeByScore({ 
    Min:"2", // 最小分数
    Max:"10", // 最大分数
    Offset:0, // 类似sql的limit, 表示开始偏移量
    Count:5, // 一次返回多少数据
}) // 根据分数范围从小到大排序返回集合元素 支持分页
ZRevRangeByScore({}) // 元素根据分数从大到小排序
ZRemRangeByRank("key", "0", "5") // 根据索引范围删除元素
ZRemRangeByScore("key", "2", "5") // 根据分数范围删除元素
ZScore("key", "name") // 查询元素对应的分数
ZRank("key", "name"), ZRevRank("key", "name") // 查询元素的排名