目录:
1.redis数据结构:
2.redis数据结构分别的应用场景:
3.redis优缺点:
4.redis是单线程的为什么效率高:
5.过期策略:
6.淘汰策略:
7.redis持久化:
8.redis缓存穿透:
9.redis缓存击穿:
1.redis数据结构:
1.String(字符串):主要用来存储整型和字符串,一个key对应一个value
2.Hash(hash表):存储对象和存储配置。一个key对应了另一个key value。
3.List(列表/链表):通俗来说就是一个链表,可以重复,通过下标取值,两头都可以插入值。
4.Set(集合):无序,不可以重复。
5.Zset(有序集合):有序,不可重复。
2.redis数据结构分别的应用场景:
1.String:
缓存:把常用信息,字符串,图片或者视频等信息放到redis中,redis作为缓存层,mysql做持久化层,降低mysql的读写压力。
计数器:redis是单线程模型,一个命令执行完才会执行下一个,同时数据可以一步落地到其他的数据源。
session:常见方案spring session + redis实现session共享,
2.Hash:
缓存: 缓存对象时能直观,相比string更节省空间,的维护缓存信息,如用户信息,视频信息等。
3.List:
消息队列
4.Set:
点赞,或点踩,收藏等,可以放到set中实现
5.ZSet:
排行榜:有序集合经典使用场景。例如小说视频等网站需要对用户上传的小说视频做排行榜,榜单可以按照用户关注数,更新时间,字数等打分,做排行。
3.redis优缺点:
优点:
1.速度快,纯内存操作,每秒10w次读写。
2.持久化:aof,rdb
3.高可用:哨兵模式,主备切换。
缺点:
1.内存数据,有容量限制。
2.rdb持久化会有可能造成数据丢失。
4.redis是单线程的为什么效率高:
因为是存内存操作读写,内存读写是最快的,并且redis是非阻塞的多路io复用,通俗的讲就是一个线程对应多个网络io。因为是单线程,所以避免了多线程的上下文切换。
5.过期策略:
定期删除: redis每100ms就会随机抽查删除过期的数据。
惰性删除: 当获取数据时,redis会先检查该数据有没有过期,如果过期就删除。
6.淘汰策略:
已经设置了过期时间的:
1.最近最少使用。
2.即将过期。
3.随机淘汰。
没有设置过期时间的:
4.所有的中最近最少使用。
5.所有的中随机删除。
6.不删除,达到最大内存后报异常。
7.redis持久化:
避免因为程序的退出,造成数据丢失,redis持久化分为rdb和aof。
rdb:在一定时间间隔内,将内存中的数据写入磁盘中。但因为是一定时间间隔,所以有可能造成数据的丢失。
优点:适合备份,并且恢复速度快。
缺点:备份的时间间隔大,容易造成很多数据的丢失。
aof:利用了日志,记录每一次的写操作。数据恢复是往往只需要通过日志操作,即可恢复。
优点:更好的保证数据不丢失。
缺点:恢复慢,文件比rdb大。
8.redis缓存穿透:
缓存穿透:查询数据库和缓存都没有的数据时,每次查询都会访问数据库,造成浪费。
解决方式:
1.布隆过滤器:可以看作一个list集合,每次添加数据时,就往布隆过滤器中添加数据,只有put方法和查看数据是否存在的方法。但布隆过滤器存在一个误判的现象,可以设置误判的几率,但无法归0,控制的实现时hash的次数。
2.缓存空对象:将查询不到的对象也缓存进入内存中,设定过期时间,但这样会造成内存的浪费。
9.redis缓存击穿:
缓存击穿:当同一时间,大量访问同一数据,但数据库存在,缓存不存在,可能缓存时间过期,引起瞬间数据库访问压力增大。
解决方式:
1.设置热点数据永不过期。
2.加互斥锁。
10.redis缓存雪崩:
缓存中大量的数据在某一时间段内同时过期,造成数据库压力过大。
解决方式:尽量将数据不设置成同一时间段过期,随机设置过期时间。