本机真实用自定义__enter__/__exit__验证:正常退出、内部抛异常、__exit__返回True吞掉异常,三种场景下__exit__真实都会被调用,第三种场景真实能让外面完全感知不到异常发生过。
本机真实对比没有try/finally和有try/finally的@contextmanager生成器,验证前者在内部异常时清理代码真实会被跳过(资源泄漏),后者真实总能执行到。
本机真实实现一个数据描述器拦截属性读写,验证即使直接往实例__dict__里塞同名key,读取真实依然会被描述器拦截——数据描述器的优先级真实高于实例字典,property本身也真实是用这套协议实现的。
本机真实统计__getattribute__和__getattr__的真实调用次数:8次属性访问全部真实触发__getattribute__,只有3次真正失败的访问触发了__getattr__,并真实复现了__getattr__里误用self.x导致的无限递归陷阱。
本机真实起Redis 8.10.1,把list-max-listpack-size设成128,真实验证一个list在128个元素时是listpack编码,加第129个元素的瞬间真实变成quicklist。
本机真实验证list、hash、zset三种类型的小集合,OBJECT ENCODING真实都统一显示listpack,不再是老版本Redis的ziplist——三种类型变大后真实分别转向quicklist、hashtable、skiplist三种不同的结构。
本机真实验证一个全是整数的set用intset编码,加一个非整数成员立刻变成listpack;另一个intset真实超过set-max-intset-entries数量限制时,却直接跳过listpack变成hashtable——两条真实不同的升级路径。
本机真实验证44字节的字符串是embstr编码,45字节立刻变成raw——精确卡在字节数上的分界线,再验证哪怕再短的字符串,一次APPEND操作也会立刻真实把它变成raw。
本机真实验证纯数字字符串是int编码,INCR之后依然是int,但一次APPEND立刻把int转成raw;真实还发现超过64位整数范围的数字,压根不会被编码成int,而是直接变成embstr。
本机真实按老版本Redis文档描述的条件测试小整数共享池:OBJECT REFCOUNT真实一直是1,不是预期的巨大共享计数;真实又用10万个key的内存对比做了独立验证,证实这个版本真实没有观察到共享效果。
本机真实验证PERSIST能让TTL从100变回-1,一个200毫秒过期的key在300毫秒后访问真实返回不存在(被动过期),另一个100毫秒过期的key即使完全不访问,500毫秒后DBSIZE也真实自动减少了(主动过期)。
本机真实用MEMORY USAGE测5种大小的字符串,发现100000字节的value真实要多付出14717字节的额外开销(14.7%),比1000字节value的51字节开销比例高得多;再对比1000个字段的hash和1000个元素的list,真实内存占用相差6.4倍。