Redis是一种开源的、基于内存的非关系型数据库管理系统(DBMS),全称为Remote Dictionary Server(远程字典服务)。以下是关于Redis的一些详细说明:
数据存储方式: Redis将数据存储在内存中,这使得它具有快速的读写速度。它支持多种数据结构,包括字符串、哈希表、列表、集合、有序集合等。
高性能: Redis以高性能著称,每秒能够处理超过10万次的读写操作。这使得它成为缓存、消息中间件等场景的理想选择。
持久化: Redis支持数据的持久化,可以将数据保存到磁盘上,以便在重启后仍然保持数据。
多语言支持: Redis提供了多种语言的API,使得开发者可以使用自己熟悉的编程语言与Redis进行交互。
支持事务: Redis支持事务,开发者可以将一系列命令作为一个事务来执行,保证这些命令的原子性。
分布式锁: 由于其快速的读写速度和支持事务的特性,Redis经常被用来实现分布式锁,用于在分布式系统中确保资源的互斥访问。
LUA脚本: Redis支持使用LUA脚本进行扩展,这使得开发者可以在Redis中执行自定义的操作。
LRU驱动事件: Redis使用LRU(Least Recently Used)算法来管理内存,保证内存中存储的数据是最近被访问的。
多种集群方案: Redis提供了多种集群方案,可以实现高可用性和横向扩展。
Redis之所以能够达到如此高的性能,主要归功于以下几个关键因素:
基于内存的存储: Redis将数据存储在内存中,相比传统的磁盘存储系统,内存读写速度更快。由于内存的高速访问特性,Redis能够提供非常低延迟的数据访问。
单线程模型: Redis采用单线程模型,即每个Redis实例都在单个线程上运行。虽然这听起来似乎是一个性能瓶颈,但通过避免多线程带来的线程同步和锁的开销,Redis实现了简单而高效的设计。单线程模型避免了多线程之间的竞争和上下文切换的开销,有助于提高整体性能。
非阻塞的I/O操作: Redis使用非阻塞的I/O操作,通过使用异步I/O和事件驱动机制,充分利用了操作系统提供的异步特性,降低了I/O操作的开销,提高了并发处理能力。
优化的数据结构: Redis提供了多种灵活的数据结构,如字符串、哈希表、列表等,这些数据结构的实现经过了优化,能够在常见的操作上达到极高的性能。
数据分片和集群: Redis支持数据分片和集群模式,允许将数据分布在多个节点上,实现水平扩展。这使得Redis能够处理更大量级的数据和更高的并发请求。
持久化策略: Redis支持多种持久化策略,包括快照(snapshot)和追加式文件(append-only file)。这些策略允许在需要时将数据写入磁盘,以保障数据的持久性,同时通过合理配置可以平衡性能和数据安全性。
精简的功能集: Redis专注于提供高效的键值存储和相关操作,避免了其他一些复杂的关系型数据库所需的功能。这种专注使得Redis能够更好地优化核心功能,提高性能。
总体来说,Redis之所以如此快速,是因为它在设计和实现上注重了简单、高效、专注的原则,并充分利用了内存、单线程、异步I/O等特性。这些因素使得Redis成为一个高性能的缓存、数据存储和消息中间件系统。
Redis支持多种数据结构,包括但不限于:
字符串(Strings): 存储文本或二进制数据。
哈希表(Hashes): 用于存储键值对的集合。
列表(Lists): 有序的字符串元素集合。
集合(Sets): 无序且不重复的字符串元素集合。
有序集合(Sorted Sets): 有序的集合,每个元素关联一个分数,通过分数排序。
缓存: 作为缓存数据库,提高访问速度。
消息中间件: 用作消息队列,实现异步通信。
计数器: 适用于统计、计数操作。
实时分析: 存储实时数据,支持实时分析和查询。
会话存储: 用于存储用户会话信息,如登录状态。
分布式锁: 通过Redis的事务特性实现分布式锁。
#关闭安全机制和防火墙
systemctl stop firewalld
setenforce 0
#下载依赖
yum install -y gcc gcc-c++ make
#解压安装
tar zxvf redis-5.0.7.tar.gz -C /opt/
cd /opt/redis-5.0.7/
make
make PREFIX=/usr/local/redis install
##由于Redis源码包中直接提供了 Makefile 文件,所以在解压完软件包后,不用先执行 ./configure 进行配置,可直接执行 make 与 make install 命令进行安装。
#执行软件包提供的 install_server.sh 脚本文件设置 Redis 服务所需要的相关配置文件
cd /opt/redis-5.0.7/utils
./install_server.sh
#这里一直回车直到遇到下面这行配置
Please select the redis executable path [/usr/local/bin/redis-server] /usr/local/redis/bin/redis-server
#要一次性完整正确的修改为:/usr/local/redis/bin/redis-server
执行 ./install_server.sh
通常会触发 Redis 安装脚本,该脚本用于将 Redis 进程服务化,使其能够以服务的形式在系统中运行。这个脚本通常包含了一系列配置步骤,以确保 Redis 在系统启动时能够自动启动,并提供一些管理功能,比如启动、停止、重启等。
具体来说,执行 ./install_server.sh
可能会执行以下操作:
询问安装路径: 脚本可能会询问你希望将 Redis 安装到哪个路径。你需要输入一个有效的路径,并确保有足够的权限在该路径下进行安装。
设置配置文件: 脚本可能会创建或修改 Redis 的配置文件,通常是 redis.conf
。这个配置文件包含了 Redis 的各种参数设置,如端口号、数据存储路径等。
创建启动脚本: 脚本可能会在 /etc/init.d/
目录下创建一个启动脚本,以便通过系统服务管理工具进行 Redis 的启动、停止和重启操作。
设置开机启动: 脚本可能会配置系统,使得 Redis 在系统启动时自动启动。
生成相关文件: 脚本可能会生成一些必要的文件,如 PID 文件(记录 Redis 进程的进程号)等。
Selected config: Port : 6379 #默认侦听端口为6379
Config file : /etc/redis/6379.conf #配置文件路径
Log file : /var/log/redis_6379.log #日志文件路径
Data dir : /var/lib/redis/6379 #数据文件路径
Executable : /usr/local/redis/bin/redis-server #可执行文件路径
Cli Executable : /usr/local/bin/redis-cli #客户端命令工具
#把redis的可执行程序文件放入路径环境变量的目录中便于系统识别
ln -s /usr/local/redis/bin/* /usr/local/bin/
#当 install_server.sh 脚本运行完毕,Redis 服务就已经启动,默认监听端口为 6379
netstat -natp | grep redis
#Redis 服务控制
/etc/init.d/redis_6379 stop #停止
/etc/init.d/redis_6379 start #启动
/etc/init.d/redis_6379 restart #重启
/etc/init.d/redis_6379 status #状态
#修改配置 /etc/redis/6379.conf 参数
vim /etc/redis/6379.conf
bind 127.0.0.1 192.168.41.11 #70行,添加 监听的主机地址
port 6379 #93行,Redis默认的监听端口
daemonize yes #137行,启用守护进程
pidfile /var/run/redis_6379.pid #159行,指定 PID 文件
loglevel notice #167行,日志级别
logfile /var/log/redis_6379.log #172行,指定日志文件
#重启
/etc/init.d/redis_6379 restart
Redis 提供了丰富的命令行工具,用于管理和与 Redis 数据库进行交互。以下是一些常用的 Redis 命令行工具:
redis-server /path/to/redis.conf
。Redis 客户端命令行工具,用于与 Redis 服务器进行交互。可以执行各种 Redis 命令,例如:
redis-cli
用于进行性能测试和基准测试的工具。可以模拟多个并发客户端执行指定数量的操作,评估 Redis 服务器的性能。例如:
redis-benchmark -h host -p port -n requests -c clients
redis-check-aof /path/to/appendonly.aof
用于修复和检查 RDB(Redis DataBase) 持久化文件的工具。例如:
redis-check-rdb /path/to/dump.rdb
这些命令工具通常在安装 Redis 后自动可用。可以通过在命令行中运行这些命令来执行各种操作,如与 Redis 服务器进行交互、测试性能、检查和修复持久化文件等。
redis-cli
是 Redis 提供的命令行工具,用于与 Redis 服务器进行交互。你可以使用 redis-cli
来执行各种 Redis 命令,查询数据、修改配置以及进行其他管理操作。以下是一些基本的用法和示例:
redis-cli
如果 Redis 服务器运行在默认地址和端口(127.0.0.1:6379),可以直接运行以上命令连接到 Redis 服务器。
redis-cli -h host -p port
用于连接到指定主机和端口的 Redis 服务器。替换 host
和 port
为实际的主机和端口信息。
redis-cli -h host -p port -a password
-h :指定远程主机
-p :指定 Redis 服务的端口号
-a :指定密码,未设置数据库密码可以省略-a 选项
若不添加任何选项表示,则使用 127.0.0.1:6379 连接本机上的 Redis 数据库
以下是一些 redis-cli
的基本操作示例:
set mykey "Hello, Redis!"
get mykey
keys *
del mykey
info
eval "return 'Hello, Redis!'" 0
exit
以上只是一些简单的示例,实际上,redis-cli
支持 Redis 的所有命令。你可以在命令行中输入 help
来查看帮助信息,或者使用 --help
参数获取更详细的使用说明。例如:
redis-cli --help
这将列出 redis-cli
的各种参数和选项,帮助你更好地使用这个命令行工具。
redis-benchmark
是 Redis 提供的性能测试工具,用于模拟多个并发客户端对 Redis 服务器执行指定数量的操作,以评估 Redis 的性能和吞吐量。以下是一些常用的 redis-benchmark
命令的示例和解释:
redis-benchmark -h host -p port -t operation -n requests -c clients
-h
: 指定 Redis 服务器的主机。
-p
: 指定 Redis 服务器的端口。
-t
: 指定操作类型,例如 get
、set
等。
-n
: 指定总请求数。
-c
: 指定并发客户端数。
-s
:指定服务器 socket
-d
:以字节的形式指定 SET/GET 值的数据大小。
-k
:1=keep alive 0=reconnect
-r
:SET/GET/INCR 使用随机 key, SADD 使用随机值。
-P
:通过管道传输请求。
-q
:强制退出 redis。仅显示 query/sec 值。
--csv
:以 CSV 格式输出。
-l
:生成循环,永久执行测试。
-t
:仅运行以逗号分隔的测试命令列表。
-I
:Idle 模式。仅打开 N 个 idle 连接并等待。
示例:
redis-benchmark -h 127.0.0.1 -p 6379 -t set,get -n 100000 -c 50
redis-benchmark -h host -p port -t operation -n requests -c clients --pipeline length
--pipeline
: 启用指定长度的管道,以提高性能。
示例:
redis-benchmark -h 127.0.0.1 -p 6379 -t set,get -n 100000 -c 50 --pipeline 10
redis-benchmark -h host -p port -t operation -n requests -c clients --csv
--csv
: 以 CSV 格式输出每次请求的延迟信息。
示例:
redis-benchmark -h 127.0.0.1 -p 6379 -t set,get -n 100000 -c 50 --csv
#向 IP 地址为 192.168.10.23、端口为 6379 的 Redis 服务器发送 100 个并发连接与 100000 个请求测试性能
redis-benchmark -h 192.168.10.23 -p 6379 -c 100 -n 100000
#测试存取大小为 100 字节的数据包的性能
redis-benchmark -h 192.168.10.161 -p 6379 -q -d 100
#测试本机上 Redis 服务在进行 set 与 lpush 操作时的性能
redis-benchmark -t set,lpush -n 100000 -q
总请求数 (-n
): 指定要执行的总请求数,用于测试 Redis 服务器在一定负载下的性能。
并发客户端数 (-c
): 指定并发运行的客户端数,表示同时有多少个客户端连接到 Redis 服务器。
管道长度 (--pipeline
): 启用管道技术,将多个请求打包发送给服务器,以提高性能。该参数指定管道中的请求数量。
延迟信息 (--csv
): 以 CSV 格式输出每次请求的延迟信息,包括最小、最大和平均延迟。
通过调整这些参数,你可以模拟不同负载条件下的性能测试,并了解 Redis 在各种情况下的性能表现。请确保在进行性能测试之前仔细阅读 redis-benchmark
的文档以了解更多选项和详细信息。
Redis是一种内存数据库,支持键值对存储。以下是一些基本的Redis操作语句:
SET key value
示例:
SET username john_doe
GET key
示例:
GET username
DEL key
示例:
DEL username
EXISTS key
示例:
EXISTS username
EXPIRE key seconds
示例:
EXPIRE username 3600
这会使username
键在3600秒(1小时)后过期。
TTL key
示例:
TTL username
返回值为负表示键没有设置过期时间,返回-1表示键不存在,否则返回键的剩余过期时间(以秒为单位)。
KEYS pattern
示例:
KEYS *
返回所有键的列表。请注意,生产环境中避免在大型数据库上使用KEYS *
,因为它可能会阻塞服务器。
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 开头 v 开头后面包含任意两位的数据
TYPE key
其中,key
是你要查看的键名。例如:
SET mykey "Hello"
TYPE mykey
上述命令的输出将是:
string
这表示 mykey
的值是字符串类型。以下是一些可能的返回值:
string
:字符串类型
list
:列表类型
set
:集合类型
zset
:有序集合类型
hash
:哈希表类型
none
:键不存在
RENAME oldkey newkey
其中,oldkey
是要被重命名的旧键名,newkey
是新的键名。例如:
SET mykey "Hello"
RENAME mykey newkey
这会将 mykey
重命名为 newkey
。你也可以将键重命名为现有的键名,此时原始键名会被新的键名覆盖。如果新的键名已经存在,则它会被覆盖,因为 RENAME
命令将删除已有的同名键。
请确保在执行重命名操作时小心谨慎,以避免意外删除数据或覆盖现有键。
renamenx 命令的作用是对已有 key 进行重命名,并检测新名是否存在,如果目标 key 存在则不进行重命名。(不覆盖)
命令格式:renamenx 源key 目标key
可以通过组合使用 EXISTS
和 RENAME
命令来实现类似的功能,以确保新键名不存在才进行重命名。
以下是一个示例:
# 检查新键名是否已经存在
EXISTS newkey
# 如果新键名不存在,则执行重命名操作
RENAME oldkey newkey
这样的操作可以在两个命令中间加上一些逻辑,确保只有在新键名不存在时才执行重命名操作。这是因为 RENAME
命令会覆盖已存在的键,可能导致数据丢失。
DBSIZE
是一个用于获取当前数据库中键的数量的命令。它返回一个整数,表示当前数据库中的键的数量。以下是 DBSIZE
命令的使用示例:
DBSIZE
这将返回一个整数,表示当前数据库中的键的数量。
示例:
SET key1 "value1"
SET key2 "value2"
DBSIZE
在这个例子中,执行 DBSIZE
命令后,如果数据库中有两个键,它将返回值为 2
。
请注意,DBSIZE
命令的时间复杂度为 O(1),因此无论数据库中有多少键,它都会在常量时间内返回结果。
配置文件
设置密码:
在 Redis 配置文件中(通常是 redis.conf
),找到并编辑以下行:
# requirepass foobared
将其中的 foobared
替换为你想要设置的密码。例如:
requirepass your_password
保存配置文件并重新启动 Redis 服务,使密码设置生效。
查看密码:
你可以通过以下方式查看 Redis 是否设置了密码:
打开 Redis 配置文件,查找 requirepass
配置项,查看其后的密码。
连接到 Redis 服务器,并使用 CONFIG GET requirepass
命令:
CONFIG GET requirepass
如果密码已设置,它将返回密码的散列值。如果密码未设置,将返回 nil
。
使用密码连接到 Redis:
在使用客户端连接到 Redis 时,你需要提供密码:
redis-cli -h your_redis_host -p your_redis_port -a your_password
其中,your_redis_host
是 Redis 服务器的主机地址,your_redis_port
是 Redis 服务器的端口号,your_password
是你设置的密码。
命令行
使用config set requirepass yourpassword命令设置密码
127.0.0.1:6379> config set requirepass 123456
使用config get requirepass命令查看密码(一旦设置密码,必须先验证通过密码,否则所有操作不可用)
127.0.0.1:6379> auth 123456
#使用密码 123456 进行身份验证。如果密码正确,Redis 将返回 OK,表示身份验证成功。
127.0.0.1:6379> config get requirepass
#获取当前Redis 实例的密码配置。如果 Redis 设置了密码,它会返回一个包含密码散列值的数组。如果 Redis 没有设置密码,它会返回一个只包含 nil 的数组。
语法:SELECT
,其中
是数据库的编号。
示例:SELECT 1
,表示切换到数据库1。
> SELECT 1
OK
MOVE
命令用于将指定键从当前数据库移动到另一个数据库。这个命令的语法如下:
MOVE
其中:
是要移动的键名。
是要移动到的目标数据库编号。
示例:
假设有一个键名为 mykey
存储在当前数据库(默认数据库 0)中,我们要将它移动到数据库 1:
> SET mykey "Hello, Redis!"
OK
> MOVE mykey 1
(integer) 1
在上面的例子中,如果移动成功,MOVE
命令会返回整数值 1;如果键不存在或者无法移动,返回整数值 0。
需要注意的是,如果目标数据库中已经存在同名的键,则 MOVE
操作不会进行,仍然会返回 0。
请确保使用该命令时键名和数据库编号都是正确的,以避免意外的数据操作。
用于获取当前数据库的key数量。
语法:DBSIZE
。
> DBSIZE
(integer) 42
FLUSHDB
用于清空当前数据库的所有数据。
FLUSHALL
用于清空所有数据库的所有数据。
> FLUSHDB
OK
一定小心使用
> INFO
这些命令可以帮助你管理和操作不同的Redis数据库。记住,不同的数据库是相互独立的,切换数据库不会影响其他数据库的数据。