Spring Boot x Redis:零基础入门,性能飙升的实战秘籍!


前言

    Redis(Remote Dictionary Server)是一款开源的、高性能的、NoSQL 键值存储数据库。它以其速度、灵活性、数据结构丰富等特点而闻名。Redis 常用于缓存、消息队列、会话管理等场景。


一、基本特性

1.高性能

    Redis将数据存储在内存中,因此具有极高的读写速度。据相关测试,Redis的读速度可达110000次/s,写速度可达81000次/s。
    采用单线程模型,避免了多线程或多进程导致的上下文切换和锁竞争,从而提高了性能。

2.丰富的数据类型

    Redis支持多种数据结构,包括字符串(Strings)、散列(Hashes)、列表(Lists)、集合(Sets)、有序集合(Sorted Sets)、位图(Bitmaps)、HyperLogLogs和地理空间(Geospatial)索引等,可以满足不同应用场景的需求。

3.持久化

    Redis支持将数据从内存异步写入到磁盘,以保证数据的持久性。主要有两种持久化方式:RDB(Redis Database)和AOF(Append Only File)

4.引入库

    Redis支持主从复制、哨兵(Sentinel)和集群(Cluster)模式,提供了高可用性和扩展性。

5.事务

    Redis支持简单的事务机制,可以执行一系列原子操作。

二、应用场景

1.缓存

    Redis是缓存领域的佼佼者,可以显著提高应用的响应速度。例如,在Web Server和数据库之间增加一层Redis缓存,可以加快Web Server的响应速度。
    在电商领域,可以缓存热门商品的静态信息或用户数据,以应对大流量访问。

2.分布式锁

    在分布式系统中,Redis常被用作实现分布式锁的工具,以保证线程安全。

3.限流

    Redis可以用来实现限流功能,保护系统免受过载。

4.会话存储

    Redis也可以用于存储会话数据,特别是在分布式系统中,可以实现会话共享。

5.排行榜

    使用Redis的有序集合功能,可以轻松实现排行榜功能,按分数排序的元素可以快速插入和查询。

6.计数器

    通过Redis的原子性自增和自减操作,可以实现精确的计数器功能。

三、Spring Boot 集成 Redis

1.添加依赖

     首先,你需要在 Spring Boot 项目的 pom.xml 文件中添加 Redis 的起步依赖(Starter)。如果你使用的是 Maven,可以添加如下依赖:

<dependency>  
    <groupId>org.springframework.boot</groupId>  
    <artifactId>spring-boot-starter-data-redis</artifactId>  
</dependency>  
  
<!-- 如果你使用的是 Lettuce 客户端,则可能需要添加下面这个依赖(Spring Boot 2.x 及以上版本默认使用 Lettuce) -->  
<!-- <dependency>  
    <groupId>io.lettuce.core</groupId>  
    <artifactId>lettuce-core</artifactId>  
</dependency> -->  
  
<!-- 如果你需要序列化支持,例如 JSON 序列化,你可能还需要添加如下依赖 -->  
<dependency>  
    <groupId>com.fasterxml.jackson.core</groupId>  
    <artifactId>jackson-databind</artifactId>  
</dependency>

2.配置Redis

     接下来,你需要在 application.properties 或 application.yml 文件中配置 Redis 服务器的相关信息。例如:

application.yml 示例:

spring:  
  redis:  
    host: localhost  
    port: 6379  
    database: 0  
    timeout: 3000  
    # password: yourpassword  
    # Jedis 或 Lettuce 客户端的特定配置...

3.创建配置类

import com.fasterxml.jackson.annotation.JsonAutoDetect;
import com.fasterxml.jackson.annotation.PropertyAccessor;
import com.fasterxml.jackson.databind.ObjectMapper;
import com.fasterxml.jackson.databind.jsontype.impl.LaissezFaireSubTypeValidator;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.data.redis.connection.RedisConnectionFactory;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.data.redis.serializer.Jackson2JsonRedisSerializer;
import org.springframework.data.redis.serializer.RedisSerializer;
import org.springframework.data.redis.serializer.StringRedisSerializer;/**
 * Redis 配置
 *
 */
