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

news2024/11/15 15:49:30

 

目录

四、 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: 6379
    jedis:
      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 字段
    @Id
    private 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.coloradmin.cn/o/810991.html

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

相关文章

0基础系列C++教程 从0开始 第四课

目录 来学习新的内容吧 1 输入 第四课课后习题1&#xff1a; 2 变量 怎么定义变量&#xff1f; 定义变量 第四课课后习题2&#xff1a; 来学习新的内容吧 1 输入 C中既然有了输出 那必然有输入 这时 我们就要用到 cin 函数啦 cin 用法与cout 相似 但却有一个差异 co…

Vue(十八):echarts地图省市区联动

效果 数据来源 https://datav.aliyun.com/portal/school/atlas/area_selector 接口请求地址 https://geo.datav.aliyun.com/areas_v3/bound/geojson?code100000_full 源码 样式 .map {width: 1000px;height: 700px; }布局 <template><div class"map">…

linux -网络编程-多线程并发服务器

目录 1.三次握手和四次挥手 2 滑动窗口 3 函数封装思想 4 高并发服务器 学习目标&#xff1a; 掌握三次握手建立连接过程掌握四次握手关闭连接的过程掌握滑动窗口的概念掌握错误处理函数封装实现多进程并发服务器实现多线程并发服务器 1.三次握手和四次挥手 思考: 为什么…

linux centos7 安装java17

删除旧版本的java或者说是自带的&#xff0c;免得干扰 查找java rpm -qa|grep java java-1.8.0-openjdk-1.8.0.262.b10-1.el7.x86_64 javapackages-tools-3.4.1-11.el7.noarch tzdata-java-2020a-1.el7.noarch python-javapackages-3.4.1-11.el7.noarch java-1.8.0-open…

力扣热门100题之矩阵置0【中等】

题目描述 给定一个 m x n 的矩阵&#xff0c;如果一个元素为 0 &#xff0c;则将其所在行和列的所有元素都设为 0 。请使用 原地 算法。 示例 1&#xff1a; 输入&#xff1a;matrix [[1,1,1],[1,0,1],[1,1,1]] 输出&#xff1a;[[1,0,1],[0,0,0],[1,0,1]] 示例 2&#xff…

❤️创意网页:萌翻少女心的果冻泡泡 - 创造生动有趣的视觉效果

✨博主&#xff1a;命运之光 &#x1f338;专栏&#xff1a;Python星辰秘典 &#x1f433;专栏&#xff1a;web开发&#xff08;简单好用又好看&#xff09; ❤️专栏&#xff1a;Java经典程序设计 ☀️博主的其他文章&#xff1a;点击进入博主的主页 前言&#xff1a;欢迎踏入…

计算机网络(Computer Networks)基础

本篇介绍计算机网络的基础知识。 文章目录 1. 计算机网络历史2. 以太网" (Ethernet)2.1 以太网" (Ethernet)的简单形式及概念2.2 指数退避解决冲突问题2.3 利用交换机减少同一载体中设备2.4 互联网&#xff08;The Internet&#xff09;2.5 路由(routing)2.6 数据包…

渗透测试基础知识(1)

渗透基础知识一 一、Web架构1、了解Web2、Web技术架构3、Web客户端技术4、Web服务端组成5、动态网站工作过程6、后端存储 二、HTTP协议1、HTTP协议解析2、HTTP协议3、http1.1与http2.0的区别4、HTTP协议 三、HTTP请求1、发起HTTP请求2、HTTP响应与请求-HTTP请求3、HTTP响应与请…

typedef对类型的重命名

typedef 重命名的类型 重命名后的类型名 typedef重命名函数指针类型时的特别写法 正确的重命名函数指针类型的方式 运用&#xff1a; 用typedef简化下面这个代码 简化后&#xff1a;

【C语言day11】

数据类型的等级从低到高如下&#xff1a;char int long float double运算的时候是从低转到高的&#xff0c;表达式的类型会自动提升或者转换为参与表达式求值的最上级类型 #include <stdio.h> int main() {int x -1;unsigned int y 2;if (x > y){printf("x is …

使用Express部署Vue项目

