Go操作redis
  Eo7GKm3ms3Sh 2023年11月02日 56 0


创作不易感谢支持。
一条主写Go和PHP的小菜鸟。平常有时间喜欢自己写点东西,如有不对的地方,欢迎大佬指点。  

在实际开发中,经常用到redis来做缓存。

在项目中安装redis的包

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

redis的String操作

set(key, value):给数据库中名称为key的string赋予值value
get(key):返回数据库中名称为key的string的value
getset(key, value):给名称为key的string赋予上一次的value
mget(key1, key2,…, key N):返回库中多个string的value
setnx(key, value):添加string,名称为key,值为value
setex(key, time, value):向库中添加string,设定过期时间time
mset(key N, value N):批量设置多个string的值
msetnx(key N, value N):如果所有名称为key i的string都不存在
incr(key):名称为key的string增1操作
incrby(key, integer):名称为key的string增加integer
decr(key):名称为key的string减1操作
decrby(key, integer):名称为key的string减少integer
append(key, value):名称为key的string的值附加value
substr(key, start, end):返回名称为key的string的value的子串
package main

import (
	"context"
	"fmt"
	"github.com/go-redis/redis/v8"
	"log"
	"net/http"
)

var ctx = context.Background()

func SetValue(w http.ResponseWriter, r *http.Request) {

	rdb := redis.NewClient(&redis.Options{
		Addr:     "127.0.0.1:6379",
		Password: "123456",
		DB:       0,
	})

	//设置key-value expiration:0 永不过期
	err := rdb.Set(ctx, "score", 80, 0).Err()
	if err != nil {
		log.Fatal(err)
	}

	//获取key-value
	val, err := rdb.Get(ctx, "score").Result()
	if err != nil {
		log.Fatal(err)
	}
	w.Write([]byte(fmt.Sprintf("score的值: %v", val)))

	//score的值加2
	rdb.IncrBy(ctx, "score", 2)
	//score的值自增1
	rdb.Incr(ctx, "score")
	val2, err := rdb.Get(ctx, "score").Result()
	if err != nil {
		log.Fatal(err)
	}

	w.Write([]byte(fmt.Sprintf("score的值: %v", val2)))

	//score的值减-2
	rdb.DecrBy(ctx, "score", 2)
	//score的值递减1
	rdb.Decr(ctx, "score")
	val3, err := rdb.Get(ctx, "score").Result()
	if err != nil {
		log.Fatal(err)
	}
	w.Write([]byte(fmt.Sprintf("score的值: %v", val3)))
}

func main()  {

	http.HandleFunc("/set", SetValue)

	http.ListenAndServe(":8081", nil)
}

redis的list操作

rpush(key, value):在名称为key的list尾添加一个值为value的元素
lpush(key, value):在名称为key的list头添加一个值为value的 元素
llen(key):返回名称为key的list的长度
lrange(key, start, end):返回名称为key的list中start至end之间的元素
ltrim(key, start, end):截取名称为key的list
lindex(key, index):返回名称为key的list中index位置的元素
lset(key, index, value):给名称为key的list中index位置的元素赋值
lrem(key, count, value):删除count个key的list中值为value的元素
lpop(key):返回并删除名称为key的list中的首元素
rpop(key):返回并删除名称为key的list中的尾元素
blpop(key1, key2,… key N, timeout):lpop命令的block版本。
brpop(key1, key2,… key N, timeout):rpop的block版本。
rpoplpush(srckey, dstkey):返回并删除名称为srckey的list的尾元素,并将该元素添加到名称为dstkey的list的头部
package main

import (
	"context"
	"fmt"
	"github.com/go-redis/redis/v8"
	"log"
	"net/http"
)

var ctx = context.Background()

func SetValue(w http.ResponseWriter, r *http.Request) {

	rdb := redis.NewClient(&redis.Options{
		Addr:     "127.0.0.1:6379",
		Password: "123456",
		DB:       0,
	})

	//往ball头部追加一个元素basketball
	rdb.LPush(ctx, "balls", "basketball")
	//往ball尾部追加一个元素football
	rdb.RPush(ctx, "balls", "football")
	//ball的长度
	len, err := rdb.LLen(ctx, "balls").Result()
	if err != nil {
		log.Fatal(err)
	}
	fmt.Println(len)

	//删除并返回balls中右侧第一个元素
	result, err := rdb.RPop(ctx, "balls").Result()
	if err != nil {
		log.Fatal(err)
	}
	fmt.Println("val: ", result)

	//删除并返回balls只左侧的第一个元素
	result2, err := rdb.LPop(ctx, "balls").Result()
	if err != nil {
		log.Fatal(err)
	}
	fmt.Println("vals: ", result2)

	//返回balls队列0-4区间的元素
	strings, err := rdb.LRange(ctx, "balls", 0, 4).Result()
	for k, v := range strings {
		fmt.Printf("k: %V, v: %v", k, v)
	}
}

func main() {

	http.HandleFunc("/set", SetValue)

	http.ListenAndServe(":8081", nil)

}

redis的set操作

sadd(key, member):向名称为key的set中添加元素member
srem(key, member) :删除名称为key的set中的元素member
spop(key) :随机返回并删除名称为key的set中一个元素
smove(srckey, dstkey, member) :移到集合元素
scard(key) :返回名称为key的set的基数
sismember(key, member) :member是否是名称为key的set的元素
sinter(key1, key2,…key N) :求交集
sinterstore(dstkey, (keys)) :求交集并将交集保存到dstkey的集合
sunion(key1, (keys)) :求并集
sunionstore(dstkey, (keys)) :求并集并将并集保存到dstkey的集合
sdiff(key1, (keys)) :求差集
sdiffstore(dstkey, (keys)) :求差集并将差集保存到dstkey的集合
smembers(key) :返回名称为key的set的所有元素
srandmember(key) :随机返回名称为key的set的一个元素
package main

