Redis 笔记
1. 什么是redis
redis 是高性能缓存数据库,基于内存运行key-value存储系统,提供分布式锁,支持事务,持久化,多种分布式集群方案。使用单线程的多路IO服用模型。
redis支持数据类型 String, Hash, List, Set, Sorted Set 等
String存储字符串,
Hash存储key-value键值对集合
List字符串链表
Set hash实现,元素不重复,提供了交集并集差集等操作
ZSet 有排序的Set
2. redis为什么快
redis是一个内存数据库,数据都在内存中,纯粹的内存操作非常快的,其次redis是单线程的多路IO服用模型,单线程可以省去多线程时CPU上下文会切换的时间,也不用考虑各种锁问题。
3. redis的数据保存方式
数据保存方式 AOF 和 RDB
RDB是一个快照文件,数据一定会丢失
AOF是一个追加文件,日志,会记录很多原始的命令语句,rewrite会清理过程,只保留最终数据
4.x版本提供了混合持久化方式,文件中既有RDB也有AOF,做rewrite时会把文件清空,再做RDB数据写入,
4. redis如何删除过去数据
redis如何删除过去数据,Redis中有个设置过期时间的功能,即对存储在redis数据库中的值可以设置一个过期时间
redis删除数据包括定期删除和惰性删除,
定期删除:默认是每隔100毫秒就随机抽取一些设置了过期时间的key,检查其是否过期,如果过期就删除。
惰性删除:定期删除可能会导致很多过期key到了时间并没有被删除,每次查询时判断是否被删除
5. 缓存雪崩:缓存大面积失效,之后的请求都会直接查询数据库,造成数据库短时间内承受大量请求而挂掉。
1. 发现其中某台Redis服务器宕机之后尽快恢复,同时选择合适的内存淘汰策略
2. 本地缓存+接口线流和服务降级
3. 利用Redis持久化机制保存的数据进行缓存恢复操作
6. 如何保证缓存与数据库双写时的数据一致性,
1. 常规使用方式,先读取缓存,缓存没有的话,就读取数据库,然后取出数据进行缓存,同时返回数据
2. 延时双删的方式,更新数据操作时,先删除缓存,再更新数据库,休眠1秒后再次删除缓存,性能上可能受影响
7. 关于缓存穿透
缓存穿透就是大量请求的Key根本不存在于缓存中,导致这些请求直接转到了数据库查询
1. 查询时构建大量无效的Key
2. 使用布隆过滤器可以非常方便地判断一个给定的数据是否存在于海量的数据中,大致思路是把所有可能存在的请求的值都存放在布隆过滤器中,当用户请求过来时,先判断用户请求的数据是否存在于布隆过滤器中,不存在的话直接返回错误信息给客户端, 存在的话进入后面的流程,布隆过滤器的判断结果,如果某个数据不存在一组数据中的话,则一定时不存在。
8. 如何解决并发竞争Key的问题,就是多个系统同一时间对同一个key进行操作
1. 使用分布式锁,代码中执行某个方法时使先获取锁,判断是否能够获取到锁,如果获取到锁则执行后续业务,并且对该方法添加分布式锁,完成业务流程后删除当前服务节点的锁资源。如果没有获取到锁,则表示其他服务节点在执行该方法,不再往后执行