使用Express部署Vue项目 目录 1. 背景 2. 配置Vue CLI 1.1 安装nodejs 1.2 创建vue-cli 1.3 创建vue项目 1.4 构建vue项目3. 配置Express 2.1 安装express 2.2 创建项目4. 使用express部署vue项目 1&#xff0c;背景 我们想要做一个前后端分离的课程项目&#xff0c;前端…

nacos2.2.3最新版启动所遇到的问题总结

前言 有问题就看官方文档&#xff0c;看不懂或者还是报错再看博客&#xff01;因为有时候忙的焦头烂额&#xff0c;却发现官方写的非常清楚&#xff0c;而且人家还自带一个example示例&#xff0c;自己都没有看&#xff0c;自己瞎折腾&#xff01;本人吃过亏&#xff0c;特此提…

svo2论文

论文题目 SVO: Semidirect Visual Odometry for Monocular and Multicamera Systems 内容 1&#xff09; 具有最小特征漂移的长特征轨迹&#xff1b; 2&#xff09; 图像平面中的大量均匀分布的特征&#xff1b; 3&#xff09;新特征与旧地标的可靠关联&#xff08;即环路闭…

mybatisPlus主键策略解读

目录 主键生成策略介绍 AUTO策略 INPUT策略 ASSIGN_ID策略 NONE策略 ASSIGN_UUID策略 主键生成策略介绍 主键的作用就是唯一标识&#xff0c;我们可以通过这个唯一标识来定位到这条数据。当然对于表数据中的主键&#xff0c;我们可以自己设计生成规则&#xff0c;生成主键…

收藏与掘出 沉淀与成长

收藏从未停止&#xff0c;练习从未开始——掘出那些闪光的宝藏 目录 引言&#xff1a;收藏的深意分享一道你收藏的好题分享一个你收藏的便捷技巧积灰这么久&#xff0c;这个当时被你收藏的东西对现在的你还有用吗&#xff1f;结语&#xff1a;掘出 引言&#xff1a;收藏的深意 …

Python(二)

最怕你一生碌碌无为&#xff0c;还安慰自己平凡可贵。 --可以import 函数 变量 类啊 等等 -- 不一 一写了 大家自己写吧 -- 命名尽量不要使用大写或者中文 --比较运算符 又名 关系运算符 后面更新&#xff0c;请看后续 Python(二)

速度快\颜色准\功能多,移动端HEIF图片解码实现方案

HEIF图片压缩格式是一种使用HEVC编码技术存储图像数据的方式&#xff0c;在同等质量下相比JPEG可节省50%以上空间&#xff0c;无论是节约包体还是节省带宽&#xff0c;使用HEIF格式都能有所收益。 基于百度智能云音视频处理MCP的自研BD265编码器&#xff0c;百度智能云对象存储…

联想北京公司研发管理部高级经理周燕龙受邀为第十二届中国PMO大会演讲嘉宾

联想&#xff08;北京&#xff09;有限公司研发管理部高级经理周燕龙先生受邀为由PMO评论主办的2023第十二届中国PMO大会演讲嘉宾&#xff0c;演讲议题&#xff1a;PMO如何助力研发。大会将于8月12-13日在北京举办&#xff0c;敬请关注&#xff01; 议题简要&#xff1a; PMO在…

Spring的加载配置文件、容器和获取bean的方式

&#x1f40c;个人主页&#xff1a; &#x1f40c; 叶落闲庭 &#x1f4a8;我的专栏&#xff1a;&#x1f4a8; c语言 数据结构 javaweb 石可破也&#xff0c;而不可夺坚&#xff1b;丹可磨也&#xff0c;而不可夺赤。 Spring配置文件和容器相关 一、加载properties文件1.1加载…

【1.2】Java微服务:SpringCloud概论

✅作者简介&#xff1a;大家好&#xff0c;我是 Meteors., 向往着更加简洁高效的代码写法与编程方式&#xff0c;持续分享Java技术内容。 &#x1f34e;个人主页&#xff1a;Meteors.的博客 &#x1f49e;当前专栏&#xff1a; 微服务 ✨特色专栏&#xff1a; 知识分享 &#x…