-
Notifications
You must be signed in to change notification settings - Fork 46
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
[Vssue]反馈问题 #5
Comments
作者你好,在项目 Springboot项目开发青铜哪里的项目代码都找不到了,github找不到该页面。 |
@17365756283
【项目】中整个章节都会重新整理下,引入更多优秀的学习资源,目前还在更新中,敬请期待。 目前学习SpringBoot项目可以参考SpringBoot 2.5.x 系列教程 |
redis pubsub章节中
实际上
原文中的匹配模式获得Channels有点歧义,我理解实际上应该是publish时根据channel获得所有pattern以及对应的客户端 |
你好,不是太明白为何会有歧义:
原文 已经在上下文中对pubsub_patterns 数据结构进行了说明: typedef struct pubsubPattern {
redisClient *client;
robj *pattern;
} pubsubPattern;
如下源码中,通过遍历整个 pubsub_patterns 链表,调用stringmatchlen方法来对pubsub_pattern(dictEntry *de就是pubsub_pattern)中的pattern进行模式匹配(过滤掉不满足的pattern的channel),通过addReplyPubsubPatMessage方法发送给再对pubsub_pattern中的client。 /*
* Publish a message to all the subscribers.
*/
int pubsubPublishMessageInternal(robj *channel, robj *message, pubsubtype type) {
int receivers = 0;
dictEntry *de;
dictIterator *di;
listNode *ln;
listIter li;
/* Send to clients listening for that channel */
de = dictFind(*type.serverPubSubChannels, channel);
if (de) {
list *list = dictGetVal(de);
listNode *ln;
listIter li;
listRewind(list,&li);
while ((ln = listNext(&li)) != NULL) {
client *c = ln->value;
addReplyPubsubMessage(c,channel,message);
updateClientMemUsage(c);
receivers++;
}
}
if (type.shard) {
/* Shard pubsub ignores patterns. */
return receivers;
}
/* Send to clients listening to matching channels */
di = dictGetIterator(server.pubsub_patterns);
if (di) {
channel = getDecodedObject(channel);
while((de = dictNext(di)) != NULL) {
robj *pattern = dictGetKey(de);
list *clients = dictGetVal(de);
// 模式匹配, 过滤掉不满足的pattern的channel
if (!stringmatchlen((char*)pattern->ptr,
sdslen(pattern->ptr),
(char*)channel->ptr,
sdslen(channel->ptr),0)) continue;
listRewind(clients,&li);
while ((ln = listNext(&li)) != NULL) {
client *c = listNodeValue(ln);
addReplyPubsubPatMessage(c,pattern,channel,message);
updateClientMemUsage(c);
receivers++;
}
}
decrRefCount(channel);
dictReleaseIterator(di);
}
return receivers;
} 同时,为何pattern 还需要作为参数传入addReplyPubsubPatMessage? 因为这个pattern除了可以模式匹配channel外,还可以匹配message的内容。 /* Send a pubsub message of type "pmessage" to the client. The difference
* with the "message" type delivered by addReplyPubsubMessage() is that
* this message format also includes the pattern that matched the message. */
void addReplyPubsubPatMessage(client *c, robj *pat, robj *channel, robj *msg) {
if (c->resp == 2)
addReply(c,shared.mbulkhdr[4]);
else
addReplyPushLen(c,4);
addReply(c,shared.pmessagebulk);
addReplyBulk(c,pat);
addReplyBulk(c,channel);
addReplyBulk(c,msg);
} 再回看原文描述:
基于上下文而言和源码,这里的模式匹配是指“pubsubPattern中的pattern”, 这里的客户端指“pubsubPattern中的client”。所以不认为有任何歧义~ |
@realpdai 刚开始深入学习redis,如果哪里不对还请继续指正。谢谢! |
https://pdai.tech/md/dev-spec/spec/dev-th-base.html Soft state(软状态)软状态也称为弱状态,和硬状态相对,是指允许系统中的数据存在中间状态,并认为该中间状态的存在不会影响系统的整体可用性,即允许系统在不同节点的数据副本之间进行数据听不的过程存在延时。 一个typo:数据听不(同步)的过程存在延时 |
感谢指出,已修复! |
作者你好,我在阅读中发现了文章中的文字可能存在的错误。 |
非常好的反馈格式!感谢指出,已经修复~ |
https://www.pdai.tech/md/java/thread/java-thread-x-lock-LockSupport.html 作者您好,这句话有点问题,如果在wait()之前调用notify()会怎样?程序应该会继续执行,但是wait会一直阻塞。 |
https://pdai.tech/md/java/thread/java-thread-x-juc-overview.html 文中第一个图,途中写的是aotmic,图的拼写有错误 |
文章链接: |
很棒!已经更正! |
感谢指出,已经修复~ |
新版本是SMEMBERS,感谢指出,已经修复~ |
我这边看没有问题哈 |
很棒,笔误了,已经修正,感谢指出! |
地址: https://pdai.tech/md/dev-spec/spec/dev-th-acid.html |
感谢,已修复这个typo. |
作者您好, Java 基础 - 知识点 这部分 关于hashCode() 知识点的demo |
@by111
对不起,没问题的 我没和上面的demo结合起来看 |
https://pdai.tech/md/algorithm/alg-sort-x-shell.html 希尔排序稳定性希尔排序是不稳定的算法,它满足稳定算法的定义。 |
希尔排序不是稳定算法,它不满足稳定算法的定义。少了一个不... 感谢指出,已经修正完善! |
https://pdai.tech/md/java/java8/java8-jre.html JPEDS工具使用应为: JDEPS工具使用 |
在Map - LinkedHashSet&Map源码解析中,描述的是java1.6中的源码,但java1.8中由于hashmap的修改,LinkdeHashMap的源码也做了响应修改。应指出文中叙述的是java1.6版本,或添加jav1.8解说。 |
JUC工具类: CountDownLatch详解这个章节,最后一段代码CountDownLatch实现并不能正确实现这个监控计数的功能,ArrayList是非线程安全的,list的add和size方法也并非原子操作,所以多线程环境下size返回也非线程安全的,简而言CountDownLatch不能实现这个功能,还是得用锁 |
SpringBoot集成Socket - 基础的Websocket实现是空的,没有内容 |
在MySQL性能优化中,您提到分解大连接查询,但是我了解到将一个大连接查询分解成对每一个表进行一次单表查询,并不一定会提高效率,甚至,这种做法可能会导致性能下降。以下是几个原因说明为什么这种分解可能不会提高效率: 网络开销:如果每个单表查询都需要单独发送到数据库服务器,那么网络开销会增加,因为需要发送更多的查询请求和接收更多的结果集。 磁盘I/O:每个单表查询都可能导致磁盘I/O操作,而一个大连接查询可能会利用索引和优化技术来减少磁盘I/O。 内存使用:数据库服务器可能会为每个查询分配内存资源,多个单表查询可能会导致内存使用效率降低。 锁竞争:每个查询都可能需要锁定表或行,多个查询可能会增加锁竞争,从而影响并发性能。 优化器能力:现代数据库优化器通常能够有效地处理连接查询,通过使用索引、查询重写和执行计划优化等技术来提高效率。 结果集处理:如果每个单表查询的结果都需要在应用程序中进行处理和组合,那么应用程序的复杂性和处理时间可能会增加。 缓存利用:数据库服务器可能会缓存查询结果,多个单表查询可能会导致缓存利用效率降低。 |
2.log4j的官网地址写错了,应该是https://logging.apache.org/log4j/1.x/ |
异常处理的finally处有一点歧义,里面提到“finally总是被执行”,但实际上finally是有不会被执行的情况的,这点在后续部分也有提到。算一个小小的歧义。具体位置链接如下:https://pdai.tech/md/java/basic/java-basic-x-exception.html#%E5%BC%82%E5%B8%B8%E5%85%B3%E9%94%AE%E5%AD%97 |
String s1 = new String("aaa");
|
关键字: volatile详解 : https://pdai.tech/md/java/thread/java-thread-x-key-volatile.html#volatile-%E6%9C%89%E5%BA%8F%E6%80%A7%E5%AE%9E%E7%8E%B0 「为了性能优化,JMM 在不改变正确语义的前提下,会允许编译器和处理器对指令序列进行重排序。」这里应该是「JVM」吧 |
Get it!
|
(URL: https://pdai.tech/md/spring/spring-x-framework-aop.html#%E5%88%87%E5%85%A5%E7%82%B9-pointcut-%E7%9A%84%E7%94%B3%E6%98%8E%E8%A7%84%E5%88%99) |
青铜 - 前后端分离方式演进青铜 - 前后端分离方式演进组哟 |
青铜 - 前后端分离方式演疏忽测测 |
CP的RFC定义这个MSS的默认值是536,这是因为 RFC 791里说了任何一个IP设备都得最少接收576尺寸的大小 https://pdai.tech/md/develop/protocol/dev-protocol-tcpip.html#silly-window-syndrome |
标题:关键字: synchronized详解
|
在aqs一文中 关于ConditionObject的源码备注有误,是清除状态为非CONDITION的结果 |
https://pdai.tech/md/db/nosql-redis/db-redis-x-rdb-aof.html redis持久化篇中,写时复制技术是在rdb时才有的哦,aof并没有使用到该技术 |
Get it!
|
带 routing 查询查询的时候,可以直接根据 routing 信息定位到某个“分配”查询,不需要查询所有的“分配”,经过协调节点排序。向上面自定义的用户查询,如果 routing 设置为 userid 的话,就可以直接查询出数据来,效率提升很多 文中的“分配“感觉是错别字,是不是”分片“。 |
[https://www.pdai.tech/md/db/nosql-redis/db-redis-data-type-enc.html](Redis进阶 - 数据结构:redis对象与编码(底层结构)对应关系详解)中,最后提到:
但是通过查看redis源码发现,5.0与7.0版本的转换判断条件都是或,并不是同时满足条件: /* check if the element is too large or the list
* becomes too long *before* executing zzlInsert. */
if (zzlLength(zobj->ptr)+1 > server.zset_max_listpack_entries ||
sdslen(ele) > server.zset_max_listpack_value ||
!lpSafeToAdd(zobj->ptr, sdslen(ele)))
{
zsetConvertAndExpand(zobj, OBJ_ENCODING_SKIPLIST, zsetLength(zobj) + 1);
} |
Get it!
|
文章地址:https://www.pdai.tech/md/dev-spec/pattern/11_compsite.html |
Java 中的编译期常量是什么? 使用它又什么风险? |
Get it!
|
集合--》按表达式过滤--》遍历、每个元系处理--》放入预先定义的集合中 |
正如JDPA名称中的Debugger,JDPA其实是一套用于调试Java程序的标准 |
JVM 基础 - JVM 内存结构 |
https://pdai.tech/md/dev-spec/pattern/2_singleton.html
|
https://www.pdai.tech/md/about/me/blog-question.html
The text was updated successfully, but these errors were encountered: