Skip to content
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

Open
realpdai opened this issue Mar 16, 2021 · 299 comments
Open

[Vssue]反馈问题 #5

realpdai opened this issue Mar 16, 2021 · 299 comments
Labels

Comments

@realpdai
Copy link
Owner

https://www.pdai.tech/md/about/me/blog-question.html

@realpdai realpdai added the Vssue label Mar 16, 2021
@heixiaozhi
Copy link

作者你好,在项目 Springboot项目开发青铜哪里的项目代码都找不到了,github找不到该页面。

@realpdai
Copy link
Owner Author

@17365756283

作者你好,在项目 Springboot项目开发青铜哪里的项目代码都找不到了,github找不到该页面。

【项目】中整个章节都会重新整理下,引入更多优秀的学习资源,目前还在更新中,敬请期待。

目前学习SpringBoot项目可以参考SpringBoot 2.5.x 系列教程

@realpdai
Copy link
Owner Author

@JoeyHe912
Copy link

JoeyHe912 commented Apr 2, 2022

redis pubsub章节中
原文

发送信息到模式的工作也是由 PUBLISH 命令进行的, 显然就是匹配模式获得Channels,然后再把消息发给客户端。

实际上

PUBLISH 除了将 message 发送到所有订阅 channel 的客户端之外, 它还会将 channel 和 pubsub_patterns 中的模式进行对比, 如果 channel 和某个模式匹配的话, 那么也将 message 发送到订阅那个模式的客户端。

原文中的匹配模式获得Channels有点歧义,我理解实际上应该是publish时根据channel获得所有pattern以及对应的客户端

@realpdai
Copy link
Owner Author

realpdai commented Apr 2, 2022

@JoeyHe912

redis pubsub章节中
原文

发送信息到模式的工作也是由 PUBLISH 命令进行的, 显然就是匹配模式获得Channels,然后再把消息发给客户端。

实际上

PUBLISH 除了将 message 发送到所有订阅 channel 的客户端之外, 它还会将 channel 和 pubsub_patterns 中的模式进行对比, 如果 channel 和某个模式匹配的话, 那么也将 message 发送到订阅那个模式的客户端。

原文中的匹配模式获得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);
}

再回看原文描述:

发送信息到模式的工作也是由 PUBLISH 命令进行的, 显然就是匹配模式获得Channels,然后再把消息发给客户端

基于上下文而言和源码,这里的模式匹配是指“pubsubPattern中的pattern”, 这里的客户端指“pubsubPattern中的client”。所以不认为有任何歧义~

@JoeyHe912
Copy link

JoeyHe912 commented Apr 2, 2022

@realpdai
channel不是PUBLISH命令的入参之一吗?为什么其中还会获得Channels(多个)呢?
源码看起来是拿入参的Channel,去跟链表里的所有pattern依次做匹配,获得匹配patterns对应的receivers
我比较纠结的是一次publish过程中应该只有一个channel?

刚开始深入学习redis,如果哪里不对还请继续指正。谢谢!

@JoeyHe912
Copy link

https://pdai.tech/md/dev-spec/spec/dev-th-base.html

Soft state(软状态)软状态也称为弱状态,和硬状态相对,是指允许系统中的数据存在中间状态,并认为该中间状态的存在不会影响系统的整体可用性,即允许系统在不同节点的数据副本之间进行数据听不的过程存在延时。

一个typo:数据听不(同步)的过程存在延时

@realpdai
Copy link
Owner Author

realpdai commented Apr 5, 2022

@JoeyHe912

https://pdai.tech/md/dev-spec/spec/dev-th-base.html

Soft state(软状态)软状态也称为弱状态,和硬状态相对,是指允许系统中的数据存在中间状态,并认为该中间状态的存在不会影响系统的整体可用性,即允许系统在不同节点的数据副本之间进行数据听不的过程存在延时。

一个typo:数据听不(同步)的过程存在延时

感谢指出,已修复!

@liusishan
Copy link

作者你好,我在阅读中发现了文章中的文字可能存在的错误。
文章标题:Java 基础 - 反射机制详解
文章链接:https://pdai.tech/md/java/basic/java-basic-x-reflection.html
原文①:RRIT(Run-Time Type Identification)运行时类型识别。
①这个地方的缩写应该是“RTTI”?
原文②:数组同样也被映射为为class 对象的一个类。
②这句话里面“为”字重复

@realpdai
Copy link
Owner Author

realpdai commented Apr 6, 2022

@liusishan

作者你好,我在阅读中发现了文章中的文字可能存在的错误。
文章标题:Java 基础 - 反射机制详解
文章链接:https://pdai.tech/md/java/basic/java-basic-x-reflection.html
原文①:RRIT(Run-Time Type Identification)运行时类型识别。
①这个地方的缩写应该是“RTTI”?
原文②:数组同样也被映射为为class 对象的一个类。
②这句话里面“为”字重复

