Redis 是一个开源内存键值数据库,支持不同类型的数据结构。它通常被用作缓存、消息代理或持久化存储。
Redis 最大的特点就是快速。因为 Redis 数据库完全放在内存中,所以操作很迅速。此外,Redis 使用 C语言编写,处理请求时不需要创建许多额外的对象,也能够更快地进行数据IO操作。
相较于传统的磁盘数据库,Redis 的优势在于它对数据高速读取性能的支持,适合快速存储和检索应用程序所需的数据。
以下是一些 Redis 常见的使用场景:
缓存:Redis 常用于缓存经常与后端服务交互的数据,并在内存中保留一份数据的备份,这样就可以快速地响应客户端请求,减少了读取磁盘的延迟。
消息队列:Redis 提供了可以进行简单消息队列管理的命令,例如实现“发布-订阅”模式等消息推送系统。
计数器和排行榜:由于 Redis 的高速读取性能,它可以轻而易举地实现计数器和排行榜应用程序,同时也支持像 ZSET 这样的数据类型。
接下来我们将展示一些 Redis 的基础命令。这些命令可以执行各种基本操作,例如添加和检索数据,以及更改和删除现有数据:
# 连接到 Redis 服务器
redis-cli
# 添加一个字符串键值对
set mykey "hello"
# 获取已经存储的值
get mykey
# 删除键值对
del mykey
# 设置哈希类型的键值,并添加三个键值对
hmset user:1234 name "John" age 25 email [email protected]
# 获取名为 user:1234 的键中所有键值对
hgetall user:1234
# 将值添加到列表尾部
lpush mylist "world"
# 检索列表中的值
lrange mylist 0 -1
# 将元素添加到称为 myset 的集合中
sadd myset "one" "two"
# 从 myset 集合中删除元素 two
srem myset "two"
Redis 支持五种核心数据类型:string、list、set、zset 和 hash。
String 类型是 Redis 最简单的数据类型,这就意味着它们可以存储任何类型的数据,例如整数、浮点数或字符串。
以下是使用 Redis string 数据类型的两个基本命令:
# 保存字符串
SET greeting "hello world"
# 获取字符串
GET greeting
List 类型是一个数组/列表结构。你可以从列表两端添加、读取或删除元素,使其非常适合于处理实时消息流之类的数据。
# 从列表的左边插入元素
LPUSH countries USA UK China
# 获取列表中的元素
LRANGE countries 0 -1
Set 类型是无序集合的一个非常好的选择。Set 中的每个元素都必须唯一,并且可以使用交集、并集和差集等操作来组合键之间的值。
# 将一些项目添加到集合中
SADD myset "Fizz" "Buzz"
# 获取集合中的所有元素
SMEMBERS myset
Hash 类型是 Redis 中非常有用的一种类型,它存储了一组属性和属性值。对于这种结构,我们可以使用批量读写及更新多个维度的数据:
# 添加新数据到哈希表
HSET user:1234 name "John"
# 获取名为 user:1234 的哈希表中某个键的值
HGET user:1234 name
Zset 类型是 Redis 的有序集合实现,它通过关联分数和排名来代替排序和索引。
# 给中国队打20个进球
ZADD team-china 20 "some-player-name"
# 检索排名前10的球员名称及其分数
ZREVRANGE team-china 0 9 WITHSCORES
以下是一个简单的使用 Flask 框架的 Python 代码,用于展示如何将 Redis 作为缓存来使用:
from flask import Flask
from redis import Redis
app = Flask(__name__)
redis = Redis(host='localhost', port=6379)
@app.route('//' )
def get_name(name: str):
# 查询 Redis 缓存
value = redis.get(name)
if value:
return f"Hello, {value.decode('utf-8')}!"
else:
val = name.upper()
redis.set(name, val)
return f"Hello, {val}!"
if __name__ == '__main__':
app.run(debug=True)
在上面的示例中,我们使用 Redis 来缓存响应。如果某个数据路径已经被查询过,并且值存在于 Redis 中,则可以直接从 Redis 中返回。
如果键不是已经存在的,那么就先