为什么 redis单线程,效率这么高
1、纯内存操作
2、核心是基于非阻塞的IO多路复用机制
3、单线程反而避免了多线程的频繁上下文切换问题
一、特点:
1、支持持久化
2、丰富的数据类型
3、数据的备份 主从
4、速度极高,读的速到能到11w次/秒,写的速度8w/秒
5、具有原子性,并且还支持几个操作合并后的原子性执行
二、使用场景
1、取最新n个数据的操作
2、排行榜类似的应用
3、需要精准设定过期时间的应用
4、计数器的应用
5、做唯一性检查的操作
6、实时系统
7、缓存
三、Redis性能调优
由于redis是单线程的,所有的命令都是有一个线程串执行的,所以redis对每条命令的执行效率比较铭感
1、确保没有让redis执行耗时长的命令
2、使用popelining将连续执行的命令组合执行
3、操作系统的Transparent huge pages功能必须关闭
4、尽可能在屋里机上直接部署redis,因为在虚拟机上可能天然就有虚拟机环境带来的股友延迟
5、考虑引入读写分离机制
6、检查持久化策略
7、不要把List当做列表使用,仅当做队列使用
8、可能得化,将排序,并集,交集的等操作放在客户端执行
9、绝对禁止使用KEYS命令
10、避免一次性遍历集合类型的所有成员。应该使用SCAN类的命令进行分批,游标式的遍历
网络引发的延迟
1、尽可能使用长连接或连接池,避免频繁创建销毁连接
2、客户端进行批量操作时,应使用Pipleline特性在一次交互中完成
数据持久化引发的延迟:
1、AOF+fsync always的设置虽然能够绝对保证数据安全,但每个操作都会触发一次fsync,会对Redis的性能有比较明显的影响
2、AOF+ fsync every second 是比较好的方案,每秒fsync一次
3、AOF+fsync never 会提供AOF持久化方案下的最优性能
4、使用RDB持久化通常比使用AOF有更高的性能,但是得注意配置RDB策略配置
5、每一ICRDB快照和AOF Rewrite 都需要Redis主进程进行fork操纵,fork操作本会可能会产生较高的耗时,与CPU和Redis占用的内存带下有关,避免过于频繁fortk带来的延迟
Swap引发的延迟
1、当linux将Redis所用的内存分移至swap空间时,将会阻塞Redis的线程
主从复制:一个Master 实例处理所有写请求,Master将写操作同步至所有Slave
四、主从赋值与集群分片
主从复制:一个Master 实例处理所有写请求,Master将写操作同步至所有Slave
原理:Redis Cluster中共有16384个hash slot,Redis会计算没个key的CRC16,将结果与16384取模,来决定该key存储在哪个Hash slot中,同时需要制定Redis Cluster中没个数据分片负责的Solt数,Slot的分配在任何时间点都可以进行重新分配。