@Configuration
public class BaseRedisConfig {@Bean
    public RedisTemplate<String, Object> redisTemplate(RedisConnectionFactory redisConnectionFactory) {
        RedisSerializer<Object> serializer = redisSerializer();
        RedisTemplate<String, Object> redisTemplate = new RedisTemplate<>();
        redisTemplate.setConnectionFactory(redisConnectionFactory);
        redisTemplate.setKeySerializer(new StringRedisSerializer());
        redisTemplate.setValueSerializer(serializer);
        redisTemplate.setHashKeySerializer(new StringRedisSerializer());
        redisTemplate.setHashValueSerializer(serializer);
        redisTemplate.afterPropertiesSet();
        return redisTemplate;
    }@Bean
    public RedisSerializer<Object> redisSerializer() {
        //创建JSON序列化器
        Jackson2JsonRedisSerializer<Object> serializer = new Jackson2JsonRedisSerializer<>(Object.class);
        ObjectMapper objectMapper = new ObjectMapper();
        objectMapper.setVisibility(PropertyAccessor.ALL, JsonAutoDetect.Visibility.ANY);
        //必须设置,否则无法将JSON转化为对象,会转化成Map类型
        objectMapper.activateDefaultTyping(LaissezFaireSubTypeValidator.instance, ObjectMapper.DefaultTyping.NON_FINAL);
        serializer.setObjectMapper(objectMapper);
        return serializer;
    }
}

    接下来我们可以使用 RedisTemplate 类来操作 Redis。

4.使用 RedisTemplate 或 StringRedisTemplate

    Spring Boot 提供了 RedisTemplate 和 StringRedisTemplate 来简化 Redis 数据的操作。RedisTemplate 提供了对 Redis 的高级抽象,而 StringRedisTemplate 是对操作字符串的简化。

注入 RedisTemplate 或 StringRedisTemplate:

import org.springframework.beans.factory.annotation.Autowired;  
import org.springframework.data.redis.core.RedisTemplate;  
import org.springframework.data.redis.core.StringRedisTemplate;  
import org.springframework.stereotype.Service;  
  
@Service  
public class RedisService {  
  
    @Autowired  
    private RedisTemplate<String, Object> redisTemplate;  
  
    @Autowired  
    private StringRedisTemplate stringRedisTemplate;  
  
    // 使用 redisTemplate 或 stringRedisTemplate 进行操作  
}

四、Redis 基本操作

1.设置和获取字符串值

// 设置字符串值
String key = "name";
String value = "tianpeng";
redisTemplate.opsForValue().set(key, value);// 获取字符串值
String name = redisTemplate.opsForValue().get(key);// 输出:tianpeng
System.out.println(name);

2.设置和获取哈希值

// 设置哈希值
String key = "user";
Map<String, String> map = new HashMap<>();
map.put("id", "1");
map.put("name", "tianpeng");
map.put("age", "18");
redisTemplate.opsForHash().putAll(key, map);// 获取哈希值
Map<Object, Object> user = redisTemplate.opsForHash().entries(key);// 输出:{id=1, name=tianpeng, age=18}
System.out.println(user);

3.设置和获取列表值

// 设置列表值
String key = "list";
List<String> values = Arrays.asList("a", "b", "c");
redisTemplate.opsForList().leftPushAll(key, values);// 获取列表值
List<String> list = redisTemplate.opsForList().range(key, 0, -1);// 输出:[a, b, c]
System.out.println(list);

4.设置和获取集合值

// 设置集合值
String key = "set";
Set<String> values = new HashSet<>();
values.add("a");
values.add("b");
values.add("c");
redisTemplate.opsForSet().add(key, values.toArray(new String[0]));// 获取集合值
Set<String> set = redisTemplate.opsForSet().members(key);// 输出:[a, b, c] (无序)
System.out.println(set);

5.设置和获取有序集合值

// 设置每个成员的分数
String member1 = "c";
double score1 = 3.0;String member2 = "a";
double score2 = 1.0;String member3 = "b";
double score3 = 2.0;// 创建 SortedSet<TypedTuple<String>>
SortedSet<ZSetOperations.TypedTuple<String>> values = new TreeSet<>();
values.add(new DefaultTypedTuple<>(member1, score1));
values.add(new DefaultTypedTuple<>(member2, score2));
values.add(new DefaultTypedTuple<>(member3, score3));// 将 SortedSet<TypedTuple<String>> 添加到 zset 中
String key = "zset";
redisTemplate.opsForZSet().add(key, values);// 获取有序集合值
Set<String> set = redisTemplate.opsForZSet().range(key, 0, -1);
// 输出:[a, b, c] (按分数排序)
System.out.println(set);

