带读 |《Redis 设计与实现》(英文名:The Design and Implementation of Redis)

Why Redis?

  • Redis是一种运行速度很快,并发很强,跑在内存上的NoSql数据库,支持键到五种数据类型的映射。根据Redis官方提供的benchmark测试数据,redis读的速度是110000次/s,写的速度是81000次/s,并且实验证明,数据没在缓存的时候,相同条件下用Jmeter进行压测,redis的请求处理速度比MySQL高了7倍。另外,在时间局部性原理很强的场景下,Redis可以从缓存迅速响应,而不是去数据库查sql,尤其是已经放入缓存的数据,这表现出了Redis的高性能
  • Redis是单线程的,避免了多线程上下文的切换和锁竞争的时间开销。(在Redis6.0之后在网络读写时已替换成多线程,但执行命令仍然是单线程)
  • Redis指令是原子性的,高并发时不会产生数据异常,Redis 使用 I/O 多路复用技术,可以处理高并发的连接(非阻塞I/O),这意味着能够让一个计算单元来处理来自多个客户端的流请求实现高并发

想要深入了解Redis,这本《Redis 设计与实现》就无法绕开了。


第一部分 数据结构与对象

简单动态字符串 SDS

SDS对标的是C语言的String,通过在底层实现数组buf的基础上增加len和free字段,实现了

  1. 常数复杂度获取字符串长度
  2. 杜绝缓冲区溢出
  3. 减少修改字符串时带来的内存重分配次数

带读 |《Redis 设计与实现》(英文名:The Design and Implementation of Redis)_第1张图片

实现的原理也巨简单,,,C的String不记录len,每次都只能遍历String时间复杂度O(n),SDS空间换时间用一个len记录一下,时间复杂度直接降到O(1),这就能解释上面的1和2,至于3就是free这个字段的作用了,redis使用了空间预分配和惰性空间释放策略,说白了就是SDS修改之后如果变长了,实际分配的空间不仅仅是len,会根据SDS长度定,如果新的SDS小于1M,新的SDS大小就在原基础上double+1,为啥double,因为这里会多分配一倍给free,这就是空间预分配;为啥+1byte,因为最后一个字节保留空字符,为啥保留空字符,为了更好的兼容C语言对字符串的操作,对的,没有看错,Redis底层就是用的标准C语言实现的。如果新的SDS大于1M,free就等于1M,新的SDS就等于旧的SDS+1M+1byte。


未完待续。


参考: 黄健宏. Redis 设计与实现[M]. Ji xie gong ye chu ban she, 2014. 带读 |《Redis 设计与实现》(英文名:The Design and Implementation of Redis)_第2张图片
https://zhuanlan.zhihu.com/p/...
https://youle.zhipin.com/ques...

你可能感兴趣的:(redisredis集群)