面试题
Redis的数据类型及应用场景?
为什么单线程的Redis比多线程的Memcache的效率要高?
为什么Redis是单线程但是还可以支撑高并发?
Redis如何通过读写分离来承受百万的QPS
Redis的持久化策略有哪些?AOF和RDB各有什么优缺点
Redis的过期策略以及LRU算法
如何保证Redis的高并发和高可用?
redis的主从复制原理能介绍一下么?
redis的哨兵原理能介绍一下么?
Redis主备切换的数据丢失问题:异步复制、集群脑裂
Redis哨兵的底层原理
剖析
Redis最基本的一个内部原理和特点就是NIO异步的单线程工作模型。Memcache是早些年个大互联网公司常用的缓存方案,但是现在近几年都是使用的redis,没有什么公司使用Memcache了。
注意:Redis中单个Value的大小最大为512MB,redis的key和string类型value限制均为512MB
Redis和Memcache的区别
从Redis作者给出的几个比较
-
Redis拥有更多的数据结构
- Redis相比Memcache来说,拥有更多的数据结构和支持更丰富的数据操作,通常在Memcache里,你需要将数据拿到客户端来进行类似的修改,在set进去。这就大大增加了网络IO的次数和体积,在Redis中,这些复杂的操作通常和一般的set/get一样高效。所以,如果需要缓存能够支持更复杂的结构和操作,那么Redis是不错的选择
-
Redis内存利用率对比
- 使用简单的key-value存储的话,Memcache的内存利用率更高,而Redis采用Hash结构来做key-value存储,由于其组合式的压缩,其内存利用率会高于Memcache
-
性能对比
- 由于Redis只使用了单核,而Memcache可以使用多核,所以平均每核上Redis在存储小数据比Memcache性能更高,而在100K以上的数据中,Memcache性能更高,虽然Redis最近也在存储大数据的性能上进行优化,但是比起Memcache还有略有逊色。
-
集群模式
- Memcache没有原生的集群模式,需要依赖客户端来实现往集群中分片写入数据,但是Redis目前是原生支持cluster模式的。
Redis都有哪些数据类型,及使用场景
-
String
- 最基本的类型,就和普通的set 和 get,做简单的key - value 存储
-
Hash
- 这个是 类似于Map的一种结构,就是一半可以将结构化数据,比如对象(前提是这个对象没有嵌套其它对象)给缓存在redis中,每次读写redis缓存的时候,可以操作hash里面的某个字段
<pre spellcheck="false" class="md-fences md-end-block ty-contain-cm modeLoaded" lang="" cid="n70" mdtype="fences" style="box-sizing: border-box; overflow: visible; font-family: Monaco, Consolas, "Andale Mono", "DejaVu Sans Mono", monospace; margin-top: 0px; margin-bottom: 20px; font-size: 0.9rem; display: block; break-inside: avoid; text-align: left; white-space: normal; background: rgb(51, 51, 51); position: relative !important; padding: 10px 10px 10px 30px; width: inherit;">key=150
value={
"id": 150,
"name": "张三",
"age": 20,
}</pre>- Hash类的数据结构,主要用来存放一些对象,把一些简单的对象给缓存起来,后续操作的时候,你可以直接仅仅修改这个对象中某个字段的值。