Redis 全称 Remote Dictionary Server(即远程字典服务),它是一个基于内存实现的键值型非关系(NoSQL)数据库
1. 谈下你对 Redis 的了解?
三点:
一般用mysql,oracle,由于数据库持久化数据主要是面向磁盘,而磁盘的读写比较慢,一般的管理系统上,由于不存在,因此没有需要瞬间读写大量数据的要求,这时候传统数据库是没有问题的。但是如果面对一个高并发的场景,比如抢票、发红包等,或者是主页访问量瞬间比较大的时候,一瞬间会有成千上问的请求的到来高并发,需要系统在极短的时间内完成成千上万次的读写操作。这时候数据库根本承受不来,很容易造成数据库系统的瘫痪,最终导致服务器宕机。
为了解决这个问题,我们可以引入nosql技术。nosql也是一种数据库,它是基于内存的,并提供一定的持久化功能。redis和mongodb是当前使用最广泛的nosql技术。
Redis 全称 Remote Dictionary Server(即远程字典服务),它是一个基于内存实现的键值型非关系(NoSQL)数据库,由意大利人用C语言所创
redis不仅可以将数据完全保存在内存中,还可以通过磁盘实现数据的持久化支持
redis支持丰富的数据类型,包括string、list、set、zset、hash等多种数据结构,因此它也被称为【数据结构服务器
redis支持主从同步,即master-slave主从复制模式。数据可以从主服务器向任意数量的从服务器上同步,有效的保证数据的安全性
Redis 支持多种编程语言,包括 C、C++、Python、Java、PHP、Ruby、Lua 等语言。
与SQL型数据不同,redis没有提供新建数据库的操作,因为它自带了16(0-15)个数据库(默认使用0库)。在同一个库中,key是唯一存在的、不允许重复的,它就像一把“密钥”,只能打开一把“锁”。键值存储的本质就是使用key来标识value,当想要检索value时,必须使用与value对应的key进行查找
客户端和服务端可以位于同一台计算机上,也可以位于不同的计算机上。服务端是整个架构的“大脑”,能够把数据存储到内存中,并且起到管理数据的作用 .Redis 基于内存来实现数据的存储,因此其速度非常快。但是我们知道,计算机的内存是非常珍贵的资源,所以 Redis 不适合存储较大的文件或者二进制数据,否则会出现错误,Redis 适合存储较小的文本信息。理论上 Redis 的每个 key、value 的大小不超过 512 MB
2. Redis 一般都有哪些使用场景?
3. Redis 有哪些常见的功能?
4. Redis 支持的数据类型有哪些?
注意:这里指的数据类型是 Value(值) 的数据类型,而非 key。
5. Redis 为什么这么快?
6. 什么是缓存穿透?怎么解决?
如果在请求数据时,在缓存层和数据库层都没有找到符合条件的数据,也就是说,在缓存层和数据库层都没有命中数据,那么,这种情况就叫作缓存穿透。
解决方式:
7. 什么是缓存雪崩?该如何解决?
如果在某一时刻缓存集中失效,或者缓存系统出现故障,所有的并发流量就会直接到达数据库。
解决方式:
8. 怎么保证缓存和数据库数据的一致性?CAP理论?
9. Redis 持久化有几种方式?
由于Redis的数据都存放在内存中,如果没有配置持久化,redis重启后数据就全丢失了,于是需要开启redis的持久化功能,将数据保存到磁盘上,当redis重启后,可以从磁盘中恢复数据。redis提供两种方式进行持久化:
时间间隔内将内存的数据集快照写到磁盘。恢复快,节省数据空间,但是当redis故障,仍会丢失部分数据
命令:
BGSAVE:Redis会调用fork来创建一个子进程,然后子进程负责将所有数据的快照写入硬盘,而父进程则继续处理命令请求。
save 60 10000:Redis最近一次创建快照之后开始算起,当“60秒之内有10000次写入”这个条件被满足时,Redis就会自动触发BGSAVE命令
AOF持久化 的实时性更好,原理是将Redis的操作日志以追加的方式写入文件,但是不加以控制的话,AOF文件的体积可能会比快照文件大好几倍,恢复慢,可以通过冗余命令(BGREWRITEAOF)来重写(rewrite)AOF文件来减小AOF文件的体积
参数:
appendonly yes 开关
appendfsync always #每次有数据修改发生时都会写入AOF文件,这样会严重降低Redis的速度
appendfsync everysec #每秒钟同步一次,显示地将多个写命令同步到硬盘
appendfsync no #让操作系统决定何时进行同步
10. Redis 怎么实现分布式锁?
加锁:使用setnx key value命令,如果key不存在,设置value(加锁成功)。如果已经存在lock(也就是有客户端持有锁了),则设置失败(加锁失败)。
解锁:使用del命令,通过删除键值释放锁。释放锁之后,其他客户端可以通过setnx命令进行加锁
1.防止死锁:要有个超时的机制,在设置key的值时,需要加上有效时间,如果有效时间过期了,就会自动失效,就不会出现死锁。
2.支持可重入锁:加锁成功后使用hset命令value=1,使用hincrby自增,解锁时,先判断可重复次数是否大于0,大于0则减一,否则删除键值,释放锁资源
3.加锁失败后阻塞等待,等锁释放后再次尝试加锁
11. Redis 淘汰策略有哪些?
在Redis中,允许用户设置最大使用内存大小server.maxmemory,当Redis 内存数据集大小上升到一定大小的时候,就会施行数据淘汰策略。
redis淘汰数据时还会同步到aof
12. Redis 常见性能问题和解决方案?
番外篇
混合持久化方式
Redis 4.0 开始支持 RDB 和 AOF 的混合持久化(默认关闭,可以通过配置项 aof-use-rdb-preamble 开启)。
redis和memcached比较
QPS和TPS