Redis的java客户端

本文涉及的产品
云数据库 Tair(兼容Redis),内存型 2GB
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
目录
相关文章
|
8天前
|
存储 Java API
Java实现导出多个excel表打包到zip文件中,供客户端另存为窗口下载
Java实现导出多个excel表打包到zip文件中,供客户端另存为窗口下载
20 4
|
30天前
|
缓存 NoSQL Java
大数据-50 Redis 分布式锁 乐观锁 Watch SETNX Lua Redisson分布式锁 Java实现分布式锁
大数据-50 Redis 分布式锁 乐观锁 Watch SETNX Lua Redisson分布式锁 Java实现分布式锁
53 3
大数据-50 Redis 分布式锁 乐观锁 Watch SETNX Lua Redisson分布式锁 Java实现分布式锁
|
12天前
|
NoSQL 网络协议 算法
Redis 客户端连接
10月更文挑战第21天
23 1
|
30天前
|
存储 消息中间件 NoSQL
Redis 入门 - C#.NET Core客户端库六种选择
Redis 入门 - C#.NET Core客户端库六种选择
52 8
|
29天前
|
缓存 NoSQL Java
Java中redis面试题
Java中redis面试题
33 1
|
30天前
|
分布式计算 Java Hadoop
Hadoop-30 ZooKeeper集群 JavaAPI 客户端 POM Java操作ZK 监听节点 监听数据变化 创建节点 删除节点
Hadoop-30 ZooKeeper集群 JavaAPI 客户端 POM Java操作ZK 监听节点 监听数据变化 创建节点 删除节点
61 1
|
11天前
|
存储 NoSQL Java
Java 使用 Redis
10月更文挑战第22天
19 0
|
29天前
|
NoSQL Java API
Java操作redis
Java操作redis
|
存储 SQL 缓存
Java-Redis笔记
  Redis   1. 概念: redis是一款高性能的NOSQL系列的非关系型数据库   1.1.什么是NOSQL   NoSQL(NoSQL=Not Only SQL),意即“不仅仅是SQL”,是一项全新的数据库理念,泛指非关系型的数据库。   随着互联网web2.0网站的兴起,传统的关系数据库在应付web2.0网站,特别是超大规模和高并发的SNS类型的web2.0纯动态网站已经显得力不从心,暴露了很多难以克服的问题,而非关系型的数据库则由于其本身的特点得到了非常迅速的发展。NoSQL数据库的产生就是为了解决大规模数据集合多重数据种类带来的挑战,尤其是大数据应用难题。
146 0
|
30天前
|
消息中间件 缓存 NoSQL
Redis 是一个高性能的键值对存储系统,常用于缓存、消息队列和会话管理等场景。
【10月更文挑战第4天】Redis 是一个高性能的键值对存储系统,常用于缓存、消息队列和会话管理等场景。随着数据增长,有时需要将 Redis 数据导出以进行分析、备份或迁移。本文详细介绍几种导出方法:1)使用 Redis 命令与重定向;2)利用 Redis 的 RDB 和 AOF 持久化功能;3)借助第三方工具如 `redis-dump`。每种方法均附有示例代码,帮助你轻松完成数据导出任务。无论数据量大小,总有一款适合你。
67 6