IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 大数据 -> redis的Java客户端 -> 正文阅读

[大数据]redis的Java客户端

Redis的Java客户端

image-20220412195740343

Jedis

Jedist的官网地址:https:/github.com/redis/jedis

1. 引入依赖

     <dependency>
            <groupId>redis.clients</groupId>
            <artifactId>jedis</artifactId>
            <version>3.7.0</version>
        </dependency>
      <dependency>
            <groupId>org.junit.jupiter</groupId>
            <artifactId>junit-jupiter</artifactId>
            <version>5.8.2</version>
            <scope>test</scope>
        </dependency>

2. 单元测试

public class TestJedis {

    private Jedis jedis;

    @BeforeEach
    void before() {
        jedis = new Jedis("82.157.9.110", 6379);
        jedis.auth("fengte");
        jedis.select(0);
    }


    @Test
    public void test01() {
        String result = jedis.set("name", "张三");
        System.out.println("result = " + result);
        String name = jedis.get("name");
        System.out.println("name = " + name);
    }


    @AfterEach
    void after() {
        if (jedis != null) {
            jedis.close();
        }
    }
}

Jedis连接池

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

jedis的直连方式。

public class JedisConnectionFactory {

    private static final JedisPool jedisPool;


    static {
        JedisPoolConfig jedisPoolConfig = new JedisPoolConfig();
        // 最大连接
        jedisPoolConfig.setMaxTotal(8);
        // 最大空闲连接
        jedisPoolConfig.setMaxIdle(8);
        // 最小空闲连接
        jedisPoolConfig.setMinIdle(0);
        // 设置最长等待时间
        jedisPoolConfig.setMaxWaitMillis(200);
        jedisPool = new JedisPool(jedisPoolConfig, "82.157.9.110", 6379,
                1000, "fengte");
    }

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

}

SpringDataRedis

SpringData是Spring中数据操作的模块,包含对各种数据库的集成,其中对Redist的集成模块就叫做SpringDataRedis,官网地址:https://spring.io/projects/spring-data-redis

  • 提供了对不同Redis客户端的整合(Lettuce和edis)
  • 提供了RedisTemplate统一API来操作Redis
  • 支持Redis的发布订阅模型
  • 支持Redis哨兵和Redis:集群
  • 支持基于Lettuce的响应式编程
  • 支持基于引DK、JSON、字符串、Spring对象的数据序列化及反序列化
  • 支持基于Redis的DKCollection实现

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

API封装到了不同的类型中:

API返回值类型说明
redisTemplate.opsForValue()ValueOperations操作String类型数据
redisTemplate.opsForHash()HashOperations操作Hash类型数据
redisTemplate.opsForList()ListOperations操作List类型数据
redisTemplate.opsForSet()SetOperations操作Set类型数据
redisTemplate.opsForZSet()ZSetOperations操作SortedSet类型数据
redisTemplate通用命令

SpringBoot已经提供了对SpringDataRedis的支持,使用非常简单:

    1. 引入依赖
        <!--    redis依赖    -->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-data-redis</artifactId>
        </dependency>
        <!--   连接池     -->
        <dependency>
            <groupId>org.apache.commons</groupId>
            <artifactId>commons-pool2</artifactId>
        </dependency>
    1. 配置yml文件
spring:
  redis:
    port: 6379
    host: 127.0.0.1
    password: ******
    lettuce:
      pool:
        max-active: 8 # 最大连接
        max-idle: 8 # 最大空闲连接
        min-idle: 0 # 最小空闲连接
        max-wait: 100 # 连接等待时间
    1. 注入RedisTemplate
    @Autowired
    private RedisTemplate redisTemplate;
    1. 编写测试
    @Test
    void contextLoads() {
        redisTemplate.opsForValue().set("name","ls");
        String name = redisTemplate.opsForValue().get("name").toString();
        System.out.println(name);
    }

然而这样是有问题的

image-20220413172101419

  • 修改SpringDataRedisTemlate序列化方式
@Configuration
public class RedisConfig {

    @Bean
    public RedisTemplate<String,Object> redisTemplate(RedisConnectionFactory redisConnectionFactory){
        // 创建 RedisTemplate
        RedisTemplate<String,Object> redisTemplate = new RedisTemplate();
        // 设置连接工厂
        redisTemplate.setConnectionFactory(redisConnectionFactory);
        // 设置序列化工具
        GenericJackson2JsonRedisSerializer jsonRedisSerializer = new GenericJackson2JsonRedisSerializer();

        // key和hashkey使用string序列化
        redisTemplate.setKeySerializer(RedisSerializer.string());
        redisTemplate.setHashKeySerializer(RedisSerializer.string());
        // value和hashvalue使用json序列化
        redisTemplate.setValueSerializer(jsonRedisSerializer);
        redisTemplate.setHashValueSerializer(jsonRedisSerializer);
        return redisTemplate;
    }

}
  • 引入jackson依赖
        <dependency>
            <groupId>com.fasterxml.jackson.core</groupId>
            <artifactId>jackson-databind</artifactId>
        </dependency>
  • 进行测试
@SpringBootTest
class RedisDemoApplicationTests {

    @Autowired
    private RedisTemplate<String,Object> redisTemplate;

    @Test
    void testSaveUser() {
		User user = new User("张三", 21);
		redisTemplate.opsForValue().set("user:1", user);
        Object o = redisTemplate.opsForValue().get("user:1");
        System.out.println(o);
    }

}

也存在一定的弊端,@class占用了一定的空间

image-20220413173632992

为了节省内存空间,我们并不会使用JSON序列化器来处理value,而是统一使用String序列化器,要求只能存储

String类型的key和value。当需要存储Java对象时,手动完成对象的序列化和反序列化。

image-20220413174520136

  • 使用StringRedisTemplate,进行手动序列化
    @Autowired
    private StringRedisTemplate stringRedisTemplate;

    @Test
    void testStringTemplate() throws JsonProcessingException {
        User user = new User("李四",21);
        // 手动序列化
        String json = new ObjectMapper().writeValueAsString(user);
        stringRedisTemplate.opsForValue().set("user:2",json);

        // 读取数据
        String u = stringRedisTemplate.opsForValue().get("user:2");
        // 反序列化
        User user1 = new ObjectMapper().readValue(u, User.class);
        System.out.println(user1);
    }

image-20220413175206905

RedisTemplate的两种序列化实践方案:

方案一:

  1. 自定义RedisTemplate
  2. 修改RedisTemplate的序列化器为GenericJackson2JsonRedisSerializer

方案二:

  1. 使用StringRedisTemplate
  2. 写入Redis时,手动把对象序列化为JSON
  3. 读取Redis时,手动把读取到的JSON反序列化为对象
  大数据 最新文章
实现Kafka至少消费一次
亚马逊云科技:还在苦于ETL?Zero ETL的时代
初探MapReduce
【SpringBoot框架篇】32.基于注解+redis实现
Elasticsearch:如何减少 Elasticsearch 集
Go redis操作
Redis面试题
专题五 Redis高并发场景
基于GBase8s和Calcite的多数据源查询
Redis——底层数据结构原理
上一篇文章      下一篇文章      查看所有文章
加:2022-04-15 00:05:37  更:2022-04-15 00:05:52 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/24 3:23:53-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码