1、Redis 是什么?


2、Redis 有哪些应用场景?

1、缓存
缓存现在几乎是所有中大型网站都在用的必杀技,合理的利用缓存不仅能够提升网站访问速度,还能大大降低数据库的压力。Redis提供了键过期功能,也提供了灵活的键淘汰策略,所以,现在Redis用在缓存的场合非常多。
2、排行榜
很多网站都有排行榜应用的,如京东的月度销量榜单、商品按时间的上新排行榜等。Redis提供的有序集合数据类构能实现各种复杂的排行榜应用。
3、计数器
什么是计数器,如电商网站商品的浏览量、视频网站视频的播放数等。为了保证数据实时效,每次浏览都得给+1,并发量高时如果每次都请求数据库操作无疑是种挑战和压力。Redis提供的incr命令来实现计数器功能,内存操作,性能非常好,非常适用于这些计数场景。
4、分布式会话
集群模式下,在应用不多的情况下一般使用容器自带的session复制功能就能满足,当应用增多相对复杂的系统中,一般都会搭建以Redis等内存数据库为中心的session服务,session不再由容器管理,而是由session服务及内存数据库管理。
5、分布式锁
在很多互联网公司中都使用了分布式技术,分布式技术带来的技术挑战是对同一个资源的并发访问,如全局ID、减库存、秒杀等场景,并发量不大的场景可以使用数据库的悲观锁、乐观锁来实现,但在并发量高的场合中,利用数据库锁来控制资源的并发访问是不太理想的,大大影响了数据库的性能。可以利用Redis的setnx功能来编写分布式的锁,如果设置返回1说明获取锁成功,否则获取锁失败,实际应用中要考虑的细节要更多。
6、 社交网络
点赞、踩、关注/被关注、共同好友等是社交网站的基本功能,社交网站的访问量通常来说比较大,而且传统的关系数据库类型不适合存储这种类型的数据,Redis提供的哈希、集合等数据结构能很方便的的实现这些功能。
7、最新列表
Redis列表结构,LPUSH可以在列表头部插入一个内容ID作为关键字,LTRIM可用来限制列表的数量,这样列表永远为N个ID,无需查询最新的列表,直接根据ID去到对应的内容页即可。
8、消息系统
消息队列是大型网站必用中间件,如ActiveMQ、RabbitMQ、Kafka等流行的消息队列中间件,主要用于业务解耦、流量削峰及异步处理实时性低的业务。Redis提供了发布/订阅及阻塞队列功能,能实现一个简单的消息队列系统。另外,这个不能和专业的消息中间件相比。


3、Redis 有什么优势?

1)响应快速
Redis 响应非常快,每秒可以执行大约 110 000 个写入操作,或者 81 000 个读操作,其速度远超数据库。如果存入一些常用的数据,就能有效提高系统的性能。
2)支持 6 种数据类型
它们是字符串、哈希结构、列表、集合、可排序集合和基数。比如对于字符串可以存入一些 Java 基础数据类型,哈希可以存储对象,列表可以存储 List 对象等。这使得在应用中很容易根据自己的需要选择存储的数据类型,方便开发。
对于 Redis 而言,虽然只有 6 种数据类型,但是有两大好处:一方面可以满足存储各种数据结构体的需要;另外一方面数据类型少,使得规则就少,需要的判断和逻辑就少,这样读/写的速度就更快。
3)操作都是原子的
所有 Redis 的操作都是原子的,从而确保当两个客户同时访问 Redis 服务器时,得到的是更新后的值(最新值)。在需要高并发的场合可以考虑使用 Redis 的事务,处理一些需要锁的业务。
4)MultiUtility 工具
Redis 可以在如缓存、消息传递队列中使用(Redis 支持“发布+订阅”的消息模式),在应用程序如 Web 应用程序会话、网站页面点击数等任何短暂的数据中使用。


4、Redis 为什么这么快?

