126.【Redis - 快速开发使用版】(二)

本文涉及的产品
云数据库 Redis 版,社区版 2GB
推荐场景:
搭建游戏排行榜
简介: 126.【Redis - 快速开发使用版】

(三)、Redis 的客户端

在Redis官网中提供了各种语言的客户端,地址: https://redis.io/resources/clients/#java

1.使用Jedis

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

  1. 引入依赖
<!--        导入jedis-->
        <dependency>
            <groupId>redis.clients</groupId>
            <artifactId>jedis</artifactId>
        </dependency>
  1. 建立连接
@Test
    void test3(){
        // 链接
        Jedis jedis = new Jedis("127.0.0.1", 6379);
        jedis.auth("121788");
        // 选择库
        jedis.select(0);
        // 测试是否链接成功
        System.out.println(jedis.ping());
        jedis.set("username1","123456");
        System.out.println(jedis.get("username"));
        // 释放链接
        jedis.close();
    }

2.Jedis 连接池

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

Redis作为一款主流的高性能NoSQL内存数据库,现在被越来越多的开发者使用。然而,由于Redis是单线程模式,大量的连接会导致CPU和内存资源耗用。为了提高Redis的性能,线程池是一项很好的解决方案。

线程池是将Redis连接包装成线程池,可以提前分配一定数量的线程来进行处理,这样就可以有效的提升Redis的性能。有了线程池,开发者就可以利用它在Redis中分布式读写数据,以改进系统的性能。同时线程池还可以有效地减少资源的消耗。

可以看出,结合Redis的线程池和数据模型进行优化,可以大大提升Redis的性能。如果正确地配置线程池和当前Redis环境,不仅可以提高性能,而且可以有效的降低服务器的资源消耗,再搭配合理的缓存策略,真正实现简单优化,大幅提升的效果。

redis:
    host: 127.0.0.1
    port: 6379
    password: 121788
    client-type: jedis
    jedis:
       pool:
        # 连接池中的最大空闲连接
        max-idle: 8
        # 连接池中的最小空闲连接
        min-idle: 10
        # 连接池最大连接数(使用负值表示没有限制)
        max-active: 100
        # 连接池最大阻塞等待时间(使用负值表示没有限制)
        max-wait: -1

连接池配置源码: RedisProperties.java

我们创建Jedis会自动找到这里

3.SpringDataRedis (需要序列化)

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

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

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

(1).快速入门

1.导入依赖

<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>    

2.配置数据

spring:
  redis:
    host: 127.0.0.1
    port: 6379
    password: 121788
    client-type: jedis
    jedis:
       pool:
        # 连接池中的最大空闲连接
        max-idle: 10
        # 连接池中的最小空闲连接
        min-idle: 8
        # 连接池最大连接数(使用负值表示没有限制)
        max-active: 100
        # 连接池最大阻塞等待时间(使用负值表示没有限制)
        max-wait: -1

3.自动注入

@Resource
    RedisTemplate redisTemplate;

4.测试实现

@Test
    void test4(){
        redisTemplate.opsForValue().set(JSON.toJSONString("username4"),JSON.toJSONString("李明"));
        System.out.println(redisTemplate.opsForValue().get(JSON.toJSONString("username4")));
    }

(2).RedisTemplate的序列化RedisSerizal

配置我们默认的序列化器

package com.jsxs.config;
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.RedisSerializer;
import java.net.UnknownHostException;
/**
 * @Author Jsxs
 * @Date 2023/7/20 13:56
 * @PackageName:com.jsxs.config
 * @ClassName: RedisConfig
 * @Description: TODO
 * @Version 1.0
 */
@Configuration
public class RedisConfig {
    @Bean
    public RedisTemplate<String, Object> redisTemplate(RedisConnectionFactory redisConnectionFactory) throws UnknownHostException {
        // 将template 泛型设置为 <String, Object>
        RedisTemplate<String, Object> template = new RedisTemplate();
        // 连接工厂,不必修改
        template.setConnectionFactory(redisConnectionFactory);
        /*
         * 序列化设置
         */
        // key、hash的key 采用 String序列化方式
        template.setKeySerializer(RedisSerializer.string());
        template.setHashKeySerializer(RedisSerializer.string());
        // value、hash的value 采用 Jackson 序列化方式
        template.setValueSerializer(RedisSerializer.json());
        template.setHashValueSerializer(RedisSerializer.json());
        template.afterPropertiesSet();
        return template;
    }
}

4.StringRedisTemplate (不需要序列化)

尽管JSON的序列化满足我们的需求,但依然存在一些问题,如图:

@Test
    void test4(){
        Admin admin = adminMapper.selectById(1);
        redisTemplate.opsForValue().set(JSON.toJSONString("username7"),JSON.toJSON(admin));
        System.out.println(redisTemplate.opsForValue().get(JSON.toJSONString("username7")));
    }

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

开销。

为了节省内存空间,我们并不会使用]SON序列化器来处理value,而是统一使用String序列化器,要求只能存储String类型的key和value。当需要存储]ava对象时,手动完成对象的序列化和反序列化。

