当前位置:   article > 正文

【黑马程序员——Redis的Java客户端】_java redis客户端

java redis客户端

Redis的Java客户端

1. Jedis客户端

Jedis是一个Java语言编写的Redis客户端库,用于与Redis服务器进行通信。它提供了易于使用的API,使Java开发人员可以轻松地与Redis进行交互。使用Jedis,你可以执行各种Redis操作,如设置和获取键值对、执行命令、订阅和发布消息等。

优点

  • 易于使用: Jedis提供了简单易用的API,使得与Redis服务器进行通信变得简单直观。它提供了直观的方法来执行各种Redis操作,降低了使用难度。
  • 完整的功能支持: Jedis支持Redis的大多数功能,包括基本的操作(如设置和获取键值对)、事务、管道操作、发布/订阅、分布式锁等。你可以使用Jedis来执行各种操作,从简单的数据存储到复杂的Redis功能。
  • 灵活性: Jedis允许你通过配置文件或代码进行各种定制,例如设置连接池、超时设置等,以满足你的特定需求。

缺点

  • 同步阻塞模型: Jedis默认采用同步阻塞模型,这意味着在执行某些操作时,客户端可能会被阻塞,直到操作完成。对于大量并发请求或需要高吞吐量的应用程序,这可能会导致性能瓶颈。
  • 单线程性能限制: Jedis的单个实例是单线程的,因此在处理高并发负载时可能会受到性能限制。这意味着需要使用多个Jedis实例或其他技术来处理高负载情况。
  • 依赖管理: 尽管Jedis本身很容易使用,但在项目中使用Jedis时,你需要管理其依赖关系。这可能包括将Jedis库添加到项目的依赖中,并确保版本与其他库兼容。
  • 内存管理: 在某些情况下,由于Jedis客户端需要在客户端维护数据的副本,因此可能会导致内存消耗较高。这对于大规模数据操作可能会带来挑战。

1.1 使用步骤

  1. 引入依赖
  2. 创建对象,建立连接
  3. 使用Jedis,方法名与Redis命令一致
  4. 释放资源

1.2 配置连接池

public class JedisConnectionFactory {
    // 配置连接池
    private static final JedisPool jedisPool;

    static {
        // 配置连接池
        JedisPoolConfig poolConfig = new JedisPoolConfig();
        poolConfig.setMaxTotal(8);
        poolConfig.setMaxIdle(8);
        poolConfig.setMinIdle(0);
        poolConfig.setMaxWaitMillis(1000);
        // 创建连接池对象
        jedisPool = new JedisPool(poolConfig, "192.168.1.107", 6379, 1000 ,"123456");
    }

    // 创建连接池对象
    public static Jedis getJedis(){
        return jedisPool.getResource();
    }
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20

1.3 使用案例

public class JedisTest {
    private Jedis jedis;

    @BeforeEach
    void setUp() {
        /*
        1.建立连接
        2.设置密码
        3.选择库
         */
//        jedis = new Jedis("192.168.1.107",6379);
//        jedis.auth("123456");
//        jedis.select(0);
        jedis = JedisConnectionFactory.getJedis();
    }

    @Test
    void testString(){
        // 存入数据
        String result = jedis.set("name", "虎哥");
        System.out.println("result = "+result);
        // 获取数据
        String name = jedis.get("name");
        System.out.println("name = "+name);
    }

    @Test
    void testHash(){
        jedis.hset("user:1","name","jack");
        jedis.hset("user:1","age","21");

        Map<String, String> map = jedis.hgetAll("user:1");
        System.out.println(map);
    }

    @AfterEach
    void tearDown(){
        if (jedis!=null) {
            jedis.close();
        }
    }
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42

2. SpringDataRedis客户端

Spring Data 是一系列旨在简化基于 Java 的应用程序中数据库访问的项目集合。它提供了一致的编程模型,减少了数据库交互所需的样板代码量。

Spring Data 的关键组件之一是存储库抽象,它允许开发人员在不编写实际实现代码的情况下进行数据访问操作。Spring Data 存储库可以配置为与各种数据存储一起工作,包括关系数据库如 MySQL、PostgreSQL 和 Oracle,以及 NoSQL 数据库如 MongoDB、Redis 和 Cassandra。

Spring Data Redis 是 Spring Data 项目的一部分,专门用于简化在基于 Java 的应用程序中与 Redis 数据库的交互。Redis 是一种高性能的键值存储数据库,常用于缓存、会话存储和消息队列等用途。

功能包括

