1. Redis基础概念
1.1. 什么是Redis
Redis(Remote Dictionary Server) 是一种开源的内存数据存储系统,它可以用作数据库、缓存和消息中间件。它被设计成高性能、低延迟的键值存储系统,常用于加速应用程序的数据访问,特别是那些需要频繁读写的场景。
1.2. 为什么用Redis
与传统的关系型数据库(SQL)不同,Redis是一个键值存储系统,数据以键值对的形式存储,值可以是字符串、哈希、列表、集合、有序集合等数据结构。同时,它还具有一些自己的关键特点:
- 内存存储: Redis 将数据存储在内存中,这使得数据的读写速度非常快,适合对延迟敏感的应用。
- 键值存储: Redis 使用键值对(key-value)的方式存储数据。每个键都是一个字符串,与之相关联的值可以是字符串、哈希、列表、集合、有序集合等数据结构。
- 持久化支持: Redis 提供了两种持久化方式,分别是快照(snapshotting)和追加日志文件(append-only file),这样可以在服务器重启后恢复数据。
- 数据结构支持: Redis 不仅仅是简单的键值存储,还支持多种复杂的数据结构,如哈希表(hashes)、列表(lists)、集合(sets)、有序集合(sorted sets)等,这使得它适用于不同种类的应用场景。
- 发布订阅: Redis 支持发布-订阅模式,允许多个客户端订阅一个或多个频道,当某个频道的消息被发布时,订阅者将收到相应的消息。
- 高可用性: Redis 支持主从复制和哨兵模式,可以实现数据的备份和故障转移,提高系统的可用性。
- 分布式缓存: Redis 常被用作分布式缓存,可以在应用程序和后端数据存储之间起到缓冲的作用,减轻数据库的负载。
- 事务支持: Redis 支持简单的事务,通过 MULTI、EXEC、DISCARD 和 WATCH 等命令可以实现一系列命令的原子性执行。
因此,对于大多数的业务场景中,我们通常将 Redis 与 SQL 一起使用,但二者的用途不同。SQL 用于持久性数据存储和复杂查询,而 Redis 则用于高速缓存、实时计数、消息队列等。在项目中是否需要同时使用它们取决于项目的具体需求和性能优化的目标,从而共同发挥他们的优势。
2. 安装与启动
对于 Redis 的安装部分,我们只需要下载对应版本的安装文件包即可,这里给出链接Redis (github.com),目前最新的版本为 5.0.14.1
在下载解压之后,我们进入解压后的文件夹路径,输入以下命令启动 Redis 服务
redis-server.exe redis.windows.conf
此时可以看到 Redis 的 Logo 和启动成功的信息,默认端口号为 6379
。
我们保持 redis-server 即服务器端运行,再次打开一个cmd窗口,启动 redis-cli 即客户端,即可创建我们的键值对了。
至此,Redis的安装与简单使用部分我们已经完成了,接下来就是更加深入的使用方法了。
3. 基本语法
数据类型 | 介绍 | 特性 | 用法 |
---|---|---|---|
String(字符串) | 一个可变的字节数组 | 可以包含任何数据,比如jpg图片或者序列化的对象(最大存储512M ) | 初始化、获取、长度、子串、覆盖、追加、计数、过期、删除等操作 |
Hash(哈希) | 二维结构,第一维是数组,第二维是链表(HashMap) | 一个 string 类型的 field 和 value 的映射表,hash 特别适合用于存储对象 | 存储、读取、修改,普通用户属性 |
List(列表) | 链表(双向链表),按照插入顺序排序 | 随机定位性能较弱,首尾插入删除性能较优。可以使用自然数或者负下标(从-1开始递减) | 适合做消息队列,有时间线的列表呈现 |
Set(集合) | 哈希表实现无序集合 | 添加,删除,查找的复杂度都是 O(1),重复元素自动忽略 | 利用唯一性,统计访问网站的所有独立ip,不重复的序列呈现 |
Sorted Set(有序集合) | 将Set中的元素增加一个权重参数score(double),元素按score有序排列 | score可重复,按从小到大自动排序 | 排行榜等需要排序的列表呈现 |
Redis支持五种数据类型:string(字符串),hash(哈希),list(列表),set(集合)及zset(sorted set:有序集合)。
3.1. String
- string 是 redis 最基本的类型
- string 类型是二进制安全的。意思是 redis 的 string 可以包含任何数据。比如jpg图片或者序列化的对象。
- string 类型是 Redis 最基本的数据类型,string 类型的值最大能存储 512MB。
3.2. hash
- Redis hash 是一个键值(key=>value)对集合。
- Redis hash 是一个 string 类型的 field 和 value 的映射表,hash 特别适合用于存储对象。
3.3. list
- Redis 列表是简单的字符串列表,按照插入顺序排序。你可以添加一个元素到列表的头部(左边)或者尾部(右边)。
redis 127.0.0.1:6379> lpush ListDemo first
(integer) 1
redis 127.0.0.1:6379> lpush ListDemo second
(integer) 2
redis 127.0.0.1:6379> lpush ListDemo third
(integer) 3
redis 127.0.0.1:6379> lrange ListDemo 0 10
1) "first"
2) "second"
3) "third"
redis 127.0.0.1:6379>
3.4. set
- 集合是一个无序的字符串元素集合,支持添加、删除、查找等操作。
- 集合可以用于存储唯一的元素,也可以进行交集、并集等操作。
- 使用
sadd key member
向集合添加键值对,成功返回1,如果元素已经在集合中返回 0。
redis 127.0.0.1:6379> sadd SetDemo first
(integer) 1
redis 127.0.0.1:6379> sadd SetDemo second
(integer) 1
redis 127.0.0.1:6379> sadd SetDemo third
(integer) 1
redis 127.0.0.1:6379> sadd SetDemo third
(integer) 0
redis 127.0.0.1:6379> smembers SetDemo
1) "first"
2) "second"
3) "third"
3.5. Sorted Set
- 有序集合类似于集合,但每个元素都关联着一个分数(score),用于排序元素。
- 有序集合通常用于实现排行榜、范围查找等功能。
- 使用
zadd key score member
向有序集合添加内容,成功返回1,如果元素已经在集合中返回 0。 - 有序集合分数可不唯一。
4. Go与Redis
在介绍完Redis的基本操作后,若想将其运用到我们的Go项目中,少不了的是 go-redis ,go-redis
是 Go 语言中一个流行的 Redis 客户端库,用于与 Redis 服务器进行交互。它提供了一组简单且强大的 API,使得在 Go 项目中操作 Redis 数据库变得更加方便和高效。
4.1. 服务端配置
对于服务端,当我们需要在程序中连接到 Redis 服务器时,通常会使用配置文件来存储与连接相关的信息,例如服务器地址、端口号、密码等。
{
"redis": {
"address": "redis-server-address",
"port": 6379,
"password": "your-password"
}
}
4.2. 客户端配置
而对于客户端,我们可以通过命令安装 go-redis
库
go get github.com/go-redis/redis/v8
并在相应的文件中导入即可
import "github.com/go-redis/redis/v8"
调用时,使用 redis.NewClient
函数创建一个客户端实例。
options := &redis.Options{
Addr: "localhost:6379", // Redis 服务器地址
Password: "", // Redis 密码,默认为空
DB: 0, // 数据库编号,默认为0
}
client := redis.NewClient(options)
同时对于键值对的 set 和 get 操作,也同样可以执行
ctx := context.Background()
// 设置键值对
err := client.Set(ctx, "KeyDemo", "ValueDemo", 0).Err()
if err != nil {
panic(err)
}
// 获取值
value, err := client.Get(ctx, "KeyDemo").Result()
if err != nil {
panic(err)
}
fmt.Println("KeyDemo:", value)
当然,当我们完成交互后,别忘了关闭链接释放资源。
err := client.Close()
if err != nil {
panic(err)
}
5. 小结
好了,本篇文章到这里就结束了,Redis 作为一款功能强大的数据库,极大的便利了我们的开发,文章中如有不足,还请读者多多指出,谢谢!