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