Redis系列(九)--几道面试题
这里只是一点面试题,想了解更多,可以查看本人的Redis系列:https://www.cnblogs.com/huigelaile/category/1461895.html
1、Redis和Memcached的区别
1).存储方式
Memcached的数据都存储在内存中,只要端点就挂掉,数据不会超过内存大小
Redis的数据有部分保存在硬盘,当数据量超过内存大小,不常用的数据就会交换到磁盘
Redis会缓存所有key的信息,如果内存超过一定阀值,将触发swap的操作,Redis将计算出哪些key对应的value需要swap到磁盘。然后再将这些
key对应的value持久化到磁盘中,同时在内存中清除。这种特性使得Redis可以保持超过其机器本身内存大小的数据。当然,机器本身的内存必须要
能够保持所有的key,毕竟这些数据 是不会进行swap操作的。
这是一个很重要的区别
2).支持数据类型
Memcached支持简单key-value,只不过也支持缓存视频等
Redis支持的数据类型很丰富,String、hash、list、set、zset、GEO、bitmap、HyperLogLog
3).使用底层模型不同
它们之间底层实现方式 以及与客户端之间通信的应用协议不一样。
Redis直接自己构建了VM 机制 ,因为一般的系统调用系统函数的话,会浪费一定的时间去移动和请求。
4).数据备份
Redis支持master-slave模式的主从复制
5).持久化
Redis支持RDB、AOF两种方式进行磁盘持久化
Memcached不支持持久化
6).应用场景
redis:数据量较小的更性能操作和运算上
memcache:用于在动态系统中减少数据库负载,提升性能;做缓存,提高性能(适合读多写少,对于数据量比较大,可以采用sharding)
个人没有用过Memcached,如果上述问题有误差,请留言
2、redis的并发竞争问题如何解决
Redis为单进程单线程模式,采用队列模式将并发访问变为串行访问。Redis本身没有锁的概念,Redis对于多个客户端连接并不存在竞争,
但是在Jedis客户端对Redis进行并发访问时会发生连接超时、数据转换错误、阻塞、客户端关闭连接等问题,这些问题均是由于客户端连接混乱
造成。
对此有2种解决方法:
客户端角度,为保证每个客户端间正常有序与Redis进行通信,对连接进行池化,同时对客户端读写Redis操作采用内部锁synchronized。
服务器角度,实现分布式锁。
3、redis事务的了解
和众多其它数据库一样,Redis作为NoSQL数据库也同样提供了事务机制。在Redis中,MULTI/EXEC/DISCARD/WATCH这四个命令是我们实现事务的
基石。
简要的列出Redis中事务的实现特征:
1、在事务中的所有命令都将会被串行化的顺序执行,事务执行期间,Redis不会再为其它客户端的请求提供任何服务,从而保证了事物中的所有
命令被原子的执行。
2、和关系型数据库中的事务相比,在Redis事务中如果有某一条命令执行失败,其后的命令仍然会被继续执行。
3、我们可以通过MULTI命令开启一个事务,可以将其理解为BEGIN TRANSACTION语句。在该语句之后执行的命令都将被视为事务之内的操作,最
后我们可以通过执行EXEC/DISCARD命令来提交/回滚该事务内的所有操作。这两个Redis命令可被视为等同于关系型数据库中的COMMIT/ROLLBACK语句。
4、在事务开启之前,如果客户端与服务器之间出现通讯故障并导致网络断开,其后所有待执行的语句都将不会被服务器执行。然而如果网络中
断事件是发生在客户端执行EXEC命令之后,那么该事务中的所有命令都会被服务器执行。
5、当使用Append-Only模式时,Redis会通过调用系统函数write将该事务内的所有写操作在本次调用中全部写入磁盘。然而如果在写入的过程中
出现系统崩溃,如电源故障导致的宕机,那么此时也许只有部分数据被写入到磁盘,而另外一部分数据却已经丢失。Redis服务器会在重新启动时执
行一系列必要的一致性检测,一旦发现类似问题,就会立即退出并给出相应的错误提示。此时,我们就要充分利用Redis工具包中提供的redis-check
-aof工具,该工具可以帮助我们定位到数据不一致的错误,并将已经写入的部分数据进行回滚。修复之后我们就可以再次重新启动Redis服务器了。