Spring Data【Spring Data Redis、Spring Data ElasticSearch】(二)-全面详解(学习总结---从入门到深化)

 

目录

四、 Spring Data Redis

五、 Spring Data ElasticSearch


四、 Spring Data Redis

Redis 是一个基于内存的数据结构存储系统,它可以用作数据库或者缓存。它支持多种 类型的数据结构,这些数据结构类型分别为 String(字符串)、List(列表)、Set(集合)、 Hash(散列)和 Zset(有序集合)。

Spring Data Redis 通过一段简单的配置即可让 JAVA 程序访问 redis 服务,它的底层 是对 redis 开发包(如 Jedis、JedisPool)的高度封装。

1 Spring Data Redis 项目搭建

1. 安装 redis

2. 安装 RedisDesktopManager

3. 创建 SpringBoot 项目,创建时加入 Spring Data Redis 起步依赖。

4. 写配置文件

spring:redis:# Redis 服务器主机。host: localhost# Redis 服务器端口。port: 6379jedis:pool:# 连接池在给定时间可以分配的最大连接数。max-active: 8# 连接池中空闲连接的最大数量。max-idle: 8# 连接池中空闲连接的最小数量。min-idle: 0

5. 测试

// 注:对象名必须叫 redisTemplate,否则由于容器中有多个 RedisTemplate 类型对象造成无法注入
@Autowired
private RedisTemplate redisTemplate;
@Test
public void t1() {//获取操作 string 数据的工具ValueOperations operations = redisTemplate.opsForValue();operations.set("name","tong"); // 存Object name = operations.get("name"); // 取System.out.println(name);
}

2 序列化器

在入门案例中,我们看到 Spring Data Redis 存入 Redis 的是一串二进制数据,这是因为 Spring Data Redis 在保存数据的时候,底层有一个序列化器在工作,它会将要保存的数据(键和值)按照一定的规则进行序列化操作后再进行存储。spring-data-redis 提供如 下几种序列化器:

JdkSerializationRedisSerializer: 默认,序列化为二进制数据

StringRedisSerializer: 简单的序列化为字符串

GenericToStringSerializer: 可以将任何对象序列化为字符串

Jackson2JsonRedisSerializer: 序列化对象为 json 字符串

GenericJackson2JsonRedisSerializer:功能同上,但是更容易反序列化

OxmSerializer: 序列化对象为 xml

如果想改变使用的序列化器,可以通过 redisTemplate 对象设置。

redisTemplate.setKeySerializer(new StringRedisSerializer());
redisTemplate.setValueSerializer(new StringRedisSerializer());

3 Spring Data Redis 操作 string

在 Redis 中有五种常见类型,Spring Data Redis 对每一种数据类型都提供了一 个 xxxOperations的工具类,分别是:

 ValueOperations:用来操作 string 类型数据

 HashOperations: 用来操作 hash 类型数据

 ListOperations:用来操作 list 类型数据

 SetOperations:用来操作 set 类型数

  ZSetOperations:用来操作 zset

RedisTemplate 常用方法:

 delete(K key):删除键值对

 delete(Collection keys):批量删除

ValueOperations 的常用方法:

 void set(K key, V value):设置键值对

 void set(K key, V value, long timeout, TimeUnit unit):设置有时效的键值对

 void multiSet(Map map):批量设置键值对

 V get(Object key):获取值

 List multiGet(Collection keys):批量获取值

 Long size(K key):获取值的长度

 Long increment(K key):数字类型值自增

 Long increment(K key, long delta):数字类型值自增设定值

 Long decrement(K key):数字类型值自减

 Long decrement(K key, long delta):数字类型值自减设定值

4 Spring Data Redis 操作 hash

HashOperations 的常用方法:

 put(H key, HK hashKey, HV value):新增 hash

 HV get(H key, Object hashKey):获取 hash 的值

 Boolean hasKey(H key, Object hashKey):判断 hash 是否有该键

 Set keys(H key):获取 hash 的所有键

 List values(H key):获取 hash 的所有值

 Map entries(H key):获取 hash 的所有键值对

 Long delete(H key, Object... hashKeys):根据 hash 的键删除 hash 的值

