问题一:redis为啥快?
  • 纯内存操作;
  • 单线程
    • 省去了很多上下文切换线程的时间;
    • 内核空间内存的占用;
    • 避免锁竞争死锁的 线程安全问题;
  • 非阻塞io:io多路复用机制,io不浪费时间,非阻塞方式;
  • 优秀的存储数据结构 哈希表,跳跃表等数据结构 时间复杂度O(1)
    • key-value简单,简单就快;
    • 没种类型都有几种数据结构针对不同的情况处理;
  • resp协议,人类可读 非常简单的协议 :redis (REdis Serialization Protocol)  序列化协议
 
redis的高性能
例如发送一个set kingzz 1 命令到redis,则通过java会被解析为:
*3:表示有三组数据
$3:第一组数据的长度为3
set
$6:第二组数据长度为6
kingzz
$1
1
将这样一组数据发送到redis,这就是resp协议;返回也一样;
aof中追加的命令?
redis的高性能
问题二:redis为啥是单线程的?
  • 瓶颈不在cpu;
  • 多线程的核心目的主要是为了提高cpu的使用率,但是redis的瓶颈不在cpu;
  • (cpu密集型 + io密集型 ) 线程数 = (cpu计算+io等待)/cpu计算
  • 内存网络带宽才是redis的瓶颈;
 
ps:仍然存在原子性问题,操作的顺序;
 
redis的优化
Lua 脚本执行命令,类似数据库的存储过程:使用 Lua 脚本来执行 Redis 命令的好处: 
  • 1、 减少网络开销:pipeline+一次发送多个命令;
  • 2、原子性:Redis 会将整个脚本作为一个整体执行,封装多个命令操作,不会被其他请求打断,保持原子性。 
  • 3、复用:对于复杂的组合命令,类似于新命令,我们可放在文件中,生成摘要,可以实现程序之间的命令集复用,其他客户端也可使用。
 
 
 
 
 
 
 
 
 
 

相关文章:

  • 2021-09-14
  • 2021-07-30
  • 2022-12-23
  • 2021-06-30
  • 2021-12-18
  • 2021-11-28
  • 2018-08-28
猜你喜欢
  • 2022-12-23
  • 2022-12-23
  • 2022-12-23
  • 2021-08-30
  • 2022-12-23
  • 2022-12-23
  • 2021-06-26
相关资源
相似解决方案