  • RedisTemplate: 提供了一个模板化的方式来执行 Redis 操作,例如设置键值对、执行列表操作、操作哈希等。
  • Repository 抽象: 类似于 Spring Data 的其他模块,Spring Data Redis 也提供了存储库抽象,使开发人员可以以声明性的方式定义 Redis 实体和查询方法。
  • 支持对象映射: Spring Data Redis 支持将 Java 对象序列化为 Redis 数据结构,例如将 Java 对象序列化为 JSON 或二进制数据,并存储在 Redis 中。
  • 缓存支持: Spring Data Redis 提供了与 Spring Cache 抽象的集成,可以使用 Spring 的缓存注解轻松地将数据缓存到 Redis 中,从而提高应用程序的性能。
  • Pub/Sub 支持: 提供了对 Redis 发布/订阅功能的支持,使应用程序能够实现消息传递和事件驱动的功能。

2.1 连接步骤

  1. 引入spring-boot-starter-data-redis依赖
  2. 在application.yml配置Redis信息
  3. 注入RedisTemplate

2.2 对应的配置文件

对应的springboot版本为2.6.5

spring:
	redis:
		host: 192.168.1.107
		port: 6379
		password: 123456
		lettuce:
			pool:
			max-active: 8
			max-idle: 8
			min-idle: 0
			max-wait: 100
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11

2.3 使用例子

@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);
    }

}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15

2.4 为key和value设置序列化器

默认的jdk序列化器十分不友好,需要通过配置相应的序列化器来解决这个问题。

@Configuration
public class RedisConfig {
    @Bean
    public RedisTemplate<String,Object> redisTemplate(RedisConnectionFactory connectionFactory){
        // 创建RedisTemplate对象
        RedisTemplate<String, Object> template = new RedisTemplate<>();
        // 设置连接工厂
        template.setConnectionFactory(connectionFactory);
        // 创建JSON序列化工具
        GenericJackson2JsonRedisSerializer jsonRedisSerializer = new GenericJackson2JsonRedisSerializer();
        // 设置Key的序列化
        template.setKeySerializer(RedisSerializer.string());
        template.setHashKeySerializer(RedisSerializer.string());
        // 设置Value的序列化
        template.setValueSerializer(jsonRedisSerializer);
        template.setHashValueSerializer(jsonRedisSerializer);
        // 返回
        return template;
    }
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20

修改之后存入的数据为:
在这里插入图片描述
新的问题:带有了额外的参数@class,容易浪费内存空间。为了节省内存空间,我们并不会使用]SON序列化器来处理value,而是统一使用String序列化器,要求只能存储String类型的key和value。当需要存储lava对象时,手动完成对象的序列化和反序列化。

2.5 StringRedisTemplate

Spring默认提供了一个StringRedistemplate类,它的key和value的序列化方式默认就是String方式。省去了我们自定义RedisTemplate的过程。需要手动完成对象的序列化和反序列化。

    @Autowired
    private StringRedisTemplate stringRedisTemplate;

    //JSON工具
    private static final ObjectMapper mapper = new ObjectMapper();
    @Test
    void testStringTemplate() throws JsonProcessingException {
        User user = new User("欢哥", 18);
        String json = mapper.writeValueAsString(user);
        // 写入一条数据到redis
        stringRedisTemplate.opsForValue().set("user:200",json);
        // 读取数据
        String val = stringRedisTemplate.opsForValue().get("user:200");
        User user1 = mapper.readValue(val, User.class);
        System.out.println("user = "+user1);
    }
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16

在这里插入图片描述

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/花生_TL007/article/detail/682815
推荐阅读
相关标签
  

闽ICP备14008679号