5 Spring Data Redis 操作 list

 Long leftPush(K key, V value):左侧加入元素

 Long leftPushAll(K key, V... values):左侧加入多个元素

 Long rightPush(K key, V value):右侧加入元素

 Long rightPushAll(K key, V... values):右侧加入多个元素

 V index(K key, long index) 根据索引进行查询:

        0 开始代表从左开始:0 1 2...

        -1 开始代表从右开始:-1 -2 -3...

 List range(K key, long start, long end):根据索引范围查询

 V leftPop(K key):从左删除一个元素

 V rightPop(K key):从右删除一个元素

6 Spring Data Redis 操作 set

 Long add(K key, V... values):添加元素

 Set members(K key):查看所有元素

 V randomMember(K key):随机获取一个元素

 Long remove(K key, Object... values):删除多个元素

 Set intersect(K key, K otherKey):两个 set 取交集

 Set union(K key, K otherKey):两个 set 取并集

7 Spring Data Redis 操作 zse

Boolean add(K key, V value, double score):添加元素

 Double incrementScore(K key, V value, double delta):为元素增减分数

 Double score(K key, Object o):查询一个元素的分数

 Long rank(K key, Object o):查询一个元素在集合中的排名,从 0 开始

 Set range(K key, long start, long end):根据排名区间来获取元素列表

 Set> rangeWithScores(K key, long start, long end):根据 排名区间来获取元素列表,包括分数

 Set rangeByScore(K key, double min, double max):根据分数区间来获取 元素列表

 Set> rangeByScoreWithScores(K key, double min, double max):根据分数区间来获取元素列表,包括分数

 Long zCard(K key):统计集合大小

 Long count(K key, double min, double max):统计分数区间的元素数量

 Long remove(K key, Object... values):根据 key 删除元素

 Long removeRange(K key, long start, long end):根据排名区间删除元素

 Long removeRangeByScore(K key, double min, double max):根据分数区间删除元素

 

8 使用 Repository 操作 Redis 

一般我们更多的时候使用 Template 方式操作 Redis,因为 Redis 并不像关系型数据库 存入的大部分是对象,操作 Redis 也不一定和对象相关。所以使用 Repository 操作 Redis 的方式我们了解即可。

创建实体类:
// 表示将对象存入 key 为 student 的 hash 中
@RedisHash("student")
public class Student {// hash 的键存的是 id 字段@Idprivate String id;private String name;private Integer age;// 省略 getter/setter、构造方法、toString 方法}创建 Repository 接口:
public interface StudentRepository extends CrudRepository<Student, String> {}

 测试:

@Autowired
private StudentRepository studentRepository;
@Test
public void t1() {Student student = new Student("1001", "懒羊羊", 10);studentRepository.save(student);
}

五、 Spring Data ElasticSearch

1 概念

Elasticsearch 是一个实时的分布式搜索和分析引擎。它底层封装了 Lucene 框架,可以提供分布式全文检索服务。

Spring Data ElasticSearch 是 SpringData 技术对 ElasticSearch 原生 API 封装之后的 产物,它通过对原生 API 的封装,使得程序员可以简单的对 ElasticSearch 进行各种操作。

2 Elasticsearch 回顾

2.1 核心概念

 索引(index):索引是一个拥有几分相似特征的文档的集合,类似于关系型数据 库中的库的概念。

 类型(type):类型是索引中的一个逻辑上的分类/分区,类似于关系型数据库中的数据表的概念。

 文档(document):文档是一个可被索引的基础信息单元,类似于关系型数据库中的记录的概念。

 域(Fied):document 由多个域组成,不同类型的 document 里面同名的 field一定具有相同的类型,类似于关系型数据库中的字段的概念。

ElasticSearch 跟关系型数据库中概念的对比: 

注:ES7.X 之后删除了 type 的概念,一个索引不会代表一个库,而是代表一张表。我们课程中使用 ES7,所以此时概念对比为:

 

2.2 安装 ElasticSearch

        2.2.1 安装 ES 服务

          1. 解压 elasticsearch 压缩文件

          2. 解压 elasticsearch-analysis-ik,将解压后的文件夹拷贝到 elasticsearch 的 plugins 目录下

