首页 > 数据库 >Redis中Key中为什么要使用{}

Redis中Key中为什么要使用{}

时间:2023-08-02 17:57:30浏览次数:33  
标签:为什么 Key Redis 集群 key HashTag 哈希 节点

Redis集群介绍

Redis 集群是一个提供在多个Redis间节点间共享数据的程序集。

Redis集群并不支持处理多个keys的命令,因为这需要在不同的节点间移动数据,从而达不到像Redis那样的性能,在高负载的情况下可能会导致不可预料的错误.

Redis 集群通过分区来提供一定程度的可用性,在实际环境中当某个节点宕机或者不可达的情况下继续处理命令. Redis 集群的优势:

  • 自动分割数据到不同的节点上。
  • 整个集群的部分节点失败或者不可达的情况下能够继续处理命令。

Redis 集群的数据分片

Redis 集群没有使用一致性hash, 而是引入了 哈希槽的概念.

Redis 集群有16384个哈希槽,每个key通过CRC16校验后对16384取模来决定放置哪个槽.集群的每个节点负责一部分hash槽,举个例子,比如当前集群有3个节点,那么:

  • 节点 A 包含 0 到 5500号哈希槽.
  • 节点 B 包含5501 到 11000 号哈希槽.
  • 节点 C 包含11001 到 16384号哈希槽.

这种结构很容易添加或者删除节点. 比如如果我想新添加个节点D, 我需要从节点 A, B, C中得部分槽到D上. 如果我想移除节点A,需要将A中的槽移到B和C节点上,然后将没有任何槽的A节点从集群中移除即可. 由于从一个节点将哈希槽移动到另一个节点并不会停止服务,所以无论添加删除或者改变某个节点的哈希槽的数量都不会造成集群不可用的状态.

MSET

单实例上的MSET是一个原子性(atomic)操作,所有给定 key 都会在同一时间内被设置,某些给定 key 被更新而另一些给定 key 没有改变的情况,不可能发生。

而集群上虽然也支持同时设置多个key,但不再是原子性操作。会存在某些给定 key 被更新而另外一些给定 key 没有改变的情况。其原因是需要设置的多个key可能分配到不同的机器上。

##SINTERSTORE,SUNIONSTORE,ZINTERSTORE,ZUNIONSTORE

这四个命令属于同一类型。它们的共同之处是都需要对一组key进行运算或操作,但要求这些key都被分配到相同机器上。

这就是分片技术的矛盾之处:

即要求key尽可能地分散到不同机器,又要求某些相关联的key分配到相同机器。

Hash Tags

HashTag机制可以影响key被分配到的slot,从而可以使用那些被限制在slot中操作。

HashTag即是用{}包裹key的一个子串,如{user:}1, {user:}2。

在设置了HashTag的情况下,集群会根据HashTag决定key分配到的slot, 两个key拥有相同的HashTag:{user:}, 它们会被分配到同一个slot,允许我们使用MGET命令。

通常情况下,HashTag不支持嵌套,即将第一个{和第一个}中间的内容作为HashTag。若花括号中不包含任何内容则会对整个key进行散列,如{}user:。

HashTag可能会使过多的key分配到同一个slot中,造成数据倾斜影响系统的吞吐量,务必谨慎使用。

 

标签:为什么,Key,Redis,集群,key,HashTag,哈希,节点
From: https://www.cnblogs.com/fnlingnzb-learner/p/17601367.html

相关文章

  • Lua script attempted to access a non local key in a cluster node 问题解决
    一、问题描述最近优化公司需要对不同的业务系统的缓存工具提供一个标准化的解决方案。各个业务系统将缓存数据通过map结构进行存储,然后在缓存系统中将这些map获取出来,然后保存在redis数据库中。技术经理想到的最好解决方案是将map集合直接存储在redis的hash表中。但是要求对hash......
  • Redis 常用命令
    连接redis-cli-h{server_ip}-p{port}-a{password}常用错误使用Jedis连接redis出现CannotgetJedisconnection;Couldnotgetaresourcefromthepool错误具体报错信息如下:org.springframework.beans.factory.BeanCreationException:Errorcreatingbeanwithname'ena......
  • 为什么要做LiveVideoStack课程?
    文/包研大家好,这里是LiveVideoStack包研,很久没有用这样的方式和大家聊天了。今天的主题是,我们要推出课程产品了,希望大家多多支持。我们会上线第一门课程——《轻松掌握WebAssembly视频播放器》轻松掌握WebAssembly视频播放器,由李超老师亲自打造。如果你希望学习如何在浏览器里通......
  • Redis配置主从复制
    1概念主从复制,是指将一台Redis服务器的数据,复制到其他的Redis服务器。前者称为主节点(master/leader),后者称为从节点(slave/follower);数据的复制是单向的,只能由主节点到从节点。Master以写为主,Slave以读为主;默认情况下,每台Redis服务器都是主节点;一个主节点可以有多个从节点(或没......
  • 为什么说数字孪生和GIS高度互补?它们各自从对方那里获得了什么?
    在数字化时代,数字孪生和GIS作为两项重要技术,它们的融合正日益受到人们的关注和认可。数字孪生是将实体世界与数字世界紧密结合的技术,可以创建实时的虚拟副本,对物理系统进行模拟、优化和预测。而GIS则是用于收集、管理、分析和展示地理空间数据的系统,为我们提供了对地理环境的全面......
  • 为什么参与LiveVideoStackCon 2022 北京站
    距离2022年11月4日至5日召开的LiveVideoStackCon2022音视频技术大会北京站还有一个多月的时间,在我们紧锣密鼓地筹备下,又有一波精彩的演讲内容、新颖的互动环节、神秘的幕后团队等信息上线啦。现在,马上开启剧透模式,让大家一睹为快!精彩内容抢先看围绕着「音视频+无限可能」这个......
  • "account_id like '%':account_id||'%'", hasKey(p, "account_id&quot
    该SQL语句用于进行模糊查询,目标是根据传入的参数p中的account_id来查询sys_account表中的数据。解释如下:"account_idlike'%':account_id||'%'":这是SQL的查询条件部分,其中account_id是表sys_account的一个字段名。like是SQL中的模糊查询操作符,用于进行字符......
  • Redis的单线程设计之谜:高性能与简洁并存
    Redis作为一款高性能的内存数据库,以其出色的读写性能和多种数据结构支持而闻名。然而,与其他传统数据库不同,Redis采用了独特的单线程设计。在本文中,我们将揭开Redis单线程设计的奥秘,解释其为何能在单线程下实现高性能,并探讨适用场景与优势。1.Redis单线程模型Redis的单线程模型意味......
  • scrapy源码分析:redis分布式爬虫队列中,priority值越大,优先级越高
    scrapy源码分析:redis分布式爬虫队列中,priority值越大,优先级越高一、背景scrapy爬虫项目中,遇到scrapy的priority属性,搞不懂priority的值越大优先级越高,还是值越小优先级越高#通过priority修改优先级returnscrapy.Request(url=request.url,dont_filter=True,callback=spider......
  • Redis 发生高延迟时
    Redis是一种内存数据库,将数据保存在内存中,读写效率要比传统的将数据保存在磁盘上的数据库要快很多。但是Redis也会发生延迟时,这是就需要我们对其产生原因有深刻的了解,以便于快速排查问题,解决Redis的延迟问题一条命令执行过程在本文场景下,延迟(latency)是指从客户端发送命......