AttributeError: ‘str’ Object Has No Attribute ‘x’:字符串对象没有属性x的完美解决方法 大家好,我是默语,擅长全栈开发、运维和人工智能技术。...摘要 在Python编程中,AttributeError: ‘str’ object has no attribute 'x’通常出现在试图访问字符串对象中不存在的属性时。...其中,AttributeError是比较常见的一种。当你试图访问一个对象的属性,但该对象并不具备这个属性时,就会抛出这个错误。...错误示例 当我们试图访问一个字符串对象的不存在属性时,就会出现AttributeError。例如: my_string = "Hello, World!"...错误的成因 这个错误通常有以下几种成因: 2.1 访问不存在的属性 ❌ Python字符串对象没有名为x的属性。当你尝试访问一个字符串对象的不存在属性时,就会抛出这个错误。
vue是一款轻量级的mvvm框架,追随了面向对象思想,使得实际操作变得方便,但是如果使用不当,将会面临着到处踩坑的危险,写这篇文章的目的是我遇到的这个问题在网上查了半天也没有发现解决方案...vue对象相关属性,奇怪的是当我使用jquery获取该select的val()方法获取的是最新的数据,那么问题就来了:为什么元素的值发生了变动却没有更新到vue对象相关属性?...value); }; this.on('change', this.listener); 看到了吧,只有select的change事件才会触发select元素的value值更新到vue对象相关属性...内容而采用默认第一项,所以如果用户选择select的其他项后再切回第一项就可以触发该事件完成vue对象属性变更。...我这里给出我的解决方案:在使用js代码追加内容到从select后,使用更改从select对应的vue对象属性来实现默认选择第一项。
r = redis.Redis() r.publish("test",'hello') 随后编写 client.py: import redis r = redis.Redis() ps = r.pubsub...,当具备频道属性的用户对该频道发布了一条消息之后,所有其他具备该频道属性的用户通过redis进行订阅后主动推送刚刚发布的消息,而频道的推送只匹配订阅该频道的用户,达到消息隔离的目的。 ...需要注意的一点是,通过线程启动redis订阅服务时,需要将当前的loop实例传递给协程对象,否则在订阅方法内将会获取不到websocket实例,报这个错误: IOLoop.current() doesn't...pubsub)) 在订阅消费方法中,异步监听所订阅频道中的发布信息,同时和之前的同步方法一样,比对用户的频道属性并且进行按频道推送: async def reader(channel: aioredis.client.PubSub...结语:实践操作来看,Redis发布订阅模式,非常契合这种实时(websocket)通信聊天系统的场景,但是发布的消息如果没有对应的频道或者消费者,消息则会被丢弃,假如我们在生产环境在消费的时候,突然断网
频道的发布订阅 实现原理 Redis将所有频道的订阅关系都保存在服务器状态的 pubsub_channels 字典,字典的键是某个被订阅的频道,而对应值则是一个链表,链表里记录了所有订阅这个频道的客户端...实现原理 Redis将所有模式的订阅关系都保存在服务器状态的 pubsub_patterns 链表,链表的每个节点都包含着一个 pubsub Pattern 结构,这个结构的 pattern 属性记录了被订阅的模式...,而 client 属性则记录了订阅模式的客户端。...,client 属性设置为订阅模式的客户端; 2)将pubsubPattern结构添加到 pubsub_patterns 链表的尾部。...属性为被退订模式,并且client 属性为执行退订命令的客户端的 pubsubPattern 结构。
---- 实现 频道订阅与退订 redis服务器全局状态由redisServer结构体对象保存,该对象内部保存了所有频道的订阅关系: struct redisServer{ //......//保存所有频道的订阅关系 dict *pubsub_channels; //... } pubsub_channels属性的数据类型是字典类型,该字典中的key保存了频道名,value...//保存所有频道的订阅关系 dict *pubsub_channels; //保存所有模式订阅关系 list *pubsub_patterns; //... } typedef...属性来记录当前事务状态: struct redisClient { //事务状态 multistate mstate; ... } 事务状态包含一个事务队列和已经入队的命令计数器...---- 持久性 因为Redis的事务不过是简单地用队列包裹起了一组Redis命令,Redis并没有为事务提供任何额外的持久化功能,所以Redis事务的耐久性由Redis所使用的持久化模式决定: □ 当服务器在无持久化的内存模式下运作时
若该频道之前没有客户端订阅,则会在词典中新建频道键,并将客户端对象存放于链表中。若该频道之前已经被订阅,则直接将新的客户端对象放在链表末尾即可。...首先遍历所有链表,找到客户端所在的链表,从链表移除客户端对象。若移除后链表为空,则将频道对应的键值对从pubsub_channels 中删除。...对象,该对象保存了每个订阅的模式及对应客户端。...2.频道退订 当有客户端退订某个模式时,服务端就会遍历pubsub_patterns链表,找到模式和客户端均匹配的pubsubPattern对象,将它从链表中移除。...// 如果没有的话,执行以下代码 retval = 1; pubsubPattern *pat; // 将 pattern 添加到 c->pubsub_patterns
#它是由Redis使用内存分配器分配的内存,所以这个数据并没有把内存碎片浪费掉的内存给统计进去 #如果used_memory > 可用最大内存,那么操作系统开始进行内存与swap空间交换 #当 rss...没有发生内存交换。...:0 pubsub_patterns:0 latest_fork_usec:414 replication cpu 都是累计值, 随着Redis启动的时间长度不断累计上升,并在你重启Redis服务后清...redisObject 结果包括一个lru属性, 记录了对象最后一次被命令程序访问的时间 OBJECT IDLETIME 输出对象的空转时间, 是将当前时间减去对象lru, 该命令是特殊实现, 不会修改对象的...lru属性 lru 属性用于配合实现maxmemory-policy中volatile-lru和allkeys-lru回收策略 lru算法 在Redis中LRU算法是一个近似算法,默认情况下,Redis
所以我也从4月底跟随之前的朋友一起开始了写作之路,我基本上是以面对对象是小白讲解方式开展自己的写作模式,期间也有小伙伴让我写高级点的 ,但是确实不敢在那么大佬面前造次;还是坚持从0到1的redis讲解之路...注意点:结果集返回是接收到message的订阅者数量,没有订阅者返回0。 pubsub指令:pubsub channels [argument [argument ...]]...; /* Map channels to list of subscribed clients */ } pubsub_channels定义的属性是一个字典类型,保存着客户端和频道信息,key值保存的就是频道名...当然还有这些命令可以玩耍 $redis->pubsub('channels'); // 获取所有频道 $redis->pubsub('channels', '*pattern*'); // 仅仅获取指定频道...redis发布订阅的优缺点 小伙伴们从上面的实践操作来看,PubSub生产的消息,如果没有对应的频道或者消费者,消息会被丢弃,直接投递失败返回0状态。
如果客户端没有为自己设置名字,那么相应客户端状态的name属性指向NULL指针; 相反地,如果客户端为自己设置了名字,那么name属性将指向一个字符串对象,而该对象就保存着客户端的名字。...执行 PUBSUB 命令会使客户端打开 REDIS_FORCE_AOF 标志,执行 SCRIPT LOAD 命令会使客户端打开 REDIS_FORCE_AOF 标志和 REDIS_FORCE_REPL...PUBSUB 命令虽然没有修改数据库,但 PUBSUB 命令向频道的所有订阅者发送消息这一行为带有副作用,接收到消息的所有客户端的状态都会因为这个命令而改变。...SCRIPT LOAD 命令的情况与PUBSUB命令类似:虽然SCRIPT LOAD命令没有修改数据库,但它修改了服务器状态,所以它是一个带有副作用的命令,服务器需要使用REDIS_FORCE_AOF标志...如果服务器没有启用身份验证功能的话,那么即使authenticated属性的值为0(这是默认值),服务器也不会拒绝执行客户端发送的命令请求。
Redis基础知识总结思维导图,系统的学习Redis。不定时更新。...性能优化 持久化 集群模式 子模块 基本知识 基本数据类型和使用场景 基本数据类型 string 二进制安全,可以包含任何数据,一个键最大能存储512M hash 键值对集合,存储、读取、修改用户属性...发布订阅缓冲区(pubsub):pubsub不是普通的命令,因此有单独的缓冲区。...配置过小 客户端连接池过多,过大 客户端存在连接泄露,服务端没有定时关闭连接 java.net.SocketTimeoutException: Read timed out 读写超时设置的过短。...NOAUTH Authentication required 客户端没有传密码 OOM command not allowed when used memory > 'maxmemory' Redis
= redis.pubsub() pubsub.psubscribe('__keyspace@0__:*') print('Starting message loop') while True...接下来,我们创建一个pubsub对象,该对象订阅一个频道并侦听新消息: pubsub = redis.pubsub() pubsub.psubscribe('__keyspace@0__:*')...如果没有数据,则该方法将返回None。...print(msg) thread.stop() pubsub = redis.pubsub() pubsub.psubscribe(**{'__keyevent@0__:expired...链接 https://redis.io/topics/notifications - Redis密钥空间通知文档 https://redis.io/topics/pubsub - Redis Pub /
初始化状态结构,都是简单的结构,后续的数据库、共享对象、慢查询日志、Lua环境等,都是后面才创建的。 2、载入配置选项 在启动redis服务器时,可以通过参数指定配置文件、端口号等。...//链表,保存频道订阅信息;server.pubsub_patterns链表,保存模式订阅信息。...创建共享对象,包括整数1~10000的字符串对象,“OK”、“ERR”回复的字符串对象等,用于避免反复创建相同对象。...4、还原数据库状态 如果开启aof,则载入aof文件;如果没有开启aof,则载入rdb文件。 载入完成后,在日志中打印载入的耗时。 5、执行事件循环 初始化最后一步,服务器将打印连接成功的日志。...redis服务器相关内容总结: 1、命令请求发送主要步骤——客户端命令发给服务器;服务器解析命令并存储在客户端的结构体相应属性;服务器检查是否具备执行条件,检查完毕后执行,执行后进行执行后的后续工作
为了实现这些数据结构,redis定义了抽象的对象redis object,如下图。每一个对象有类型,一共5种:字符串,链表,集合,有序集合,哈希表。...然后还有记录了对象的lru,即上次被访问的时间,同时在redis 服务器中会记录一个当前的时间(近似值,因为这个时间只是每隔一定时间,服务器进行自动维护的时候才更新),它们两个只差就可以计算出对象多久没有被访问了...然后redis object中还有引用计数,这是为了共享对象,然后确定对象的删除时间用的。最后使用一个void*指针来指向对象的真正内容。...正式由于使用了抽象redis object,使得数据库操作数据时方便很多,全部统一使用redis object对象即可,需要区分对象类型的时候,再根据type来判断。...这里并没有去除重复的客户,在pubsub_channels可能已经给某一个client发过message了,然后在pubsub_patterns中可能还会给用户再发一次(甚至更多次)。
在Redis-7.0.5源码中的体现: (来源:Redis-7.0.5: server.h --->struct redisServer ) 字典的底层实现使用哈希数组来实现,键为频道名字,值为链表...(订阅同一频道的客户端组成的链表),链表中的元素为连接的client对象。...(pubsub.c文件) (来源:Redis-7.0.5: pubsub.c --> void subscribeCommand(client *c)) 订阅命令:SUBSCRIBE channel...发布消息的流程 以频道名 renzhikeji为例: 发布消息命令的处理函数为:publishCommand(pubsub.c文件) (来源:Redis-7.0.5: pubsub.c -->...redis客户端client对象里的响应缓存是有限制的,一旦超过限制会强制关闭client,需要客户端处理重新订阅关系。 redis的发布订阅的这种实现,不能用来当做消息队列如rocktmq。
前言 在 Redis 系列的开篇文章中,我们对 Redis 概述以及 Redis 数据结构与对象进行了详细的讨论以及了解。...LRU 算法的思想是:如果一个数据在最近一段时间没有被访问到,那么可以认为在将来它被访问的可能性也很小。因此,当空间满时,最久没有访问的数据最先被置换(淘汰)。...Redis 提供 6 种数据淘汰策略 我们在该系列的上一篇文章中了解到,redisobject 中除了 type、encoding、ptr 和 refcount 属性外,还有一个 lru 属性用来计算空转时长...OBJECT IDLETIME 命令是特殊的,这个命令在访问键的对象时,不会修改值对象的 lru 属性。...的值来设置 redis 需要检查 key 的个数,但是检查的越多,耗费的时间也就越久,结构越精确 (也就是 Redis 从内存中淘汰的对象未使用的时间也就越久),设置多少,综合权衡。
退订指定模式的频道 pubsub channels 列出至少有一个订阅者的频道 pubsub numsub [channel...]..._conn = conn def subscribe(self, channel: Channel): # 获取发布/订阅对象 pub = self...._conn.pubsub() # 选择要订阅的频道 pub.subscribe(channel.name) while True:...redis对象 """ return redis.StrictRedis(address, port, password=password) 为了简便在订阅者和发布者两处都实例化了一个...“CCTV1”的频道,虽然用起来不会有什么问题(Redis中简单的通过字符串区分频道),但在实际中这应该是同一个对象。
消息的处理方式: 在 Redis 的发布订阅模式中,消息是即时的,也就是说,当消息发布后,只有当前在线且订阅了该频道的客户端才能收到这个消息,消息不会被存储,一旦发布,当前没有在线的客户端将无法接收到这个消息...在消息队列中,消息是持久化的,消息被发送到队列后,会一直在队列中等待被消费,即使没有在线的消费者,消息也不会丢失,消费者下次上线后可以继续从队列中获取到消息。...客户端结构:每个 Redis 客户端都有一个 pubsub_channels 和 pubsub_patterns 两个属性,分别用于存储该客户端订阅的频道和模式。...服务器的Pub/Sub结构:Redis 服务器维护了一个 pubsub_channels 字典和一个 pubsub_patterns 链表,用于存储所有的频道和模式。...如果没有客户端订阅这个频道,那么这个命令将不会有任何效果。
如果没有通过 XACK 命令告知消息已经成功消费了,该消息会一直存在,可以通过 XPENDING 命令查看已读取、但尚未确认处理完成的消息。...订阅 $ psubscribe p-test* 发送信息 $ PUBLISH p-testa ceshi-1 ◆看下源码实现 Redis 将所有频道和模式的订阅关系分别保存在 pubsub_channels...; /* A dict of pubsub_patterns */ // ... } pubsub_channels 属性是一个字典,字典的键为正在被订阅的频道,而字典的值则是一个链表, 链表中保存了所有订阅这个频道的客户端...使用 PSUBSCRIBE 命令订阅频道时,就会将订阅的频道和客户端在 pubsub_channels 中进行关联 代码路径 https://github.com/redis/redis/blob/6.2...看 redis 的提交记录可以发现,原本 pubsub_patterns 的类型是 list,后面调整成了 dict。
PubSub 的缺点 尽管 Redis 实现了 PubSub 模式来达到了 多播消息队列 的目的,但在实际的消息队列的领域,几乎 找不到特别合适的场景,因为它的缺点十分明显: 没有 Ack 机制,也不保证数据的连续...: PubSub 的生产者传递过来一个消息,Redis 会直接找到相应的消费者传递过去。...不持久化消息: 如果 Redis 停机重启,PubSub 的消息是不会持久化的,毕竟 Redis 宕机就相当于一个消费者都没有,所有的消息都会被直接丢弃。...基于上述缺点,Redis 的作者甚至单独开启了一个 Disque 的项目来专门用来做多播消息队列,不过该项目目前好像都没有成熟。...一方面,我们要 满足 ID 自增 的属性,另一方面,也是为了 支持范围查找 的功能。由于 ID 和生成消息的时间有关,这样就使得在根据时间范围内查找时基本上是没有额外损耗的。
本次示例我们需要安装的是 Redis 通过在平台管理->应⽤市场->开源应⽤商店->搜索 Redis 并进行安装。安装完成后,在应用视图->k8s资源->编写 Component 资源进行绑定。...apiVersion: dapr.io/v1alpha1kind: Componentmetadata: name: pubsubspec: type: pubsub.redis version:.../zhangqihang/pubsub-react-form:latestregistry.cn-hangzhou.aliyuncs.com/zhangqihang/pubsub-go-subscriber...:latest由于 Dapr 中消息队列需要为组件 annotations 属性设置 dapr.io/app-port 字段,切换治理模式的时候并没有自动生成,所以我们需要在组件视图->其他设置->Kubernetes...部署最终效果在pubsub-react-form 组件的组件视图->端口->打开对外服务便可实现访问消息发布组件,向订阅 A、B、C中发布消息,通过观察pubsub-node-subscriber和pubsub-go-subscriber
领取专属 10元无门槛券
手把手带您无忧上云