(1)完全基于内存,数据存在内存中,绝大部分请求是纯粹的内存操作,非常快速,跟传统的磁盘文件数据存储相比,避免了通过磁盘IO读取到内存这部分的开销。
(2)数据结构简单,对数据操作也简单。Redis中的数据结构是专门进行设计的,每种数据结构都有一种或多种数据结构来支持。Redis正是依赖这些灵活的数据结构,来提升读取和写入的性能。
(3)采用单线程,省去了很多上下文切换的时间以及CPU消耗,不存在竞争条件,不用去考虑各种锁的问题,不存在加锁释放锁操作,也不会出现死锁而导致的性能消耗。
(4)使用基于IO多路复用机制的线程模型,可以处理并发的链接。


5、Redis 主要消耗什么物理资源?

内存


6、Redis 到底是单线程还是多线程?

单线程


7、Redis 和 Memcache 有什么区别?

1、存储方式
  Memecache把数据全部存在内存之中,断电后会挂掉,没有持久化功能,数据不能超过内存大小。
  Redis有部份存在硬盘上,这样能保证数据的持久性。
2、数据支持类型
  Memcache对数据类型支持相对简单,只有String这一种类型
  Redis有复杂的数据类型。Redis不仅仅支持简单的k/v类型的数据,同时还提供 list,set,zset,hash等 数据结构的存储。
3、使用底层模型不同
  它们之间底层实现方式 以及与客户端之间通信的应用协议不一样。
  Redis直接自己构建了VM 机制 ,因为一般的系统调用系统函数的话,会浪费一定的时间去移动和请 求。
4、集群模式:
  Memcached没有原生的集群模式,需要依靠客户端来实现往集群中分片写入数据;但是 Redis 目前 是原生支持 cluster 模式的.
5、Memcached是多线程,非阻塞IO复用的网络模型;Redis使用单线程的多路 IO 复用模型。
6、Value 值大小不同:Redis 最大可以达到 512MB;Memcached 只有 1MB。


8、Redis 支持哪些数据类型?

string(字符串),hash(哈希),list(列表),set(集合)及zset(sorted set:有序集合)。


9、Redis 默认支持多少个数据库?怎么修改?

Redis 默认支持16 个数据库。 可以通过修改Redis 配置文件redis.conf 中的databases 一值进行变更


10、Redis 最大 key 大小?

Key的大小上限为512M。


11、Redis String 值最大存储多少?

类型 value最大容量
String value最大可以存储512M
hash 键值对个数最多为2^32-1个,即4294967295个
List 元素个数最多为2^32-1个,即4294967295个
Set 元素个数最多为2^32-1个,即4294967295个
SortSet 元素个数最多为2^32-1个,即4294967295个


12、Redis 事务有什么用?

redis事务是乐观锁,在事务提交前的几个操作也并不是原子性,它仅仅是监控事务提交前有没有其它操作了你事务里面所操作的那些key,并在事务提交时候告诉你,有没有用看你具体业务需求吧,我之前写过一个小demo用zset结构模拟lpop就有用到,


13、Redis 事务相关的命令有哪几个?

multi,标记一个事务块的开始,返回 ok
exec,执行所有事务块内,事务块内所有命令执行的先后顺序的返回值,操作被,返回空值 nil
discard,取消事务,放弃执行事务块内的所有命令,返回 ok
watch,监视 key 在事务执行之前是否被其他指令改动,若已修改则事务内的指令取消执行,返回 ok
unwatch,取消 watch 命令对 key 的监视,返回 ok


14、Redis 持久化有什么用?

持久化就是把内存的数据写到磁盘中去,防止服务宕机了内存数据丢失。


15、Redis 有哪几种持久化方式?

