redis相关的面题有哪些?在Java程序采访期间,人们会问到与Redis有关的问题,在这里将整理一下它们的常见问题。Redis是用C语言编写的开放源码、高性能、非关键-值对数据库。Redis能在关键字和五种不同类型的值之间存储映射。关键字类型只能是string,值支持5种数据类型:字符串、列表、集合、散列表、有序集合。
1.什麽是Redis?
Redis实质上是一种Key-Value类型的内存数据库,与memcached非常类似,它在内存中统统装载整个数据库以进行操作,定期将数据库数据flush通过异步操作保存到硬盘上。只有记忆操作,Redis表现得很好,它每秒能处理100,000次以上的读写,是Key-ValueDB,速度最高。Redis支持保存多个数据结构,另外一个value的最大限制为1GB,与memcached不同,memcached只能保存1MB的数据,Redis可用于实现许多有用的功能。
2.与memcached相比,Redis的优点是什么?
Rmemcached所有的值都是简单的字符串,redis提供了更丰富的替代数据类型;redis比memcached更快;redis能够持久存储数据。
3.Redis的数据淘汰战略有哪些?
noeviction.allkeys-lru.allkeys-random.volatile-random.volatile-ttl五项淘汰策略:
(1)noeviction:返回一个错误,当内存限制达到时,客户机试图执行将允许使用更多内存;
(2)allkeys-lru:试图回收最少使用的键(LRU),使新添加的数据有空间存储;
(3)volatile-lru:试图回收最少用到的键(LRU),但是限制到过期收集的键,这使新添加的数据有空间存储;
(4)allkeys-random:回收随机键,使新添加的数据有空间存储;
(5)volatile-random:回收随机关键字使新添加的数据具有存储空间,但只限于过期集合中的键。
volatile-ttl:回收在过期集合中的关键字,并优先回收存活时间(TTL)更短的键,使新添加的数据得以存储。
4.为什么把Redis数据放进内存?
Redis把所有的数据读写到内存中,然后异步地把数据写到磁盘上,达到最快的读取和写入。redis具有快速且数据持久性。磁盘I/O速度对redis性能有很大影响,因为没有把数据放到内存中。
5.Redis适用于哪些场景?
(1)会话缓存。
使用Redis最常用的一种场景是会话缓存。使用Redis缓存会话与其它存储相比的优点是:Redis提供持久性。在维护一个并没有严格要求一致性的缓存中,如果用户的购物车信息全部丢失,大多数人也会感到不开心,难道还会如此吗?多年来Redis的改进使我们很容易地发现如何正确地使用Redis来缓存会话文档。即使Magento著名的商业平台也提供了Redis插件。
(2)全页缓存。
除了基本的会话token外,Redis还提供了FPC平台。返回到一致性问题上,即使重启Redis实例,由于存在磁盘持久性,用户也不会看到页面加载速度的降低,这是一个巨大的改善,就像PHP本地FPC一样。
(3)队列
Reids在内存存储引擎领域的主要优势在于提供了list和set操作,使Redis可以成为一个好的消息队列平台。Redis作为队列的操作,与本地程序语言(例如Python)对list的push/pop操作相似。
只要在Google上快速搜索“Redisqueues”,就会立即发现一大批开放源码项目,它们旨在利用Redis创建非常好的后端工具,以满足各种队列需求。举例来说,Celery有一个后台,它使用Redis作为broker,从这里可以看到它。
(4)排名表/计数。
Redis在存储器中增加或减少数字的操作可以很好地实现。收集(Set)和有序集合(SortedSet)也让我们在执行这些操作时变得非常简单,Redis仅仅提供了这两个数据结构。因此,要从排序集合中获得10个排名最高的用户-我们称之为"user_scores"。
(5)出版/订阅。
Redis发布/订阅功能。发行/订阅的使用场景的确很多。我已经看到一些人用于社会网络连接,它们也可以作为脚本触发器,基于发布/订阅甚至通过Redis的发布/订阅功能创建一个聊天系统!
6.什么是Redis集群方案?
(1)codis。
当前使用的集群模式,基本的和twemproxy-致的效果,但是它支持当节点数目变化时,可以将旧的节点数据恢复到新的hash节点。
(2)redis。
cluster3.0自带集群,其特点是其分布式算法并非一致性hash,而是hash槽的概念,以及它本身支持从节点设置。特别是官方文件介绍。
(3)实现业务代码层。
给出无关紧要的redis实例,key在代码层上执行hash计算,然后去处理相应的redis实例。该方法对hash层代码要求较高,考虑了其中包括替换算法的节点失效方案、数据震荡后的自动脚本恢复、实例监控等。
使用Redis主要是考虑项目的性能和并发性。了解Redis关注以下内容:RedisClient.RedisPredisPredis,讨论.Redis复制原理及优化策略.redis分布式解决方案等。