Spring默认提供了一个StringRedisTemplate类,它的key和value的序列化方式默认就是String方式。省去了我们自定义RedisTemplate配置的过程:

@Resource
    StringRedisTemplate stringRedisTemplate;
@Test
    void test5(){
        Admin admin = adminMapper.selectById(1);
        stringRedisTemplate.opsForValue().set(JSON.toJSONString("username8"),JSON.toJSONString(admin));
        System.out.println(JSON.parse(stringRedisTemplate.opsForValue().get(JSON.toJSONString("username8"))));
    }

相关实践学习
基于Redis实现在线游戏积分排行榜
本场景将介绍如何基于Redis数据库实现在线游戏中的游戏玩家积分排行榜功能。
云数据库 Redis 版使用教程
云数据库Redis版是兼容Redis协议标准的、提供持久化的内存数据库服务,基于高可靠双机热备架构及可无缝扩展的集群架构,满足高读写性能场景及容量需弹性变配的业务需求。 产品详情:https://www.aliyun.com/product/kvstore &nbsp; &nbsp; ------------------------------------------------------------------------- 阿里云数据库体验:数据库上云实战 开发者云会免费提供一台带自建MySQL的源数据库&nbsp;ECS 实例和一台目标数据库&nbsp;RDS实例。跟着指引,您可以一步步实现将ECS自建数据库迁移到目标数据库RDS。 点击下方链接,领取免费ECS&amp;RDS资源,30分钟完成数据库上云实战!https://developer.aliyun.com/adc/scenario/51eefbd1894e42f6bb9acacadd3f9121?spm=a2c6h.13788135.J_3257954370.9.4ba85f24utseFl
相关文章
|
8月前
|
存储 缓存 NoSQL
Java开发面试--Redis专区(二)
Java开发面试--Redis专区
138 0
|
10月前
|
消息中间件 缓存 NoSQL
手把手教你云相册项目简易开发 day1 Kafka+IDEA+Springboot+Redis+MySQL+libvips 简单运行和使用
手把手教你云相册项目简易开发 day1 Kafka+IDEA+Springboot+Redis+MySQL+libvips 简单运行和使用
138 0
|
2天前
|
NoSQL API Redis
最佳实践|如何使用c++开发redis module
本文将试着总结Tair用c++开发redis module中遇到的一些问题并沉淀为最佳实践,希望对redis module的使用者和开发者带来一些帮助(部分最佳实践也适用于c和其他语言)。
|
13天前
|
人工智能 前端开发 Java
Java语言开发的AI智慧导诊系统源码springboot+redis 3D互联网智导诊系统源码
智慧导诊解决盲目就诊问题,减轻分诊工作压力。降低挂错号比例,优化就诊流程,有效提高线上线下医疗机构接诊效率。可通过人体画像选择症状部位,了解对应病症信息和推荐就医科室。
160 10
|
18天前
|
NoSQL 关系型数据库 MySQL
开发者福音:用IDEA和Iedis2加速Redis开发与调试
开发者福音:用IDEA和Iedis2加速Redis开发与调试
32 0
开发者福音:用IDEA和Iedis2加速Redis开发与调试
|
20天前
|
运维 NoSQL 算法
Java开发-深入理解Redis Cluster的工作原理
综上所述,Redis Cluster通过数据分片、节点发现、主从复制、数据迁移、故障检测和客户端路由等机制,实现了一个分布式的、高可用的Redis解决方案。它允许数据分布在多个节点上,提供了自动故障转移和读写分离的功能,适用于需要大规模、高性能、高可用性的应用场景。
16 0
|
4月前
|
消息中间件 存储 NoSQL
Redis开发最佳实践
Redis开发最佳实践
64 0
|
4月前
|
NoSQL 关系型数据库 MySQL
mysql与redis在java开发过程中的数据一致性问题
mysql与redis在java开发过程中的数据一致性问题
45 4
|
9月前
|
缓存 NoSQL Java
GitHub笔记疯抢竟崩溃!Redis完整开发实战居然包含大厂同款项目
现在阿里、腾讯这样的大厂和大部分互联网公司,基本上都需要使用到Redis技术。网上发布的Java开发工程师岗位的招聘信息,对Redis的要求都是熟练掌握。 而且现在大厂的大部分面试题都和Redis有关,尤其是在阿里、字节、华为、腾讯的后端面试中,只要你的项目中涉及到Redis,面试官大部分都会针对Redis提问!很多Redis的提问还特别深入……没答上来就非常可惜了。 所以千万不要小看Redis! 学习推荐 作为Java程序员,选择学习什么样的技术?什么技术该不该学?去招聘网站上搜一搜、看看岗位要求就十分清楚了,自己具备的技术和能力,直接影响到你工作选择范围和能不能面试成功。
70 0
|
5月前
|
缓存 NoSQL Java
SSM之spring注解式缓存redis->redis整合,redis的注解式开发及应用场景,redis的击穿穿透雪崩
SSM之spring注解式缓存redis->redis整合,redis的注解式开发及应用场景,redis的击穿穿透雪崩
49 0