1. 什么是Redis?(远程内存数据库)
Redis(Remote Dictionary Server)是一个开源免费的key-value的高性能数据库.
2. Redis的优势?
- 支持数据持久化
- 支持多种数据结构存储
- 支持数据备份
- 速度快
- 支持事务(原子性)
3. Redis支持的数据类型以及使用场景
- String : 常用的,做计数功能缓存
- hash : 一般用于存储用户信息
- list : 生产者-消费者场景,先进先出
- set : 全局去重
- Zset(有序集合) : 排行榜
4. Redis 相比 Memcached 的区别有哪些?
- 数据类型:Memcached只支持string,Redis有五种数据类型.
- 速度:Redis的速度更快.
- 支持持久化:Redis可以持久化其数据,Memcached数据在duan.
- 存储方式:Memcached存储在内存中,Redis有部分存在硬盘上.
5. 什么是缓存雪崩,解决方法?
- 缓存雪崩
原有的缓存过期,新的缓存未到。原本应该访问缓存的请求都去访问了数据库,给数据库和内存造成巨大压力,导致系统奔溃。
- 解决方案
- 使用断路器,如果缓存宕机,为了防止系统全部宕机,限制部分流量进入 DB,保证部分可用,其余的请求返回断路器的默认值。
- 设置不同的缓存时间,保证一直有缓存.对缓存做高可用,防止缓存宕机
6. 什么是缓存穿透,解决方法?
- 缓存穿透
用户查询的数据不存在于数据库中,缓存中也没有,这样当用户请求该数据的时候,还要去数据库中在查一下,才会返回空.
- 解决方案
- 空数据也加到缓存中设置一个默认值,设置很短的过期时间.
使用布隆过滤器,把所有数据的哈希值存在一个bigMap中,这样不存在的数据就会被bigMap拦截.
7. Redis中是如何实现分布式锁的?
7.1 分布式锁常见的三种实现方式
- 基于数据库乐观锁
- 基于Redis的分布式锁
- 基于Zookeeper的分布式锁
7.2 Redis实现分布式锁的条件
- 互斥性: 在任何时候,只有一个客户端能持有锁
- 不能死锁:客户端奔溃未解锁的,后续客户端能加锁
- 容错性:只要大部分Redis节点正常运行,客户端就能加锁和解锁
7.3
set 命令要用 set key value px milliseconds nx
,替代 setnx + expire 需要分两次执行命令的方式,保证了原子性
//加锁、解锁 Lua脚本
//获取锁(unique_value可以是UUID等)
SET resource_name unique_value NX PX 30000
//释放锁(lua脚本中,一定要比较value,防止误解锁)
if redis.call("get",KEYS[1]) == ARGV[1] then
return redis.call("del",KEYS[1])
else
return 0
end
8 Redis主要消耗什么物理资源
内存
9 如何测试Redis的连通性
ping
10 Redis如何做内存优化
尽量使用散列表
11 Redis常见的性能问题和解决方案?
- Master最好不要做任何持久化工作;
- 如果数据比较重要,某个slave开启aof备份数据,策略设置每秒同步一次;
- 为了主从复制的速度,Master和Slave最好在同一个局域网内;
- 尽量避免在压力很大的主库上增加从库;
- 主从复制不要使用图状结构,使用链表结构更稳定.