聊城网站建设设计开发公司,西安可以做网站的,word做招聘网站,企业logo设计要素1.redis为什么这么快#xff1f; #xff08;1#xff09;基于内存操作#xff1a;redis的所有数据都存在内存中#xff0c;因此所有的运算都是内存级别的#xff0c;所以性能比较高 #xff08;2#xff09;数据结构简单#xff1a;redis的数据结构是专门设计的…1.redis为什么这么快 1基于内存操作redis的所有数据都存在内存中因此所有的运算都是内存级别的所以性能比较高 2数据结构简单redis的数据结构是专门设计的而这些简单的数据结构的查找和操作时间大部分复杂度都是O(1)因此性能比较高 3多路复用和非阻塞I/Oredis使用I/O多路复用功能来监听多个socket连接客户端这样可以使用一个线程连接来处理多个请求 4避免上下文切换单线程模型避免了不必要的上下文切换和多线程竞争省去了多线程切换带来的时间和性能消耗 2.redis主要的性能瓶颈是内存或者网络带宽而非CPU
3.redis多线程的使用 网络硬件的性能提升redis的性能瓶颈出现在网络IO的处理上单个主线程处理网络请求的速度跟不上底层网络硬件的速度所以redis6/7采用多个IO线程来处理网络请求提高网络请求的并行度。redis的多IO只是用来处理网络请求的对于读写操作命令redis仍然使用单线程这样就避免了开发多线程的互斥加锁机制 4.面试问题 1海量数据里查询某一固定前缀key scan命令遍历 2生产上如何限制keys */flushdb/flushall等危险命令以防止误删误用 key* 这个指令有致命的弊端这个指令没有offset、limit参数是要一次性遍历所有满足条件的key由于redis是单线程的其所有操作都是原子的而keys算法是遍历算法复杂度是O(n)如果实例中有千万级别以上的key这个指令就会导致redis服务卡顿所有读写redis的其它指令都会被延后甚至会超时报错可能会引起缓存雪崩甚至数据库宕机。 禁用方法在配置文件中 rename-command keys rename-command flushdb rename-command flushall 3memory usage 命令的使用 获取关键字的value所占内存的字节数 4bigkey多大算big?如何发现如何删除如何处理 单个key的value小于10KB 对于集合类型的key建议元素数量小于1000 想查询大于10kb的所有key--bigkeys参数就无能为力了需要用到memory usage来计算每个键值的字节数 redis-cli -h 192.168.1.5 -p 6379 -a root --bigkeys 这个命令会扫描(Scan) Redis 中的所有 key 会对 Redis 的性能有一点影响。并且这种方式只能找出每种数据结构 top 1 bigkey占用内存最大的 string 数据类型包含元素最多的复合数据类型 5bigkey做过调优吗惰性释放lazyfree了解过吗 使用lazyfree开启unlink命令和将del删除命令变为异步删除key防止删除的时候卡顿 6生产上redis数据库有1000w记录如何遍历key * 可以吗 不可以 scan遍历 SCAN 0 match k7* count 10 zscan 遍历 zset 集合元素 hscan 遍历 hash 字典的元素 sscan 遍历 set 集合的元素。 5.生成100万redis数据 for((i1;i100*10000;i)); do echo set k$i v$i ./redisTest.txt ;done; cat ./redisTest.txt | redis-cli -h 192.168.1.5 -p 6379 -a root --pipe