Redis基本概念
1. 什么是redis?
Redis 是一个使用 C 语言写成的,开源、基于内存、可选持久性的、非关系型,key-value数据库
2.Redis有什么优点?
- 速度快:因为数据存在内存中,类似于HashMap,HashMap的优势就是查找和操作的时间复杂度都是O(1)
- 支持数据类型丰富:有字符串string,字典hash,列表list,集合set,有序集合zset
- 支持事务 :redis对事务是部分支持的,如果是在入队时报错,那么都不会执行;在非入队时报错,那么成功的就会成功执行。
redis监控:锁的介绍 - 丰富的特性:可用于缓存,消息,按key设置过期时间,过期后将会自动删除。
3.Redis有什么缺点?
- 存储受内存大小限制;
- 持久化时占用cpu较高
4.Redis 有哪些功能?
- 数据缓冲功能
- 分布式锁的功能
- 支持事务
- 支持消息队列
5.redis 为什么是单线程的?
因为 cpu 不是 Redis 的瓶颈,Redis 瓶颈最有可能是机器内存或者网络带宽。单线程容易实现,而且 cpu 又不会成为瓶颈, 就顺理成章采用单线程方案了。
6.redis 支持的数据类型有哪些?
Redis 支持的数据类型:String(字符串),list(列表),hash(字典),set(集合),zset(有序集合)
7.redis 支持的 java客户端都有哪些?
支持 java客户端有 Redisson,jedis,lettuce等。
8.jedis 和 redisson 有哪些区别?
- jedis:提供了比较全面的 Redis 命令的支持。
- Redisson:实现了分布式和可扩展的 java数据结构,与 jedis 相比 Redisson 的功能相对简单,不支持排序,事务,管道,分区等 Redis 特性。
9.怎么保证缓存和数据库的一致性?
- 合理设置缓存的过期时间。
- 新增,更改,删除数据库操作时同步更新 Redis,可以使用事务机制来保证数据的一致性。
10.redis 持久化有几种方式?
Redis 的持久化有两种方式,或者说有两种策略:
- RDB(Redis Database):指定的时间间隔能对你的数据进行快照存储。
- AOF (Append Only File):每收到一个写命令都通过wirte函数追加到文件中。
11.redis 怎么实现分布式锁?
Redis 分布式锁其实就是在系统里面占一个“坑”,其他程序也要占“坑”的时候,占用成功了就可以继续执行,失败了就只能放弃或者稍后重试。
- 使用 setnx(set if not exists) 指令来争抢锁,再用expire加一个过期时间,防止忘记释放锁;
- 如果在执行setnx之后,expire之前发生异常,就会死锁;可以将setnx和expire合成一条指令;
12.redis 分布式锁有什么缺陷?
Redis 分布式锁不能解决超时的问题,分布式锁有一个超时时间,程序的执行如果超出了锁的超时时间就会出现问题。
13.什么是缓存穿透?怎么解决?
指查询一个一定不存在的数据,由于缓存找不到是时需要从数据库查询,查不到这个数据则不写入缓存,这将导致这个不存在的数据每次都要到数据库去查询,造成缓存穿透。
解决方案:
- 布隆过滤:对所有可能查询的参数以hash形式存储,在控制层先进行校验,不符合则丢弃,从而避免了对底层存储系统的查询压力;
- 缓存空对象,设置一个过期时间:当数据库也没有找到值后不后,即使返回的空对象也将其缓存起来,同时设置一个过期时间,之后再访问这个数据将会从缓存中获取,保护了后端数据源;
14.什么是缓存雪崩?怎么解决?
是指在某一个时间段,一批数据的缓存集中过期失效。则这批数据在缓存中查不到,都只能查询数据库,对于数据库而言,就会产生周期性的压力波峰。
解决方案:
为需要缓存的数据设置不同的缓存失效时间。
15.什么是缓存击穿?怎么解决?
指某个 key 非常热点,访问非常频繁,处于集中式高并发访问的情况,当这个 key 在失效的瞬间,大量的请求就击穿了缓存,直接请求数据库,将数据库瞬间压垮。
解决方案:
- 使用锁,确保只有一个线程去查询数据库;
- 可以将热点数据设置为永远不过期;
16.redis默认有多少数据库,如何指定?
默认有16个数据库,下标默认从0开始。可以通过配置database选项指定。
可以通过select 下标 切换数据库。
17.过期键删除策略?
主动删除:
- 定时删除:创建定时器,在键过期的时候,删除键;占用cpu。
- 定期删除:每隔一段时间,删除过期键。
被动删除:
惰性删除:在取出键的时候检查是否过期;有些键不被使用,永远无法删除。