Go语言连接Redis之go-redis使用指南
main.go
package main
import (
"fmt"
"haimait/learn/base/redis_dome01/utils"
)
func main(){
test1()
}
func test1() {
utils.RedisSet("age",18,0)
get, err := utils.RedisGet("age2")
if err !=nil {
fmt.Println("err:",err)
return
}
fmt.Println(get)
}
redis_api.go
package utils
import (
"encoding/json"
"fmt"
"strings"
"time"
"github.com/ansel1/merry"
"github.com/astaxie/beego/logs"
"github.com/go-redis/redis"
)
var RedisClient *redis.Client
func init() {
NewClient()
}
func NewClient() *redis.Client {
if RedisClient != nil {
return RedisClient
}
RedisClient = redis.NewClient(&redis.Options{
Addr: "182.92.234.23:6379",
Password: "123456", // no password set
DB: 0, // use default DB
})
_, err := RedisClient.Ping().Result()
if err != nil {
logs.Error("redis connection failed: ", err.Error())
}
return RedisClient
}
func RedisSet(key string, value interface{}, expire int) error {
if expire > 0 {
err := RedisClient.Do("SET", key, value, "PX", expire).Err()
if err != nil {
logs.Error("RedisSet Error! key:", key, "Details:", err.Error())
return err
}
} else {
err := RedisClient.Do("SET", key, value).Err()
if err != nil {
logs.Error("RedisSet Error! key:", key, "Details:", err.Error())
return err
}
}
return nil
}
func RedisKeyExists(key string) (bool, error) {
ok, err := RedisClient.Do("EXISTS", key).Bool()
return ok, err
}
func RedisGet(key string) (string, error) {
value, err := RedisClient.Do("GET", key).String()
if err != nil {
return "", nil
}
return value, nil
}
func RedisGetResult(key string) (interface{}, error) {
v, err := RedisClient.Do("GET", key).Result()
if err == redis.Nil {
return v, nil
}
return v, err
}
func RedisGetInt(key string) (int, error) {
v, err := RedisClient.Do("GET", key).Int()
if err == redis.Nil {
return 0, nil
}
return v, err
}
func RedisGetInt64(key string) (int64, error) {
v, err := RedisClient.Do("GET", key).Int64()
if err == redis.Nil {
return 0, nil
}
return v, err
}
func RedisGetUint64(key string) (uint64, error) {
v, err := RedisClient.Do("GET", key).Uint64()
if err == redis.Nil {
return 0, nil
}
return v, err
}
func RedisGetFloat64(key string) (float64, error) {
v, err := RedisClient.Do("GET", key).Float64()
if err == redis.Nil {
return 0.0, nil
}
return v, err
}
func RedisExpire(key string, expire int) error {
err := RedisClient.Do("EXPIRE", key, expire).Err()
if err != nil {
logs.Error("RedisExpire Error!", key, "Details:", err.Error())
return err
}
return nil
}
func RedisPTTL(key string) (int, error) {
ttl, err := RedisClient.Do("PTTL", key).Int()
if err != nil {
return -1, err
}
return ttl, nil
}
func RedisTTL(key string) (int, error) {
ttl, err := RedisClient.Do("TTL", key).Int()
if err != nil {
return -1, err
}
return ttl, nil
}
func RedisSetJson(key string, value interface{}, expire int) error {
jsonData, _ := json.Marshal(value)
if expire > 0 {
err := RedisClient.Do("SET", key, jsonData, "PX", expire).Err()
if err != nil {
logs.Error("RedisSetJson Error! key:", key, "Details:", err.Error())
return err
}
} else {
err := RedisClient.Do("SET", key, jsonData).Err()
if err != nil {
logs.Error("RedisSetJson Error! key:", key, "Details:", err.Error())
return err
}
}
return nil
}
func RedisGetJson(key string) ([]byte, error) {
value, err := RedisClient.Do("GET", key).String()
if err != nil {
return nil, nil
}
return []byte(value), nil
}
func RedisDel(key string) error {
err := RedisClient.Do("DEL", key).Err()
if err != nil {
logs.Error("RedisDel Error! key:", key, "Details:", err.Error())
}
return err
}
func RedisHGet(key, field string) (string, error) {
value, err := RedisClient.Do("HGET", key, field).String()
if err != nil {
return "", nil
}
return value, nil
}
func RedisHSet(key, field, value string) error {
err := RedisClient.Do("HSET", key, field, value).Err()
if err != nil {
logs.Error("RedisHSet Error!", key, "field:", field, "Details:", err.Error())
}
return err
}
func RedisHDel(key, field string) error {
err := RedisClient.Do("HDEL", key, field).Err()
if err != nil {
logs.Error("RedisHDel Error!", key, "field:", field, "Details:", err.Error())
}
return err
}
func RedisZAdd(key, member, score string) error {
err := RedisClient.Do("ZADD", key, score, member).Err()
if err != nil {
logs.Error("RedisZAdd Error!", key, "member:", member, "score:", score, "Details:", err.Error())
}
return err
}
func RedisZRank(key, member string) (int, error) {
rank, err := RedisClient.Do("ZRANK", key, member).Int()
if err == redis.Nil {
return -1, nil
}
if err != nil {
logs.Error("RedisZRank Error!", key, "member:", member, "Details:", err.Error())
return -1, nil
}
return rank, err
}
func RedisZRange(key string, start, stop int) (values []string, err error) {
values, err = RedisClient.ZRange(key, int64(start), int64(stop)).Result()
if err != nil {
logs.Error("RedisZRange Error!", key, "start:", start, "stop:", stop, "Details:", err.Error())
return
}
return
}
func RedisZRangeWithScores(key string, start, stop int) (values []redis.Z, err error) {
values, err = RedisClient.ZRangeWithScores(key, int64(start), int64(stop)).Result()
if err != nil {
logs.Error("RedisZRange Error!", key, "start:", start, "stop:", stop, "Details:", err.Error())
return
}
return
}
func RedisZRem(key, member string) error {
err := RedisClient.Do("ZREM", key, member).Err()
if err != nil {
logs.Error("RedisZRem Error!", key, "member:", member, "Details:", err.Error())
}
return err
}
func RedisRPUSH(key string, member string) (err error) {
err = RedisClient.Do("RPUSH", key, member).Err()
if err != nil {
logs.Error("RedisRPUSH Error!", key, member, "Details:", err.Error())
return
}
return
}
func RedisBLPOP(timeout time.Duration, keys ...string) (value []string, err error) {
value, err = RedisClient.BLPop(timeout, keys...).Result()
if err == redis.Nil {
err = nil
return
}
if err != nil {
logs.Error("BLPop Error!", keys, timeout, "Details:", err.Error())
return
}
return
}
func RedisLLEN(key string) (value int64, err error) {
value, err = RedisClient.LLen(key).Result()
if err != nil {
logs.Error("RedisLLEN Error!", key, "Details:", err.Error())
return
}
return
}
func RedisLRange(key string, start, stop int) (values []string, err error) {
values, err = RedisClient.LRange(key, int64(start), int64(stop)).Result()
if err != nil {
logs.Error("RedisLRange Error!", key, "start:", start, "stop:", stop, "Details:", err.Error())
return
}
return
}
func RedisKeys(pattern string) (keys []string, err error) {
keys, err = RedisClient.Keys(pattern).Result()
if err != nil {
logs.Error("RedisKeys Error!", pattern, "Details:", err.Error())
return
}
return
}
// RedisListAllValuesWithPrefix will take in a key prefix and return the value of all the keys that contain that prefix
func RedisListAllValuesWithPrefix(prefix string) (map[string]string, error) {
// Grab all the keys with the prefix
keys, err := getKeys(fmt.Sprintf("%s*", prefix))
if err != nil {
return nil, err
}
// We will now iterate through all of the values to
values, err := getKeyAndValuesMap(keys, prefix)
return values, nil
}
// getKeys will take a certain prefix that the keys share and return a list of all the keys
func getKeys(prefix string) ([]string, error) {
var allKeys []string
var cursor uint64
count := int64(10) // count specifies how many keys should be returned in every Scan call
for {
var keys []string
var err error
keys, cursor, err = RedisClient.Scan(cursor, prefix, count).Result()
if err != nil {
return nil, merry.Appendf(err, "error retrieving '%s' keys", prefix)
}
allKeys = append(allKeys, keys...)
if cursor == 0 {
break
}
}
return allKeys, nil
}
// getKeyAndValuesMap generates a [string]string map structure that will associate an ID with the token value stored in Redis
func getKeyAndValuesMap(keys []string, prefix string) (map[string]string, error) {
values := make(map[string]string)
for _, key := range keys {
value, err := RedisClient.Do("GET", key).String()
if err != nil {
return nil, merry.Appendf(err, "error retrieving value for key %s", key)
}
// Strip off the prefix from the key so that we save the key to the user ID
strippedKey := strings.Split(key, prefix)
values[strippedKey[1]] = value
}
return values, nil
}
func RedisBatchDel(key ...string) error {
err := RedisClient.Del(key...).Err()
if err != nil {
logs.Error("RedisBatchDel Error! key:", key, "Details:", err.Error())
}
return err
}
func RedisMset(pairs ...interface{}) error {
err := RedisClient.MSet(pairs...).Err()
if err != nil {
logs.Error("RedisMset Error! pairs:", pairs, "Details:", err.Error())
}
return err
}
Go语言连接Redis之go-redis使用指南的更多相关文章
- go语言之行--golang操作redis、mysql大全
一.redis 简介 redis(REmote DIctionary Server)是一个由Salvatore Sanfilippo写key-value存储系统,它由C语言编写.遵守BSD协议.支持网 ...
- Go语言系列- Socket编程和Redis
Socket编程 一.socket编程概述 什么是socket编程? socket编程是计算机PC机器上2个程序通过一个双向的通信连接实现数据的交互,这个连接的一端就是一个socket.socket的 ...
- 本地连接虚拟机上面的redis
想做一个抓取系统,想到用redis存储临时数据可能会比较好些,就想着装个虚拟机,在虚拟机上面安装redis,通过本地来访问虚拟机上面的redis. 虚拟机和redis安装成功之后,发现本地怎么都连接不 ...
- Redis系列-远程连接redis并给redis加锁
假设两台redis服务器,ip分别为:192.168.1.101和192.168.1.103,如何在101上通过redis-cli访问103上的redis呢?在远程连接103之前,先讲下redis-c ...
- Jmeter连接Redis,获取Redis数据集
Redis(REmote DIctionary Server)是一个开源的内存数据结构存储,用作数据库,缓存和消息代理. 本博文是分享jmeter怎么连接使用Redis数据库. 安装Redis数据集J ...
- java连接CentOS7上的redis
这篇博客写得挺全的: https://blog.csdn.net/achenyuan/article/details/78521831?locationNum=3&fps=1 我也是跟着这篇博 ...
- RedisDesktopManager远程连接Linux系统的Redis服务
linux下安装redis :https://www.runoob.com/redis/redis-install.html 进入 src 运行redis : ./redis-server 打开另 ...
- python通过连接池连接redis,操作redis队列
在每次使用redis都进行连接的话会拉低redis的效率,都知道redis是基于内存的数据库,效率贼高,所以每次进行连接比真正使用消耗的资源和时间还多.所以为了节省资源,减少多次连接损耗,连接池的作用 ...
- 通过nginx转发,用外网连接阿里云的redis,报Unexpected end of stream的解决办法
一.在与redis同一个内网的服务器上A的nginx做了下面的设置 stream { upstream redis { server redis.rds.aliyuncs.com:6379 max_ ...
- RUST actix-web连接有密码的Redis数据库
RUST actix-web连接有密码的Redis数据库 actix-web的example里面,使用了自己的actix-redis,但是我尝试了一下,并不好用 替换成另一连接池,deadpool-r ...
随机推荐
- WPF中封装一个自己的MessageBox
前言 在WPF应用程序开发中,我们可以借助其强大灵活的设计能力打造出绚丽而富有创意的用户界面.然而,与这种高度定制化的界面相比,标准MessageBox却显得有些原始和古老.它的外观与现代.绚丽的应用 ...
- #背包#AT2037 [ARC060A] 高橋君とカード / Tak and Cards
题目 有一个长度为\(n\)的数组\(a\),选择若干个数使它们的平均数为\(A\),问共有多少种方案 分析 设\(dp[i][j]\)表示选择\(i\)个数总和为\(j\)的方案数,那么答案就是\( ...
- C/C++ 项目构建指南:如何使用 Makefile 提高开发效率
Makefile是一个常用的自动化构建工具,它可以为开发人员提供方便的项目构建方式.在C/C++项目中,Makefile可以用来编译.链接和生成可执行文件.使用Makefile的好处是可以自动执行一系 ...
- Python 集合(Sets)1
集合 集合用于在单个变量中存储多个项.集合是 Python 中的 4 种内置数据类型之一,用于存储数据集合,其他 3 种是列表(List).元组(Tuple)和字典(Dictionary),它们都具有 ...
- Nacos 无法注册服务
情况描述: Nacos服务搭建完成. 引入了Nacos的依赖. <!-- SpringCloud Alibaba 服务管理 --> <dependency> <group ...
- css 文字溢出省略号
前言 css 文字溢出后显示省略号,这是一个非常常规的操作,但是你会发现在网上很多给出的例子两行之后显示省略号,却没有用. 这是为什么呢?please look follow. 正文 在一行省略的: ...
- 【数学】主成分分析(PCA)的详细深度推导过程
Based on Deep Learning (2017, MIT) book. 本文基于Deep Learning (2017, MIT),推导过程补全了所涉及的知识及书中推导过程中跳跃和省略的部分 ...
- 力扣49(java)-字母异位词分组(中等)
题目: 给你一个字符串数组,请你将 字母异位词 组合在一起.可以按任意顺序返回结果列表. 字母异位词 是由重新排列源单词的字母得到的一个新单词,所有源单词中的字母通常恰好只用一次. 示例 1: 输入: ...
- 力扣23(java)-合并k个升序链表(困难)
题目: 给你一个链表数组,每个链表都已经按升序排列. 请你将所有链表合并到一个升序链表中,返回合并后的链表. 示例 1: 输入:lists = [[1,4,5],[1,3,4],[2,6]]输出:[1 ...
- 阿里云 ACK 容器服务生产级可观测体系建设实践
简介: 随着容器被越来越对企业接纳与落地,可观测成为重点.那么,让我们深入了解阿里云 ACK 容器服务生产级可观测体系建设实践,为自身业务可观测提供参考- 作者:冯诗淳(行疾) ACK 可观测体系 ...