【Redis | 第二篇】Jedis&SpringDataRedis

目录

一、Jedis

[1.1 什么是Jedis?](#1.1 什么是Jedis?)

[1.2 Jedis的使用](#1.2 Jedis的使用)

二、SpringDataRedis

[2.1 SpringDataRedis介绍](#2.1 SpringDataRedis介绍)

[2.2 StringRedisTemplate](#2.2 StringRedisTemplate)


一、Jedis

1.1 什么是Jedis?

Jedis 是一款老牌且极其广受欢迎的 Redis 的 Java 客户端。它最大的特点就是API 设计非常直白,几乎与原生的 Redis 命令一一对应。这种设计让熟悉 Redis 命令的开发者能够零成本上手。

Jedis官网:https://github.com/redis/jedis

1.2 Jedis的使用

步骤如下:

1.引入依赖(Maven)

首先需要在项目中引入 Jedis 的依赖,参考如下表格,根据对应的Java版本选择合适的Jedis版本:

XML 复制代码
<dependency>
    <groupId>redis.clients</groupId>
    <artifactId>jedis</artifactId>
    <version>4.3.1</version> 
</dependency>

2.基础连接:最简单的连接方式是直接实例化 Jedis 对象,但这每次都会创建和销毁 TCP 连接,性能极差。不推荐在生产环境中使用。

java 复制代码
// 1. 创建 Jedis 对象,连接本地的 6379 端口
Jedis jedis = new Jedis("127.0.0.1", 6379);

// 2. 如果 Redis 设置了密码,需要进行认证
// jedis.auth("your_password");

// 3. 测试连通性
System.out.println(jedis.ping()); // 输出 PONG

// 4. 关闭连接
jedis.close();

3.JedisPool连接,Jedis本身是线程不安全的,并且频繁的创建和销毁连接会有性能损耗,因此我们推荐大家使用Jedis连接池代替Jedis的直连方式。

java 复制代码
import redis.clients.jedis.Jedis;
import redis.clients.jedis.JedisPool;
import redis.clients.jedis.JedisPoolConfig;


public class JedisConnectionFactory {
    private static final JedisPool jedisPool;
    static {
        //配置连接池
        JedisPoolConfig jedisPoolConfig = new JedisPoolConfig();
        jedisPoolConfig.setMaxTotal(8);
        jedisPoolConfig.setMaxIdle(8);
        jedisPoolConfig.setMinIdle(0);
        jedisPoolConfig.setMaxWaitMillis(1000);
        //创建连接池
        jedisPool = new JedisPool(jedisPoolConfig, "192.168.214.128",
                6379, 1000, "123321", 0);
    }

    public static Jedis getJedis() {
        return jedisPool.getResource();
    }
}

二、SpringDataRedis

2.1 SpringDataRedis介绍

SpringDataRedis中提供了RedisTemplate工具类,其中封装了各种对Redis的操作。并且将不同数据类型的操作API封装到了不同的类型中:

使用步骤:

1.引入依赖

XML 复制代码
<!-- Spring Data Redis -->
<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-data-redis</artifactId>
</dependency>
<!-- Lettuce 连接池  -->
<dependency>
    <groupId>org.apache.commons</groupId>
    <artifactId>commons-pool2</artifactId>
</dependency>

2.配置文件

XML 复制代码
spring:
  data:
    redis:
      host: 127.0.0.1
      port: 6379
      password: yourpassword # 没有则留空
      database: 0
      lettuce:
        pool:
          max-active: 8      # 连接池最大连接数
          max-idle: 8        # 连接池中的最大空闲连接
          min-idle: 0        # 连接池中的最小空闲连接

3.测试,执行完毕上述操作后,RedisTemplate就可以使用@Autowired注解自动注入到IOC容器当中。

java 复制代码
@SpringBootTest
class SpringdataredisDemoApplicationTests {

    @Autowired
    private RedisTemplate redisTemplate;
    @Test
    void testString() {
        redisTemplate.opsForValue().set("name","张三");
        Object name = redisTemplate.opsForValue().get("name");
        System.out.println("name = " + name);
    }
}

输出结果:

RedisTemplate可以接收任意Object作为值写入Redis,但是默认的 JDK 序列化会导致 Redis 中的 Key 变成类似 \xac\xed\x00\x05t\x00\x04user 的乱码。

因此我们可以自定义序列化方法:

java 复制代码
@Configuration
public class RedisConfig {

    @Bean
    public RedisTemplate<String, Object> redisTemplate(RedisConnectionFactory redisConnectionFactory) {
        RedisTemplate<String, Object> redisTemplate = new RedisTemplate<>();

        redisTemplate.setConnectionFactory(redisConnectionFactory);

        redisTemplate.setKeySerializer(RedisSerializer.string());
        redisTemplate.setHashKeySerializer(RedisSerializer.string());
        redisTemplate.setValueSerializer(RedisSerializer.json());
        redisTemplate.setHashValueSerializer(RedisSerializer.json());

        return redisTemplate;
    }
}

此时再进行存入操作:

java 复制代码
@SpringBootTest
class SpringdataredisDemoApplicationTests {

    @Autowired
    private RedisTemplate<String, Object> redisTemplate;
    @Test
    void testString() {
        redisTemplate.opsForValue().set("name","张三");
        Object name = redisTemplate.opsForValue().get("name");
        System.out.println("name = " + name);
    }

    @Test
    void testObject() {
        redisTemplate.opsForValue().set("user:100",new User("李四",21));
        User user = (User) redisTemplate.opsForValue().get("user:100");
        System.out.println("user = " + user);
    }
}

存入的数据展示:

2.2 StringRedisTemplate

为了在反序列化时知道对象的类型,JSON序列化器会将类的class类型写入json结果中,存入Redis,会带来额外的内存开销。

我们可以通过手动序列化和手动反序列化来实现写入对象和读取字符串转对象。Spring提供了StringRedisTemplate它要求key和value都是String类型。

java 复制代码
    @Autowired
    private StringRedisTemplate stringRedisTemplate;
    //Json工具
    private static final ObjectMapper mapper = new ObjectMapper();
    @Test
    void testStringTemplate(){
        User user = new User("王五",22);
        //转为json
        String json = mapper.writeValueAsString(user);
        //存储到redis
        stringRedisTemplate.opsForValue().set("user:100",json);
        //获取
        String val = stringRedisTemplate.opsForValue().get("user:100");
        //转为User对象
        User user1 = mapper.readValue(val, User.class);
        System.out.println("user1 = " + user1);
    }

存入的展示:

相关推荐
郝学胜-神的一滴1 小时前
系统设计 012:从用户系统出发,吃透缓存、数据库与高并发设计
java·数据库·python·缓存·php·软件构建
米高梅狮子1 小时前
01.ELK企业日志分析系统
运维·服务器·网络·数据库·elk·oracle
小杍随笔1 小时前
【redb vs SQLite (rusqlite) 技术选型对比】
数据库·sqlite
暗夜猎手-大魔王1 小时前
转载--AI Agent 架构设计:工具返回值设计(OpenClaw、Claude Code、Hermes Agent 对比)
数据库
windawdaysss1 小时前
离线学习SQL和数据库的工具及其部署
数据库·sql·学习
Rubin智造社1 小时前
Claude Code开发者大会系列8:从脚本到智能体——独立开发者的“AI原生”工作流转型
数据库·人工智能·独立开发者·agentic工作流·ai原生开发·实操指南
一条泥憨鱼1 小时前
深入理解 MySQL 索引:原理、分类与优化实战
数据库·mysql
楠枬1 小时前
Redis 缓存
数据库·redis·缓存
一条泥憨鱼1 小时前
详解MySQL事务(超详细版)
java·数据库·mysql·spring·maven·后端开发