实战笔记-用GO连接并操作Redis数据库 | 青训营

80 阅读4分钟

Redis-大厂程序员是如何使用的 | 青训营

什么是Redis

Redis的诞生背景

随着互联网技术的发展,对数据库读写有了新的需求,如更快的读写速度、能支持海量数据、大规模的集群管理......如何解决这一问题呢,可以根据数据的使用频率,将数据分为冷热数据,热数据放在内存中访问,读写速度更快,冷数据放在硬盘里,Redis在这背景下孕育而生。

Redis是什么

Redis是完全开源的、遵守BSD协议的,高性能的key-value数据库,具有高读写速度、支持丰富数据类型、操作原子性、数据持久化等优势,Redis的使用场景丰富,如消息队列、缓存、会话存储等

Redis基本原理

一般来说,电脑重启会清除存在内存中的数据,但Redis可以保证数据的持久化。

  • 数据从内存中读写
  • 数据保存在硬盘中防止重启导致数据丢失
  • 增量数据保存到AOF文件中
  • 周期性将全量数据保存在RDB文件中
  • 单线程处理所有命令操作,一个一个命令顺序执行

在使用Redis存储数据时,Redis客户端会使用RESP协议将数据传到服务端中,这会有两个影响,首先会将数据存储在内存中、然后会产生一条命令,将增量数据追加到硬盘中的AOF文件中。一旦发生重启,先读取RDB中的数据,然后重放AOF文件,防止有未执行的命令,以此来确保数据的完整性和正确性。

Redis的使用

启动本地Redis

redis-cli

启动远程Redis

redis-cli -h host -p port -a password // 例子redis-cli -h 127.0.0.1 -p 6379 -a "mypass"

创建key-value

SET 键名 值 //创建成功返回OK

返回键的值

GET 键名

删除键

DEL 键名 //删除成功返回1,否则返回0

检查键是否存在

EXISTS 键名 //存在返回1,否则返回0

为给定键设置过期实践,单位为秒 // 一旦过期了会自动删除

EXPIRE KYE 秒

移除键的过期时间

PERSIS 键名

从数据库中随机返回一个键

RANDOMKEY

改键名

RENAME KEY NEWNAME

返回键的值类型

TYPE KEY

值增一

INCR KEY

对于给定键增加增量值

INCRBY KEY INCREMENT

值减一

DECR KEY

哈希hash

哈希是一个string类型的映射表,适合存储对象

// 创建方式一
HSET user:id123 username "john_doe"
HSET user:id123 age 30
HSET user:id123 occupation "engineer"

// 创建方式二
HMSET runoobkey name "redis tutorial" description "redis basic commands for caching" likes 20 visitors 23000
// 这种创建方式是奇数项是key、偶数项是value

获得hash字段

HGET HASH_NAME 项 //某一项
HGETALL HASH_NAME //所有值

删除hash字段

HDEL HASH_NAME 项

列表List

简单的字符串列表,可以按顺序插入,可以在头部插入或者尾部插入

例子

redis 127.0.0.1:6379> LPUSH runoobkey redis
(integer) 1
redis 127.0.0.1:6379> LPUSH runoobkey mongodb
(integer) 2
redis 127.0.0.1:6379> LPUSH runoobkey mysql
(integer) 3
redis 127.0.0.1:6379> LRANGE runoobkey 0 10

1) "mysql"
2) "mongodb"
3) "redis"

集合Set

集合是String类型的无序集合,集合成员唯一

例子

redis 127.0.0.1:6379> SADD runoobkey redis
(integer) 1
redis 127.0.0.1:6379> SADD runoobkey mongodb
(integer) 1
redis 127.0.0.1:6379> SADD runoobkey mysql
(integer) 1
redis 127.0.0.1:6379> SADD runoobkey mysql
(integer) 0
redis 127.0.0.1:6379> SMEMBERS runoobkey

1) "mysql"
2) "mongodb"
3) "redis"

事务

Redis事务可以一次执行多个命令,并有三个重要特性

  • 在EXEC命令前,操作存在缓存队列中
  • 执行EXEC命令后,如果事务中任意操作执行失败,其余命令仍然执行
  • 在EXEC执行过程中,不会有新的命令插入执行序列中

一个事务生命周期:开始事务,命令入列,执行事务

例子

redis 127.0.0.1:6379> MULTI
OK

redis 127.0.0.1:6379> SET book-name "Mastering C++ in 21 days"
QUEUED

redis 127.0.0.1:6379> GET book-name
QUEUED

redis 127.0.0.1:6379> SADD tag "C++" "Programming" "Mastering Series"
QUEUED

redis 127.0.0.1:6379> SMEMBERS tag
QUEUED

redis 127.0.0.1:6379> EXEC
1) OK
2) "Mastering C++ in 21 days"
3) (integer) 3
4) 1) "Mastering Series"
   2) "C++"
   3) "Programming"

go语言使用Redis

安装库,在终端输入来安装所需要的库

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

创建一个Redis客户端,需要提供Redis数据库的基本信息,如ip地址与端口,密码,数据库索引

ctx := context.Background()
client := redis.NewClient(&redis.Options{
        Addr:     "localhost:6379", // Redis服务器地址和端口
        Password: "",              // 如果有密码,填写密码
        DB:       0,               // 使用的数据库索引
    })

检查是否连接上Redis数据库,使用ping命令,如果err不为空,输出连接失败,反之输出连接成功

pong, err := client.Ping(ctx).Result()
    if err != nil {
        fmt.Println("Failed to connect to Redis:", err)
        return
    }
    fmt.Println("Connected to Redis:", pong)

 err = client.Set(ctx, "mykey", "myvalue", 0).Err()
    if err != nil {
        fmt.Println("Failed to set key:", err)
        return
    }
// 0为过期时间,设置为0则为永不过期,为20,则20s后自动删除mykey 

err = client.Del(ctx,"mykey").Err()
if err != nil {
    fmt.Println("Fail to del key")
}

// 修改键的值
    err := client.Set(ctx, "mykey", "lyy", 0).Err()
    if err != nil {
        // 处理错误
        println("Failed to update value:", err)
        return
    }

 value, err := client.Get(ctx, "mykey").Result()
    if err != nil {
        fmt.Println("Failed to get key:", err)
        return
    }
    fmt.Println("Value of mykey:", value)

心得

这是我第一次接触Redis,在上课过程中老师讲了很多关于Redis的具体项目和一些数据结构的实现,我感觉有点懵,于是先简单学习了一下redis。