redis 持久化的两种方式
RDB:RDB 持久化机制,是对 redis 中的数据执行周期性的持久化。
AOF:AOF 机制对每条写入命令作为日志,以 append-only 的模式写入一个日志文件中,在 redis 重启的时候,可以通过回放 AOF 日志中的写入指令来重新构建整个数据集。
通过 RDB 或 AOF,都可以将 redis 内存中的数据给持久化到磁盘上面来,然后可以将这些数据备份到别的地方去,比如说阿里云等云服务。
如果 redis 挂了,服务器上的内存和磁盘上的数据都丢了,可以从云服务上拷贝回来之前的数据,放到指定的目录中,然后重新启动 redis,redis 就会自动根据持久化数据文件中的数据,去恢复内存中的数据,继续对外提供服务。
如果同时使用 RDB 和 AOF 两种持久化机制,那么在 redis 重启的时候,会使用 AOF 来重新构建数据,因为 AOF 中的数据更加完整。


16、Redis 持久化方式如何选择?

如果你的业务场景需要很高的性能,或者宕机之后能够尽快的恢复,而对数据完整性的要求不是那么高,那么可以采用RDB持久化的方式。
如果你的业务场景对数据完整性的要求很高,那么可以采用AOF的持久化方式,而至于采用那种回写策略,则取决于你对数据完整性的要求程度。
如果你的业务场景既要兼顾性能,又注重数据完整性,那么可以采用混合持久化的方式。
如果你对数据丢失无所谓,追求性能最大化的情况下,甚至可以禁用持久化。


17、Redis 内存满了怎么办?

在Redis中有配置参数maxmemory可以设置Redis内存的大小。


18、Redis 有哪些淘汰策略?

  • noeviction(默认策略):若是内存的大小达到阀值的时候,所有申请内存的指令都会报错。
  • allkeys-lru:所有key都是使用LRU算法进行淘汰。
  • volatile-lru:所有设置了过期时间的key使用LRU算法进行淘汰。
  • allkeys-random:所有的key使用随机淘汰的方式进行淘汰。
  • volatile-random:所有设置了过期时间的key使用随机淘汰的方式进行淘汰。
  • volatile-ttl:所有设置了过期时间的key根据过期时间进行淘汰,越早过期就越快被淘汰


    19、Redis 如何提高多核 CPU 利用率?

    可以在同一个服务器部署多个 Redis 实例,并把它们当做不同的服务器来使用,在某些时候,无论如何一个服务器是不够的,所以,如果你想使用多个 CPU,你可以考虑一下分片( shard )


    20、Redis 如何实现大量数据插入?

    // 在pom依赖中添加jedis依赖

    redis.clients
    jedis
    2.9.0

// 使用jedis实现pipeline调用
public static void main(String[] args) {
Jedis jedis = new Jedis(“192.168.222.135”, 6379);
Pipeline pipeline = jedis.pipelined();
long startTime = System.currentTimeMillis();
IntStream.range(0, 1000000).forEach(it -> pipeline.set(“batch” + it, it + “”));
pipeline.syncAndReturnAll();
long endTime = System.currentTimeMillis();
System.out.println(endTime - startTime);
}


21、Redis 的回收进程如何工作的?

当一个客户端运行了新的命令,添加了新的数据,Redis检查内存使用情况,如果大于max memory的限制,则根据设定好的策略进行回收。我们不断的穿越内存限制的边界,通过不断达到边界然后不断的回收并回收到边界以下。如果一个命令的结果导致大量内存被使用,不用多久内存限制就会被这个内存使用量超越

22、Redis 中的管道有什么用?
23、Redis 有哪些高可用方案?
24、Redis 集群如何选择数据库?
25、Redis 哈希槽怎么理解?
26、Redis 支持的 Java 客户端有哪些?
27、Redisson 是什么框架?
28、Redis 和 Redisson 有什么关系?
29、Jedis 和 Redisson 对比有什么优缺点?
30、Redis 为什么不提供 Windows 版本?
31、Redis 如何设置密码访问?
32、Redis 如何分析慢查询操作?
33、什么是缓存预热和热备?
34、什么是缓存雪崩,如何解决?
35、什么是缓存穿透,如何解决?
36、什么是缓存击穿,如何解决?
37、什么是缓存抖动,如何解决?
38、什么是缓存无底洞现象,如何解决?
39、Redis 和数据库双写一致性问题如何解决?
40、Redis 有哪些危险命令?如何防范?
41、Redis 如何统计独立用户访问量?