1)它是非关系型数据库
2)存储环境:内存
3)内存优化:由两个HashTable组成,其中一个是处理数据的存储,另外一个是扩容
4)数据类型:String Hash Set Zset List
5)Redis 是一个单线程
6)每秒可以处理超过 10万次读写操作
7)Redis 也经常用来做分布式锁
8)Redis 支持事务 、持久化(支持AOF和RDB两种持久化方式)、集群
9)支持主从复制,主机会自动将数据同步到从机,可以进行读写分离
10)对String类型的数据进行自增自减,用来做计数器,提高读写效率,从而减轻数据库的频繁读写
11)用来做消息队列:List 但是目前最好的方案是使用MQ或者Kafka
12)分布式锁实现
13)reidis持久化:一旦服务器宕机,redis中的存储在内存中的数据就会消失,所以我们为了保证数据能在服务器宕机后,再次打开redis,还能找到数据,所以我们对redis的数据进行持久化存储
①redis的默认RDB持久化:按照一定的时间将内存的数据以快照的形式保存到硬盘中,对应产生的数据文件为dump.rdb。通过配置文件中的save参数来定义快照的周期,相对于数据集大时,比 AOF 的启动效率更高。
②AOF持久化(即Append Only File持久化),则是将Redis执行的每次写命令记录到单独的日志文件中,当重启Redis会重新将持久化的日志中文件恢复数据
当两种方式同时开启时,数据恢复Redis会优先选择AOF恢复。
14)Redis的过期键的删除策略
①定时过期:每个设置过期时间的key都需要创建一个定时器,到过期时间就会立即清除。该策略可以立即清除过期的数据,对内存很友好;但是会占用大量的CPU资源去处理过期的数据,从而影响缓存的响应时间和吞吐量。
②定期过期:每隔一定的时间,会扫描一定数量的数据库的expires字典中一定数量的key,并清除其中已过期的key。
③惰性过期:只有当访问一个key时,才会判断该key是否已过期,过期则清除。该策略可以最大化地节省CPU资源,却对内存非常不友好。极端情况可能出现大量的过期key没有再次被访问,从而不会被清除,占用大量内存。
Redis key的过期时间和永久有效:EXPIRE和PERSIST命令。
15)Redis的内存淘汰策略:
全局的键空间选择性移除
noeviction:当内存不足以容纳新写入数据时,新写入操作会报错。
allkeys-lru:当内存不足以容纳新写入数据时,在键空间中,移除最近最少使用的key。(这个是最常用的)
allkeys-random:当内存不足以容纳新写入数据时,在键空间中,随机移除某个key。
设置过期时间的键空间选择性移除
volatile-lru:当内存不足以容纳新写入数据时,在设置了过期时间的键空间中,移除最近最少使用的key。
volatile-random:当内存不足以容纳新写入数据时,在设置了过期时间的键空间中,随机移除某个key。
volatile-ttl:当内存不足以容纳新写入数据时,在设置了过期时间的键空间中,有更早过期时间的key优先移除。
16)缓存雪崩
缓存雪崩是指缓存同一时间大面积的失效,所以,后面的请求都会落到数据库上,造成数据库短时间内承受大量请求而崩掉。
解决方案:
①缓存数据的过期时间设置随机,防止同一时间大量数据过期现象发生。
②一般并发量不是特别多的时候,使用最多的解决方案是加锁排队。
③给每一个缓存数据增加相应的缓存标记,记录缓存的是否失效,如果缓存标记失效,则更新数据缓存。
17)缓存穿透
缓存穿透是指缓存和数据库中都没有的数据,导致所有的请求都落到数据库上,造成数据库短时间内承受大量请求而崩掉。
①接口层增加校验,如用户鉴权校验,id做基础校验,id<=0的直接拦截;
②从缓存取不到的数据,在数据库中也没有取到,这时也可以将key-value对写为key-null,缓存有效时间可以设置短点,如30秒(设置太长会导致 正常情况也没法使用)。这样可以防止攻击用户反复用同一个id暴力攻击
(在缓存系统中缓存一个空值,防止穿透一直存在,但是因为空值并不是准确的业务数据,并且会占用缓存的空间,所以我们会给这个空值加一个比 较短的过期时间,让空值在短时间之内能够快速过期淘汰)
③布隆过滤器
利用布隆过滤器的这个特点可以解决缓存穿透的问题,在服务启动的时候先把数据的查询条件,例如数据的 ID 映射到布隆过滤器上,当然如果新增 数据时,除了写入到数据库中之外,也需要将数据的ID存入到布隆过滤器中。
我们在查询某条数据时,先判断这个查询的 ID 是否存在布隆过滤器中,如果不存在就直接返回空值,而不需要继续查询数据库和缓存,存在布隆过 滤器中才继续查询数据库和缓存,这样就解决缓存穿透的问题。
18)缓存击穿
缓存击穿是指缓存中没有但数据库中有的数据(一般是缓存时间到期),这时由于并发用户特别多,同时读缓存没读到数据,又同时去数据库去取数据,引起数据库压力瞬间增大,造成过大压力。和缓存雪崩不同的是,缓存击穿指并发查同一条数据,缓存雪崩是不同数据都过期了,很多数据都查不到从而查数据库。
解决方案
①设置热点数据永远不过期。
②加互斥锁,互斥锁