五、Redis原生命令

     以上在Spring中集成Redis使用的接口,实际上最终都会被翻译成Redis命令执行相关操作,所以我们了解Redis命令也是比较重要的。

1.连接与认证

  • redis-cli:启动Redis客户端,用于连接到Redis服务器。
    redis-cli -h host -p port -a password:远程连接到Redis服务器,其中-h指定主机名,-p指定端口号,-a后跟密码用于认证。
  • AUTH password:验证密码是否正确。

2.通用命令

  • DEL key:删除指定的key。
  • EXISTS key:检查key是否存在。
  • EXPIRE key seconds:设置key的过期时间(秒)。
  • TTL key:以秒为单位返回key的剩余生存时间。
  • TYPE key:返回key所存储的值的类型。
  • KEYS pattern:查找所有符合给定模式的key。
  • RENAME key newkey:修改key的名称。
  • RENAMENX key newkey:仅当newkey不存在时,将key改名为newkey。

3.字符串命令

  • SET key value:设置指定key的值。
  • GET key:获取指定key的值。
  • SETEX key seconds value:设置key的值,并将key的过期时间设为seconds秒。
  • SETNX key value:只有在key不存在时设置key的值。
  • MSET key value [key value …]:同时设置一个或多个key-value对。
  • MGET key [key …]:获取一个或多个给定key的值。
  • INCR key:将key中储存的数字值增一。
  • DECR key:将key中储存的数字值减一。
  • INCRBY key increment:将key所储存的值加上给定
  • DECRBY key decrement:将key所储存的值减去给定的减量值。

4.哈希命令

  • HSET key field value:将哈希表key中的字段field的值设置为value。
  • HGET key field:获取存储在哈希表中的指定字段的值。
  • HMSET key field1 value1 [field2 value2 …]:同时将多个field-value(域-值)对设置到哈希表key中。
  • HMGET key field1 [field2 …]:获取所有给定字段的值。
  • HGETALL key:获取在哈希表中指定key的所有字段和值。
  • HINCRBY key field increment:为哈希表key中的指定字段的整数值加上增量increment。
  • HINCRBYFLOAT key field increment:为哈希表key中的指定字段的浮点数值加上增量increment。

5.列表命令

  • LPUSH key value1 [value2]:将一个或多个值插入到列表头部。
  • RPUSH key value1 [value2]:在列表中添加一个或多个值,从列表尾部开始插入。
  • LPOP key:移出并获取列表的第一个元素。
  • RPOP key:移除并获取列表的最后一个元素。
  • LRANGE key start stop:获取列表指定范围内的元素。
  • LINSERT key BEFORE|AFTER pivot value:在列表的元素前或者后插入元素。
  • LLEN key:获取列表长度。

6.集合命令

  • SADD key member1 [member2]:向集合添加一个或多个成员。
  • SMEMBERS key:返回集合中的所有成员。
  • SCARD key:获取集合的成员数。
  • SISMEMBER key member:判断member是否在集合中。
  • SDIFF key1 [key2]:返回给定所有集合的差集。
  • SINTER key1 [key2]:返回给定所有集合的交集。
  • SUNION key1 [key2]:返回给定所有集合的并集。

7.有序集合命令

  • ZADD key score1 member1 [score2 member2]:向有序集合添加一个或多个元素,或者更新已存在元素的分数。
  • ZRANGE key start stop [WITHSCORES]:通过索引区间返回有序集合中指定区间内的元素,可选返回分数。
  • ZINCRBY key increment member:为有序集合中的指定成员的分数加上增量increment。
  • ZREM key member [member …]:移除有序集合中的一个或多个成员。

8.其他命令

  • FLUSHDB:清空当前数据库中的所有key。

进阶篇文章:Spring Boot携手Redis缓存实战:精通注解、配置与策略,加速你的应用至极致!

“笑对人生,智慧同行!博客新文出炉,微信订阅号更新更实时,等你笑纳~”
在这里插入图片描述

  • 15
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

拥有必珍惜

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值