Redis⾯试常问问题(⼀定要看)1.说⼀下Redis有什么特点?
1)Redis基于k-v数据库,访问速度快
2)⽀持数据的持久化(可以将数据保存在硬盘,重启Redis之后可以重新写⼊内存)
3)⽀持丰富的数据类型,主要包括string、list、hash、set、zset
4)⽀持主从数据备份
5)⽀持事务
2.说⼀下Redis都有什么数据类型?
Redis 有五个常⽤的数据类型
string ,list,set,zset,和hash
Redis5.0以后添加了新的数据类型stream
3.说⼀下Redis常有的命令
Redis的命令⾮常多
string类型
- set:赋值;
- get:获取指定key的值;
- setnx:当设置的key不存在时则进⾏设置;
- setex:设置key的有效时间;
- mset:⼀次为多个key赋值;
- mget:⼀次获取多个key的值;
- incr:对key的值做加加操作,并返回新的值;
hash类型
- hset:赋值;
-
hget:获取某个key下的某个field的值;
- hgetall:获取⼀个key下所有field和value;
- hkeys:获取所有的key;
- hvals:获取某个key下所有的value;
- hexists:测试给定key下的field是否存在;
list类型
- lpush:从头部(链表左侧)添加元素;
- lpop:从list头部获取元素
- rpush:从尾部(链表右侧)添加元素;
- rpop:从list尾部获取元素
- lrange:查看list的所有元素:lrange list名称 0 -1
-
linsert:在某个元素的前后插⼊元素 linsert list before/after 原有元素新元素
- lrem:移除元素 lrem list 2(移除个数) “key”
- rpoplpush:从原来的list的尾部删除元素,并将其插⼊到新的list的头部
- lindex:返回指定索引的值
- llen:返回list的元素个数
set类型
- sadd:添加元素;
- smembers:获取集合中所有元素
- sismember:判断元素是否在集合中
- srem:删除元素
- scard:获取元素个数,相当于count
-
spop:随机返回删除的元素
- sdiff:差集,返回在第⼀个set⾥⾯⽽不在后⾯任何⼀个set⾥⾯的项(谁在前以谁为标准)  - sdiffstore:差集并保留结果
redis支持的数据结构- sinter:交集,返回多个set⾥⾯都有的项
- sinterstore:交集并保留结果
- sunion:并集
- sunionstore:并集并保留结果
- smove:移动元素到另⼀个集合
zset类型
- zadd:添加元素;
- zrange:获取索引区间内的元素;
- zrangebyscore:获取分数区间内的元素
4.说⼀下Redis和MemCache的区别
1.在存储⽅式⽅⾯
Memecache 把数据全部存在内存中,不能持久化数据
Redis⽀持数据的持久化(RDB和AOF)
2.在数据类型⽅⾯
Redis在数据类型上的⽀持⽐memecache多的多
3.在底层模型⽅⾯
redis在2.0版本后增加了⾃⼰的VM特性,突破物理内存的限制
Memcache可以修改最⼤可⽤内存,采⽤LRU算法
4.数据⼀致性⽅⾯
Memcache在并发场景下,⽤CAS保证⼀致性;
Redis 事务⽀持⽐较弱,只能保证事务中的每个操作连续执⾏
附:Memcache的介绍
1. Memcached的优点:
- Memcached可以利⽤多核优势,单实例吞吐量极⾼,可以达到⼏⼗万QPS(取决于key、value的字节⼤⼩以及服务器硬件性能,⽇常环境中QPS⾼峰⼤约在4-6w左右)。
2. Memcached的局限性:
只⽀持简单的key/value数据结构,不像Redis可以⽀持丰富的数据类型。
⽆法进⾏持久化,数据不能备份,只能⽤于缓存使⽤,且重启后数据全部丢失。
⽆法进⾏数据同步,不能将Memcached中的数据迁移到其他Memcached实例中。
Memcached内存分配采⽤Slab Allocation机制管理内存,value⼤⼩分布差异较⼤时会造成内存利⽤率降低,并引发低利⽤率时依然出现踢出等问题。
- 需要⽤户注重value设计
5.关于Redis的回收策略,过期机制的相关问题
Redis 回收策略过期机制? Redis内存满了怎么办,有什么替换策略?
问题2:假如我有10亿条数据,可以拿30%放进redis缓存吗?redis缓存有没有限制?
问题3:MySQL有1000万数据,Redis只存20w的数据,如何保证redis中的数据都是热点数据?
回答:
Redis 内存数据集上升到⼀定⼤⼩的时候,会实⾏数据淘汰策略
Redis key过期的⽅式有三种
1.被动删除:当读、写⼀个已经过期的key时,会触发惰性删除策略,直接删除掉过期的key
2.主动删除:由于惰性删除策略⽆法保证冷数据被及时删掉,所以Redis会定期主动淘汰⼀批已过期的key
3.当前已⽤内存超过maxmemory时,触发主动清理策略
当前已⽤内存超过maxmemory限定时,触发主动清理策略,主动清理策略有6种:
1. volitile-lru:从已设置过期时间的数据集中挑选"最近最少使⽤"的数据进⾏淘汰;
2. volitile-ttl:从已设置过期时间的数据集中挑选"将要过期"的数据进⾏淘汰;
3. volitile-random:从已设置过期时间的数据集中"任意"挑选数据进⾏淘汰;
4.allkeys-lru:从数据集中挑选"最近最少使⽤"的数据进⾏淘汰
5. allkeys-random:从数据集中"任意"选择数据进⾏淘汰;
6. no-envicition:设置永不过期,禁⽌驱逐数据;
Redis缓存怎么与数据库数据保持⼀致?(缓存与数据双写⼀致)
⼀、什么是缓存与数据库双写⼀致问题?
如果仅仅查询的话,缓存的数据和数据库的数据是没问题的。
但是,当我们要更新时候呢?各种情况很可能就造成数据库和缓存的数据不⼀致了。
⽐如:数据库中存储的某篇⽂章的点赞数为10,⽽Redis中存储的点赞数为11;
⼆、对于读操作
- 如果数据在Redis缓存⾥,那么就直接取Redis缓存的数据。
- 如果数据不在Redis缓存⾥,那么先去查询数据库,然后将数据库查出来的数据写到Redis缓存中。
- 最后将数据返回
从理论上说,只要我们设置了键的过期时间,我们就能保证缓存和数据库的数据最终是⼀致的。
因为只要缓存数据过期了,就会被删除。之后再读的时候,如果缓存⾥没有,可以查数据库的数据,然后将查出来的数据写⼊到缓存中。
除了设置过期时间,我们还需要做更多的措施来尽量避免数据库与缓存处于不⼀致的情况发⽣。
这个时候,跟⾯试官说⼀下⼏种处理策略:
- 先更新数据库,再删除缓存
这种策略会出现如下情况
情形1. 如果更新数据库就失败了,程序可以直接返回错误(Exception),不会出现数据不⼀致。
情形2. 更新数据库成功,删除缓存失败;这就会导致数据库⾥是新数据,⽽缓存⾥是旧数据。
解决情形2思路:
1.先删除缓存,再更新数据库。如果数据库更新失败了,那么数据库中是旧数据,缓存中是空的,那么数据不会不⼀致。
这样读的时候缓存没有,所以去读了数据库中的旧数据,然后更新到缓存中。
2. 将需要删除的key发送到消息队列中,⾃⼰消费消息,获得需要删除的key,不断重试删除操作,直到成功
- 先删除缓存,再更新数据库
这种策略会出现如下美好情况
1. 删除缓存成功,更新数据库失败,这样的话,数据库和缓存的数据最终是⼀致的。
2. 删除缓存失败了,我们可以直接返回错误(Exception),数据库和缓存的数据还是⼀致的。
但是在并发场景下,就会下⾯的问题:
- 线程1删除了缓存;
- 线程2查询,发现缓存已不存在;
- 线程2去数据库查询得到旧值;
- 线程2将旧值写⼊缓存;
- 线程1将新值写⼊数据库;
- 所以也会导致数据库和缓存不⼀致的问题;
解决思路:
将删除缓存、修改数据库、读取缓存等的操作积压到队列⾥边,实现串⾏化。
Redis负载均衡了解吗?怎么实现的?
利⽤Redis官⽅提供的Redis集⽅案实现Redis数据的负载均衡
Redis集⾃动分割数据到不同的节点上,整个集的部分节点失败或者不可达的情况下能够继续处理命令、
Redis集引⼊了哈希槽的概念,集有16384个哈希槽,每个key通过CRC16校验后对16384取模来决定放置哪个槽,集的每个节点负责⼀部分hash槽。你们Redis做读写分离了么
不做读写分离,我们⽤的是Redis集架构,是属于分⽚集的架构;
Redis本⾝在内存上操作,不会涉及IO吞吐,即使读写分离也不会提升太多性能;
Redis在⽣产上的主要问题是考虑容量,单机最多10-20G,key太多降低Redis性能,因此采⽤分⽤分⽚集结构,已经能保证了我们的性能
如果使⽤了读写分离后,还要考虑主从⼀致性,主从延迟等问题,会增加务复杂度。
Redis集机制中,你觉得有什么不⾜的地⽅
1、默认不⽀持批量操作,如不⽀持mset、mget等命令
2、如果⼀个key对应的value是Hash类型的,若Hash对象⾮常⼤,是不⽀持映射到不同节点的,只能映射到集中的⼀个节点上!
了解Redis的多数据库机制吗?了解多少?
1.单机下的Redis默认⽀持16个数据库;但是
-不⽀持⾃定义数据库名称
-不⽀持为每个数据库设置访问密码
-数据库之间不是完全隔离的,FLUSHALL命令会清空所有数据库的数据
-多数据库不适⽤存储不同的应⽤数据
2.我们⽣产环境中使⽤Redis集,集架构下只有⼀个数据库空间,即db0
因此,我们没有使⽤Redis的多数据库功能!
6.10 说⼀下Redis事务?
1. Redis对事务的⽀持⽐较简单,它是⼀组命令的集合,命令被依次顺序的执⾏;
2. 我们在⽣产上采⽤的是Redis集,不同的key是可能分到不同的Redis节点上的,在这种情况下Redis的事务机制是不⽣效的;
3. Redis事务不⽀持回滚操作,所以基本没有使⽤过;
Redis持久化的两种⽅式及应⽤场景?
两种⽅式RDB和AOF
RDB是在不同的时间点,将Redis某⼀时刻的数据⽣成快照,并保存在磁盘上
AOF是只允许追加不允许改写⽂件,是将Redis执⾏过的所有写指令记录下来,在下次redis重启的时候,只要把这些指令从前到后重复执⾏⼀遍,就可以实现数据恢复
RDB持久化触发⽅式:⾃动触发和⼿动触发
⾃动触发⽅式在f⽂件配置
⼿动触发⽅式: save命令:执⾏此命令会阻塞Redis服务器
bgsave命令:执⾏该命令时,Redis会在后台异步进⾏快照操作
AOF持久化
默认的AOF持久化策略是每秒钟⼀次同步策略
AOF的同步策略还有always和no两种,加上everysec,共三种
RDB可以和AOF同时使⽤吗?
RDB和AOF两种⽅式可以同时使⽤,这时如果Redis重启则会优先采⽤AOF⽅式进⾏数据恢复因为AOF⽅式的数据恢复完整度更⾼;

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。