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。