软件开发 --- redis 之初体验
一个键值对(Key-Value)的内存数据库
可以用作数据库缓存、消息队列、排行榜等场景。
快速上手
Redis 默认有 16 个数据库(索引从 0 到 15),但所有命令默认都会在数据库 0 中执行,除非你显式地使用 SELECT
命令来切换到其他数据库。
安装
一、在 Windows 上安装 Redis
Redis 并没有官方支持 Windows 版本,但是可以通过 Microsoft Open Tech 版本或者使用 WSL(Windows Subsystem for Linux)来在 Windows 上运行 Redis。
1.访问 https://github.com/microsoftarchive/redis/releases ,下载最新的 Redis 版本的 .zip
文件。这里只有2016版本的比较旧,还是建议使用官方linux编译的版本,或者其他第三方编译者的软件。
2.解压运行 Redis。
redis-server.exe
此时 Redis 会启动,默认监听在 6379 端口。
3.在另一个命令行窗口中,输入:
redis-cli.exe
你就可以开始使用 Redis 了。
注意: 这种方法是微软开放技术组维护的版本,已不再更新,且性能和稳定性较 Linux 上的版本较差。如果你在生产环境中使用 Redis,推荐使用 Linux 环境。
二、在 Linux 上安装 Redis
Redis 在 Linux 上的安装非常简便,通常可以通过包管理器直接安装,也可以从源码进行安装。
方法 1:通过包管理器安装(例如在 Ubuntu 上)
sudo apt update
sudo apt install redis-server
安装完成后,Redis 会自动作为服务启动。可以使用以下命令检查 Redis 服务状态:
sudo systemctl status redis-server
sudo systemctl enable redis-server
redis-cli
测试 Redis:
set mykey "Hello, Redis!"
get mykey
方法 2:从源码安装 Redis
如果你从源码安装 Redis,首先需要安装一些编译所需的工具:
sudo apt update
sudo apt install build-essential tcl
wget http://download.redis.io/redis-stable.tar.gz
tar xzf redis-stable.tar.gz
cd redis-stable
make
make test
sudo make install
redis-server
在另一个终端中使用 Redis 客户端:
redis-cli
对于生产环境,建议使用 Linux 服务器,因为 Redis 原生是为 Linux 开发的,性能和稳定性更好。
1. 数据缓存:快速存取热点数据
Redis 常用来缓存经常访问的数据,减少数据库的压力。
假设我们有一个商品详情页,每次用户访问都要查询数据库。为了加速访问,可以用 Redis 做缓存:
存储商品信息:
SET product:1001 "{'name': 'iPhone 14', 'price': 5999}" Key 是 product:1001,表示商品 ID 为 1001 的商品。
product也可以理解为表,库默认是0,1001是key Value 是 JSON 字符串,存储商品的名称和价格。
获取商品信息:
GET product:1001 返回:{'name': 'iPhone 14', 'price': 5999}。
优势:
数据从 Redis 读取速度非常快(内存存储)。
如果商品数据更新,可以直接更新缓存中的值。
2. 分布式锁:控制资源访问
在分布式系统中,多个服务可能会同时操作某一资源,Redis 可以用来实现分布式锁,防止冲突。
假设一个秒杀活动中,所有用户都抢同一个商品库存。为了防止超卖,可以用 Redis 锁。
加锁:
SET lock:product:1001 user123 EX 10 NX lock:product:1001 是锁的名称,表示商品 1001 的锁。 user123 是持有锁的用户 ID。 EX 10 设置锁的过期时间为 10 秒。 NX 表示“只有锁不存在时才设置”。
释放锁:
DEL lock:product:1001
优势:
防止多个用户同时扣减库存。
锁有过期时间,防止因程序异常导致锁无法释放。
3. 消息队列:异步任务处理
Redis 的 List 数据结构可以用来实现简单的消息队列,多个消费者可以异步处理任务。
例子:
假设用户下单后,需要异步发送订单确认邮件。
生产者添加任务:
LPUSH email_queue "{'user_id': 123, 'email': 'user@example.com'}"
主程序把任务信息(用户 ID 和邮箱地址)添加到队列 email_queue。
消费者处理任务:
BRPOP email_queue 0
发送邮件的程序,从队列中取出任务,并处理发送邮件的操作。
优势:
异步处理,避免阻塞主流程。
支持多个消费者并行处理任务。
4. 排行榜:实时统计和排序
Redis 的 Sorted Set(有序集合)可以用来实现排行榜功能。
例子:
假设一个游戏中需要显示玩家积分排行榜。
记录玩家分数:
ZADD leaderboard 1000 player1 ZADD leaderboard 1200 player2 ZADD leaderboard 900 player3 ZADD 命令将玩家和分数添加到有序集合 leaderboard 中。
获取排行榜:
ZREVRANGE leaderboard 0 2 WITHSCORES 返回:[player2: 1200, player1: 1000, player3: 900]。
优势:
Redis 自动对分数进行排序,查询效率极高。
支持动态更新分数,实时反映变化。
5. 会话管理:记录用户登录状态
Redis 可以用来存储用户的会话信息,比如登录状态、购物车内容等。
例子:
记录用户登录状态:
SETEX session:user123 3600 "logged_in" //session:user123 是会话的 Key,表示用户 ID 为 123 的会话信息。SETEX
:这是 Redis 的一个命令,用于设置一个键的值,并且设置这个键的过期时间。SETEX
是SET
和EXPIRE
命令的结合,允许你同时设置键的值和过期时间。 //3600 是过期时间(秒),表示会话有效时间为 1 小时。 //logged_in 是会话的状态信息。
检查用户是否登录:
GET session:user123
//返回:logged_in(表示用户已登录)。
//如果返回 nil,表示会话已过期或用户未登录。
优势:
使用 Redis 可以高效管理用户的会话,支持大规模并发访问。
会话有过期机制,无需手动清理过期数据。
总结
1. 高性能: Redis 数据存储在内存中,读写速度非常快。
2. 丰富的数据结构: 支持字符串(String)、列表(List)、集合(Set)、有序集合(Sorted Set)、哈希(Hash)等多种数据类型。
3. 支持持久化: 虽然 Redis 是内存数据库,但支持将数据保存到磁盘,防止数据丢失。
4. 灵活扩展: 支持分布式部署,适合高并发场景。