Redis查询之RediSearch和RedisJSON讲解

news2024/12/24 3:26:04

文章目录

  • 1 Redis查询
    • 1.1 RedisMod介绍
    • 1.2 安装Redis
    • 1.3 RediSearch+RedisJSON安装
      • 1.3.1 下载安装
      • 1.3.2 修改配置
    • 1.4 RedisJSON操作
      • 1.4.1 基本操作
        • 1.4.1.1 保存操作JSON.SET
        • 1.4.1.2 读取操作JSON.GET
        • 1.4.1.3 批量读取操作JSON.MGET
        • 1.4.1.4 删除操作JSON.DEL
        • 1.4.1.5 其他命令
        • 1.4.1.6 综合操作
      • 1.4.2 Java 来操作 redis Json
    • 1.5 RediSearch操作
      • 1.5.1 查询语法
      • 1.5.2 建立索引
      • 1.5.3 操作

1 Redis查询

1.1 RedisMod介绍

首先介绍下RedisMod这个东西,它是一系列Redis的增强模块。有了RedisMod的支持,Redis的功能将变得非常强大。目前RedisMod中包含了如下增强模块:

  • RediSearch:一个功能齐全的搜索引擎;
  • RedisJSON:对JSON类型的原生支持;
  • RedisTimeSeries:时序数据库支持;
  • RedisGraph:图数据库支持;
  • RedisBloom:概率性数据的原生支持;
  • RedisGears:可编程的数据处理;
  • RedisAI:机器学习的实时模型管理和部署。

1.2 安装Redis

Redis这些模块都是依赖于Redis,因此先要安装Redis
点击了解Redis单机安装
点击了解Redis集群安装

1.3 RediSearch+RedisJSON安装

1.3.1 下载安装

下载RediSearch+RedisJSON地址:https://redis.com/redis-enterprise-software/download-center/software/
在这里插入图片描述
redis 安装目录下新建 module 文件夹,把获取到的rejson.somodule-enterprise.so(可以重命名为redissearch.so)文件 放到 module 文件夹中

1.3.2 修改配置

修改 文件 为可执行权限
chmod +x rejson.so
chmod +x module-enterprise.so

修改 redis.conf,搜索 loadmodule
loadmodule /root/software/redis-6.0.6/module/rejson.so
loadmodule /root/software/redis-6.0.6/module/module-enterprise.so
重启 redis
/usr/local/redis-6.2.6/bin/redis-cli -a 123456 shutdown
/usr/local/redis-6.2.6/bin/redis-server conf/redis.conf

1.4 RedisJSON操作

命令行体验 json 的操作

1.4.1 基本操作

1.4.1.1 保存操作JSON.SET

语法:

JSON.SET <key> <path> <json>  [NX | XX]

参数说明:

  • 对于新的Keypath需要使用$.
  • 对于已经存在Key,在进行保存操作之后,原来path路径的值将会被替换掉;
  • NX:表示只有Key不存在,才执行保存操作
  • XX:表示只有Key存在,才执行保存操作
  • 通过命令type doc可以查看到存储进去的数据是ReJSON-RL类型

1.4.1.2 读取操作JSON.GET

语法:

JSON.GET <key>
         [INDENT indentation-string]
         [NEWLINE line-break-string]
         [SPACE space-string]
         [path ...]

