Redis
一、Redis 简介
Redis(Remote Dictionary Server)是一个使用C语言开发的开源的、基于内存的数据结构存储系统 ,它可以用作数据库、缓存和消息中间件。Redis 支持多种数据结构,如字符串(Strings)、哈希(Hashes)、列表(Lists)、集合(Sets)、有序集(Sorted Sets)等,并提供了丰富的操作命令来高效地管理这些数据结构。
二、发展历史
- 2009年:由意大利开发者 Salvatore Sanfilippo 创建,最初是为了改善他的创业项目 LLOOGG 的性能问题。
- 2010年:Redis 开始在 GitHub 上托管,迅速获得了社区的关注和支持。
- 2013年:Redis Labs 成立,专注于提供 Redis 的商业支持和服务。
- 至今:Redis 已经成为最受欢迎的 NoSQL 数据库之一,广泛应用于各种场景中,包括会话存储、计数器、排行榜、实时分析等。
三、编程语言支持
Redis 自带了一个命令行界面(CLI),但是更常见的是通过编程语言的客户端库来与 Redis 进行交互。几乎所有主流编程语言都有对应的 Redis 客户端库,以下是一些例子:
- Java: Jedis, Lettuce,Redisson,Spring Data Redis
- Python: redis-py
- JavaScript/Node.js: ioredis, node-redis
- Ruby: redis-rb
- PHP: predis, phpredis (扩展)
- C#/.NET: StackExchange.Redis
- Go: go-redis, redigo
四、使用场景
-
缓存:提高数据读取速度,减轻数据库负担。
-
会话存储:由于其高性能,非常适合用于存储用户会话信息。
-
队列:利用列表(Lists)实现任务队列。
-
发布/订阅模式:适用于构建实时应用的消息系统。
-
计数器和统计数据:快速增加或减少数值,适合用于计数器、统计等场景。
五、redis优势
1. 性能高效
Redis 是基于内存的数据存储系统,这意味着它的读写速度非常快,通常比基于磁盘的数据库要快得多。这对于需要快速响应的应用程序(如实时分析、游戏服务器等)尤为重要。
2. 支持多种数据结构
Redis 支持字符串(Strings)、哈希(Hashes)、列表(Lists)、集合(Sets)、有序集(Sorted Sets)等多种数据结构,并针对每种数据结构提供了丰富的操作命令。这使得 Redis 可以灵活地适应不同的应用场景,比如:
- 利用哈希存储对象信息。
- 使用列表实现队列或栈的功能。
- 借助有序集轻松实现排行榜功能。
3. 持久化能力
虽然 Redis 主要作为内存数据库运行,但它也提供了两种方式将数据持久化到硬盘上:RDB 快照和 AOF 日志。这样即使发生断电或其他故障,数据也不会完全丢失。
4. 发布/订阅模式
Redis 支持发布/订阅消息模式,可以用于构建即时通讯应用、事件广播系统等,实现实时的消息传递。
5. 高可用性和扩展性
通过 Redis Sentinel 和 Redis Cluster,可以分别实现主从复制、自动故障转移以及分布式部署,确保系统的高可用性和可扩展性。
6. 缓存解决方案
由于其出色的读写性能,Redis 经常被用作缓存层,减少对后端数据库的压力,提高整个系统的响应速度。
7. 事务支持
Redis 提供了简单的事务功能,允许一组命令作为原子操作执行,即这些命令要么全部执行成功,要么都不执行,这对于保证数据一致性非常重要。
8. Lua 脚本支持
Redis 允许用户编写 Lua 脚本来扩展其功能,提供了一种简单的方式来实现复杂操作的原子执行。
六、redis安装
在Linux系统中,安装Redis有几种常见的方式:
6.1 Docker 安装方式
6.1.1 前置条件
# 确保已安装 Docker
docker --version
# 如果没有安装,可以使用以下命令(Ubuntu系统)
sudo apt update
sudo apt install docker.io
6.1.2.安装步骤
# 拉取官方Redis镜像
docker pull redis:latest
# 创建持久化目录
mkdir -p /data/redis/data
mkdir -p /data/redis/conf
# 创建redis.conf配置文件
cat > /data/redis/conf/redis.conf << EOF
bind 0.0.0.0
protected-mode yes
port 6379
tcp-backlog 511
requirepass your_password
timeout 0
tcp-keepalive 300
daemonize no
supervised no
pidfile /var/run/redis_6379.pid
loglevel notice
logfile ""
databases 16
always-show-logo yes
save 900 1
save 300 10
save 60 10000
stop-writes-on-bgsave-error yes
rdbcompression yes
rdbchecksum yes
dbfilename dump.rdb
dir ./
replica-serve-stale-data yes
replica-read-only yes
repl-diskless-sync no
repl-diskless-sync-delay 5
repl-disable-tcp-nodelay no
replica-priority 100
maxmemory 1gb
maxmemory-policy allkeys-lru
EOF
# 启动Redis容器
docker run -d \
--name redis \
-p 6379:6379 \
-v /data/redis/data:/data \
-v /data/redis/conf/redis.conf:/etc/redis/redis.conf \
--restart always \
redis:latest redis-server /etc/redis/redis.conf
6.1.3. 验证安装
# 进入容器
docker exec -it redis bash
# 连接Redis
redis-cli
AUTH your_password
ping
6.2 源码编译安装
6.2.1 前置条件
# Ubuntu/Debian
sudo apt update
sudo apt install build-essential tcl pkg-config -y
# CentOS/RHEL
sudo yum groupinstall "Development Tools"
sudo yum install tcl
6.2.2 安装步骤
# 下载源码
wget https://download.redis.io/redis-stable.tar.gz
tar xzf redis-stable.tar.gz
cd redis-stable
# 编译安装
make
sudo make install
# 创建必要目录
sudo mkdir -p /etc/redis
sudo mkdir -p /var/redis
sudo mkdir -p /var/log/redis
# 复制配置文件
sudo cp redis.conf /etc/redis/redis.conf
# 修改配置文件
sudo sed -i 's/daemonize no/daemonize yes/g' /etc/redis/redis.conf
sudo sed -i 's/bind 127.0.0.1/bind 0.0.0.0/g' /etc/redis/redis.conf
sudo sed -i 's/# requirepass foobared/requirepass your_password/g' /etc/redis/redis.conf
sudo sed -i 's/dir \.\//dir \/var\/redis\//g' /etc/redis/redis.conf
# 创建系统服务
cat > /etc/systemd/system/redis.service << EOF
[Unit]
Description=Redis In-Memory Data Store
After=network.target
[Service]
Type=forking
ExecStart=/usr/local/bin/redis-server /etc/redis/redis.conf
ExecStop=/usr/local/bin/redis-cli shutdown
Restart=always
[Install]
WantedBy=multi-user.target
EOF
# 启动Redis
sudo systemctl daemon-reload
sudo systemctl start redis
sudo systemctl enable redis
6.2.3 验证安装
redis-cli
AUTH your_password
ping
6.3 包管理器安装
6.3.1 Ubuntu/Debian
# 安装
sudo apt update
sudo apt install redis-server
# 修改配置
sudo vim /etc/redis/redis.conf
# 修改以下内容:
# bind 0.0.0.0
# requirepass your_password
# 重启服务
sudo systemctl restart redis-server
sudo systemctl enable redis-server
6.3.2 CentOS/RHEL
# 安装EPEL仓库
sudo yum install epel-release
# 安装Redis
sudo yum install redis
# 修改配置
sudo vim /etc/redis.conf
# 修改以下内容:
# bind 0.0.0.0
# requirepass your_password
# 启动服务
sudo systemctl start redis
sudo systemctl enable redis
6.4 基本使用指南
6.4.1 连接Redis
# 本地连接
redis-cli
AUTH your_password
# 远程连接
redis-cli -h host -p port -a your_password
6.4.2 基本操作命令
# 测试连接
ping
# 设置键值
set key value
# 获取值
get key
# 删除键
del key
# 查看所有键
keys *
# 查看键类型
type key
6.4.3 监控命令
# 查看信息
info
# 监控命令
monitor
# 查看客户端
client list
6.5 安全建议
6.5.1 网络安全
# 配置文件中设置
bind 具体IP
protected-mode yes
6.5.2 访问控制
# 设置强密码
requirepass complex_password
6.5.3 资源限制
# 配置最大内存
maxmemory 1gb
maxmemory-policy allkeys-lru
6.6.常见问题处理
6.6.1 连接被拒绝
- 检查防火墙设置
- 验证bind配置
- 确认端口是否正确
6.6.2 内存问题
# 查看内存使用
info memory
# 清理过期键
redis-cli --scan --pattern '*' | xargs redis-cli del
6.6.3 性能问题
# 查看慢查询日志
slowlog get 10
# 配置慢查询阈值
config set slowlog-log-slower-than 10000
七、springboot项目中使用redis
在Spring Boot项目中使用Redis可以通过 Redisson、Jedis, Lettuce,Spring Data Redis 等来实现,以下是一个使用Redisson来实现的例子。
7.1 添加依赖
首先,在你的pom.xml
文件中添加Redisson的依赖:
<dependency>
<groupId>org.redisson</groupId>
<artifactId>redisson-spring-boot-starter</artifactId>
<version>3.17.6</version> <!-- 确保使用最新版本 -->
</dependency>
注意:确保选择与你的Spring Boot版本兼容的Redisson版本。
7.2 配置Redis连接
你可以在application.yml
或application.properties
中配置Redisson连接信息。例如:
application.yml:
spring:
redis:
host: localhost
port: 6379
password: yourpassword # 如果有密码的话
database: 0 # 默认数据库编号
或者,如果你需要更详细的配置,可以创建一个配置类来初始化RedissonClient
。
7.3 使用RedissonClient
接下来,你可以在服务层或其他地方注入并使用RedissonClient
来进行各种操作。下面是一些基本的操作示例:
import org.redisson.api.RBucket;
import org.redisson.api.RList;
import org.redisson.api.RMap;
import org.redisson.api.RedissonClient;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
@Service
public class RedissonService {
private final RedissonClient redissonClient;
@Autowired
public RedissonService(RedissonClient redissonClient) {
this.redissonClient = redissonClient;
}
// 操作字符串
public void stringOperations(String key, String value) {
RBucket<String> bucket = redissonClient.getBucket(key);
bucket.set(value);
System.out.println("Stored value: " + bucket.get());
}
// 操作哈希表
public void hashOperations(String mapKey) {
RMap<String, String> map = redissonClient.getMap(mapKey);
map.put("key1", "value1");
System.out.println("Retrieved value: " + map.get("key1"));
}
// 操作列表
public void listOperations(String listKey) {
RList<String> list = redissonClient.getList(listKey);
list.add("item1");
System.out.println("First item: " + list.get(0));
}
}
7.4 关闭RedissonClient
当你不再需要使用RedissonClient时,应该关闭它以释放资源。通常情况下,Spring Boot会自动管理这个过程,但如果你想手动关闭,可以这样做:
@Autowired
private RedissonClient redissonClient;
@PreDestroy
public void onDestroy() throws Exception {
redissonClient.shutdown();
}
以上就是在Spring Boot项目中使用Redisson的基本步骤。Redisson提供了丰富的API,支持多种数据结构(如Set、SortedSet、HyperLogLog等)以及分布式锁、信号量等高级特性。
7.5 不同客户端的区别(拓展)
下面是一个表格,对比了几种常见的Redis Java客户端的主要特点和区别:
特性/客户端 | Jedis | Lettuce | Redisson | Spring Data Redis (RedisTemplate) |
---|---|---|---|---|
底层实现 | 直接使用Java连接到Redis服务器 | 基于Netty的异步I/O | 基于Netty,支持同步、异步和响应式编程模型 | 抽象层,支持Jedis和Lettuce作为底层实现 |
线程安全 | 需要手动管理连接池以确保线程安全 | 天生线程安全,基于Netty的事件驱动架构 | 线程安全,内部管理连接 | 通过配置可达到线程安全 |
性能 | 高性能,但在高并发下可能需要额外优化 | 高性能,特别适合高并发场景 | 高性能,并提供丰富的分布式功能 | 性能依赖于底层客户端的选择(Jedis或Lettuce) |
连接池支持 | 支持Apache Commons Pool2 | 内置连接池支持 | 自带连接管理机制 | 通过底层客户端实现连接池支持 |
支持的数据结构 | 标准的Redis数据类型 | 标准的Redis数据类型 | 标准的Redis数据类型 + 分布式对象容器、锁等高级特性 | 标准的Redis数据类型,通过不同的序列化器支持复杂对象 |
高级特性 | 较少 | 支持Redis Sentinel, Redis Cluster | 支持分布式锁、分布式集合、分布式队列等 | 提供高层次抽象,易于与Spring框架集成 |
易用性 | API简单直接,容易上手 | 异步API可能对新手不太友好 | 功能强大,但API相对复杂 | 与Spring生态系统无缝集成,易于在Spring应用中使用 |
社区支持 | 活跃的社区支持 | 活跃的社区支持,特别是对于Spring项目的支持 | 活跃的社区支持,专注于分布式系统 | 作为Spring Data的一部分,有强大的社区和官方支持 |
每个客户端都有其独特的优势,选择哪个取决于你的具体需求,例如是否需要分布式锁、是否希望与Spring框架深度集成、是否面临高并发场景等。根据项目的特定要求来选择最适合的客户端是关键。
八、常用非关系型数据库(NoSQL)对比
以下是Redis、MongoDB和Neo4j的相同点、不同点以及它们各自适合场景的比较表格
特性/数据库 | Redis | MongoDB | Neo4j |
---|---|---|---|
数据模型 | 键值对,支持多种数据结构(如字符串、哈希、列表等) | 文档型,使用BSON格式存储数据 | 图形数据库,节点和关系构成的数据模型 |
存储类型 | 内存存储为主,持久化为辅 | 磁盘存储 | 磁盘存储 |
查询语言 | 自定义命令集 | 使用类似JSON的查询语言 | Cypher,图形查询语言 |
事务支持 | 基本操作是原子性的,部分版本支持多键事务 | 支持文档级别的ACID事务 | 支持ACID事务,特别是在图操作中 |
扩展方式 | 主从复制、哨兵模式、集群 | 分片、副本集 | Causal Clustering, 高可用性部署 |
适用场景 | 缓存、会话存储、实时分析、队列等 | 内容管理系统(CMS)、大数据分析、物联网(IoT) | 社交网络、推荐系统、路径查找算法、知识图谱 |
总结
Redis 是一个功能强大且灵活的工具,它不仅能够作为高性能的键值对存储解决方案,还可以通过其支持的各种数据结构解决复杂的业务需求。学习 Redis 可以帮助你更好地理解和处理高并发、低延迟的应用场景,同时也能让你的应用更加高效和稳定。