Redis使用笔记 | 青训营
一、Redis介绍
Redis诞生于2009年全称是Remote Dictionary Server 远程词典服务器,是一个基于内存的键值型NoSQL数据库。
特征:
- 键值(key-value)型,value支持多种不同数据结构,功能丰富
- 单线程,每个命令具备原子性
- 低延迟,速度快(基于内存、IO多路复用、良好的编码)。
- 支持数据持久化
- 支持主从集群、分片集群
- 支持多语言客户端
Redis是一种键值型的NoSql数据库,这里有两个关键字:
-
键值型
-
NoSql
其中键值型,是指Redis中存储的数据都是以key、value对的形式存储,而value的形式多种多样,可以是字符串、数值、甚至json:
二、Redis五大数据类型
1、String类型
String类型,也就是字符串类型,是Redis中最简单的存储类型。
其value是字符串,不过根据字符串的格式不同,又可以分为3类:
- string:普通字符串
- int:整数类型,可以做自增、自减操作
- float:浮点类型,可以做自增、自减操作
不管是哪种格式,底层都是字节数组形式存储,只不过是编码方式不同。字符串类型的最大空间不能超过512m.
2、键值对
Redis没有类似MySQL中的Table的概念,我们该如何区分不同类型的key呢?
例如,需要存储用户、商品信息到redis,有一个用户id是1,有一个商品id恰好也是1,此时如果使用id作为key,那就会冲突了,该怎么办?
我们可以通过给key添加前缀加以区分,不过这个前缀不是随便加的,有一定的规范:
Redis的key允许有多个单词形成层级结构,多个单词之间用':'隔开,格式如下:
项目名:业务名:类型:id
这个格式并非固定,也可以根据自己的需求来删除或添加词条。这样以来,我们就可以把不同类型的数据区分开了。从而避免了key的冲突问题。
3、Hash类型
Hash类型,也叫散列,其value是一个无序字典,类似于Java中的HashMap结构。
String结构是将对象序列化为JSON字符串后存储,当需要修改对象某个字段时很不方便,Hash结构可以将对象中的每个字段独立存储,可以针对单个字段做CRUD。
4、List类型
Redis中的List类型与Java中的LinkedList类似,可以看做是一个双向链表结构。既可以支持正向检索和也可以支持反向检索。
特征也与LinkedList类似:
- 有序
- 元素可以重复
- 插入和删除快
- 查询速度一般
常用来存储一个有序数据,例如:朋友圈点赞列表,评论列表等。
5、Set类型
Redis的Set结构与Java中的HashSet类似,可以看做是一个value为null的HashMap。因为也是一个hash表,因此具备与HashSet类似的特征:
-
无序
-
元素不可重复
-
查找快
-
支持交集、并集、差集等功能
三、Linux下安装Redis
1、依赖库
Redis是基于C语言编写的,因此首先需要安装Redis所需要的gcc依赖:
yum install -y gcc tcl
2、下载Redis安装解压包并解压
解压缩:
tar -xzf redis-6.2.6.tar.gz
3、执行安装命令
进入redis目录:
cd redis-6.2.6
运行编译命令:
make && make install
如果没有出错,应该就安装成功了。
4、启动
安装完成后,在任意目录输入redis-server命令即可启动Redis:
redis-server
5、配置开机自启
首先,新建一个系统服务文件:
vi /etc/systemd/system/redis.service
内容如下:
[Unit]
Description=redis-server
After=network.target
[Service]
Type=forking
ExecStart=/usr/local/bin/redis-server /usr/local/src/redis-6.2.6/redis.conf
PrivateTmp=true
[Install]
WantedBy=multi-user.target
然后重载系统服务:
systemctl daemon-reload
现在,我们可以用下面这组命令来操作redis了:
# 启动
systemctl start redis
# 停止
systemctl stop redis
# 重启
systemctl restart redis
# 查看状态
systemctl status redis
执行下面的命令,可以让redis开机自启:
systemctl enable redis
四、Go语言如何访问Redis
1、连接
Conn 接口是与 Redis 协作的主要接口,可以使用 Dial, DialWithTimeout 或者 NewConn 函数来创建连接,当任务完成时,应用程序必须调用 Close 函数来完成操作。
c, err := redis.Dial("tcp", "localhost:6379")
if err != nil {
fmt.Println("Connect to redis error", err)
return
}else {
fmt.Println("连接成功")
}
defer c.Close()
2、常用命令操作
可以通过使用 Conn 接口中的 do 方法执行 redis 命令
get、set 操作:
// 写入数据,永不过期
_, err = c.Do("SET", "username", "nick")
if err != nil {
fmt.Println("redis set failed:", err)
}
// 写入数据,10s后过期
_, err = c.Do("SET", "password", "123456", "EX", "10")
if err != nil {
fmt.Println("redis set failed:", err)
}
// 读取数据
username, err := redis.String(c.Do("GET", "username"))
if err != nil {
fmt.Println("redis get failed:", err)
} else {
fmt.Printf("Got username %v \n", username)
}
// 读取数据
passwd, err := redis.String(c.Do("GET", "password"))
if err != nil {
fmt.Println("redis get failed:", err)
} else {
fmt.Printf("Got password %v \n", passwd)
}
列表操作:
// 列表操作
c.Do("lpush", "redlist", "qqq")
c.Do("lpush", "redlist", "www")
c.Do("lpush", "redlist", "eee")
values, _ := redis.Values(c.Do("lrange", "redlist", "0", "2"))
for _, v := range values {
fmt.Println(string(v.([]byte)))
}
hash操作:
// hash 操作
_, err = c.Do("HSET", "student","name", "nill","passwd","123456")
if err != nil {
fmt.Println("redis mset error:", err)
}
resi, err := redis.Int64(c.Do("HGET", "student","passwd"))
if err != nil {
fmt.Println("redis HGET error:", err)
} else {
res_type := reflect.TypeOf(resi)
fmt.Printf("res type : %s \n", res_type)
fmt.Printf("res : %d \n", resi)
}
五、笔记总结
今天主要了解了Redis是什么以及基本数据类型,通过Go语言进行了简单的操作。后续还需要学习Redis的底层数据结构,IO多路复用模型,以及分布式锁和分布式事务等。期待能够在未来的项目中充分运用这些知识,构建出更加高效和可靠的应用。
六、附录
- Redis官方网站:redis.io/ 这是Redis的官方网站,上面提供了丰富的文档、教程、示例代码和最新版本的下载等资源。
- Redis官方文档:redis.io/documentati… 官方文档是学习Redis最权威的参考资料,其中包括Redis的各种指令、配置项、数据类型和特性等详细说明。
- Go语言Redis客户端库:pkg.go.dev/github.com/… 这是Go语言Redis客户端库的官方文档,你可以在这里了解如何使用Go与Redis服务器进行交互。
- Redis入门教程 - 菜鸟教程:www.runoob.com/redis/redis… 菜鸟教程提供了简单易懂的Redis入门教程,适合初学者快速上手