【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 小时前
在 CentOS 上安装 Redis Stack
linux·redis·centos
CCIE-Yasuo1 小时前
网络安全-学习数据库-Mysql-2
数据库·学习·mysql
这个DBA有点耶1 小时前
内核级AI与多模融合:AI数据库在海外场景的落地要点
数据库·人工智能·架构
涛思数据(TDengine)2 小时前
从工业本体到 AI 原生:TDengine 出席 2026 QCon 分享工业数据基础设施路径
大数据·数据库·人工智能·tdengine·工业
Jesse_EC2 小时前
换乘次数最少的路径 SQL 查询详解与实战经验——从 WITH RECURSIVE 到 pgRouting
数据库·postgresql
工控丫丫2 小时前
帆软看板中经常使用的公式函数及经常搭的组合
前端·javascript·数据库
这个DBA有点耶3 小时前
云数据库半夜卡顿,CPU才30%?深挖云盘IOPS突发限制与内核挂起机制
数据库·mysql·云原生
Mikko74 小时前
Redis 连接数满了服务端有错误信息吗?连接数不增加却命令超时?6.2 实测连接池、超时与大 key 怎么判定
java·spring boot·redis·后端
无言听风雨丶4 小时前
Redis 运维实战与排错
运维·数据库·redis
小天源6 小时前
智叟云集系统 · 架构与职责分层
服务器·前端·数据库