Redis的java客户端

本文涉及的产品
Redis 开源版,标准版 2GB
推荐场景:
搭建游戏排行榜
云数据库 Tair(兼容Redis),内存型 2GB
简介: Redis的java客户端

Jedis



快速入门


引入依赖


<groupId>redis.chlients</groupId>
<artifactId>jedis</xxx>


1.建立连接


void setUp(){
    jedis = new Jedis("IP地址" ,6379);
    jedsi.auth("密码"); 
    jedis.select("1"); //选择数据库
}


1.操作数据,测试String


void testString(){
  String result = jedis.set("name","张三");
    sout
    Sitrng name = jedis.get("name");
    sout
}


1.关闭连接


void tearDown(){
  if(jedis != null){
        jedis.close();
    }
}


springDataRedis



SpringData是Spring中数据操作的模块,包含对各种数据库的集成


其中对Redis的集成模块就叫做SpringDataRedis


官网地址:https://spring.io/projects/spring-data-redis


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


RedisTemplate工具类


1676608553685-762cc763-8a75-422c-9461-e569b8c6ee61.png

使用RedisTemplate统一API来操作Redis


1.导入依赖


<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-data-redis</artifactId>
</dependency>
<dependency>
    <groupId>org.projectlombok</groupId>
    <artifactId>lombok</artifactId>
    <optional>true</optional>
</dependency>
<dependency>
    <groupId>org.apache.commons</groupId>
    <artifactId>commons-pool2</artifactId>
</dependency>
<dependency>
    <groupId>com.fasterxml.jackson.core</groupId>
    <artifactId>jackson-databind</artifactId>
</dependency>


1.创建RedisTemplate对象

@Resource
private RedisTemplate redisTemplate;

1.实现对数据的操作


@Test
void testString() {
    //写入一条数据
     redisTemplate.opsForValue().set("name","虎哥");
    Object name = redisTemplate.opsForValue().get("name");
    System.out.println(name);
}


得到的结果:

1676609065382-4b9c84a7-071d-4e51-8d47-3bbe7bfb0169.png

1676609078844-5dd841c8-6729-4044-b63f-d457a3c62463.png


需要解决的问题


因为使用redisTemplate.opsForValue().set(“name”,”虎哥”);得到的不是一个String 类型的字符串,而使一个Object对象


所以存入的就会是java对象,那么就需要对对象进行序列化,从而得到我们需要的类型


解决RedisTemplate序列化的两种方案


方案一:

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


package second.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.GenericJackson2JsonRedisSerializer;
import org.springframework.data.redis.serializer.RedisSerializer;
/**
 * 创建配置文件的原因:
 * 但我们进行写入操作时,在redis数据库中存储的确实一段\xAC\xED\x00\x05t\x00\x06\xE8\x99\x8E\xE5\x93\xA5
 */
@Configuration
public class RedisTemplateConfig {
    @Bean
    public RedisTemplate<String,Object> redisTemplate(RedisConnectionFactory redisConnectionFactory){
        //创建redisTemplate对象
        RedisTemplate<String,Object> redisTemplate = new RedisTemplate<>();
        //连接工厂
        redisTemplate.setConnectionFactory(redisConnectionFactory);
        //创建json序列化工具
        GenericJackson2JsonRedisSerializer jsonRedisSerializer = new GenericJackson2JsonRedisSerializer();
        //设置key序列化
        redisTemplate.setKeySerializer(RedisSerializer.string());
        redisTemplate.setHashKeySerializer(RedisSerializer.string());
        //设置value序列化
        redisTemplate.setValueSerializer(jsonRedisSerializer);
        redisTemplate.setHashValueSerializer(jsonRedisSerializer);
        //返回
        return redisTemplate;
    }
}

得到的结果


1676609346379-4e1de992-af7b-42b7-a142-7b8980c7f921.png


这样就是我们所需要的结果,但是与此同时,他却不满足内存的要求,因为他多了一个@Class:”second.pojo.user” 这是我们自己定义的接收数据的实体类。他将会占用很大的内存。所以我们就不能这么做。就需要再次进行升级


