Go中redis的增删查改操作
在现代的应用程序中,缓存起着至关重要的作用,可以显著提高系统的性能和响应时间。Redis是一个快速、高效的内存数据库,常用于缓存和数据存储。本文将介绍如何使用Redis进行缓存操作,以提高应用程序的性能。
Redis简介
Redis(Remote Dictionary Server ),即远程字典服务,是一个开源的使用ANSI 编写、支持网络、可基于内存亦可持久化的日志型、Key-Value,并提供多种语言的API。
Redis应用领域
1、内存存储、持久化,内存中是断电即失、所以说持久化很重要(rdb、aof)
2、效率高,可以用于高速缓存
3、发布订阅系统
4、地图信息分析
5、计时器、计数器
Redis基本类型
1、String(字符串):
- 简介:String是Redis最基础的数据结构类型,它是二进制安全的,可以存储图片或者序列化的对象,值最大存储为512M
- 简单使用举例:
set key value、get key等
- 应用场景:
共享session、分布式锁,计数器、限流。
- 内部编码有3种,int(8字节长整型)/embstr(小于等于39字节字符串)/raw(大于39个字节字符串)
2、Hash(哈希)
- 简介:在Redis中,哈希类型是指v(值)本身又是一个键值对(k-v)结构
- 简单使用举例:
hset key field value 、hget key field
- 内部编码:
ziplist(压缩列表) 、hashtable(哈希表)
- 应用场景:缓存用户信息等。
3、List(列表)
- 简介:列表(list)类型是用来存储多个有序的字符串,一个列表最多可以存储2^32-1个元素。
- 简单实用举例:
lpush key value lrange key start end
- 内部编码:
ziplist(压缩列表)、linkedlist(链表)
- 应用场景:消息队列,文章列表
4、Set(集合)
- 简介:集合(set)类型也是用来保存多个的字符串元素,但是不允许重复元素
- 简单使用举例:
sadd key element 、smembers key
- 内部编码:
intset(整数集合)、hashtable(哈希表)
- 应用场景:用户标签,生成随机数抽奖、社交需求。
5、有序集合(zset)
- 简介:已排序的字符串集合,同时元素不能重复
- 简单格式举例:
zadd key score member [score member ...]
,zrank key member
- 底层内部编码:
ziplist(压缩列表)
、skiplist(跳跃表)
- 应用场景:排行榜,社交需求(如用户点赞)。
前置工作
1、环境设置:
首先,确保你已经安装了Redis,并在Go项目中引入相应的包
import (
"gorm.io/gorm"
"gorm.io/driver/mysql"
"github.com/go-redis/redis/v8"
)
2、连接Redis:
在GORM中,我们可以使用BeforeSave和AfterFind回调函数钩子来实现Redis缓存的功能。首先,创建一个全局的Redis连接池。
func main() {
// 创建Redis客户端
rdb := redis.NewClient(&redis.Options{
Addr: "localhost:6379",
Password: "", // 如果有密码,填写密码
DB: 0, // 选择数据库
})
// 测试连接
pong, err := rdb.Ping(ctx).Result()
if err != nil {
panic(err)
}
fmt.Println(pong)
}
在上述代码中,我们使用redis.NewClient函数创建了一个Redis客户端,并指定了Redis服务器的地址、密码和数据库编号。然后,我们通过Ping方法测试连接是否成功。
基本操作
1、存储和获取字符串:
err := rdb.Set(ctx, "key", "value", 0).Err()
if err != nil {
panic(err)
}
val, err := rdb.Get(ctx, "key").Result()
if err != nil {
panic(err)
}
fmt.Println(val)
2、存储和获取哈希表
err := rdb.HSet(ctx, "user", "name", "John").Err()
if err != nil {
panic(err)
}
val, err := rdb.HGet(ctx, "user", "name").Result()
if err != nil {
panic(err)
}
fmt.Println(val)
3、发布和订阅消息:
pubsub := rdb.Subscribe(ctx, "channel")
_, err := pubsub.Receive(ctx)
if err != nil {
panic(err)
}
ch := pubsub.Channel()
for msg := range ch {
fmt.Println(msg.Channel, msg.Payload)
}
上述只是Redis操作的基本示例,读者如果感兴趣可以可以根据具体需求查阅Redis文档以了解更多操作和函数。
使用连接池
为了避免每次操作都创建/关闭Redis连接的开销,我们可以使用连接池来管理Redis连接。
func main() {
// 创建Redis连接池
rdb := redis.NewClient(&redis.Options{
Addr: "localhost:6379",
Password: "", // 如果有密码,填写密码
DB: 0, // 选择数据库
})
// 关闭连接池
defer rdb.Close()
// 使用连接池进行操作
err := rdb.Set(ctx, "key", "value", 0).Err()
if err != nil {
panic(err)
}
val, err := rdb.Get(ctx, "key").Result()
if err != nil {
panic(err)
}
fmt.Println(val)
}
通过创建Redis连接池,我们可以重复使用连接,避免频繁地创建和关闭连接。
总结
在本文中,我们介绍了如何在Go语言中使用Redis来提高应用程序的性能和可扩展性。通过连接Redis服务器、执行基本操作和使用连接池,我们可以轻松地集成Redis到Go应用程序中,利用其优秀的性能和丰富的功能。希望本文对读者在Go语言中使用Redis有所帮助。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 分享4款.NET开源、免费、实用的商城系统
· 全程不用写代码,我用AI程序员写了一个飞机大战
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· 白话解读 Dapr 1.15:你的「微服务管家」又秀新绝活了
· 上周热点回顾(2.24-3.2)
2022-08-27 学习随笔——codeforces题目Build Permutation解答