请稍等 ...
×

采纳答案成功!

向帮助你的同学说点啥吧!感谢那些助人为乐的人

两个问题

1、老师在课程里面讲string类型的,如果需要存储的数据超过现有的容量会1MB 1MB的扩容,那如果来的是很大的值,这样会不会太费时间了呀。
2、还有个问题就是老师说redis还是单线程进行存取数据,那后来新加的多线程是用在哪里了呢?

正在回答

1回答

1、string类型的扩容机制,它其实是节省了存储空间,在一定程度上反而会提高性能
2、多线程主要是解决两个问题,一个是提高CPU的利用率(以前单线程只能用1核);二是提高网络的IO处理能力,任务可以分摊 Redis 同步 IO 读写负荷

0 回复 有任何疑惑可以回复我~
  • 提问者 java搬砖 #1
    非常感谢!
    回复 有任何疑惑可以回复我~ 2020-11-30 23:10:15
  • 提问者 java搬砖 #2
    看了老师的答案后依然有些懵懵懂懂,所以后来又查阅了《Redis设计与实现》一书。
    
    String用到的是SDS结构,该结构除了保存数据data外还额外保存了当前数据长度length和空闲空间free。
    
    传统程序中的字符串是不包含length和free的,每次修改支付串会同时让底层的数组进行空间重分配,会耗费很多性能。
    而我们的redis的sds结构可以根据预空间分配策略减少空间多次重分配:
    当扩容后大小小于1M,free会额外开出当前length的大小,以供下次扩容;
    当扩容后大小大于1M,free会额外开除1M的大小(老师课程里讲的),以供下次扩容。
    
    所以说这是一种空间换时间的方法:
    1、减少每次统计length时O(n)的计算量,只生成或扩缩容时统计一次
    2、采用预空间分配、惰性空间释放(缩容用)的优化机制,使传统的加长N次String就扩容N次变成了redis的加长N次最多扩容N次。
    回复 有任何疑惑可以回复我~ 2020-12-02 17:44:34
  • 提问者 java搬砖 #3
    把刚学的消化后码一下,老师麻烦确认下,我码的是否有问题,不然消化错了也是麻烦事
    回复 有任何疑惑可以回复我~ 2020-12-02 17:50:02
问题已解决,确定采纳
还有疑问,暂不采纳
意见反馈 帮助中心 APP下载
官方微信