import (
	"context"
	"fmt"
	"github.com/go-redis/redis/v8"
	"log"
	"net/http"
)

var ctx = context.Background()

func SetValue(w http.ResponseWriter, r *http.Request) {
	rdb := redis.NewClient(&redis.Options{
		Addr:     "127.0.0.1:6379",
		Password: "123456",
		DB:       0,
	})

	fmt.Println("====================================================")

	//向AFriends中添加三个好友
	rdb.SAdd(ctx,"AFriends", "mary")
	rdb.SAdd(ctx, "AFriends", "job")
	rdb.SAdd(ctx, "AFriends", "bitch")

	//向BFriends中添加三个好友
	rdb.SAdd(ctx, "BFriends", "job")
	rdb.SAdd(ctx, "BFriends", "dem")

	//判断bitch是否在AFriends集合中
	_, err := rdb.SIsMember(ctx, "AFriends", "bitch").Result()
	if err != nil {
		log.Fatal(err)
	}
	fmt.Println("bitch is in AFriends")


	fmt.Println("====================================================")

	//取交集
	r2, err := rdb.SInter(ctx, "AFriends", "BFriends").Result()
	if err != nil {
		log.Fatal(err)
	}
	fmt.Println("交集的好友是: ", r2)

	fmt.Println("====================================================")

	//取差集
	r3, _ := rdb.SDiff(ctx, "AFriends", "BFriends").Result()
	fmt.Println("交集的好友是: ", r3)

	fmt.Println("====================================================")

	//返回BFriends中的所有元素
	r4, _ := rdb.SMembers(ctx, "BFriends").Result()
	fmt.Println("BFriends的全部好友:", r4)

	fmt.Println("====================================================")
}

func main() {

	http.HandleFunc("/set", SetValue)

	http.ListenAndServe(":8081", nil)

}

Go操作redis_v8

redis的hash操作

hset(key, field, value):向名称为key的hash中添加元素field
hget(key, field):返回名称为key的hash中field对应的value
hmget(key, (fields)):返回名称为key的hash中field i对应的value
hmset(key, (fields)):向名称为key的hash中添加元素field 
hincrby(key, field, integer):将名称为key的hash中field的value增加integer
hexists(key, field):名称为key的hash中是否存在键为field的域
hdel(key, field):删除名称为key的hash中键为field的域
hlen(key):返回名称为key的hash中元素个数
hkeys(key):返回名称为key的hash中所有键
hvals(key):返回名称为key的hash中所有键对应的value
hgetall(key):返回名称为key的hash中所有的键(field)及其对应的value
package main

import (
	"context"
	"fmt"
	"github.com/go-redis/redis/v8"
	"net/http"
)

var ctx = context.Background()

func SetValue(w http.ResponseWriter, r *http.Request) {
	rdb := redis.NewClient(&redis.Options{
		Addr:     "127.0.0.1:6379",
		Password: "123456",
		DB:       0,
	})

	//向名c_user_info的hash中添加name和age
	rdb.HSet(ctx, "c_user_info", "name", "大卫")
	rdb.HSet(ctx, "c_user_info", "age", 20)

	//返回名c_user_info的hash中添加name和age的值
	r1, _ := rdb.HGet(ctx, "c_user_info", "name").Result()
	fmt.Println("name的值为:", r1)

	r2, _ := rdb.HGet(ctx, "c_user_info", "age").Result()
	fmt.Println("age的值为:", r2)

	//批量向名为c_user_info的hash中添加元素
	rdb.HMSet(ctx, "c_user_info", map[string]string{"name": "贝多芬", "age": "500"})

	//批量获取名为c_user_info的hash中指定字段的值
	r3, _ := rdb.HMGet(ctx, "c_user_info", "name", "age").Result()
	fmt.Println("name age", r3)

	// 获取名为c_user_info的hash中字段的数量
	r4, _ := rdb.HLen(ctx, "c_user_info").Result()
	fmt.Println("c_user_info中字段的数量是:", r4)

	// 删除hash中指定的字段
	r5, _ := rdb.HDel(ctx, "c_user_info", "age").Result()
	fmt.Println("删除的字段数量:", r5)


}

func main() {

	http.HandleFunc("/set", SetValue)

	http.ListenAndServe(":8081", nil)

}

redis的连接池

go-redis通过PoolSize设置连接池数量,默认初始化的数量为10个

优点:提前存放一定数量已经建立好连接的链接,节省了每次操作redis都要进行连接的时间。

Addr:     "127.0.0.1:6379",
		Password: "123456",
		DB:       0,
		PoolSize: 20, // 通过PoolSize设置初始化连接池数量
	})


【版权声明】本文内容来自摩杜云社区用户原创、第三方投稿、转载,内容版权归原作者所有。本网站的目的在于传递更多信息,不拥有版权,亦不承担相应法律责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@moduyun.com

上一篇: RabbitMQ与PHP应用 下一篇: Go操纵Session
  1. 分享:
最后一次编辑于 2023年11月08日 0

暂无评论

推荐阅读
Eo7GKm3ms3Sh