Redis缓存技术
1. NoSQL产品
1 | memcached |
2. redis面试常问问题:功能介绍
1 | 高速读写 |
3. 企业缓存产品介绍
3.1 memcached
1 | 优点:高性能读写、单一数据类型、支持客户端式分布式集群、一致性 hash多核结构、多线程读写性能高。 |
3.2 redis
1 | 优点:高性能读写、多数据类型支持、数据持久化、高可用架构、支持自定义虚拟内存、支持分布式分片集群、单线程读写性能极高 |
3.3 memcache与redis在读写性能的对比
1 | memcached 适合,多用户访问,每个用户少量的rw |
3.4 Redis使用场景介绍
1 | Memcached:多核的缓存服务,更加适合于多用户并发访问次数较少的应用场景 |
4. Redis安装部署
1 | 下载: |
5. Redis基本管理操作
5.1 基础配置文件介绍
1 | 1.设置配置文件 |
5.2 配置文件说明
1 | redis.conf |
5.3 redis-cli 客户端命令常用参数说明
1 | redis-cli 刚装完,可以在redis服务器上直接登录redis |
5.4 redis安全配置:指定IP/设置验证密码
1 | redis默认开启了保护模式,只允许本地回环地址登录并访问数据库。 |
1 | (1)Bind :指定IP进行监听 |
5.5 在线查看和修改配置
1 | CONFIG GET * |
6. redis持久化(内存数据保存到磁盘)
6.1 作用
1 | 作用:可以有效防止,在redis宕机后,缓存失效的问题. |
6.2 RDB 持久化
1. 优缺点
1 | 可以在指定的时间间隔内生成数据集的时间点快照(point-in-time snapshot)。 |
2.rdb持久化核心配置参数
1 | vim /data/6379/redis.conf |
6.3 AOF 持久化(append-only log file)
1.优缺点
1 | 记录服务器执行的所有写操作命令,并在服务器启动时,通过重新执行这些命令来还原数据集。 |
2.AOF持久化配置
1 | 1.配置参数 |
6.4 redis 持久化方式有哪些?有什么区别?
1 | rdb:基于快照的持久化,速度更快,一般用作备份,主从复制也是依赖于rdb持久化功能 |
7. Redis数据类型(笔试)
7.1 介绍
1 | String : 字符类型 |
7.2 键的通用操作
1 | KEYS * keys a keys a* 查看已存在所有键的名字 **** |
7.3 string类型的应用场景
1 | 应用场景 |
7.4 hash类型的应用场景
1 | hash类型(字典类型) |
7.5 list列表的应用场景
1 | 消息队列系统:后进先出 |
7.6 SET 集合类型(类似于mysql中的join)应用场景
1 | 应用场景: |
1.经典案例
1 | ------------- |
7.7 SortedSet(有序集合)应用场景
1 | 应用场景: |
1.经典案例
1 | -------------- |
8. redis的发布订阅
8.1 发布订阅系统的相关指令
领事回话关了没了
1 | 1.PUBLISH channel msg |
8.2 实例
1 | 发布订阅例子: |
9. Redis事务
9.1 redis和mysql事务实现的原理
1 | redis的事务是基于队列实现的。---queue |
9.2 开启事务
1 | 1.开启事务功能时(multi) |
1.实例
1 | ---------- |
9.3 redis乐观锁实现(模拟买票)
1 | 发布一张票 |
10. 服务器管理命令
1 | Info |
11. redis(master-replicaset)主从复制
11.1 原理
1 | 原理: |
11.2 主从数据一致性保证
1 | min-slaves-to-write 1 |
1 | 这个特性的运作原理: |
11.3 主库是否要开启持久化?
1 | 如果不开有可能,主库重启操作,造成所有主从数据丢失! |
11.4 主从复制实现
1.环境:准备两个或两个以上redis实例
1 | mkdir /data/638{0..2} |
2.开启主从
1 | 6381/6382命令行: |
3.查询主从状态
1 | redis-cli -p 6380 -a 123 info replication |
4.模拟主库故障: 从库切为主库
1 | redis-cli -p 6380 -a 123 shutdown |
11.5 redis-sentinel(哨兵)
1.作用
1 | 1、监控 |
2.搭建
1 | sentinel搭建过程 |
3.如果有问题
1 | 1、重新准备1主2从环境 |
4.停主库测试
1 | 停主库测试: |
12. redis cluster(集群)
12.1 高性能
1 | 1、在多分片节点中,将16384个槽位,均匀分布到多个分片节点中 |
12.2 高可用
1 | 在搭建集群时,会为每一个分片的主节点,对应一个从节点,实现slaveof的功能,同时当主节点down,实现类似于sentinel的自动failover的功能。 |
12.3 规划、搭建过程:
1.注意事项
1 | 注: |
2.安装集群插件
1 | EPEL源安装ruby支持 |
3.集群节点准备
1 | mkdir /data/700{0..5} |
4.将节点加入集群管理
1 | redis-trib.rb create --replicas 1 127.0.0.1:7000 127.0.0.1:7001 \ |
5.集群状态查看
1 | 集群主节点状态 |
6.集群节点管理: 增加新的节点
1 | #1 增加新的节点 |
7.集群节点管理: 删除一个节点
1 | 删除master节点之前首先要使用reshard移除master的全部slot,然后再删除当前节点 |
8.设置redis最大内存
1 | config set maxmemory 102400000 |
13. redis的多API支持:python为例
13.1 软件驱动下载
1 | https://redis.io/clients |
13.2 对redis的单实例进行连接操作
1 | python3 |
13.3 sentinel集群连接并操作
1 | 1. 服务和sentinel服务开启 |
1 | ## 导入redis sentinel包 |
13.4 redis cluster的连接并操作(python2.7.2以上版本才支持redis cluster,我们选择的是3.5)
1 | python3 |
14. redis可能会出现的问题
14.1 缓存穿透
1.概念
1 | 访问一个不存在的key,缓存不起作用,请求会穿透到DB,流量大时DB会挂掉。 |
2.解决方案
1 | 1.采用部署过滤器,使用一个足够大的bitmap,用于存储可能访问的key,不存在的key直接被过滤; |
14.2 缓存雪崩
1.概念
1 | 大量的key设置了相同的过期时间,导致在缓存在同一时刻全部失效,造成瞬时DB请求量大、压力骤增,引起雪崩。 |
2.解决方案
1 | 可以给缓存设置过期时间时加上一个随机值时间,使得每个key的过期时间分布开来,不会集中在同一时刻失效。 |
14.3 缓存击穿
1.概念
1 | 在访问key之前,在缓存过期的一刻,同时有大量的请求,这些请求都会击穿到DB,造成瞬时DB请求量大、压力骤增。 |
2.解决方案
1 | 在访问key之前,采用SETNX(set if not exists)来设置另一个短期key来锁住当前key的访问,访问结束再删除该短期key。 |