参数说明:

  • 允许使用多个path进行查询
  • INDENT 查询结果替换掉默认缩进字符(用于返回Pretty-formatted JSON
  • NEWLINE 查询结果替换掉默认换行符(用于返回Pretty-formatted JSON
  • SPACE 查询结果替换掉默认空格(用于返回Pretty-formatted JSON
  • 获取JSON对象中的属性时需要以.开头

1.4.1.3 批量读取操作JSON.MGET

语法:

JSON.MGET <key> [key ...] <path>

参数说明:

  • 最后一个参数作为path进行处理
  • 遍历每一个Keypath,如果不存在,则返回null

例子:

先保存两条记录
JSON.SET doc1 $ '{"a":1, "b": 2, "nested": {"a": 3}, "c": null}'
JSON.SET doc2 $ '{"a":4, "b": 5, "nested": {"a": 6}, "c": null}'

再进行mget操作
JSON.MGET doc1 doc2 $..a

执行结果:
1) "[1,3]"
2) "[4,6]"

1.4.1.4 删除操作JSON.DEL

语法:

JSON.DEL <key> [path]

参数说明:

  • path是可选的,如果没有输入,则默认整个Key删除掉

例子:

JSON.DEL doc $..a

结果:
"2"

1.4.1.5 其他命令

除了上面的几种常见操作,官方还支持如下命令,官方命令地址:https://redis.io/docs/stack/json/commands/

常用命令:
JSON.NUMINCRBY,JSON.NUMMULTBY,JSON.STRAPPEND,JSON.STRLEN
数组命令:
JSON.ARRAPPEND,JSON.ARRINDEX,JSON.ARRINSERT,JSON.ARRLEN,JSON.ARRPOP,JSON.ARRTRIM
对象命令:
JSON.OBJKEYS,JSON.OBJLEN
组件命令
JSON.TYPE,JSON.DEBUG,JSON.FORGET,JSON.RESP

1.4.1.6 综合操作

创建一个 json_1
127.0.0.1:6379> JSON.SET json_1 . '{"name":"zz","age":22,"msg":"hello"}'
OK

设置 json_1 的 key=name 的值为 zhangsan
127.0.0.1:6379> JSON.SET json_1 .name '"zhangsan"'
OK

获得整个 json_1 
127.0.0.1:6379> JSON.GET json_1
"{\"name\":\"zhangsan\",\"age\":22,\"msg\":\"hello\"}"

获得 json_1 键为 name 的值
127.0.0.1:6379> JSON.GET json_1 .name
"\"zhangsan\""

往 json_1 中添加一个数组对象
127.0.0.1:6379> json.set json_1 .list '[2,3,4]'
OK

往 json_1 的 list 对象中添加一个元素 6 
127.0.0.1:6379> json.arrappend json_1 .list 6
(integer) 4

查看所有元素
127.0.0.1:6379> json.get json_1
"{\"name\":\"zhangsan\",\"age\":22,\"msg\":\"hello\",\"list\":[2,3,4,6]}"

体验下来,感觉 Redis 原生支持 json 之后,对于 redis 的操作更加灵活了。

想象空间更大了,一切复杂信息的存储皆可 JSON,并且操作十分简单,省去了序列化、反序列化的操作,

1.4.2 Java 来操作 redis Json

当然我们还是要在一个 Java 工程中去操作一下:

package com.kkarch.rejson;

import com.redislabs.modules.rejson.JReJSON;
import com.redislabs.modules.rejson.Path;
import redis.clients.jedis.Jedis;

import java.util.Arrays;


public class ReJsonMain {
    public static void main(String[] args) {
        Jedis jedis = new Jedis("192.168.0.110",6379);
        jedis.auth("123456");
        JReJSON redisClient = new JReJSON(jedis);

        System.out.println("初始化 json");
        redisClient.set("json_2",new Object());
        redisClient.set("json_2","zhangsan",new Path(".name"));
        redisClient.set("json_2",21,new Path(".age"));
        redisClient.set("json_2","hello",new Path(".msg"));
        redisClient.set("json_2",Arrays.asList(9,8,7),new Path(".arr"));
        Object result = null;
        result = redisClient.get("json_2");
        System.out.println(result);

        System.out.println("设置 name=lisi");
        redisClient.set("json_2","lisi",new Path(".name"));
        result = redisClient.get("json_2");
        System.out.println(result);

        System.out.println("在数组追加一个值:21");
        redisClient.arrAppend("json_2", new Path(".arr"), 21);
        result = redisClient.get("json_2");
        System.out.println(result);

    }
}


结果:

初始化 json
{name=zhangsan, age=21.0, msg=hello, arr=[9.0, 8.0, 7.0]}
设置 name=lisi
{name=lisi, age=21.0, msg=hello, arr=[9.0, 8.0, 7.0]}
在数组追加一个值:21
{name=lisi, age=21.0, msg=hello, arr=[9.0, 8.0, 7.0, 21.0]}

1.5 RediSearch操作

通过RediSearch模块,Redis可以变成一个功能强大的全文搜索引擎,并且原生支持中文搜索,下面我们就来体验下

1.5.1 查询语法

RediSearch的搜索语法比较复杂,不过我们可以对比SQL来使用它,具体可以参考如下
在这里插入图片描述

SQL ConditionRediSearch Equivalent注释
where x=‘foo’ and y=‘bar’@x:foo @y:barfor less ambiguity use (@x:foo) (@y:bar)
where x=‘foo’ and y!=‘bar’@x:foo -@y:bar
where x=‘foo’ or y=‘bar’(@x:foo) | (@y:bar)
where x in (‘foo’ ,‘bar’ )@x:(foo| bar)quotes means exact phrase
where y=‘foo’ and x not in (‘foo’ ,‘bar’ )@y:foo (-@x:foo)(-@x:bar)
where num between 10 and 20@num:[10:20]
where num >=10@num:[10 +inf]
where num > 10@num:[(10 +inf]
where num < 10@num:[-inf (10]
where num <= 10@num:[-inf 10]
where num < 10 or num >20@num:[-inf (10] | @num:[(20 +inf ]
where name like ‘john%’@name:john*

1.5.2 建立索引

使用 RediSearch 来搜索数据之前,我们得先创建下索引,建立索引的语法有点复杂,我们先来看下;

FT.CREATE {index}
  [ON {data_type}]
     [PREFIX {count} {prefix} [{prefix} ..]
     [LANGUAGE {default_lang}]
  	SCHEMA {identifier} [AS {attribute}]
      [TEXT | NUMERIC | GEO | TAG ] [CASESENSITIVE]
      [SORTABLE] [NOINDEX]] ...

使用FT.CREATE命令可以建立索引,语法中的参数意义如下;

  • index:索引名称;
  • data_type:建立索引的数据类型,目前支持JSON或者HASH两种;
  • PREFIX:通过它可以选择需要建立索引的数据前缀,比如PREFIX 1 "product:" 表示为键中以product:为前缀的数据建立索引;
  • LANGUAGE:指定TEXT类型属性的默认语言,使用chinese可以设置为中文;
  • SCHEMA:索引的字段
  • identifier:指定属性名称;
  • attribute:指定属性别名;
  • TEXT | NUMERIC | GEO | TAG:这些都是属性可选的类型;
  • SORTABLE:指定属性可以进行排序。

看了语法可能不太好理解,直接对一个商品数据建立索引试试就懂了;

FT.CREATE 
	productIdx 
	ON JSON 
	PREFIX 1 "product:" 
	LANGUAGE chinese 
	SCHEMA $.id AS id NUMERIC 
	$.name AS name TEXT $.subTitle AS subTitle TEXT 
	$.price AS price NUMERIC 
	SORTABLE $.brandName AS brandName TAG

1.5.3 操作

建立完索引后,我们就可以使用FT.SEARCH对数据进行查看了,比如使用*可以查询全部;

FT.SEARCH productIdx *

由于我们设置了price字段为SORTABLE,我们可以以price降序返回商品信息

FT.SEARCH productIdx * SORTBY price DESC

指定返回的字段;

FT.SEARCH productIdx * RETURN 3 name subTitle price

我们把brandName设置为了TAG类型,我们可以使用如下语句查询品牌为小米或苹果的商品;

FT.SEARCH productIdx '@brandName:{小米 | 苹果}'

由于priceNUMERIC类型,我们可以使用如下语句查询价格在500~1000的商品;

FT.SEARCH productIdx '@price:[500 1000]'

还可以通过前缀进行模糊查询,类似于SQL中的LIKE,使用*表示;

FT.SEARCH productIdx '@name:小米*'

FT.SEARCH中直接指定搜索关键词,可以对所有TEXT类型的属性进行全局搜索,支持中文搜索,比如我们搜索下包含黑色字段的商品;

FT.SEARCH productIdx '黑色'

当然我们也可以指定搜索的字段,比如搜索副标题中带有红色字段的商品;

FT.SEARCH productIdx '@subTitle:红色'

通过FT.DROPINDEX命令可以删除索引,如果加入DD选项的话,会连数据一起删除;

FT.DROPINDEX productIdx

通过FT.INFO命令可以查看索引状态;

FT.INFO productIdx

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

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

相关文章

鲲鹏Bigdata pro之Hive的基本操作(创建表、查询表)

1 介绍 本文主要依据《鲲鹏Bigdata pro之Hive集群部署》实验教程上的Hive操作例子讲解&#xff0c;方便大数据学员重用相应的操作语句。同时对实验过程中出现的问题给以解决方法&#xff0c;重现问题解决的过程。以让大家认识到&#xff0c;出现问题很正常&#xff1b;同时&am…

Java设计模式中接口隔离原则是什么?迪米特原则又是什么,啥又是合成复用原则,这些又怎么运用

继续整理记录这段时间来的收获&#xff0c;详细代码可在我的Gitee仓库SpringBoot克隆下载学习使用&#xff01; 3.5 接口隔离原则 3.5.1 特点 使用的类不应该被迫依赖于不想使用的方法&#xff0c;应该依赖接口方法 3.5.2 案例(安全门) 防火功能代码 public interface Fi…

第一章:统计学习方法概论

大纲1.1统计学习的特点1.2统计学习方法步骤1.3 统计学习的分类基本分类&#xff1a;1.4 监督学习方法的三要素模型&#xff1a;条件概率分布P(Y∣X)P(Y|X)P(Y∣X)或决策分布Yf(X)Yf(X)Yf(X)策略&#xff1a;在所有假设空间中选择一个最优模型注意事项&#xff1a;算法&#xff…

Java设计模式中适配器模式是什么/适配器模式可以干什么/又如何实现

继续整理记录这段时间来的收获&#xff0c;详细代码可在我的Gitee仓库SpringBoot克隆下载学习使用&#xff01; 5.3 适配器模式 5.3.1 概述 将一个类的接口转换为客户希望的另一种接口&#xff0c;使得原本由于接口不兼容而不能一起工作的那些类能一起工作分为类适配器模式和…

一套采用ASP.NET开发的工作通OA协同办公系统源码 流程审批 公文流转 文档管理

分享一套采用ASP.NET基于C#开发&#xff0c;使用桌面式的OA协同办公系统&#xff0c;超好用户体验效果的后台管理界面&#xff0c;集成 资讯、邮件、日程、文档&#xff08;在线文件档案管理&#xff09;、流程审批、公文流转、沟通与分享&#xff08;在线聊天和内部论坛&#…

基于LLVM的C编译器--lcc——以CLion用SSH连接WSL Ubuntu22.04为例

Windows 10 22H2CLion 2022.3.1Ubuntu 20.04 &#xff08;Microsoft Store内的WSL发行版&#xff09; 一、下载WSL&#xff0c;换源&#xff0c;切换到WSL2 1.1 保证windows版本 在设置->系统->关于中查看 必须是win10及以上对于x64系统&#xff1a;版本1903或更高版…

ArcGIS基础实验操作100例--实验63由图片创建点符号

本实验专栏参考自汤国安教授《地理信息系统基础实验操作100例》一书 实验平台&#xff1a;ArcGIS 10.6 实验数据&#xff1a;请访问实验1&#xff08;传送门&#xff09; 高级编辑篇--实验63 由图片创建点符号 目录 一、实验背景 二、实验数据 三、实验步骤 &#xff08;1&…

Java设计模式中代理模式是什么/JDK动态代理分为哪些,静态代理又怎么实现,又适合哪些场景

继续整理记录这段时间来的收获&#xff0c;详细代码可在我的Gitee仓库SpringBoot克隆下载学习使用&#xff01; 5.结构型模式 5.1 概述 根据如何将类或对象按某种布局组成更大的结构&#xff0c;分为类结构模式和对象结构模式&#xff0c;前者采用继承机制来组织接口和类&am…

视频序列对比学习

前言 视频embedding化也即表征有很多实际的应用场景&#xff0c;比如文本-视频 pair的检索等等。由于视频一般来说较长&#xff0c;所以对于给定的一段话&#xff0c;其中的某些sentence句子一般对应着视频中某几个clip片段&#xff0c;之前常规的做法都是去匹配所有的sentence…

人工服务、人工智能和分析是联络中心的主要趋势

数字联络中心提供商 IPI 宣布了其对 2023 年的预测。IPI 非常重视提供卓越的客户联系&#xff0c;认为未来一年将由以下趋势定义&#xff1a;专注于人工服务&#xff1b;增加对人工智能和自动化的采用&#xff1b;以及更多地使用数据和分析。 关注人性化服务 据 IPI 称&#…

实现QTreeView、QTableView子项中的复选框勾选/取消勾选功能

1.前言本博文所说的技术点适用于同时满足下面条件的所有视图类&#xff1a;模型类从 QAbstractItemModel派生。代理类从QStyledItemDelegate派生。故本博文所说的技术点也适用于QTableView。2.需求提出基于Qt的model/view framework技术&#xff0c;利用QTreeView树视图实现业务…

【异常】SpringSecurity登录失败:Full authentication is required to access this resource

一、报错提示 SpringSecurity提示如下内容&#xff1a; 2023-01-07 06:08:51.843 [cdi-ids-commonprovider] [http-nio-9092-exec-14] WARN com.desaysv.tsp.logic.ids.config.MyAuthenticationEntryPoint - 登录失败&#xff1a;Full authentication is required to acces…

基于Java+Jsp+SpringMVC漫威手办商城系统设计和实现

基于JavaJspSpringMVC漫威手办商城系统设计和实现 博主介绍&#xff1a;5年java开发经验&#xff0c;专注Java开发、定制、远程、文档编写指导等,csdn特邀作者、专注于Java技术领域 作者主页 超级帅帅吴 Java毕设项目精品实战案例《500套》 欢迎点赞 收藏 ⭐留言 文末获取源码联…

2023 年值得关注的 7 大人工智能 (AI) 技术趋势

&#x1f482; 个人网站:【海拥】【摸鱼游戏】【神级源码资源网】&#x1f91f; 前端学习课程&#xff1a;&#x1f449;【28个案例趣学前端】【400个JS面试题】&#x1f485; 想寻找共同学习交流、摸鱼划水的小伙伴&#xff0c;请点击【摸鱼学习交流群】 人工智能 (AI) 已经接…

图数据库Neo4j实战(全网最详细教程)

1.图数据库Neo4j介绍 1.1 什么是图数据库&#xff08;graph database&#xff09; 随着社交、电商、金融、零售、物联网等行业的快速发展&#xff0c;现实社会织起了了一张庞大而复杂的关系网&#xff0c;传统数据库很难处理关系运算。大数据行业需要处理的数据之间的关系随数…

《Go 并发数据结构和算法实践》学习笔记 Day 1

极客时间21天打卡活动&#xff1a;2023.1.16-2.5 链表的接口&#xff1a; 插入元素删除元素读取元素 并发化改造&#xff1a; 并发插入元素并发删除元素并发读取元素 锁&#xff0c;每个节点都定义一把锁。 并发插入 区域猜想&#xff1a;如果某个CPU 锁定了某个节点&…

U3D客户端框架(资源管理篇)之资源热更新管理器 ResourceManager

一、资源热更新管理器模块设计 1.热更新是什么&#xff1f; 游戏或者软件内的 美术/脚本代码等资源 发生变化时&#xff0c;无需下载客户端重新进行安装&#xff0c;而是在应用程序启动的情况下&#xff0c;通过比对本地资源与CDN资源的MD5码&#xff0c;如果本地资源与CDN中…

Visual Code 打开方式添加到右键菜单

一、配置右键打开 文件 注册表找到分支&#xff1a; 计算机\HKEY_CLASSES_ROOT\*\shell 在这个里面 shell 分支里右键添加项 VisualCode&#xff08;这个可以随便起&#xff0c;便于识别就行&#xff09; 在 VisualCode 分支里右键添加项 Command&#xff08;必须这个名&am…

【C++】双指针用法

快慢指针/同向指针 [0,i)的数据代表处理好的数据[i,j)的数据是那些处理过但不需要的数据[j,array.length)区间的数据为接下来待处理的数据。 以上三个区间的开和闭需要根据题目要求定义&#xff0c;但是要保持一致。 用此方法处理过的数组&#xff0c;处理好的数据相对位置会保…

(mysql)Waiting for table metadata lock

MySQL5.5 中引入了 metadata lock. 顾名思义&#xff0c;metadata lock 不是为了保护表中的数据的&#xff0c;而是保护 database objects(元数据)的。包括表结构、schema、存储过程、函数、触发器、mysql的调度事件(events). 要理解 metadata lock 最重要的一点就是&#xff1…