Redis面试常见问题
Redis中的Lua脚本到底能不能保证原子性?
Redis中Lua脚本的执行,可以保证并发编程中不可再拆分的这个原子性,但是没有保证数据库ACID中要么都执行要么都回滚的这个原子性。Lua脚本执行过程中命令产生错误,是不会回滚的,后续命令不会执行。
在数据库中的原子性,确实是一个不可拆分的工作单元,要么都执行,要么都不执行。因为事务可以Commit、也可以Rollback。
在并发编程中,我们把一个或者多个操作在 CPU 执行的过程中不被中断的特性称为原子性。
redis为什么快?
-
操作基于内存
-
IO多路复用
-
单线程操作:省去多线程时CPU上下文会切换的时间
Redis 单线程指的是网络请求模块使用了一个线程,即一个线程处理所有网络请求,其他模块该使用多线程,仍会使用了多个线程。
-
数据结构。
redis为什么设计16384槽
Normal heartbeat packets carry the full configuration of a node, that can be replaced in an idempotent way with the old in order to update an old config. This means they contain the slots configuration for a node, in raw form, that uses 2k of space with16k slots, but would use a prohibitive 8k of space using 65k slots.At the same time it is unlikely that Redis Cluster would scale to more than 1000 mater nodes because of other design tradeoffs.
So 16k was in the right range to ensure enough slots per master with a max of 1000 maters, but a small enough number to propagate the slot configuration as a raw bitmap easily. Note that in small clusters the bitmap would be hard to compress because when N is small the bitmap would have slots/N bits set that is a large percentage of bits set.
- 如果槽位为65536,发送心跳信息的消息头达8k(65536÷8÷1024=8kb),发送的心跳包过于庞大。所以槽位(16394÷8÷1024=2kb)比较合适。
- redis的集群主节点数量基本不可能超过1000个。
- 槽位越小,节点少的情况下,压缩率高
热key问题
概念:在Redis中,热key问题指的是某个key被频繁访问,导致该key所在的数据结构增长过大,进而导致Redis性能下降甚至宕机。
对于热key的处理,主要在于事前预测和事中解决。
在事中解决方面,主要可以考虑,热点key拆分、多级缓存、热key备份、限流等方案来解决。
LRU、LFU
LRU指的是最近最少使用(Least Recently Used),是一种缓存淘汰策略。在实现缓存时,为了让缓存的命中率更高,我们需要选择合适的缓存淘汰策略。LRU的具体做法是将最近最少使用的缓存块置换出去,即将最久未被访问的缓存块淘汰掉。
LFU是Least Frequently Used的缩写,意为最不经常使用。LFU算法是一种用于缓存管理的算法,它根据数据项在最近一段时间内被访问的频率来确定哪些数据应该从缓存中删除以腾出空间。当缓存达到容量限制时,LFU算法会优先删除被访问次数最少的数据项。与其他缓存替换算法相比,LFU算法可以更加高效地利用缓存空间。
Redis怎么保证数据不丢失
- 持久化:redis支持AOF和RDB、混合的持久化方式,可以保证数据不丢失。
- 集群:有主从模式,哨兵模式和cluster集群模式集群来保证应用的可靠性,保证数据不丢失。