当前位置: 首页 > news >正文

郑州市做网站公司app 程序开发公司

郑州市做网站公司,app 程序开发公司,中国万网是做什么的,网络推广公司 深圳目录 一、RedisJson介绍 1.1 RedisJson是什么 1.2 RedisJson特点 1.3 RedisJson使用场景 1.3.1 数据结构化存储 1.3.2 实时数据分析 1.3.3 事件存储和分析 1.3.4 文档存储和检索 二、当前使用中的问题 2.1 刚性数据库模式限制了敏捷性 2.2 基于磁盘的文档存储导致瓶…目录 一、RedisJson介绍 1.1 RedisJson是什么 1.2 RedisJson特点 1.3 RedisJson使用场景 1.3.1 数据结构化存储 1.3.2 实时数据分析 1.3.3 事件存储和分析 1.3.4 文档存储和检索 二、当前使用中的问题 2.1 刚性数据库模式限制了敏捷性 2.2 基于磁盘的文档存储导致瓶颈 2.3 附加索引和全文搜索增加了复杂性 2.4 小规模数据量下的准实时搜索问题 三、RedisSearch介绍 3.1 什么是RedisSearch 3.2 RedisSearch功能特性 3.3 与mongodb和es对比 四、RedisSearch安装 4.1 启动镜像 4.2 检查测试 五、RedisJson/ RedisSearch命令使用 5.1 RedisJson操作命令 5.1.1 保存操作 5.1.2 读取操作 5.1.3 批量读取操作 5.1.4 删除操作 5.2 RedisSearch操作命令 5.2.1 创建索引 5.2.2 为索引添加内容 5.2.3 根据关键字查询 5.3 RedisSearch 扩展使用 5.3.1 前置准备 5.3.2 查询全部数据 5.3.3 查询并按照字段排序 5.3.4 返回指定字段 5.3.5 模糊查询 5.3.6 查询范围区间的数据 5.3.7 关键词检索 5.3.8 高亮显示 5.3.9 删除索引 六、Java操作RedisJson 6.1 引入基本依赖 6.2 相关操作API 七、SpringBoot操作RedisJson 7.1 添加配置文件 7.2 添加jedis配置类 7.3 测试类 八、写在文末 一、RedisJson介绍 1.1 RedisJson是什么 RedisJSON是一个Redis模块它实现了JSON数据交换标准ECMA-404作为原生数据类型。它允许从Redis中存储、更新和获取JSON值 RedisJSON 是一种高性能 JSON 文档存储允许开发人员构建现代应用程序。它在内存中存储和处理 JSON以亚毫秒级支持每秒数百万次操作响应时间JSON 文档的原生索引、查询和全文搜索允许开发人员创建二级索引快速查询数据 1.2 RedisJson特点 redisJson具有如下特点 完全支持JSON标准使用类似JSONPath的语法,用于在文档中选择元素文档以二进制数据的形式存储在树结构中允许快速访问子元素所有JSON值类型都是原子操作 1.3 RedisJson使用场景 在下面的这些场景下可以考虑使用RedisJson 1.3.1 数据结构化存储 redisJson允许将复杂的JSON数据存储在redis中并可以使用Redis的查询功能来快速检索和操作这些数据。 1.3.2 实时数据分析 通过将结构化数据存储在RedisJson中可以轻松的对数据进行实时分析和计算。 1.3.3 事件存储和分析 RedisJson可以用作事件驱动的存储系统。用于存储和分析事件流数据。 1.3.4 文档存储和检索 RedisJson提供了一些内置的查询功能可以轻松的在存储的JSON数据中执行文档检索。 二、当前使用中的问题 通过上面的内容我们了解了RedisJson的基本内容并了解了使用RedisJson可以解决的问题和应用场景Redis常用的数据结构已经很强大了可以说已经能够满足大多数的业务场景了为什么还要了解和学习RedisJson这个点呢在弄清这个问题之前先来看看现有的一些业务场景下存在的问题。 2.1 刚性数据库模式限制了敏捷性 传统的关系型数据库一旦数据库表结构随着业务确定下来中途想要针对某个表扩展新字段将是一件非常麻烦的事甚至可能会对团队现有的工作节奏造成难以预估的冲击。简单来说就是传统的数据库模式限制了业务机动调整的灵活性和自由性。 2.2 基于磁盘的文档存储导致瓶颈 文档类型的结构数据允许开发人员使用灵活的 JSON 数据模型更快地迭代。 然而由于磁盘 I/O性能瓶颈 导致应用程序写入缓慢和读取延迟高。 2.3 附加索引和全文搜索增加了复杂性 我们知道在mysql5.7之后的版本要实现全文检索功能可以考虑使用全文索引但使用过mysql全文索引的同学大多数会得出一个结论就是不好用用起来限制较多不够灵活但在mysql如果不用全文索引实现使用其他方式将会增加更大的难度和复杂度。 2.4 小规模数据量下的准实时搜索问题 试想你的系统数据规模并不是很大只是系统中的某些业务场景需要使用实时搜索或者存在高性能检索的需求在这种场景下引入其他高性能数据存储成本会大大增加同时这也将给开发和运维带来新的工作量。 综上论述在下面的场景中可能需要使用RedisJson改进或优化你的使用 数据规模较小的场景下需要完成实时检索使用mysql无法满足高性能检索场景数据结构类json文档且存在文档结构的扩展能够实现全文检索存储简单运维成本低系统接入成本低... 三、RedisSearch介绍 在上文中我们了解了为什么需要使用RedisJson其实总结一句话就是需要基于RedisJson使用其全文检索功能同时还能方便的对存储其中的JSON文档或字段进行增删改查。 3.1 什么是RedisSearch RediSearch 是一个高性能的全文搜索引擎它可以作为一个 Redis Module扩展模块运行在 Redis 服务器上在2.x之后的版本它不在使用基于RDB的基础数据结构而是采用了一种全新的文件存储结构对数据进行索引而且性能上也有了成倍的提升。 3.2 RedisSearch功能特性 RedisSearch主要特性如下 多字段联合检索高性能增量索引复杂布尔查询基于管道的查询子句基于前缀的搜索支持字段权重设置自动完成建议可用于搜索框联想词提示精确的短语搜索在许多语言中基于词干分析的查询扩展支持自定义评分函数类似ES的function_score将搜索限制到特定的文档字段数字过滤器和范围使用 Redis 自己的地理命令进行地理过滤检索完整的文档内容或只是 ID 的检索支持文档删除和更新与索引垃圾收集支持部分更新和条件文档更新支持拼写纠错支持高亮显示支持聚合分析支持配置停用词和同义词支持向量存储与KNN检索(重磅)... 3.3 与mongodb和es对比 结合已有的使用经验对比 RedisSearch 2.2 (支持RedisJson *) 比以前的版本更快RedisJson * 在直接读取、写入和更新工作负载方面比Mongodb和es更快在混合工作负载场景中实时更新不会影响RedisJson *的搜索和读取性能而es则会受到影响 尽管来说从测试的数据来看在一定情况下RedisSearch的性能确实比es或mongo要高很多但是两者的使用场景还是有区别的这点需要额外关注。 四、RedisSearch安装 官方安装手册地址Install Redis Stack | Redis 官方提供了多种安装部署方式这里选择使用Docker来搭建一个RedisSearch的环境。参考下面的安装流程。 4.1 启动镜像 使用下面的命令启动RedisSearch docker run -p 6379:6379 -d --namemyredis redislabs/redisearch:latest 4.2 检查测试 安装完成之后使用 redis-cli 来检查 RediSearch 模块是否加载成功使用 Docker 启动 redis-cli命令如下 docker exec -it myredis redis-cli 在基础命令的使用上RedisSearch与之前并没有什么区分可以理解是原生的redis的一种升级版。使用下面的命令检查下安装的RediSearch 包括的功能模块 module list 看到下面的效果说明RedisSearch模块加载成功 五、RedisJson/ RedisSearch命令使用 接下来对RedisSearch与RedisJson中的常用操作命令通过案例做一下深入的使用和了解。 5.1 RedisJson操作命令 5.1.1 保存操作 语法 JSON.SET key path json  [NX | XX] 参数说明 对于新的Keypath需要使用$或 .对于已经存在Key在进行保存操作之后原来path路径的值将会被替换掉NX表示只有Key不存在才执行保存操作XX表示只有Key存在才执行保存操作通过命令type doc可以查看到存储进去的数据是ReJSON-RL类型 使用下面的命令添加一条json数据 JSON.SET json_1 . {name:jerry,age:22,city:hangzhou} 5.1.2 读取操作 语法 JSON.GET key[INDENT indentation-string][NEWLINE line-break-string][SPACE space-string][path ...] 参数说明 允许使用多个path进行查询INDENT 查询结果替换掉默认缩进字符用于返回Pretty-formatted JSONNEWLINE 查询结果替换掉默认换行符用于返回Pretty-formatted JSONSPACE 查询结果替换掉默认空格用于返回Pretty-formatted JSON获取JSON对象中的属性时需要以.开头 使用下面的命令获取上面添加进去的数据 JSON.GET json_1 5.1.3 批量读取操作 语法 JSON.MGET key [key ...] path 参数说明 最后一个参数作为path进行处理遍历每一个Key的path如果不存在则返回null 准备两条数据 JSON.SET json_1 . {name:jerry,age:22,city:hangzhou} JSON.SET json_2 . {name:mike,age:26,city:beijing} 使用mget批量获取多条数据 5.1.4 删除操作 语法 JSON.DEL key [path] 参数说明 path是可选的如果没有输入则默认整个Key删除掉 更多redisJson命令参考文档说明Commands | Redis 5.2 RedisSearch操作命令 RedisSearch的操作可以说是与RedisJson密不可分的两者在使用上具有一定的前后关系简单理解就是RedisSearch通常操作的数据就是RedisJson结构的数据。 5.2.1 创建索引 RedisSearch在使用之前需要提前定义json数据结构的相关属性包括指定索引命名json中的字段类型等这就有点像操作mysql表需要提前创建表一样。 ft.create myidx schema title text weight 5.0 desc text 参数说明 “myidx”为索引的ID此索引包含了两个字段“title”和“desc”“weight”为权重默认值为 1.0 5.2.2 为索引添加内容 添加内容到上面的索引 ft.add myidx doc1 1.0 fields title He urged her to study English desc good idea 其中“doc1”为文档 IDdocid“1.0”为评分score 5.2.3 根据关键字查询 使用下面的语句查询索引中包含 english关键字的数据 ft.search myidx english limit 0 10 5.3 RedisSearch 扩展使用 上面演示了一下使用RedisJson和RedisSearch的基本操作命令下面继续深入研究一下RedisSearch更深入的使用。 5.3.1 前置准备 定义json模板 FT.CREATE itemIdx ON JSON LANGUAGE chinese SCHEMA $.name AS name TEXT $.description as description TEXT $.brandName AS brandName TAG $.price AS price NUMERIC SORTABLE 参数说明 FT.CREATE itemIdx :创建一个名为 itemIdx 的 RedisSearch索引此命令创建一个索引该索引代表 与JSON 文档中的name、description 、brandName和price相关联进行索引设置索引语言为chinese SCHEMA 这部分定义了索引的字段和他们的数据类型 $.name as name TEXT 定义了一个名为name的文本字段对应于JSON键 $name 这个字段存储的是文本类型的数据$.description as description TEXT 定义了一个名为description 的文本字段对应于JSON键 $description 这个字段存储的是文本类型的数据$.brandName as brandName TAG 定义了一个名为brandName 的TAG字段对应于JSON键 $brandName 这个字段存储的是TAG类型的数据$.price as price NUMERIC 定义了一个名为price的文本字段对应于JSON键 $price 这个字段存储的是NUMERIC类型的数据 支持的常用的数据类型 TEXT(文本)用于存储文本类型的数据可以进行全文搜索和模糊匹配NUMERIC数值用于存储数值数据支持范围查询和聚合操作TAG(标签)用于存储标签或分类信息支持过滤和聚合操作VECTOR向量用于存储多维向量数据支持基于向量相似性的搜索 执行下面的语句为上述自定义json索引添加几条数据 JSON.SET a1 $ {name: Iphone 15plus,description: Iphone15-16G-25G,brandName:Iphone,price: 5699}JSON.SET a2 $ {name: 华为Mate60 pro,description: HuaWei-32G-512G,brandName:华为,price: 7799} 5.3.2 查询全部数据 建立完索引后我们就可以使用FT.SEARCH对数据进行查看了比如使用*可以查询全部 5.3.3 查询并按照字段排序 设置了price字段为SORTABLE我们可以以price降序返回查询数据 5.3.4 返回指定字段 FT.SEARCH itemIdx * RETURN 2 name price 5.3.5 模糊查询 还可以使用像like一样的模糊查询例查询name以华为开头的 FT.SEARCH item name:华为* 5.3.6 查询范围区间的数据 使用如下语句查询价格在5000~6000的商品  FT.SEARCH itemIdx price:[5000 6000] 5.3.7 关键词检索 FT.SEARCH中直接指定搜索关键词可以对所有TEXT类型的属性进行全局搜索支持中文搜索 FT.SEARCH itemIdx Iphone 5.3.8 高亮显示 使用HIGHLIGHT来进行高亮显示效果默认对搜索关键字加上b/bHIGHLIGHT必须跟在return后面return 1 name表示返回一个name字段对name字段高亮显示。测试了一下高亮只对TEXT类型有效 FT.SEARCH itemIdx name:(华为) return 1 name HIGHLIGHT 5.3.9 删除索引 使用FT.DROPINDEX命令可以删除索引如果不加DD只会删除索引与索引关联的JSON文档不会删除如果加入DD选项的话会连数据一起删除 FT.DROPINDEX itemIdx DD 小结 细心的同学可能会发现在Redis的基本数据结构中Hash这种数据结构和json很类似因为它们两者存储的都是json类型结构的数据但是使用JSON的方式与HASH相比JSON更快。在对数据做修改时hash需要删除整个文档再将修改后的文档添加而json可以直接对文档中的某一字段修改。 六、Java操作RedisJson 在Java中操作RedisJson和RedisSearch毕比较简单的方式就是使用jedis下面演示如何基于jedis来操作RedisJson和RedisSearch 6.1 引入基本依赖 这里注意引入的jedis的版本我这里使用的是4.0以上的版本版本太低的话某些与RedisJson相关的API可能无法使用 !--测试单元 --dependencygroupIdjunit/groupIdartifactIdjunit/artifactIdversion4.12/version/dependency!--用来操作redis --dependencygroupIdredis.clients/groupIdartifactIdjedis/artifactIdversion4.0.1/version/dependencydependencygroupIdcn.hutool/groupIdartifactIdhutool-all/artifactIdversion5.8.15/version/dependencydependencygroupIdorg.projectlombok/groupIdartifactIdlombok/artifactIdversion${lomok.version}/version/dependency 6.2 相关操作API 下面给出了使用RedisJson的方式操作对象的相关API以及RedisSearch的操作API import cn.hutool.core.lang.Console; import cn.hutool.json.JSONUtil; import com.congge.entity.TbUser; import org.junit.Test; import redis.clients.jedis.HostAndPort; import redis.clients.jedis.UnifiedJedis; import redis.clients.jedis.providers.PooledConnectionProvider; import redis.clients.jedis.search.*;import java.util.List;public class RedisJsonTest {static UnifiedJedis client;static {// redis连接HostAndPort config new HostAndPort(IP, 6379);PooledConnectionProvider provider new PooledConnectionProvider(config);client new UnifiedJedis(provider);}/*** 添加json数据*/public static void addJson(){TbUser tbUser1 new TbUser(jerry,30,杭州西湖区);TbUser tbUser2 new TbUser(mike,29,北京东城区);TbUser tbUser3 new TbUser(john,28,武汉汉口);// 添加jsonclient.jsonSet(user:1, redis.clients.jedis.json.Path.ROOT_PATH,tbUser1);client.jsonSet(user:2,redis.clients.jedis.json.Path.ROOT_PATH,tbUser2);client.jsonSet(user:3,redis.clients.jedis.json.Path.ROOT_PATH,tbUser3);System.out.println(添加json数据成功);}/*** 根据key查询对象数据*/public static void getFromJsonKey(){// 查询TbUser student client.jsonGet(user:1, TbUser.class,redis.clients.jedis.json.Path.ROOT_PATH);System.out.println(JSONUtil.toJsonStr(student));}/*** 创建索引*/public static void createIndex(){Schema schema new Schema().addField(new Schema.Field(new FieldName($.userName, userName), Schema.FieldType.TEXT)).addField(new Schema.Field(new FieldName($.address, address), Schema.FieldType.TEXT));// 只索引key以user:开头的IndexDefinition rule new IndexDefinition(IndexDefinition.Type.JSON).setPrefixes(user:);// 创建索引client.ftCreate(user-index,IndexOptions.defaultOptions().setDefinition(rule),schema);System.out.println(索引创建成功);}/*** 根据索引中的字段查询*/public static void queryByIndexField(){// 查询名字以John开头的学生,并高亮显示Query q new Query(userName:jerry)//.highlightFields(new Query.HighlightTags(b,/b),userName).returnFields(userName,address);SearchResult searchResult client.ftSearch(user-index, q);ListDocument documents searchResult.getDocuments();for(Document document : documents){Console.log(JSONUtil.toJsonStr(document));System.out.println();document.getProperties().forEach(item -{System.out.println(item.getKey());System.out.println(item.getValue());});}}public static void main(String[] args) {//addJson();//getFromJsonKey();//createIndex();queryByIndexField();}} 下面是根据某个字段的查询结果 七、SpringBoot操作RedisJson 基于上述使用jedis操作RedisJson与RedisSearch的操作接下来演示如何与springboot进行整合 7.1 添加配置文件 添加application.yaml配置文件主要配置redis相关的信息参考如下内容 server:port: 8087spring:jackson:date-format: yyyy-MM-dd HH:mm:sstime-zone: GMT8redis:database: 0host: IPport: 6379jedis:pool:max-active: 30 7.2 添加jedis配置类 该配置类即为全局注入一个jedis的客户端可以在需要调用的位置直接注入使用 import org.springframework.beans.factory.annotation.Value; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; import redis.clients.jedis.HostAndPort; import redis.clients.jedis.UnifiedJedis; import redis.clients.jedis.providers.PooledConnectionProvider;Configuration public class UnifiedJedisClientConfig {Value(${spring.redis.host})private String host;Value(${spring.redis.port:6379})private Integer port;Beanpublic UnifiedJedis unifiedJedis() {HostAndPort config new HostAndPort(host, 6379);PooledConnectionProvider provider new PooledConnectionProvider(config);UnifiedJedis unifiedJedis new UnifiedJedis(provider);return unifiedJedis;}} 7.3 测试类 编写一个测试接口 RestController public class UserRedisJsonController {private static final Logger logger LoggerFactory.getLogger(UserRedisJsonController.class);Autowiredprivate UnifiedJedis jedis;//localhost:8087/addJsonGetMapping(/addJson)public String add(){TbUser tbUser1 new TbUser(jerry,30,杭州西湖区);TbUser tbUser2 new TbUser(mike,29,北京东城区);TbUser tbUser3 new TbUser(john,28,武汉汉口);// 添加jsonjedis.jsonSet(user:1, redis.clients.jedis.json.Path.ROOT_PATH,tbUser1);jedis.jsonSet(user:2,redis.clients.jedis.json.Path.ROOT_PATH,tbUser2);jedis.jsonSet(user:3,redis.clients.jedis.json.Path.ROOT_PATH,tbUser3);System.out.println(添加json数据成功);return success;}/*** 根据key查询对象数据* localhost:8087/getFromJsonKey*/GetMapping(/getFromJsonKey)public void getFromJsonKey(){// 查询TbUser tbUser jedis.jsonGet(user:1, TbUser.class,redis.clients.jedis.json.Path.ROOT_PATH);System.out.println(JSONUtil.toJsonStr(tbUser));}GetMapping(/createIndex)public String createIndex(){// 创建索引createIndex(users-index,users:, new String[]{userName,address});return 索引创建成功;}public boolean createIndex(String indexName, String key, String... fields){try {try{MapString, Object map jedis.ftInfo(indexName);logger.info(index configuration:{},map);jedis.ftDropIndex(indexName);} catch (Exception e){logger.error(the index does not exist, e);}Schema schema new Schema();float weight 1.0f;for(String field : fields) {String attribute;if (!StringUtils.isEmpty(field)) {if (field.indexOf(.) -1) {attribute field;} else {String[] fieldSplit field.split(\\.);attribute fieldSplit[fieldSplit.length - 1];}if (attribute.toLowerCase().startsWith(geo)) {Schema.Field field1 new Schema.Field(FieldName.of(user: field).as(attribute), Schema.FieldType.GEO);schema.addField(field1);continue;} else {Schema.TextField textField new Schema.TextField(FieldName.of(user: field).as(attribute), weight, false, false, false, null);schema.addField(textField);weight * 3;continue;}}}IndexDefinition rule new IndexDefinition(IndexDefinition.Type.JSON).setLanguage(chinese).setPrefixes(new String[]{key});jedis.ftCreate(indexName,IndexOptions.defaultOptions().setDefinition(rule),schema);return true;} catch (Exception e){logger.error(create redis search index failed, e);return false;}}} 测试其中一个接口效果如下 八、写在文末 RedisJson是Redis扩展功能中的重要数据结构基于RedisJson结构可以在实际业务中巧妙处理一些疑难杂症让程序得到很好的灵活性和扩展性值得深入研究和学习本篇到此结束感谢观看
http://www.pierceye.com/news/785003/

相关文章:

  • 泉州网站建设报价广东建设厅网站
  • 建设网站的源代码的所有权wordpress网站打开慢
  • 印度外贸网站有哪些家居小程序源码下载
  • 上海网站建设中心pc官方网站
  • 深圳企业网站制作公司查询西安网站设计哪家好
  • 大埔做网站手机qq邮箱发布了wordpress
  • 寻找南昌网站设计单位网站建设 中企动力医院
  • 中间商可以做网站吗平面广告设计师的工作内容
  • 网站建设用户分析做网站有什么软件
  • 洛阳网站建设启辰网络wordpress怎么破解查看
  • 长沙市网站设计公司厦门建设网站建站
  • 网站做链轮会被惩罚吗网站开发系统
  • 一般做企业网站需要什么资料WordPress情侣博客模板
  • 网站开发教程公司哪些官网用wordpress
  • redis网站开发教程创建app软件
  • 企业网站新闻wp怎么做合肥环保公司网站建设
  • 怎么仿一个复杂的网站wordpress描述怎么改
  • php 如何用op浏览器开发手机网站app开发制作哪种快
  • 网站维护主要有哪些内容和方法网页制作需要学多久
  • 机械加工网站模板做蛋糕比较火的网站
  • 网站的折线图怎么做四川省建设厅官方网站
  • 域名备案 个人 网站基本信息查询wordpress mysql缓存
  • 优秀校园网站建设汇报个人备案的网站
  • 网站信息化建设报送电商网站 设计
  • 写作网站哪个好用有没有必要给企业做网站
  • 长沙cms建站模板设计说明英文翻译
  • 做的差的网站河北网站制作公司地址
  • 网站的推广有哪些方式AWS免费套餐做网站可以吗
  • 如何建设公司网站 需要注意什么iis搭建多个网站
  • 青海住房与建设厅网站本地门户网站源码