文章目录
- 关系型数据库与非关系型数据库
- 关系型数据库SQL
- 定义
- SQL语句
- 主流产品
- 非关系型数据库NoSQL
- 定义
- 主流产品
- 区别
- 数据存储方式不同
- 扩展方式不同
- 对事务性的支持不同
- 应用场景
- 结构对比
- 补充
- Redis
- Redis 的特点与优势
- Redis 的使用场景
- 哪些数据适合放入缓存中?
- Redis 为什么这么快?
- Redis部署安装指南
- 软件包下载
- 环境准备
- 修改内核参数
- 安装Redis
- 修改配置文件
- 定义systemd服务管理脚本
- 启动服务
- 验证服务
- Redis命令工具
- 命令列表
- redis-cli 命令行工具
- redis-benchmark 测试工具
- Redis 数据库常用命令
- Redis数据库常用命令
- 数据存储与获取
- keys 命令
- exists 命令
- del 命令
- type 命令
- expire 命令
- ttl 命令
- setex 命令
- rename 命令
- renamenx 命令
- dbsize 命令
- config 命令
- Redis多数据库常用命令
- 1. 数据库切换
- 2. 数据移动
- 3. 数据清除
- 总结
- 关系型数据库SQL和非关系型数据库NoSQL之间区别
- Redis 数据库特性
- Redis工具
- Redis String 类型操作(计数器相关)
- Redis list类型操作(消息队列相关)
- Redis Hash 类型操作(存储对象,购物车相关)
- Redis Set 类型操作(随机抽奖,求交集、差集、并集相关)
- Redis Zset 类型操作(排行榜,热搜相关)
- Redis 常用命令
- 问答
关系型数据库与非关系型数据库
关系型数据库SQL
定义
关系型数据库(Relational Database,简称RDB)是一种结构化的数据库,它建立在关系模型基础上,通过二维表格的形式来存储数据。每个表格(表)由行和列组成,其中行代表记录,列代表字段。
SQL语句
SQL(Structured Query Language,结构化查询语言)是关系型数据库的标准数据查询语言,用于执行对数据库中数据的检索和操作。SQL语句包括数据定义语言(DDL)、数据操作语言(DML)、数据控制语言(DCL)和数据查询语言(DQL)等。
主流产品
- Oracle:一种大型的关系型数据库管理系统,适用于企业级应用。
- MySQL:一种开源的关系型数据库管理系统,广泛应用于Web开发中。
- SQL Server:微软开发的关系型数据库管理系统,适用于Windows平台。
- Microsoft Access:微软开发的桌面关系型数据库管理系统,适用于小型应用。
- DB2:IBM开发的关系型数据库管理系统,适用于企业级应用。
- PostgreSQL:一种开源的对象-关系型数据库管理系统,支持复杂的查询和高级功能。
在使用关系型数据库时,必须先建库建表设计表结构,然后按照表结构存储数据。如果数据与表结构不匹配,就会存储失败。这种严格的数据结构使得关系型数据库在数据一致性和完整性方面具有优势。
非关系型数据库NoSQL
定义
非关系型数据库(NoSQL,Not Only SQL)是指那些不遵循关系模型的数据库,它们不需要预先定义表结构,每条记录可以有不同的数据类型和字段个数。NoSQL数据库包括多种类型,如键值存储、列族存储、文档存储和图数据库等。
主流产品
- Redis:一种开源的键值存储数据库,支持多种数据类型,如字符串、哈希、列表、集合和有序集合等。
- MongoDB:一种开源的文档存储数据库,使用BSON(Binary JSON)格式存储数据,支持复杂查询和索引。
- HBase:一种基于Hadoop的列族存储数据库,适用于大规模数据的存储和访问。
- Memcached:一种开源的分布式内存对象缓存系统,用于加速Web应用的性能。
- Elasticsearch:一种开源的分布式搜索和分析引擎,适用于全文搜索和结构化数据的分析。
- TSDB(Time Series Database):一种专门用于存储时间序列数据的数据库,如InfluxDB、Prometheus等。
非关系型数据库不需要预先建库建表定义数据存储表结构,每条记录可以有不同的数据类型和字段个数。这种灵活性使得非关系型数据库在应对Web2.0纯动态网站类型的高并发、高性能和高可用性需求方面具有优势。
区别
数据存储方式不同
- 关系型数据库:数据存储在数据表的行和列中,数据表可以彼此关联协作存储。
- 非关系型数据库:数据通常存储在数据集中,如文档、键值对或图结构中。
扩展方式不同
- 关系型数据库:纵向扩展,通过提高计算机性能来支持更多并发量。
- 非关系型数据库:横向扩展,通过添加更多普通的数据库服务器(节点)来分担负载。
对事务性的支持不同
- 关系型数据库:遵循ACID规则,对事务的支持很好。
- 非关系型数据库:遵循BASE原则,对事务的支持不是很好。
应用场景
- 关系型数据库:适用于需要强一致性、复杂查询和事务处理的场景,如金融系统、企业资源规划(ERP)等。
- 非关系型数据库:适用于高并发、大数据量、灵活数据模型的场景,如社交媒体、实时分析、物联网数据处理等。
结构对比
- 关系型数据库:
实例 --> 数据库 --> 表(table) --> 记录行(row)、数据字段(column)
- 非关系型数据库:
实例 --> 数据库 --> 集合(collection) --> 键值对(key-value)
补充
非关系型数据库产生背景
可用于应对 Web2.0 纯动态网站类型的三高问题(高并发、高性能、高可用)。
- High performance——对数据库高并发读写需求
- Huge Storage——对海量数据高效存储与访问需求
- High Scalability && High Availability——对数据库高可扩展性与高可用性需求
关系型数据库和非关系型数据库都有各自的特点与应用场景,两者的紧密结合将会给Web2.0的数据库发展带来新的思路。让关系型数据库关注在关系上和对数据的一致性保障,非关系型数据库关注在存储和高效率上。例如,在读写分离的MySQL数据库环境中,可以把经常访问的数据存储在非关系型数据库中,提升访问速度。
Redis
Redis(Remote Dictionary Server)是一个开源的、使用 C 语言编写的 NoSQL 数据库,它基于内存运行并支持持久化,采用 key-value(键值对)的存储形式。Redis 在分布式架构中扮演着不可或缺的角色,为开发者提供了高性能的数据存储和访问能力。
Redis 的特点与优势
- 极高的数据读写速度:
- Redis 的数据读取速度最高可达到 110,000 次/秒,写入速度最高可达到 81,000 次/秒。
- 这种速度使得 Redis 成为高性能缓存的理想选择。
- 支持丰富的数据类型:
- Redis 支持多种数据类型,包括 key-value、Strings(字符串)、Lists(列表)、Hashes(哈希)、Sets(集合)及 Sorted Sets(有序集合)等。
- 丰富的数据类型使得 Redis 能够满足多种应用场景的需求。
- 支持数据的持久化:
- Redis 可以将内存中的数据保存到磁盘中,以实现数据的持久化。
- 这意味着即使 Redis 服务器重启,之前保存的数据也可以重新加载并继续使用。
- 原子性:
- Redis 的所有操作都是原子性的,这意味着每个操作要么完全执行,要么完全不执行,不会出现中间状态。
- 原子性保证了 Redis 数据的一致性和完整性。
- 支持数据备份:
- Redis 支持 master-slave(主从)模式的数据备份,以实现数据的高可用性和容错性。
- 在主从模式下,主节点负责处理数据操作,而从节点则实时复制主节点的数据,以便在主节点出现故障时能够接管服务。
Redis 的使用场景
Redis 作为基于内存运行的数据库,是一个高性能的缓存,通常应用于以下场景:
- Session 缓存:存储用户的会话信息,以提高用户访问速度。
- 队列:实现消息队列功能,支持生产者-消费者模型。
- 排行榜:存储排名信息,如游戏排行榜、文章阅读量排行榜等。
- 计数器:实现计数器功能,如网站访问量统计、用户点赞数统计等。
- 最近最热文章/评论:存储最近最热的文章或评论信息,以便快速展示给用户。
- 发布订阅:实现发布-订阅模型,支持消息广播和订阅功能。
哪些数据适合放入缓存中?
- 即时性:例如查询最新的物流状态信息,这类数据需要实时更新,并且访问频率较高,适合放入缓存中以提高访问速度。
- 数据一致性要求不高:例如门店信息,修改后数据库中已经更新了,但缓存中可能稍微延迟几分钟才更新,这并不影响功能的使用。
- 访问量大且更新频率不高:例如网站首页的广告信息,访问量大但更新频率不高,适合放入缓存中以减少数据库的访问压力。
Redis 为什么这么快?
- 纯内存结构:
- Redis 是一个纯内存数据库,避免了磁盘 I/O 等耗时操作。
- 内存访问速度比磁盘访问速度快得多,因此 Redis 能够提供极高的数据读写速度。
- 单线程处理:
- Redis 的命令处理核心模块是单线程的,避免了多线程切换和锁竞争带来的性能消耗。
- 单线程处理使得 Redis 能够专注于数据处理,而不需要处理线程间的同步和通信问题。
- I/O 多路复用机制:
- Redis 采用了 I/O 多路复用机制(如 select、poll、epoll 等),能够同时处理多个客户端的连接请求和数据传输。
- I/O 多路复用机制大大提高了 Redis 的并发处理能力,使得 Redis 能够同时处理成千上万的客户端连接。
- 注意:
- 在 Redis 6.0 版本中,虽然增加了多线程处理网络请求的功能,但数据的读写命令仍然是单线程处理的。
- 这意味着 Redis 的数据处理能力仍然受限于单线程的性能瓶颈,但网络请求的处理能力得到了提升。
Redis部署安装指南
软件包下载
- 下载地址:https://download.redis.io/releases/
环境准备
- 关闭防火墙:
systemctl stop firewalld systemctl disable firewalld
- 关闭SELinux:
setenforce 0 sed -i 's/enforcing/disabled/' /etc/selinux/config
修改内核参数
编辑 /etc/sysctl.conf
文件,添加或修改以下内容:
vm.overcommit_memory = 1
net.core.somaxconn = 2048
使配置生效:
sysctl -p
安装Redis
- 安装依赖:
yum install -y gcc gcc-c++ make
- 解压并编译Redis:
tar zxvf /opt/redis-7.0.9.tar.gz -C /opt/ cd /opt/redis-7.0.9 make make PREFIX=/usr/local/redis install
- 创建工作目录并设置权限:
mkdir /usr/local/redis/{conf,log,data} cp /opt/redis-7.0.9/redis.conf /usr/local/redis/conf/ useradd -M -s /sbin/nologin redis chown -R redis.redis /usr/local/redis/
- 设置环境变量:
编辑/etc/profile
文件,添加以下内容:
使配置生效:PATH=$PATH:/usr/local/redis/bin
source /etc/profile
修改配置文件
编辑 /usr/local/redis/conf/redis.conf
文件,修改以下内容:
bind 127.0.0.1 192.168.80.10 # 监听的主机地址
protected-mode no # 关闭本机访问保护模式
port 6379 # 监听端口
daemonize yes # 后台启动
pidfile /usr/local/redis/log/redis_6379.pid # PID文件路径
logfile "/usr/local/redis/log/redis_6379.log" # 日志文件路径
dir /usr/local/redis/data # 持久化文件所在目录
requirepass abc123 # 设置密码
定义systemd服务管理脚本
创建 /usr/lib/systemd/system/redis-server.service
文件,添加以下内容:
[Unit]
Description=Redis Server
After=network.target[Service]
User=redis
Group=redis
Type=forking
TimeoutSec=0
PIDFile=/usr/local/redis/log/redis_6379.pid
ExecStart=/usr/local/redis/bin/redis-server /usr/local/redis/conf/redis.conf
ExecReload=/bin/kill -s HUP $MAINPID
ExecStop=/bin/kill -s QUIT $MAINPID
PrivateTmp=true[Install]
WantedBy=multi-user.target
启动服务
systemctl start redis-server
systemctl enable redis-server
验证服务
netstat -lntp | grep 6379
Redis命令工具
命令列表
- redis-server:启动 Redis 服务器。
- redis-benchmark:性能测试工具,用于检测 Redis 在本机的运行效率。
- redis-check-aof:修复有问题的 AOF 持久化文件。
- redis-check-rdb:修复有问题的 RDB 持久化文件。
- redis-cli:Redis 客户端命令行工具。
- redis-sentinel:Redis 哨兵集群使用。
redis-cli 命令行工具
语法
redis-cli -h host -p port [-a password]
- -h:指定远程主机。
- -p:指定 Redis 服务的端口号。
- -a:指定密码,未设置数据库密码可以省略
-a
选项。
示例:
# 连接到远程Redis服务器(IP地址为192.168.80.10,端口为6379,密码为abc123)
redis-cli -h 192.168.80.10 -p 6379 -a 'abc123' # 执行Redis命令(例如,获取名为mykey的键的值)
GET mykey # 在不退出redis-cli的情况下,切换到另一个数据库(例如,切换到数据库2)
SELECT 2 # 退出redis-cli
exit
redis-benchmark 测试工具
基本语法
redis-benchmark [选项] [选项值]
- -h:指定服务器主机名。
- -p:指定服务器端口。
- -s:指定服务器 socket。
- -c:指定并发连接数。
- -n:指定请求数。
- -d:以字节的形式指定 SET/GET 值的数据大小。
- -k:1=keep alive 0=reconnect。
- -r:SET/GET/INCR 使用随机 key, SADD 使用随机值。
- -P:通过管道传输
<numreq>
请求。 - -q:强制退出 redis。仅显示 query/sec 值。
- –csv:以 CSV 格式输出。
- -l:生成循环,永久执行测试。
- -t:仅运行以逗号分隔的测试命令列表。
- -I:Idle 模式。仅打开 N 个 idle 连接并等待。
示例:
# 向IP地址为192.168.80.10、端口为6379的Redis服务器发送100个并发连接与100000个请求测试性能
redis-benchmark -h 192.168.80.10 -p 6379 -c 100 -n 100000 # 测试存取大小为100字节的数据包的性能(仅显示query/sec值)
redis-benchmark -h 192.168.80.10 -p 6379 -q -d 100 # 测试本机上Redis服务在进行set与lpush操作时的性能(仅显示query/sec值)
redis-benchmark -t set,lpush -n 100000 -q # 以CSV格式输出set与lpush操作的测试结果
redis-benchmark -t set,lpush -n 100000 --csv
Redis 数据库常用命令
Redis数据库常用命令
- 数据存取
SET key value
:存放数据。GET key
:获取数据。
- 键管理
KEYS pattern
:获取符合规则的键值列表。支持使用*
(匹配任意数量的字符)、?
(匹配单个字符)等通配符。EXISTS key
:判断键值是否存在,存在返回1,不存在返回0。DEL key
:删除指定键及其值。RENAME oldkey newkey
:对已有键进行重命名,无论新键是否存在都会进行重命名,并覆盖新键的值。RENAMENX oldkey newkey
:对已有键进行重命名,但仅当新键不存在时才进行重命名。
- 数据类型检测
TYPE key
:获取键对应的值的类型,如字符串(string)、列表(list)、集合(set)、有序集合(zset)等。
- 过期设置
EXPIRE key seconds
:为已存在的键设置过期时间(以秒为单位)。TTL key
:查看键还有多少秒过期。返回-1表示永不过期,返回-2表示已过期。SETEX key seconds value
:创建键和值,并同时设置过期时间(以秒为单位)。
- 数据库大小查看
DBSIZE
:查看当前数据库中键的数目。
- 配置与安全
CONFIG SET parameter value
:设置Redis服务器的配置参数。例如,CONFIG SET requirepass yourpassword
用于设置访问密码。CONFIG GET parameter
:获取Redis服务器的配置参数值。例如,CONFIG GET requirepass
用于查看当前设置的密码。AUTH password
:验证客户端密码。在设置了密码后,所有操作前都需要先进行密码验证。
注意:
- 在实际使用中,应谨慎使用
KEYS
命令,特别是在生产环境中,因为它会扫描整个数据库并可能导致性能问题。对于大型数据集,建议使用SCAN
命令进行迭代查询。 - 设置密码后,所有操作前都需要先进行密码验证(使用
AUTH
命令),否则操作将被拒绝。 RENAME
和RENAMENX
命令在重命名键时应小心使用,以避免覆盖重要数据。
数据存储与获取
- set:存放数据。
set key value # 将键 key 的值设置为 value
- get:获取数据。
get key # 获取键 key 的值
示例:
127.0.0.1:6379> set teacher zhangsan # 设置键 teacher 的值为 "zhangsan"
OK
127.0.0.1:6379> get teacher # 获取键 teacher 的值
"zhangsan"
keys 命令
用于获取符合规则的键列表,常与通配符 *
和 ?
结合使用。
- **KEYS ***:查看当前数据库中所有键。
- KEYS v*:查看当前数据库中以
v
开头的数据。 - KEYS v?:查看当前数据库中以
v
开头后面包含任意一位的数据。 - KEYS v??:查看当前数据库中以
v
开头后面包含任意两位的数据。
示例:
127.0.0.1:6379> KEYS * # 查看当前数据库中所有键
127.0.0.1:6379> KEYS v* # 查看当前数据库中以 v 开头的数据
127.0.0.1:6379> KEYS v? # 查看当前数据库中以 v 开头后面包含任意一位的数据
127.0.0.1:6379> KEYS v?? # 查看当前数据库中以 v 开头后面包含任意两位的数据
exists 命令
判断键是否存在。
exists key # 判断键 key 是否存在,存在返回 1,不存在返回 0
返回值为 1
表示键存在,0
表示键不存在。
示例:
127.0.0.1:6379> exists teacher # 判断键 teacher 是否存在
(integer) 1 # 键 teacher 存在
127.0.0.1:6379> exists tea # 判断键 tea 是否存在
(integer) 0 # 键 tea 不存在
del 命令
删除指定键。
del key # 删除键 key
示例:
127.0.0.1:6379> keys * # 查看当前数据库中所有键
127.0.0.1:6379> del v5 # 删除键 v5
127.0.0.1:6379> get v5 # 尝试获取已删除的键 v5
type 命令
获取键对应的值类型。
type key # 获取键 key 对应的值类型
示例:
127.0.0.1:6379> type k1 # 获取键 k1 对应的值类型
string # 键 k1 对应的值类型为 string
expire 命令
为已存在的键设置过期时间。
expire key seconds # 为键 key 设置过期时间为 seconds 秒
示例:
127.0.0.1:6379> expire k1 10 # 设置键 k1 的过期时间为 10 秒
ttl 命令
查看键还有多少秒过期,-1
表示永不过期,-2
表示已过期。
ttl key # 查看键 key 还有多少秒过期
setex 命令
创建键和值,并设置过期时间。
setex key seconds value # 创建键 key 并设置值为 value,过期时间为 seconds 秒
示例:
127.0.0.1:6379> setex k11 15 hello # 创建键 k11 并设置值为 "hello",过期时间为 15 秒
rename 命令
对已有键进行重命名(覆盖)。
rename oldkey newkey # 将键 oldkey 重命名为 newkey,覆盖已存在的 newkey
示例:
127.0.0.1:6379> rename v22 v2 # 将键 v22 重命名为 v2
OK
127.0.0.1:6379> get v2 # 获取键 v2 的值
"5"
renamenx 命令
对已有键进行重命名,并检测新名是否存在,如果目标键存在则不进行重命名(不覆盖)。
renamenx oldkey newkey # 将键 oldkey 重命名为 newkey,如果 newkey 已存在则不进行重命名
返回值为 1
表示重命名成功,0
表示目标键存在,重命名失败。
示例:
127.0.0.1:6379> renamenx v2 teacher # 将键 v2 重命名为 teacher
(integer) 0 # 键 teacher 已存在,重命名失败
dbsize 命令
查看当前数据库中键的数目。
dbsize # 查看当前数据库中键的数目
config 命令
用于配置 Redis 服务器。
- config set requirepass yourpassword:设置密码。
- config get requirepass:查看密码(需先验证密码)。
示例:
127.0.0.1:6379> config set requirepass 123456 # 设置密码为 123456
127.0.0.1:6379> auth 123456 # 验证密码
OK
127.0.0.1:6379> config get requirepass # 查看密码设置
Redis多数据库常用命令
Redis支持多数据库功能,默认情况下包含16个数据库(编号从0到15)。这些数据库相互独立,互不干扰。
1. 数据库切换
- 命令格式:
SELECT 序号
- 使用
redis-cli
连接Redis数据库后,默认使用的是序号为0的数据库。
# 切换到序号为10的数据库
127.0.0.1:6379> SELECT 10
OK
# 此时提示符变为127.0.0.1:6379[10]>,表示已切换到序号为10的数据库# 切换到序号为15的数据库
127.0.0.1:6379[10]> SELECT 15
OK
# 提示符变为127.0.0.1:6379[15]># 切换回序号为0的数据库
127.0.0.1:6379[15]> SELECT 0
OK
# 提示符恢复为127.0.0.1:6379>
2. 数据移动
- 命令格式:
MOVE 键名 序号
- 可以将指定键及其值从一个数据库移动到另一个数据库。
# 在序号为0的数据库中设置一个键值对
127.0.0.1:6379> SET k1 100
OK
# 获取并验证键值对
127.0.0.1:6379> GET k1
"100"# 切换到序号为1的数据库
127.0.0.1:6379> SELECT 1
OK
# 尝试在序号为1的数据库中获取k1,应返回nil(不存在)
127.0.0.1:6379[1]> GET k1
(nil)# 切换回序号为0的数据库
127.0.0.1:6379[1]> SELECT 0
OK
# 将k1从序号为0的数据库移动到序号为1的数据库
127.0.0.1:6379> MOVE k1 1
(integer) 1 # 返回1表示移动成功# 切换到序号为1的数据库
127.0.0.1:6379> SELECT 1
OK
# 验证k1是否已成功移动到序号为1的数据库
127.0.0.1:6379[1]> GET k1
"100"# 切换回序号为0的数据库并验证k1是否已不存在
127.0.0.1:6379[1]> SELECT 0
OK
127.0.0.1:6379> GET k1
(nil) # 返回nil表示k1在序号为0的数据库中已不存在
3. 数据清除
FLUSHDB
:清空当前数据库的所有数据。FLUSHALL
:清空所有数据库的所有数据,使用时需谨慎!
# 在序号为0的数据库中设置一个键值对
127.0.0.1:6379> SET k2 200
OK
# 验证键值对
127.0.0.1:6379> GET k2
"200"# 清空序号为0的数据库的所有数据
127.0.0.1:6379> FLUSHDB
OK
# 验证k2是否已被清除
127.0.0.1:6379> GET k2
(nil) # 返回nil表示k2已被清除# 注意:FLUSHALL会清空所有数据库的数据,以下仅为示例,不建议在生产环境中使用
# 清空所有数据库的所有数据(慎用!)
# 127.0.0.1:6379> FLUSHALL
# OK
注意:
- 在使用
FLUSHDB
和FLUSHALL
命令时,请确保已备份重要数据,因为这些操作会永久删除数据库中的数据。 - Redis的多数据库功能虽然方便,但在实际生产环境中,更推荐使用单个数据库并结合命名空间(如使用前缀)来组织数据,以避免数据库切换带来的复杂性和潜在问题。
总结
关系型数据库SQL和非关系型数据库NoSQL之间区别
关系型数据库SQL | 非关系型数据库NoSQL | |
---|---|---|
存储结构 | 二维表格结构 | 不是二维表格结构,不同的NoSQL采用不同的存储方式(键值对、文档、索引、图形结构、时间序列等) |
扩展方式 | 纵向扩展(提升单机的硬件性能) | 横向扩展(增加服务器节点数量) |
事务支持 | 基于ACID原则,对事务控制更稳定、细粒度更高 | 基于BASE原则,对事务控制的稳定性和细粒度不如SQL |
典型代表 | MySQL、PostgreSQL、Oracle、SQL Server | Redis、Memcached、MongoDB、ElasticSearch、Prometheus、HBase |
Redis 数据库特性
特性 | 描述 |
---|---|
开发语言 | C语言 |
开源 | 是 |
存储模型 | 基于内存运行的NoSQL数据库 |
存储结构 | 键值对(Key/Value, KV) |
数据类型 | 五大基础数据类型: - string(字符串) - list(列表) - hash(哈希/散列) - set(集合/无序集合) - zset/sorted set(有序集合) 特殊数据类型: - HyperLogLogs(基数统计) - Bitmaps(位图) - geospatial(地理位置) |
端口号 | TCP/6379 |
- 开发语言:Redis使用C语言开发,确保高性能和低内存占用。
- 开源:Redis是完全开源的,拥有活跃的社区支持和丰富的文档资源。
- 存储模型:Redis是一款基于内存运行的NoSQL数据库,提供快速的读写能力。
- 存储结构:采用键值对(Key/Value, KV)存储结构,简单高效。
- 数据类型:
- 五大基础数据类型:
- string(字符串):用于存储文本或二进制数据。
- list(列表):有序的字符串列表,支持两端插入和删除操作。
- hash(哈希/散列):存储字段和值的映射关系。
- set(集合/无序集合):无序且唯一的字符串集合。
- zset/sorted set(有序集合):有序且唯一的字符串集合,每个元素关联一个分数用于排序。
- 特殊数据类型:
- HyperLogLogs(基数统计):用于基数统计,适用于大数据集。
- Bitmaps(位图):高效存储和操作位级数据。
- geospatial(地理位置):支持地理位置数据的存储和查询。
- 五大基础数据类型:
- 端口号:默认使用TCP端口6379进行通信。
Redis工具
工具类型 | 工具名称 | 命令格式 | 功能描述 |
---|---|---|---|
性能检测工具 | redis-benchmark | redis-benchmark -h <redis服务器地址> -p <redis端口> -a <redis密码> -c <并发连接数> -n <总请求数> -d <请求的数据大小> -t <被测试的命令> -q | 用于检测 Redis 在本机的运行效率,支持多种参数配置以模拟不同负载情况 |
客户端命令行工具 | redis-cli | redis-cli -h <redis服务器地址> -p <redis端口> -a <redis密码> | Redis 客户端命令行工具,用于连接 Redis 服务器并执行命令 |
Redis String 类型操作(计数器相关)
命令 | 描述 | 参数 | 示例 |
---|---|---|---|
set | 设置键的值 | 键, 值 | set counter 0 |
get | 获取键的值 | 键 | get counter |
mset | 同时设置多个键的值 | 键1, 值1, 键2, 值2, … | mset key1 value1 key2 value2 |
mget | 同时获取多个键的值 | 键1, 键2, … | mget key1 key2 |
setex | 创建键并设置过期时间 | 键, 秒, 值 | setex counter 60 1 |
strlen | 统计键值的字符长度 | 键 | strlen counter |
incr | 数值递增+1 | 键 | incr counter |
decr | 数值递减-1 | 键 | decr counter |
incrby | 数值递增+N | 键, N(增量值) | incrby counter 5 |
decrby | 数值递减-N | 键, N(减量值) | decrby counter 3 |
Redis list类型操作(消息队列相关)
命令 | 描述 | 参数 | 示例 |
---|---|---|---|
lpush | 从左边开始插入元素 | 键, 值1, 值2, 值3, … | lpush queue value1 value2 value3 |
rpush | 从右边开始插入元素 | 键, 值1, 值2, 值3, … | rpush queue value1 value2 value3 |
lrange | 查询指定范围的元素 | 键, 起始下标, 结束下标(起始位置0表示第一个元素,-1表示最后一个元素) | lrange queue 0 -1 |
lpop | 显示并删除从左边开始的N个元素 | 键, N(可选,默认为1) | lpop queue 1 |
rpop | 显示并删除从右边开始的N个元素 | 键, N(可选,默认为1) | rpop queue 1 |
llen | 统计元素的数量 | 键 | llen queue |
lindex | 查看指定位置的元素值 | 键, 元素下标(从左往右,从0开始) | lindex queue 0 |
lset | 修改指定位置的元素值 | 键, 元素下标, 新值 | lset queue 0 newValue |
lrem | 从左边开始删除N个指定元素 | 键, N, 元素值 | lrem queue 2 value1 |
linsert | 在指定元素前或后插入一个新元素 | 键, before | after, 指定元素, 新元素 |
Redis Hash 类型操作(存储对象,购物车相关)
命令 | 描述 | 参数 | 示例 |
---|---|---|---|
hset | 设置hash字段的值 | 键, 字段, 值 | hset user:1000 name "John Doe" |
hmset | 同时设置hash的多个字段的值(Redis 4.0.0后已废弃,建议使用hset替代) | 键, 字段1, 值1, 字段2, 值2, … | hmset user:1000 name "John Doe" age 30 email "john.doe@example.com" |
hget | 获取hash字段的值 | 键, 字段 | hget user:1000 name |
hkeys | 查看hash的所有字段名 | 键 | hkeys user:1000 |
hvals | 查看hash的所有字段的值 | 键 | hvals user:1000 |
hdel | 删除hash的字段 | 键, 字段 | hdel user:1000 email |
在Redis 4.0.0及以后的版本中,hmset
命令已被弃用,建议使用 hset
命令的批量设置形式(即一次性设置多个字段和值,但每个字段和值对作为一个参数传入)来替代。
Redis Set 类型操作(随机抽奖,求交集、差集、并集相关)
命令 | 描述 | 参数 | 示例 |
---|---|---|---|
sadd | 向集合添加元素(值不能重复) | 键, 值1, 值2, … | sadd lottery 1 2 3 4 5 |
smembers | 查看所有元素(无序) | 键 | smembers lottery |
srem | 移除集合中指定元素 | 键, 值1, 值2, … | srem lottery 3 |
srandmember | 随机显示N个元素 | 键, N(可选,默认为1) | srandmember lottery 3 |
spop | 随机显示N个元素并删除 | 键, N(可选,默认为1) | spop lottery 3 |
scard | 统计元素数量 | 键 | scard lottery |
smove | 将元素从一个集合移动到另一个集合 | 源键, 目标键, 值 | smove lottery winners 4 |
sinter | 求两个集合的交集 | 键1, 键2, … | sinter lottery winners |
sdiff | 求两个集合的差集 | 键1, 键2, …(键1与后面所有键的差集) | sdiff lottery winners |
sunion | 求两个集合的并集 | 键1, 键2, … | sunion lottery winners |
Redis Zset 类型操作(排行榜,热搜相关)
命令 | 描述 | 参数 | 示例 |
---|---|---|---|
zadd | 添加元素(权重可重复,值不能重复) | 键, 权重1 值1, 权重2 值2, … | zadd scores 100 user1 200 user2 |
zrange | 根据元素下标查看元素(可带分数) | 键, 起始下标, 结束下标, withscores(可选) | zrange scores 0 -1 withscores |
zrangebyscore | 根据分数查看元素(从小到大) | 键, 起始权重, 终止权重, [WITHSCORES] [LIMIT offset count] | zrangebyscore scores 100 200 |
zrevrange | 降序查看元素(可带分数) | 键, 起始下标, 结束下标, withscores(可选) | zrevrange scores 0 -1 withscores |
zrevrangebyscore | 根据分数降序查看元素 | 键, 起始权重, 终止权重, [WITHSCORES] [LIMIT offset count] | zrevrangebyscore scores 200 100 |
zcard | 统计元素数量 | 键 | zcard scores |
zcount | 统计指定分数范围的元素数量 | 键, 起始权重, 终止权重 | zcount scores 150 250 |
zrem | 删除指定元素 | 键, 值1, 值2, … | zrem scores user1 |
zincrby | 在指定分数位置添加元素 | 键, 增量, 值 | zincrby scores 50 user1 |
zrange
和zrevrange
命令中的withscores
选项是可选的,用于指定是否返回成员的分数。zrangebyscore
和zrevrangebyscore
命令可以附加LIMIT offset count
选项来限制返回的成员数量,类似于SQL中的分页查询。zincrby
命令用于增加有序集合中指定成员的分数,而不是在指定分数位置添加元素;如果成员不存在,则将其添加到有序集合中并设置其分数为增量值。
Redis 常用命令
命令 | 描述 | 参数 | 示例 |
---|---|---|---|
del | 删除一个或多个键 | 键, 键, … | del mykey |
type | 查询键的数据类型 | 键 | type mykey |
keys | 查询符合模式的键,支持通配符 * 和 ? | 键模式(如 *mykey* ) | keys mykey* |
exists | 判断键是否存在 | 键 | exists mykey |
expire | 为键设置过期时间(秒) | 键, 秒数 | expire mykey 60 |
ttl | 查询键的剩余过期时间(秒),-2表示已过期,-1表示永不过期 | 键 | ttl mykey |
rename | 重命名键,若新键已存在则覆盖 | 键, 新键 | rename mykey newkey |
renamenx | 重命名键,若新键已存在则不操作 | 键, 新键 | renamenx mykey newkey |
dbsize | 统计当前数据库中键的总数 | 无 | dbsize |
select | 切换到指定的数据库 | 库ID(0-15) | select 1 |
move | 将键移动到指定的数据库 | 键, 库ID(0-15) | move mykey 1 |
flushdb | 清空当前数据库中的所有键(慎用) | 无 | flushdb |
flushall | 清空所有数据库中的所有键(慎用) | 无 | flushall |
修改redis密码
config set requirepass '密码'
查询redis密码
config get requirepass
问答
Redis为什么那么快?
- redis是基于内存运行,数据的读写都是在内存中完成的
- 数据结构简单,直接使用 键值对 的方式存储数据
- 数据读写采用单线程模式,避免了多线程切换带来的CPU性能损耗,同时也不用考虑各种锁的影响
- 采用IO多路复用模型,异步非阻塞IO可以使网络线程处理更多的网络连接请求,提高了网络并发能力