          3. 修改 es 服务器 config 目录下的 yml 文件,加入以下配置

                    http.cors.enabled: true 

                    http.cors.allow-origin: "*"

           4. 启动 bin/elasticsearch.bat

           5. 访问 http://127.0.0.1:9200 

2.2.2 安装 ES 图形化管理软件 kibana

ES 需要一个图形化管理软件方便我们操作,此处我们安装 kibana。

        1. 解压 kibana 压缩文件

        2. 启动 bin/kibana.bat

        3. 访问 http://127.0.0.1:5601 

 2.3 使用 Restful 风格的 http 请求方式操作 ES

创建索引

路径:localhost:9200/索引
提交方式:put
请求体:
{ "settings":{ "number_of_shards":5, "number_of_replicas":1},"mappings":{ "properties":{"id":{ "type":"long", "store":true},"title":{"type":"text", "store":true, "index":true, "analyzer":"ik_smart},"content":{"type":"text", "store":true, "index":true, "analyzer":"ik_max_word"}}}
}

创建/修改文档

路径:localhost:9200/索引/_doc/[文档id]
提交方式:POST
请求体:
{ "id":1, "title":"ElasticSearch是一个基于Lucene的搜索服务器", "content":"提供了一个分布式多用户能力的全文搜索引擎,基于RESTful web接口。"
}

删除文档

路径:localhost:9200/索引/_doc/文档 id
提交方式:DELETE

查询文档

路径:localhost:9200/索引/_search
提交方式:POST
请求体:
{ "query": {"查询类型": {"查询属性": "查询条件值"}}}
查询类型:match_all、term、range、fuzzy等

使用 SQL 查询文档

在 ES7.X 版本后,ES支持原生 SQL 查询文档

路径:localhost:9200/_sql?format=txt
提交方式:POST
请求体:
{"query": "SELECT * FROM travel where id = 1"
}

2.4 使用 JAVA 原生代码操作 ES

使用 JAVA 原生代码操作 ES 代码非常繁琐,我们了解一下即可。

这是一段创建索引的代码:

CreateIndexRequest request = new CreateIndexRequest(indexName);
request.settings(Settings.builder().put("index.number_of_shards", 3).put("index.number_of_replicas", 2)
);
// 创建索引结构,es7 及以后去掉了映射类型
XContentBuilder builder = XContentFactory.jsonBuilder();
builder.startObject().startObject("properties").startObject("name").field("type", "text").field("analyzer", "ik_smart").endObject().startObject("age").field("type", "integer").endObject().startObject("desc").field("type", "text").field("analyzer", "ik_smart").endObject().startObject("id").field("type", "integer").endObject().endObject()
.endObject();
request.mapping(builder);
CreateIndexResponse response = restHighLevelClient.indices().create(request, RequestOptions.DEFAULT);
// 指示是否所有节点都已确认请求
boolean acknowledged = response.isAcknowledged();
// 指示是否在超时之前为索引中的每个分片启动了必需的分片副本数
boolean shardsAcknowledged = response.isShardsAcknowledged();
if (acknowledged || shardsAcknowledged) {log.info("创建索引成功!索引名称为{}", indexName);return true;
}
return false;

由于使用 JAVA 原生代码操作 ES 代码非常繁琐,我们在开发中更多使用 Spring Data ElasticSearch 框架操作 ES,下面我们就学习使用 Spring Data ElasticSearch。

 3 Spring Data ElasticSearch 项目搭建

1. 创建 SpringBoot 项目,创建时加入 Spring Data Redis 起步依赖。

2. 写配置文件

spring:elasticsearch:rest:uris: http://localhost:9200

3. 创建实体类

@Document(indexName = "travel")
public class Product {@Id@Field(type = FieldType.Integer,store = true)private Integer id;@Field(type = FieldType.text,store = true,analyzer = "ik_max_word")private String productName;@Field(type = FieldType.text,store = true,analyzer = "ik_max_word")private String productDesc;
}

@Document:标记在类上,标记实体类为文档对象,一般有以下属性,如下:

         indexName:对应索引库的名称

         shards:分片数量

         replicas:副本数量

         createIndex:是否自动创建索引 @Id:标记在成员变量上,标记一个字段作为主键 @Field:标记在成员变量上,标记为文档中的字段,并指定字段映射属性:

         type:字段类型

         index:是否索引,默认是 true

         store:是否存储,默认是 false

         analyzer:分词器名称

         searchAnalyzer:搜索时的分词器名称

4. 创建 ProductRepository 接口继承 ElasticsearchRepository

5. 在测试类注入

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

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

相关文章

Flutter 开发者工具 Android Studio 开发Flutter应用

Flutter 开发者工具 在 Android Studio 开发Flutter应用 &#x1f525; Android Studio 版本更新 &#x1f525; Android Studio Check for Update Connection failed ​ 解决方案 如果是运行的是32位的android studio需要在andriod studio的启动目录下找到studio.exe.vmoptio…

WIZnet W5100S-EVB-Pico DHCP 配置教程(三)

DHCP协议介绍 什么是DHCP&#xff1f; 动态主机配置协议DHCP&#xff08;Dynamic Host Configuration Protocol&#xff09;是一种网络管理协议&#xff0c;用于集中对用户IP地址进行动态管理和配置。 DHCP于1993年10月成为标准协议&#xff0c;其前身是BOOTP协议。DHCP协议由…

Python批量下载主播照片,实现人脸识别, 进行颜值评分,制作颜值排行榜

昨晚一回家&#xff0c;表弟就神神秘秘的跟我说&#xff0c;发现一个高颜值网站&#xff0c;非要拉着我研究一下她们的颜值高低。 我心想&#xff0c;这还得要我一个个慢慢看&#xff0c;太麻烦了~ 于是反手用Python给他写了一个人脸识别代码&#xff0c;把她们的照片全部爬下…

【TiDB理论知识 07】SQL执行流程

一 DML语句读写流程 1 DML语句读流程概要 用户发出SQL 被协议层接收 Protocal Layer 通过PD获取时间戳 parse模块 解析SQL&#xff0c;通过词法解析 与 语法解析 生成AST语法树 编译SQL Compile模块 ,区分点查 与 非点查&#xff0c;生成执行计划 发送给Executor,从TIKV获…

AAOS 音频焦点请求

文章目录 前言基本概念提供给应用来获取音频焦点的apiAAOS中的音频焦点管理交互矩阵duck的实现流程AAOS 测试应用kitchensink焦点相关 前言 本文章的目标是首先了解Android中音频焦点的基本概念&#xff0c;理解代码中相关音频焦点的使用方法。其次理解AAOS 中相关交互矩阵概念…

【Linux】Centos的一些快捷操作

Centos的一些快捷操作 一个窗口多个终端GVIM 一个窗口多个文件 一个窗口多个终端 GVIM 一个窗口多个文件

Hadoop学习指南:探索大数据时代的重要组成——Hadoop概述

前言 在当今大数据时代&#xff0c;处理海量数据成为了一项关键任务。Hadoop作为一种开源的分布式计算框架&#xff0c;为大规模数据处理和存储提供了强大的解决方案。本文将介绍Hadoop的组成和其在大数据处理中的重要作用&#xff0c;让我们一同踏上学习Hadoop的旅程。 Hado…

Jenkins集成SonarQube保姆级教程

Jenkins是自动化部署平台&#xff0c;一个粗眉大眼的糙汉子&#xff01; SonarQube是代码扫描平台&#xff0c;一个眉目清秀的小女子&#xff01; 有一天&#xff0c;上天交给我一个任务&#xff0c;去撮合撮合他们&#xff01; 我抬头看了看天&#xff0c; 不&#xff0c;…

2023-07-30 LeetCode每日一题(环形链表 II)

2023-07-30每日一题 一、题目编号 142. 环形链表 II二、题目链接 点击跳转到题目位置 三、题目描述 给定一个链表的头节点 head &#xff0c;返回链表开始入环的第一个节点。 如果链表无环&#xff0c;则返回 null。 如果链表中有某个节点&#xff0c;可以通过连续跟踪 n…

Centos7中实现脚本使用mysqldump实现分库分表备份

脚本 #!/bash/bin userroot #用户名 password123456 #密码 back_path/backup/db databases_file/backup/databases.list [ -f $databases_file ] || touch /backup/databases.list if [[ ! -s ${databases_file} ]] then while read line do[ -d ${back_path}/$line ] …

【Python】数据分析+数据挖掘——探索Pandas中的数据筛选

1. 前言 当涉及数据处理和分析时&#xff0c;Pandas是Python编程语言中最强大、灵活且广泛使用的工具之一。Pandas提供了丰富的功能和方法&#xff0c;使得数据的选择、筛选和处理变得简单而高效。在本博客中&#xff0c;我们将重点介绍Pandas中数据筛选的关键知识点&#xff…

Git的.gitignore文件、标签管理以及给命令起别名

文章目录 1. 前言2. .gitignore文件3. 标签管理4. 给命令起别名 1. 前言 本文主要讲解Git中容易被忽略但比较重要一些知识:.gitignore文件、标签管理以及给命令起别名. 2. .gitignore文件 在新建仓库时,有一个添加.gitignore 模板: .gitignore 是一个用于指定 Git 忽略特定文…

第 356 场力扣周赛题解

A 满足目标工作时长的员工数目 签到题 class Solution { public:int numberOfEmployeesWhoMetTarget(vector<int> &hours, int target) {int res 0;for (auto x: hours)if (x > target)res;return res;} };B 统计完全子数组的数目 枚举子数组&#xff1a;枚举子数…

web-暴力破解密码

Burte Force&#xff08;暴力破解&#xff09;概述 暴力破解”是一攻击具手段&#xff0c;在web攻击中&#xff0c;一般会使用这种手段对应用系统的认证信息进行获取。 其过程就是使用大量的认证信息在认证接口进行尝试登录&#xff0c;直到得到正确的结果。 为了提高效率&…

【iOS】KVOKVC原理

1 KVO 键值监听 1.1 KVO简介 KVO的全称是Key-Value Observing&#xff0c;俗称"键值监听"&#xff0c;可以用于监听摸个对象属性值得改变。 KVO一般通过以下三个步骤使用&#xff1a; // 1. 添加监听 [self.student1 addObserver:self forKeyPath:"age"…

protobuf数据类型

protobuf特殊数据类型 一&#xff0c;特殊数据类型1&#xff0c;enum使用规则注意事项 2&#xff0c;Any3&#xff0c;oneof4&#xff0c;map通讯录demo升级 二&#xff0c;默认值三&#xff0c;更新消息更新规则保留字段reserved未知字段获取未知字段 四&#xff0c;选项optio…

时频分析方法的matlab实现

傅里叶变换 function [ output_args ] example3_7( input_args ) %EXAMPLE3_7 Summary of this function goes here % Detailed explanation goes here clc; clear; fs12800;%采样频率 s1load(Sig1.txt); s2load(Sig2.txt); lslength(s1); figure(1) subplot(211) plot…

Cilium 系列-7-Cilium 的 NodePort 实现从 SNAT 改为 DSR

系列文章 Cilium 系列文章 前言 将 Kubernetes 的 CNI 从其他组件切换为 Cilium, 已经可以有效地提升网络的性能。但是通过对 Cilium 不同模式的切换/功能的启用&#xff0c;可以进一步提升 Cilium 的网络性能。具体调优项包括不限于&#xff1a; 启用本地路由 (Native Rou…

西安市未央区地方财政支出绩效管理研究_kaic

摘 要 目前传统的地方财政绩效管理研究普遍上主要集中在有关收入研究方面上&#xff0c;而对其支出的规模以及各类结构的研究较少。我国大部分地方财政政府的财政收入低下&#xff0c;财政支出效率有限&#xff0c;不能很好的为其地方经济提供较为稳定的社会支撑和经济保障。造…

SQL基础使用

SQL的概述 SQL全称&#xff1a; Structured Query Language&#xff0c;结构化查询语言&#xff0c;用于访问和处理数据库的标准的计算机语言。 SQL语言1974年由Boyce和Chamberlin提出&#xff0c;并首先在IBM公司研制的关系数据库系统SystemR上实现。 经过多年发…