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.ymlapplication.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客户端的主要特点和区别:

特性/客户端JedisLettuceRedissonSpring 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的相同点、不同点以及它们各自适合场景的比较表格

特性/数据库RedisMongoDBNeo4j
数据模型键值对,支持多种数据结构(如字符串、哈希、列表等)文档型,使用BSON格式存储数据图形数据库,节点和关系构成的数据模型
存储类型内存存储为主,持久化为辅磁盘存储磁盘存储
查询语言自定义命令集使用类似JSON的查询语言Cypher,图形查询语言
事务支持基本操作是原子性的,部分版本支持多键事务支持文档级别的ACID事务支持ACID事务,特别是在图操作中
扩展方式主从复制、哨兵模式、集群分片、副本集Causal Clustering, 高可用性部署
适用场景缓存、会话存储、实时分析、队列等内容管理系统(CMS)、大数据分析、物联网(IoT)社交网络、推荐系统、路径查找算法、知识图谱

总结

Redis 是一个功能强大且灵活的工具,它不仅能够作为高性能的键值对存储解决方案,还可以通过其支持的各种数据结构解决复杂的业务需求。学习 Redis 可以帮助你更好地理解和处理高并发、低延迟的应用场景,同时也能让你的应用更加高效和稳定。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值