方案二:

  1. 使用StringRedisTemplate
  2. 写入Redis时,手动把对象序列化为JSON
  3. 读取Redis时,手动把读取到的JSON反序列化为对象


通过这样得到的结果才是我们真正需要的结果


而Spring官方也同样推出了一个更为好用的**StringRedisTemplate统一API来操作Redis**


如下:


@Resource
private StringRedisTemplate stringRedisTemplate;


public ObjectMapper mapper = new ObjectMapper();
@Test
void getTest() throws JsonProcessingException {
    user usr1 = new user("小花", 21);
    //手动序列化  : 将java对象转换为json
    String s = mapper.writeValueAsString(usr1);
    //进行操作
    stringRedisTemplate.opsForValue().set("user:300",s);
    System.out.println("s==" + s);
    //读取数据
    String s1 = stringRedisTemplate.opsForValue().get("user:300");
    user user = mapper.readValue(s1, user.class);
    System.out.println("数据为 : " + user);
    /**
     * 得到的数据(在redis中存储的) :
     * {
     *   "name": "小花",
     *   "age": 21
     * }
     */
}


1676610240800-380eb8b3-e710-463d-b3eb-b57cb3fdb867.png

相关实践学习
基于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
目录
相关文章
|
10天前
|
NoSQL 算法 Java
Java Redis多限流
通过本文的介绍,我们详细讲解了如何在Java中使用Redis实现三种不同的限流策略:固定窗口限流、滑动窗口限流和令牌桶算法。每种限流策略都有其适用的场景和特点,根据具体需求选择合适的限流策略可以有效保护系统资源和提高服务的稳定性。
35 18
|
1月前
|
NoSQL Java 关系型数据库
Liunx部署java项目Tomcat、Redis、Mysql教程
本文详细介绍了如何在 Linux 服务器上安装和配置 Tomcat、MySQL 和 Redis,并部署 Java 项目。通过这些步骤,您可以搭建一个高效稳定的 Java 应用运行环境。希望本文能为您在实际操作中提供有价值的参考。
136 26
|
2月前
|
存储 消息中间件 NoSQL
使用Java操作Redis数据类型的详解指南
通过使用Jedis库,可以在Java中方便地操作Redis的各种数据类型。本文详细介绍了字符串、哈希、列表、集合和有序集合的基本操作及其对应的Java实现。这些示例展示了如何使用Java与Redis进行交互,为开发高效的Redis客户端应用程序提供了基础。希望本文的指南能帮助您更好地理解和使用Redis,提升应用程序的性能和可靠性。
47 1
|
2月前
|
存储 Java API
Java实现导出多个excel表打包到zip文件中,供客户端另存为窗口下载
Java实现导出多个excel表打包到zip文件中,供客户端另存为窗口下载
103 4
|
3月前
|
NoSQL 网络协议 算法
Redis 客户端连接
10月更文挑战第21天
50 1
|
3月前
|
缓存 NoSQL Java
Java中redis面试题
Java中redis面试题
58 1
|
2月前
|
存储 NoSQL Java
Java 使用 Redis
10月更文挑战第22天
57 0
|
存储 自然语言处理 Java
Elasticsearch: java客户端之AdminClient
Elasticsearch: java客户端之AdminClient
172 0
|
存储 自然语言处理 Java
Elasticsearch: java客户端之AdminClient
Elasticsearch: java客户端之AdminClient
264 0
|
6天前
|
监控 Java
java异步判断线程池所有任务是否执行完
通过上述步骤,您可以在Java中实现异步判断线程池所有任务是否执行完毕。这种方法使用了 `CompletionService`来监控任务的完成情况,并通过一个独立线程异步检查所有任务的执行状态。这种设计不仅简洁高效,还能确保在大量任务处理时程序的稳定性和可维护性。希望本文能为您的开发工作提供实用的指导和帮助。
44 17