Redis学习笔记--002

Redis的JAVA客户端

文章目录

  • Redis的JAVA客户端
    • 一、Redis的Java客户端的种类
    • 二、Jedis
      • 2.1、使用步骤
      • 2.2、Jedis连接池
    • 三、[SpringDataRedis](https://spring.io/projects/spring-data-redis)
      • 3.1、介绍
      • 3.2、RedisTemplate
      • 3.3、SpringDataRedis使用步骤
      • 3.4、SpringDataRedis的序列化方式
    • 四、StringRedisTemplate
      • 4.1、解决方法
      • 4.2、**ObjectMapper介绍**
      • 4.3、StringRedisTemplate类
    • 五、其它结构的使用

一、Redis的Java客户端的种类

在这里插入图片描述

二、Jedis

Jedis是一个用于连接和与Redis服务器进行交互的Java客户端库。Redis是一个高性能的内存数据存储系统,Jedis允许Java应用程序通过简单的API与Redis进行通信。

	 <dependency><groupId>redis.clients</groupId><artifactId>jedis</artifactId><version>4.3.1</version></dependency>

2.1、使用步骤

  1. 获取Jedis连接
//设置主机地址和端口号
Jedis jedis = new Jedis("192.168.74.1xx", 6379);
  1. 给Jedis设置redis密码
// 设置密码认证
jedis.auth("123456");
  1. 操作
HashMap<String,String> map=new HashMap<>();map.put("id","1");map.put("name","radan");jedis.hset("user:1",map);System.out.println(jedis.hgetAll("user:1"));
  1. 释放连接
jedis.close();

2.2、Jedis连接池

Jedis本身就是线程不安全的,并且频繁的创建和销毁会有性能的损耗,因此推荐使用Jedis连接池代替Jedis的直连方式。(JedisPool)

JedisConnectionFactory 连接池配置类

public class JedisConnectionFactory {private static JedisPool jedisPool = null;static {// 配置连接池JedisPoolConfig jedisPoolConfig=new JedisPoolConfig();// 最大连接数jedisPoolConfig.setMaxIdle(8);// 最大空闲连接jedisPoolConfig.setMaxIdle(8);// 最小空闲连接jedisPoolConfig.setMinIdle(0);// 设置最长等待时间   msjedisPoolConfig.setMaxWaitMillis(200);jedisPool = new JedisPool(jedisPoolConfig,"192.168.74.128",6379);}// 获取Jedis对象public static Jedis getJedis(){return jedisPool.getResource();}public static void closeJedis(){jedisPool.close();}   
}

三、SpringDataRedis

3.1、介绍

Spring Data Redis是Spring框架的一个模块,用于简化在Java应用程序中与Redis数据库进行交互的过程。它提供了高级别的抽象和易于使用的API,使得在Spring应用中使用Redis变得更加容易。

Spring Data Redis的一些关键特点和用途

  1. Redis操作抽象化: Spring Data Redis抽象了与Redis数据库的交互,允许你以面向对象的方式操作数据。你可以将Java对象存储在Redis中,而不必担心底层的Redis命令。

  2. 注解支持: Spring Data Redis支持注解,使得在Java类中定义Redis数据模型更加方便。你可以使用注解来标记实体类、字段和方法,以指定它们与Redis数据之间的映射关系。

  3. 连接池管理: Spring Data Redis集成了连接池管理,确保有效地管理Redis连接。这有助于提高性能和资源利用率。

  4. 声明式事务: 你可以使用Spring的声明式事务管理来确保Redis操作的一致性。这使得在多个Redis命令之间进行原子性操作更加容易。

  5. 缓存支持: Spring Data Redis还提供了与Spring框架的缓存抽象集成使得可以轻松地将Redis用作应用程序的缓存存储。

  6. 查询支持: 该模块允许你使用Spring表达式语言(SpEL)构建自定义查询,以根据不同的条件检索数据。

  7. Pub/Sub支持: Spring Data Redis支持发布/订阅模式,允许你创建消息发布者和订阅者,以便实现实时消息传递。

3.2、RedisTemplate

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

在这里插入图片描述

3.3、SpringDataRedis使用步骤

SpringBoot已经提供了对SpringBootDataRedis的支持,使用非常方便:

  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><version>2.11.1</version></dependency>
  1. 配置文件
spring:redis:host: 192.168.74.128port: 6379password: 123456lettuce:pool:max-active: 8 # 最大连接max-idle: 8 # 最大空闲连接max-wait: 100  #  最小等待时间min-idle: 0 # 连接等待时间
  1. 注入RedisTemplate
   @Autowiredprivate RedisTemplate redisTemplate;
  1. 测试
    void test001(){//  插入一条数据redisTemplate.opsForValue().set("name","李四");//  读取一条数据Object name = redisTemplate.opsForValue().get("name");System.out.println("name="+name);}

在这里插入图片描述
解决方法

在这里插入图片描述

3.4、SpringDataRedis的序列化方式

可以自定义RedisTemplate的序列化方式,代码如下:

  1. 引入依赖
       <dependency><groupId>com.fasterxml.jackson.core</groupId><artifactId>jackson-databind</artifactId></dependency>
  1. 编写配置类

要求RedisTemplate对象的键使用String类型,值使用Object对象类型

@Configuration
public class RedisConfig {@Beanpublic RedisTemplate<String,Object> redisTemplate(RedisConnectionFactory connectionFactory){//  创建RedisTemplate对象RedisTemplate<String,Object> redisTemplate = new RedisTemplate<>();//  设置连接工厂redisTemplate.setConnectionFactory(connectionFactory);// 创建JSON序列化工具GenericJackson2JsonRedisSerializer jsonRedisSerializer = new GenericJackson2JsonRedisSerializer();//  设置Key的序列化redisTemplate.setKeySerializer(RedisSerializer.string());redisTemplate.setHashKeySerializer(RedisSerializer.string());//  设置Value的序列化redisTemplate.setValueSerializer(jsonRedisSerializer);redisTemplate.setHashValueSerializer(jsonRedisSerializer);//  返 回return  redisTemplate;}}
  1. 测试结果
    @Testvoid test002(){//  插入一条数据redisTemplate.opsForValue().set("user:20",new User("张三",28));//  读取一条数据Object name = redisTemplate.opsForValue().get("user:20");System.out.println("name="+name);}

在这里插入图片描述
这样也有缺点:为了在反序列化时知道对象的类型,JSON序列化器会将类的class类型写入json结果中,存入redis,会带来额外的开销。

四、StringRedisTemplate

解决:JSON序列化器会将类的class类型写入json结果中,存入redis,会带来额外的开销这一问题

4.1、解决方法

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

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

4.2、ObjectMapper介绍

是Java编程语言中常用的库,用于将Java对象与JSON(JavaScript对象表示法)数据之间进行转换。它是Jackson库的一部分,提供了一套用于在Java中处理JSON的数据处理工具。

ObjectMapper主要使用方法

// 将Java对象序列化为JSON字符串String jsonString = objectMapper.writeValueAsString(person);
// 将JSON字符串反序列化为Java对象Person deserializedPerson = objectMapper.readValue(jsonString, 需要待转的对象类.class);

4.3、StringRedisTemplate类

StringRedisTemplate类的使用:

@SpringBootTest
public class RedisString {@Autowiredprivate StringRedisTemplate stringRedisTemplate;//引入ObjectMapperJSON处理类private static final ObjectMapper objectMapper = new ObjectMapper();@Testvoid  testString() throws JsonProcessingException {User user = new User("李四", 14);// 1.存数据// 将User对象转换为Json数据String jsonString  = objectMapper.writeValueAsString(user);System.out.println(jsonString);  // {"username":"李四","age":14}stringRedisTemplate.opsForValue().set("name",jsonString);// 2.取数据String name = stringRedisTemplate.opsForValue().get("name");System.out.println(name);   // {"username":"李四","age":14}//  将JSON数据转为对象格式User user1 = objectMapper.readValue(name, User.class);System.out.println(user1);  //   User(username=李四, age=14)}
}

之前的问题得到了解决:
在这里插入图片描述

五、其它结构的使用

Hash结构的使用:使用基本没有太大差别,更多的是偏向Java代码的这种分格

代码:

  @Testvoid test002(){//  存数据stringRedisTemplate.opsForHash().put("user:23","name","小王");stringRedisTemplate.opsForHash().put("user:23","age","6");// 取一个字段Object name = stringRedisTemplate.opsForHash().get("user:23", "name");System.out.println(name);// 取所有的字段Map<Object, Object> objectMap = stringRedisTemplate.opsForHash().entries("user:23");System.out.println(objectMap);}

测试:

在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/86219.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

RabbitMQ工作模式——PubSub生产者及消费者

PubSub模式生产者代码 public class Producer_PubSub {public static void main(String[] args) throws IOException, TimeoutException {//1.创建连接工厂ConnectionFactory factory new ConnectionFactory();//2.设置参数factory.setHost("172.16.98.133"); ip 默…

JavaWeb 学习笔记 8:AJAX

JavaWeb 学习笔记 8&#xff1a;AJAX AJAX&#xff08;Asynchronous JavaScript And XML&#xff0c;异步 js 和 XML&#xff09;是一种用 js 代码异步&#xff08;或同步&#xff09;的方式请求服务端数据&#xff0c;并在页面显示或加载的技术。 1.快速入门 先看如何用纯 …

STM32-无人机-电机-定时器基础知识与PWM输出原理

电机控制基础——定时器基础知识与PWM输出原理 - 掘金单片机开发中&#xff0c;电机的控制与定时器有着密不可分的关系&#xff0c;无论是直流电机&#xff0c;步进电机还是舵机&#xff0c;都会用到定时器&#xff0c;比如最常用的有刷直流电机&#xff0c;会使用定时器产生PW…

Linux学习记录——삼십 socket编程---udp套接字

文章目录 UDP套接字简单通信1、服务端1、创建文件&#xff0c;写框架2、用命令行参数调起程序3、服务端运行逻辑 2、客户端1、创建套接字2、发送数据 3、测试4、通信5、加功能1、处理数据2、群聊 6、Windows下socket编程的不同 UDP套接字简单通信 1、服务端 1、创建文件&…

【C语言学习笔记---内存函数】

C语言程序设计笔记---019 C语言进阶之内存函数1、memcpy函数1.1、模拟实现memcpy 2、memmove函数2.1、模拟实现memmove函数 3、memset函数4、memcmp函数5、结语 C语言进阶之内存函数 前言&#xff1a; 通过C语言进阶前篇的字符串函数的知识&#xff0c;继续C语言的内存函数学习…

vue+element plus 使用table组件,清空用户的选择项

<el-table ref"tableRef"> .... </el-table> <script lang"ts" setup> import { onMounted, reactive, ref, nextTick } from vue const clearBtn () > {console.log(清空用户的选择项)tableRef.value.clearSelection() } </scr…

基于Java的酒店管理系统

博主主页&#xff1a;猫头鹰源码 博主简介&#xff1a;Java领域优质创作者、CSDN博客专家、公司架构师、全网粉丝5万、专注Java技术领域和毕业设计项目实战 主要内容&#xff1a;毕业设计(Javaweb项目|小程序等)、简历模板、学习资料、面试题库、技术咨询 文末联系获取 项目介绍…

洛谷P5660:数字游戏 ← CSP-J 2019 复赛第1题

【题目来源】https://www.luogu.com.cn/problem/P5660https://www.acwing.com/problem/content/1163/【题目描述】 小 K 同学向小 P 同学发送了一个长度为 8 的 01 字符串来玩数字游戏&#xff0c;小 P 同学想要知道字符串中究竟有多少个 1。 注意&#xff1a;01 字符串为每一个…

docker alpine:3.16 root权限安装Anaconda3-2020.07-Linux-x86_64和jdk

首先查看系统版本: rootfv-az454-287:/tmp# uname -a Linux fv-az454-287 5.15.0-1046-azure #53~20.04.1-Ubuntu SMP Mon Aug 28 14:17:23 UTC 2023 x86_64 x86_64 x86_64 GNU/Linux rootfv-az454-287:/tmp# grep NA /etc/os-release NAME"Ubuntu" PRETTY_NAME&q…

【VIM安装ctags cscope】

一、安装软件包 sudo passwd root sudo apt install cmake python2-dev python3-dev build-essential cmake flex bison -y sudo apt install universal-ctags cscope vim git -y sudo apt install python-is-python3 -y sudo apt-get install build-essential libncurses-dev…

算法 - 栈和队列

算法 - 栈和队列 算法 - 栈和队列 栈 1. 数组实现2. 链表实现 队列 栈 public interface MyStack<Item> extends Iterable<Item> {MyStack<Item> push(Item item);Item pop() throws Exception;boolean isEmpty();int size();}1. 数组实现 public class A…

在c#中使用CancellationToken取消任务

目录 &#x1f680;介绍&#xff1a; &#x1f424;简单举例 &#x1f680;IsCancellationRequested &#x1f680;ThrowIfCancellationRequested &#x1f424;在控制器中使用 &#x1f680;通过异步方法的参数使用cancellationToken &#x1f680;api结合ThrowIfCancel…

Docker Compose初使用

简介 Docker-Compose项目是Docker官方的开源项目&#xff0c;负责实现对Docker容器集群的快速编排。 Docker-Compose将所管理的容器分为三层&#xff0c;分别是 工程&#xff08;project&#xff09;&#xff0c;服务&#xff08;service&#xff09;以及容器&#xff08;cont…

【论文阅读 09】融合门控自注意力机制的生成对抗网络视频异常检测

2021年 中国图象图形学报 摘 要 背景&#xff1a; 视频异常行为检测是智能监控技术的研究重点&#xff0c;广泛应用于社会安防领域。当前的挑战之一是如何提高异常检测的准确性&#xff0c;这需要有效地建模视频数据的空间维度和时间维度信息。生成对抗网络&#xff08;GANs&…

langchain +gpt 报错 SSLError

解决版本2种 一加入下面代码: https://www.zhihu.com/question/588395420 import os os.environ["http_proxy"] "http://127.0.0.1:7890" os.environ["https_proxy"] "http://127.0.0.1:7890"二降低urllib3版本 urllib3 1.25.11错…

Stable Diffusion 系统教程 | 强大的ControlNet 控制网

2023年的2月13日&#xff0c;一款名叫ControlNet的插件横空出世&#xff0c;AI绘画变得更加可控 ControlNet直译过来很简单&#xff0c;就叫做控制网&#xff0c;开发者是一名华裔&#xff0c;毕业于苏州大学&#xff0c;目前在斯坦福做读博士一年级&#xff0c;大佬大佬&…

【lesson10】fork创建进程的现象解答

文章目录 fork现象fork问题 fork现象 我们先来看一段代码。 大家觉得这段代码的printf会打印几次&#xff1f; 结果&#xff1a; 我们可以清楚的看到&#xff0c;第二个printf打印了2次。 我们再来看一段不可思议的代码&#xff1a; 运行结果&#xff1a; 我们可以看到这r…

批量、在线学习, 参数、非参数学习

批量学习&#xff08;Batch Learning&#xff09;和在线学习&#xff08;Online Learning&#xff09; 批量学习 批量学习的概念非常容易理解&#xff0c;我们之前介绍的许多机器学习算法&#xff0c;如果没有特殊说明&#xff0c;都可以采用批量学习的方式。批量学习的过程通…

第35节——useLayoutEffect——了解

一、概念 组件挂载或渲染完成后调用。useLayoutEffect使用方法、所传参数和useEffect完全相同。 他们的不同点在于&#xff0c;你可以把useLayoutEffect等同于componentDidMount、componentDidUpdate&#xff0c;因为他们调用阶段是相同的。而useEffect是在componentDidMount…