非常好的反馈格式!感谢指出,已经修复~

@zhenpingliu
Copy link

https://www.pdai.tech/md/java/thread/java-thread-x-lock-LockSupport.html
-->
Object.wait()和LockSupport.park()的区别
-->
“如果在wait()之前执行了notify()会怎样? 抛出IllegalMonitorStateException异常;”

作者您好,这句话有点问题,如果在wait()之前调用notify()会怎样?程序应该会继续执行,但是wait会一直阻塞。
什么情况下抛出IllegalMonitorStateException异常呢?当前线程不是对象监视器的所有者时,调用nofify或者wait都会抛出此异常。

@lsbnbdz
Copy link

lsbnbdz commented Apr 7, 2022

https://pdai.tech/md/java/thread/java-thread-x-juc-overview.html

文中第一个图,途中写的是aotmic,图的拼写有错误

@cutehuman
Copy link

文章链接:
https://pdai.tech/md/db/nosql-redis/db-redis-data-types.html
错误:
Redis 集合SMEMBER命令【使用】错误了。

@realpdai
Copy link
Owner Author

realpdai commented Apr 7, 2022

@zhenpingliu

https://www.pdai.tech/md/java/thread/java-thread-x-lock-LockSupport.html
-->
Object.wait()和LockSupport.park()的区别
-->
“如果在wait()之前执行了notify()会怎样? 抛出IllegalMonitorStateException异常;”

作者您好,这句话有点问题,如果在wait()之前调用notify()会怎样?程序应该会继续执行,但是wait会一直阻塞。
什么情况下抛出IllegalMonitorStateException异常呢?当前线程不是对象监视器的所有者时,调用nofify或者wait都会抛出此异常。

很棒!已经更正!

@realpdai
Copy link
Owner Author

realpdai commented Apr 7, 2022

@lsbnbdz

https://pdai.tech/md/java/thread/java-thread-x-juc-overview.html

文中第一个图,途中写的是aotmic,图的拼写有错误

感谢指出,已经修复~

@realpdai
Copy link
Owner Author

realpdai commented Apr 7, 2022

@cutehuman

文章链接:
https://pdai.tech/md/db/nosql-redis/db-redis-data-types.html
错误:
Redis 集合SMEMBER命令【使用】错误了。

新版本是SMEMBERS,感谢指出,已经修复~

@shoyu666
Copy link

shoyu666 commented Apr 8, 2022

@realpdai
Copy link
Owner Author

realpdai commented Apr 8, 2022

@shoyu666

https://pdai.tech/md/java/jvm/java-jvm-struct.html
图片裂了

我这边看没有问题哈

@JoeyHe912
Copy link

JoeyHe912 commented Apr 9, 2022

@realpdai
Copy link
Owner Author

realpdai commented Apr 9, 2022

@JoeyHe912

https://pdai.tech/md/java/jvm/java-jvm-agent-arthas.html#%E9%87%8D%E8%A6%81%EF%BC%9A%E6%89%BE%E5%88%B0%E6%9C%80%E8%80%97%E6%97%B6%E7%9A%84%E6%96%B9%E6%B3%95%E8%B0%83%E7%94%A8
重要:找到最耗时的方法调用?
这里是否应该是trace而不是stack?

很棒,笔误了,已经修正,感谢指出!

@RoadTLife
Copy link

地址: https://pdai.tech/md/dev-spec/spec/dev-th-acid.html
错误内容:
章节 什么是ACID。该词 Durablity(持久性)错误 ,请修改为 Durability(持久性)

@realpdai
Copy link
Owner Author

@RoadTLife

地址: https://pdai.tech/md/dev-spec/spec/dev-th-acid.html
错误内容:
章节 什么是ACID。该词 Durablity(持久性)错误 ,请修改为 Durability(持久性)

感谢,已修复这个typo.

@j4free
Copy link

j4free commented Apr 11, 2022

作者您好, Java 基础 - 知识点 这部分 关于hashCode() 知识点的demo
System.out.println(e1.equals(e2)); // true 这行代码返回false

@j4free
Copy link

j4free commented Apr 11, 2022

@by111

作者您好, Java 基础 - 知识点 这部分 关于hashCode() 知识点的demo
System.out.println(e1.equals(e2)); // true 这行代码返回false

对不起,没问题的 我没和上面的demo结合起来看

@b1tzer
Copy link

b1tzer commented Apr 13, 2022

https://pdai.tech/md/algorithm/alg-sort-x-shell.html

希尔排序稳定性

希尔排序是不稳定的算法,它满足稳定算法的定义。
这句话前后矛盾。

@realpdai
Copy link
Owner Author

@b1tzer

https://pdai.tech/md/algorithm/alg-sort-x-shell.html

