Redis,全称为Remote Dictionary Server,是一种开源的、基于键值对的数据结构存储系统,以其高性能、低延迟和丰富的数据结构特性而广受欢迎。本教程旨在为初学者提供一个全面的Redis入门指南,涵盖安装、基本操作、数据类型以及实战应用,助读者快速上手并高效利用Redis提升应用性能。
Redis是一个key-value存储系统。和Memcached类似,但是解决了断电后数据完全丢失的情况,而且她支持更多无化的value类型,除了和string外,还支持lists(链表)、sets(集合)和zsets(有序集合)几种数据类型。这些数据类型都支持push/pop、add/remove及取交集并集和差集及更丰富的操作,而且这些操作都是原子性的。
1. Redis 安装与启动
1.1. 安装 Redis
1.1.1. 在Linux上安装
对于Ubuntu/Debian系统,可以使用以下命令安装Redis:
sudo apt-get update
sudo apt-get install redis-server
而对于CentOS/RHEL系统,则使用:
sudo yum install redis
Redis 由四个可执行文件:
- redis-server:Redis服务器的daemon启动程序
- redis-cli:Redis命令行操作工具。当然,你也可以用telnet根据其纯文本协议来操作
- redis-benchmark:Redis性能测试工具,测试Redis在你的系统及你的配置下的读写性能
- redis-stat:Redis状态检测工具,可以检测Redis当前状态参数及延迟状况
1.1.2. 在Windows上安装
官网: https://redis.io/download/
中文: http://www.redis.cn/
GitHub下载地址:https://github.com/MSOpenTech/redis/releases
Redis 支持 32 位和 64 位。这个需要根据你系统平台的实际情况选择,这里我们下载 Redis-x64-xxx.zip压缩包到 C 盘,解压后,将文件夹重新命名为 redis。
1.2. 启动 Redis
1.2.1. 在Linux上启动
在大多数Linux发行版中,安装完成后Redis会自动启动。如果不行的话可以使用命令行,其中/etc/redis.conf
是配置文件的地址。
redis-server /etc/redis.conf
你可以通过以下redis-cli
命令来连接Redis:
[root@wujie ~]# redis-cli
Warning: Using a password with '-a' or '-u' option on the command line interface may not be safe.
127.0.0.1:6379>
1.2.2. 在Windows上启动
双击redis-server.exe
即可运行,如下图所示,出现这个就好了哦。
可以通过redis-cli ping
命令检查Redis是否正在运行:
1.3. 连接Redis
1.3.1. 连接本地Redis
一般都可以直接使用redis-cli
命令来连接。
1.3.2. 连接远程Redis
这是一个真实的情况,在图文魔方小程序的开发中,我作为后端开发,把代码写好后丢给前端来写页面,但是前端没有安装redis服务,好吧,那我就直接用服务器上的redis好了,我先用自己的本地电脑去连接,结果是失败的。
1.3.2.1. 服务器开放端口
比如我使用的是阿里云的服务器,就要在安全组中开放6379端口。
1.3.2.2. 关闭防火墙
使用命令关闭防火墙
# 查看防火墙状态
sudo systemctl status firewalld
# 关闭防火墙
sudo systemctl disable firewalld
# 禁用防火墙(开机自动关闭)
sudo systemctl disable firewalld
1.3.2.3. 修改配置文件
配置文件名为redis.conf
,这个文件就看你们的redis安装位置啦,这里我把bind注释掉了就好了。
bind 127.0.0.1
, 只能在本地机器连接bind 127.0.0.1 192.168.1.1
, 可以通过redis-cli -p 127.0.0.1
或redis-cli -p 192.168.1.1
连接,多个IP用空格分隔就好。bind 0.0.0.0
配置成 0.0.0.0 表示没有IP限制。和不填的效果一样。
以下是一些Redis的配置信息介绍
# 是否以守护进程启动 默认:no
daemonize no
# 用于设置Redis绑定的网络接口(网卡)。如果不配置bind,默认情况下Redis监听所有可用的网卡,redis只接受来自绑定网络接口的请求。
# Redis的配置文件中一般默认有bind 127.0.0.1,只允许本地连接,如果想要被远程访问注释掉bind配置或者bind外网ip即可。
bind 127.0.0.1
# 是否开启保护模式 默认:yes,是否有效会被bind和requirepass配置影响
## 当protected-mode为yes
### 注释bind和requirepass,redis的保护模式生效,只能通过本地连接
### 只注释bind,配置requirepass,redis的保护模式失效,可以通过密码远程连接
### 只注释requirepass,redis的保护模式失效,可以通过bind的ip无密码连接
## 当protected-mode为no
### 无论上面的哪种场景,客户端都可以根据 bind 及 requirepass 实际参数来连接到 redis
protected-mode yes
# redis服务端口 默认:6379
port 6379
# 客户端连接空闲时间单位秒,如果在指定时间内没有操作则会断开连接 默认:0(不超时)
timeout 0
# tcp心跳检测时间单位秒,对访问客户端的一种心跳检测,每个n秒检测一次 默认:0(不检测),建议设置成60
tcp-keepalive 0
# 客户端最大连接数,设置redis同时可以与多少个客户端进行连接 默认:10000
maxclients 10000
# 日志级别配置 默认:notice
## debug:能设置的最高的日志级别,打印所有信息,包括debug信息。
## verbose:打印除了debug日志之外的所有日志。
## notice:打印除了debug和verbose级别的所有日志。
## warning:仅打印非常重要的信息。
loglevel notice
# 日志文件输出路径配置
## 该路径默认为空。可以根据自己需要把日志文件输出到指定位置。
logfile ""
# 数据库数量配置 默认:16
databases 16
# 连接密码配置 默认无密码
requirepass 123456
1.3.2.4.重启Redis服务
然后使用命令来重启服务
# 重启Redis服务
sudo systemctl restart redis.service
一旦Redis服务器配置妥当,你就可以使用redis-cli
命令来远程连接了。基本的命令格式如下:
redis-cli -h <host> -p <port> -a <password>
<host>
是Redis服务器的IP地址或域名。<port>
是Redis服务器监听的端口,默认是6379。<password>
是你的Redis服务器密码(如果设置了的话)。
2. Redis数据结构详解
Redis支持五种主要的数据类型:String(字符串)、List(列表)、Set(集合)、Hash(哈希)和Sorted Set(有序集合)。每种数据类型都有其独特的应用场景。
2.1. 字符串(String)
- 特点:可以存储数字或文本,支持对其执行增加或减少操作。
- 使用场景:计数器、用户会话信息、短文本存储等。
SET user:1 "wujie" # 设置键值对
GET user:1 # 获取键值,输出 "wujie"
INCR user:age # 将键的值增加1,假设初始值为0
GET user:age # 获取键值,输出 "1"
2.2. 列表(List)
- 特点:双向链表实现,可以在列表两端进行插入或删除操作。
- 使用场景:队列系统、微博的消息流、最近浏览记录等。
LPUSH mylist "apple" # 左侧插入元素
RPUSH mylist "banana" # 右侧插入元素
LRANGE mylist 0 -1 # 获取列表所有元素,输出 ["apple", "banana"]
2.3. 集合(Set)
- 特点:无序集合,每个元素独一无二,适合做去重处理或集合运算。
- 使用场景:好友关系存储、标签分类、共同关注等。
SADD fruits "apple" # 添加元素到集合
SADD fruits "orange"
SMEMBERS fruits # 获取集合所有元素,输出 ["apple", "orange"]
2.4. 有序集合(Sorted Set)
- 特点:自动排序的集合,每个元素都与一个浮点数分数关联,用于排序。
- 使用场景:排行榜、时间线索引、优先级队列等。
ZADD leaderboard 100 "player1" # 添加元素到有序集合,并指定分数
ZADD leaderboard 50 "player2"
ZRANGE leaderboard 0 -1 # 获取有序集合的所有元素和分数,输出 ["player1", "player2"]
2.5. 哈希(Hash)
- 特点:字段-值映射,适用于存储对象。
- 使用场景:存储配置文件、用户信息、购物车等。
HMSET user:1 name "Tom" age 30 # 添加字段和值到哈希表
HGETALL user:1 # 获取哈希表中的字段和值,输出 {"name": "Tom", "age": "30"}
3. Redis 高效管理数据有效期
在许多应用场景下,数据具有临时性,例如网页缓存、用户会话信息或限时消息。为这类数据设置有效期可以:
- 节省资源:自动清理不再需要的数据,避免内存占用。
- 保持数据新鲜度:确保获取的是最新的数据副本。
- 提升安全性:限制敏感数据的生命周期。
3.1. 设置数据有效期的方法
3.1.1. EXPIRE 、 PEXPIRE 命令
**EXPIRE key seconds**
:设置key在seconds秒后过期。**PEXPIRE key milliseconds**
:设置key在milliseconds毫秒后过期。
SET mykey "Hello"
EXPIRE mykey 10 # 设置mykey在10秒后过期
3.1.2. SET 命令的过期选项
在使用SET
命令设置键值时,可以直接指定过期时间:
SET mykey "Hello" EX 10 # EX表示以秒为单位
SET mykey "Hello" PX 10000 # PX表示以毫秒为单位
3.1.3. TTL & PTTL 命令
**TTL key**
:查询key的剩余生存时间,以秒为单位,如果已过期或不存在则返回-2或-1。**PTTL key**
:查询key的剩余生存时间,以毫秒为单位。
TTL mykey # 返回mykey剩余的生存时间(秒)
3.2. 使用场景
设置数据有效时间在许多场景下非常有用,例如:
- 缓存:在缓存服务器上存储的数据通常是暂时的,可以使用过期时间自动清除旧数据。
- 会话管理:用户会话信息可以在用户登录后设置一个过期时间,以便在会话结束时自动清除。
- 临时授权:如验证码等敏感信息,可以在验证后设置一个短时间的过期,确保它们不会长时间留在系统中。