希尔排序稳定性

希尔排序是不稳定的算法,它满足稳定算法的定义。
这句话前后矛盾。

希尔排序不是稳定算法,它满足稳定算法的定义。少了一个不...

感谢指出,已经修正完善!

@b1tzer
Copy link

b1tzer commented Apr 13, 2022

https://pdai.tech/md/java/java8/java8-jre.html
原文:

JPEDS工具使用

应为:

JDEPS工具使用

@Dkenze
Copy link

Dkenze commented Apr 14, 2022

在Map - LinkedHashSet&Map源码解析中,描述的是java1.6中的源码,但java1.8中由于hashmap的修改,LinkdeHashMap的源码也做了响应修改。应指出文中叙述的是java1.6版本,或添加jav1.8解说。

@XJShane
Copy link

XJShane commented May 16, 2024

JUC工具类: CountDownLatch详解这个章节,最后一段代码CountDownLatch实现并不能正确实现这个监控计数的功能,ArrayList是非线程安全的,list的add和size方法也并非原子操作,所以多线程环境下size返回也非线程安全的,简而言CountDownLatch不能实现这个功能,还是得用锁

@yangzhao1924563771
Copy link

SpringBoot集成Socket - 基础的Websocket实现是空的,没有内容

@Dream-it-possible1995
Copy link

在MySQL性能优化中,您提到分解大连接查询,但是我了解到将一个大连接查询分解成对每一个表进行一次单表查询,并不一定会提高效率,甚至,这种做法可能会导致性能下降。以下是几个原因说明为什么这种分解可能不会提高效率:

网络开销:如果每个单表查询都需要单独发送到数据库服务器,那么网络开销会增加,因为需要发送更多的查询请求和接收更多的结果集。

磁盘I/O:每个单表查询都可能导致磁盘I/O操作,而一个大连接查询可能会利用索引和优化技术来减少磁盘I/O。

内存使用:数据库服务器可能会为每个查询分配内存资源,多个单表查询可能会导致内存使用效率降低。

锁竞争:每个查询都可能需要锁定表或行,多个查询可能会增加锁竞争,从而影响并发性能。

优化器能力:现代数据库优化器通常能够有效地处理连接查询,通过使用索引、查询重写和执行计划优化等技术来提高效率。

结果集处理:如果每个单表查询的结果都需要在应用程序中进行处理和组合,那么应用程序的复杂性和处理时间可能会增加。

缓存利用:数据库服务器可能会缓存查询结果,多个单表查询可能会导致缓存利用效率降低。

@no-trifling
Copy link

1.常用开发库 - 日志类库详解

2.log4j的官网地址写错了,应该是https://logging.apache.org/log4j/1.x/

@MaverickMango
Copy link

异常处理的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

@wangcuisun
Copy link

String s1 = new String("aaa");
String s2 = new String("aaa");
System.out.println(s1 == s2); // false
String s3 = s1.intern();
System.out.println(s1.intern() == s3); // true

出处:https://pdai.tech/md/java/basic/java-basic-lan-basic.html#stringintern
作者您好,这个例子有点费解,s1.intern() 不就是 s3 吗? s1.intern() == s3 这个肯定是true啊,这个例子似乎无法验证 s1 和 s3 引用的是同一个字符串常量池的对象。

@nimoqqq
Copy link

nimoqqq commented Jul 4, 2024

关键字: 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」吧

@HongXiaoHong
Copy link

HongXiaoHong commented Jul 4, 2024 via email

@zark721
Copy link

zark721 commented Jul 4, 2024

(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)
其中"切入点(pointcut)的申明规则?"这个部分的插图有误。
一个execution表达式必要的部分 = "返回类型" + “方法名” + “参数”。
但是图中却标识必要的部分是 "返回类型" + “包和类” + “参数”。

@jzbcoding
Copy link

青铜 - 前后端分离方式演进青铜 - 前后端分离方式演进组哟

@jzbcoding
Copy link

青铜 - 前后端分离方式演疏忽测测

@hhlhhhh
Copy link

hhlhhhh commented Jul 13, 2024

CP的RFC定义这个MSS的默认值是536,这是因为 RFC 791里说了任何一个IP设备都得最少接收576尺寸的大小
这句话里面不应该是最大接收576么,MTU

https://pdai.tech/md/develop/protocol/dev-protocol-tcpip.html#silly-window-syndrome

@komorebi123456
Copy link

标题:关键字: synchronized详解
网页:https://www.pdai.tech/md/java/thread/java-thread-x-key-synchronized.html
原文:Monitorenter和Monitorexit指令,会让对象在执行,使其锁计数器加1或者减1。每一个对象在同一时间只与一个monitor(锁)相关联,而一个monitor在同一时间只能被一个线程获得,一个对象在尝试获得与这个对象相关联的Monitor锁的所有权的时候,monitorenter指令会发生如下3中情况之一:
monitor计数器为0,意味着目前还没有被获得,那这个线程就会立刻获得然后把锁计数器+1,一旦+1,别的线程再想获取,就需要等待
如果这个monitor已经拿到了这个锁的所有权,又重入了这把锁,那锁计数器就会累加,变成2,并且随着重入的次数,会一直累加
这把锁已经被别的线程获取了,等待锁释放

我对Monitor的定义感到疑惑,在您的句子里(“每一个对象在同一时间只与一个monitor(锁)相关联,而一个monitor在同一时间只能被一个线程获得,一个对象在尝试获得与这个对象相关联的Monitor锁的所有权的时候”),monitor是锁的意思,但是在这个句子里(“如果这个monitor已经拿到了这个锁的所有权,又重入了这把锁”)已经拿到了这个锁的所有权,又重入了这把锁的主语应该不是monitor吧,应该是线程??

@zlongliu
Copy link

在aqs一文中
链接:https://www.pdai.tech/md/java/thread/java-thread-x-lock-AbstractQueuedSynchronizer.html

关于ConditionObject的源码备注有误,是清除状态为非CONDITION的结果
// 清除状态为CONDITION的结点
unlinkCancelledWaiters();

@x270944070
Copy link

https://pdai.tech/md/db/nosql-redis/db-redis-x-rdb-aof.html

redis持久化篇中,写时复制技术是在rdb时才有的哦,aof并没有使用到该技术

@HongXiaoHong
Copy link

HongXiaoHong commented Aug 8, 2024 via email

@du-mozzie
Copy link

https://www.pdai.tech/md/db/nosql-es/elasticsearch-y-peformance.html#%E5%B8%A6-routing-%E6%9F%A5%E8%AF%A2

带 routing 查询查询的时候,可以直接根据 routing 信息定位到某个“分配”查询,不需要查询所有的“分配”,经过协调节点排序。向上面自定义的用户查询,如果 routing 设置为 userid 的话,就可以直接查询出数据来,效率提升很多

文中的“分配“感觉是错别字,是不是”分片“。

@a1oyss
Copy link

a1oyss commented Sep 5, 2024

[https://www.pdai.tech/md/db/nosql-redis/db-redis-data-type-enc.html](Redis进阶 - 数据结构:redis对象与编码(底层结构)对应关系详解)中,最后提到:

当有序集合对象同时满足以下两个条件时,对象使用 ziplist 编码:
1、保存的元素数量小于128;

2、保存的所有元素长度都小于64字节。

但是通过查看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);
}

@HongXiaoHong
Copy link

HongXiaoHong commented Sep 5, 2024 via email

@17830043558
Copy link

文章地址:https://www.pdai.tech/md/dev-spec/pattern/11_compsite.html
类图中存在两个composite类,没有component类

@ageovb
Copy link

ageovb commented Oct 7, 2024

Java 中的编译期常量是什么? 使用它又什么风险?
➡️
Java 中的编译期常量是什么? 使用它有什么风险?

@HongXiaoHong
Copy link

HongXiaoHong commented Oct 7, 2024 via email

@ageovb
Copy link

ageovb commented Oct 8, 2024

集合--》按表达式过滤--》遍历、每个元系处理--》放入预先定义的集合中
➡️
集合--》按表达式过滤--》遍历、每个元素处理--》放入预先定义的集合中

@ageovb
Copy link

ageovb commented Oct 10, 2024

正如JDPA名称中的Debugger,JDPA其实是一套用于调试Java程序的标准
➡️
正如JPDA名称中的Debugger,JPDA其实是一套用于调试Java程序的标准

@913678917
Copy link

JVM 基础 - JVM 内存结构
5.5 方法区在 JDK6、7、8中的演进细节
字符串常量池、静态变量仍在堆中有疑惑
静态变量是属于类的,不是属于任何实例的,因此静态变量存储在非堆内存区域,即元空间。

@qksuki
Copy link

qksuki commented Dec 12, 2024

https://pdai.tech/md/dev-spec/pattern/2_singleton.html

6 中 实现方式
错别字勘误

@SSSDNSY
Copy link

SSSDNSY commented Dec 24, 2024

原文出处链接
参考博客

错误点:本质上是将对象的地址以值的方式传递到形参中

应该是:本质上是将对象值拷贝一份放到形参中

@SSSDNSY
Copy link

SSSDNSY commented Dec 24, 2024

@SSSDNSY

原文出处链接
参考博客

错误点:本质上是将对象的地址以值的方式传递到形参中

应该是:本质上是将对象值拷贝一份放到形参中

因为按照原文说的地址值传过去不就是引用传递么,结合给的示例我想不通为啥dog的hashcode没有变

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
Projects
None yet
Development

No branches or pull requests