课程介绍:https://coding.imooc.com/class/151.html
百度云链接:http://yun.java1234.com/article/2956
基础压缩包版:https://pan.baidu.com/s/1_dRwOCJeW3L7oEJMgh86tw 提取码: ws26
增补在线即看版:https://pan.baidu.com/s/1KlaEUHCHF41BNhEXnHcBdg 提取码:e6vx
第1章 Redis初识
带领听众进入Redis的世界,了解它的前世今生、众多特性、应用场景、安装配置、简单使用,可以让听众对Redis有一个全面的认识。
1-1 导学
1-2 Redis初识 试看
1-3 谁在使用Redis
1-4 redis特性目录
1-5 特性1-速度快
1-6 特性2-持久化
1-7 特性3-数据结构
1-8 特性4-多语言客户端
1-9 特性5-功能丰富
1-10 特性6-简单
1-11 特性7-复制
1-12 特性8-高可用分布式
1-13 redis典型使用场景
1-14 redis三种启动方式介绍
1-15 redis常用配置
1-16 redis安装启动演示
第2章 API的理解和使用
全面介绍了Redis提供的5种数据结构字符串(string)、哈希(hash)、列表(list)、集合(set)、有序集合(zset)的数据模型、常用命令、典型应用场景。同时本章还会对Redis的单线程处理机制、键值管理做一个全面介绍,通过对这些原理的理解,听众可以在合适的应用场景选择合适的数据结构。 ...
2-1 -课程目录
2-2 -通用命令
2-3 数据结构和内部编码
2-4 单线程
2-5 字符串
2-6 hash (1)
2-7 hash (2)
2-8 list(1)
2-9 list(2)
2-10 set
2-11 zset
第3章 Redis客户端的使用
本章重点关注Redis客户端的开发,介绍了详细讲解了Java客户端Jedis,简单介绍下Python和Go语言的Redis客户端的选择和使用。
3-1 课程目录
3-2 Java客户端:Jedis
3-3 Python客户端:redis-py
3-4 Go客户端:redigo简介
3-5 Jedis配置优化(上)
3-6 Jedis配置优化(下)
第4章 瑞士军刀Redis其他功能
除了5种数据结构外,Redis还提供了诸如慢查询、Pipeline、Bitmap、HyperLogLog、发布订阅、GEO等附加功能,在这些功能的帮助下,Redis的应用场景更加丰富。
4-1 课程目录
4-2 慢查询
4-3 pipeline
4-4 发布订阅
4-5 bitmap
4-6 hyperloglog
4-7 geo
第5章 Redis持久化的取舍和选择
Redis的持久化功能有效避免因进程退出造成的数据丢失问题,本章将介绍介绍RDB和AOF两种持久化配置和运行流程,以及选择策略
5-1 目录
5-2 持久化的作用
5-3 RDB(1)
5-4 RDB(2)
5-5 RDB(3)
5-6 AOF(1)
5-7 AOF(2)
5-8 AOF实验
5-9 RDB和AOF抉择
第6章 常见的持久化开发运维问题
本章探讨了常见的持久化问题进行定位和优化,最后结合Redis常见的单机多实例部署场景进行优化
6-1 常见问题目录
6-2 fork
6-3 子进程开销和优化
6-4 AOF阻塞
第7章 Redis复制的原理与优化
复制是实现高可用的基石,但复制同样是运维的痛点,本部分详细分析复制的原理,讲解运维过程中可能遇到的问题。
7-1 目录
7-2 什么是主从复制
7-3 主从复制配置-介绍
7-4 主从复制配置-操作
7-5 runid和复制偏移量
7-6 全量复制
7-7 全量复制开销 + 部分复制
7-8 故障处理
7-9 主从复制常见问题
第8章 Redis Sentinel
本章将一步步解析Redis Sentinel的相关概念、安装部署、配置、客户端路由、原理解析,最后分析了Redis Sentinel运维中的一些问题。
8-1 sentinel-目录
8-2 主从复制高可用?
8-3 redis sentinel架构
8-4 redis sentinel安装与配置
8-5 redis sentinel安装演示-1
8-6 redis sentinel安装演示-2
8-7 java客户端
8-8 python客户端
8-9 实现原理-1-故障转移演练
8-10 实现原理-2.故障转移演练(客户端)
8-11 实现原理-3.故障演练(日志分析)
8-12 三个定时任务
8-13 主观下线和客观下线
8-14 领导者选举
8-15 故障转移
8-16 常见开发运维问题-目录
8-17 节点运维
8-18 高可用读写分离
8-19 本章总结
第9章 初识Redis Cluster
Redis Cluster是Redis 3提供的分布式解决方案,有效解决了Redis分布式方面的需求,同时它也是学习分布式存储的绝佳案例。本章将针对Redis Cluster的数据分布,搭建集群进行分析说明。
9-1 本章目录
9-2 呼唤集群
9-3 数据分布概论
9-4 节点取余分区
9-5 一致性哈希分区
9-6 虚拟槽哈希分布
9-7 基本架构
9-8 原生安装
9-9 原生安装-1.准备节点
9-10 原生安装-2.节点握手
9-11 原生安装-3.分配槽
9-12 原生安装-4.分配主从
9-13 ruby环境准备-说明
9-14 ruby环境准备-操作
9-15 redis-trib构建集群
9-16 原生命令和redis-trib.rb对比
第10章 深入Redis Cluster
本章将针对Redis Cluster的集群伸缩,请求路由,故障转移等方面进行分析说明。
10-1 集群伸缩目录
10-2 集群伸缩原理
10-3 扩展集群-1.加入节点
10-4 扩展集群-2.加入集群
10-5 扩展集群-3.迁移槽和数据
10-6 集群扩容演示-1
10-7 集群扩容演示-2
10-8 集群缩容-说明
10-9 集群缩容-操作
10-10 客户端路由-目录
10-11 moved异常说明和操作
10-12 ask重定向
10-13 smart客户端实现原理
10-14 JedisCluster执行源码分析
10-15 smart客户端JedisCluster-目录
10-16 JedisCluster基本使用
10-17 整合spring-1
10-18 整合spring-2
10-19 多节点操作命令
10-20 批量操作优化
10-21 故障转移-目录
10-22 故障发现
10-23 故障恢复
10-24 故障模拟
10-25 Redis Cluster常见开发运维问题-目录
10-26 集群完整性
10-27 带宽消耗
10-28 PubSub广播
10-29 集群倾斜-目录
10-30 数据倾斜
10-31 请求倾斜
10-32 读写分离
10-33 数据迁移
10-34 集群vs单机
10-35 本章总结
第11章 缓存设计与优化
讲解将缓存加入应用架构后带来的一些问题,这些问题常常会成为应用的致命点。
11-1 目录
11-2 缓存的受益和成本
11-3 缓存的更新策略
11-4 缓存粒度问题
11-5 缓存穿透问题
11-6 缓存雪崩优化 试看
11-7 无底洞问题
11-8 热点key的重建优化
11-9 本章总结
第12章 Redis云平台CacheCloud
本章结合前面的知识介绍redis规模化后使用云平台如何进行机器部署、应用接入、用户相关功能维护等问题
12-1 _目录
12-2 _Redis规模化困扰
12-3 _快速构建
12-4 机器部署
12-5 应用接入
12-6 用户功能
12-7 运维功能
第13章 课程总结
课程总结
13-1 _课程总结
第14章 增补:Redis布隆过滤器
现有50亿电话号码,如何快速判断10w个电话号码是否在其中?利用之前学习的bitmap和redis cluster构建分布式布隆过滤器
14-1 _目录_
14-2 引出布隆过滤器
14-3 布隆过滤器基本原理
14-4 布隆过滤器误差率
14-5 本地布隆过滤器
14-6 Redis布隆过器
14-7 Redis分布式布隆过滤器
第15章 Redis开发规范
本章介绍键值的设计、命令的优化、连接池优化、客户端使用规范及客户端常见问题,带领用户全面梳理Redis开发规范。
15-1 key设计
15-2 value设计
15-3 发现bigkey的方法
15-4 bigkey的删除
15-5 选择合理的数据结构
15-6 键值生命周期的管理
15-7 命令优化技巧
15-8 java客户端优化
15-9 连接池参数优化1
15-10 连接池参数优化2
15-11 连接池参数优化3
第16章 内存管理
本章主要讲解Redis内存消耗、组成分析、Redis内存管理设置及内存优化技巧。
16-1 Redis内存优化介绍
16-2 Redis内存消耗
16-3 客户端缓冲区
16-4 缓冲内存
16-5 对象内存
16-6 内存设置上限
16-7 内存回收策略
16-8 内存优化 试看
16-9 客户端缓冲区优化
第17章 开发运维常见坑
本章介绍Linux针对Redis的内核参数优化、Redis安全七个方法以及Redis热点key的发现方法。
17-1 redis开发运维那些坑
17-2 overcommit_memory参数讲解和演示
17-3 其它参数的讲解
17-4 安全的redis
17-5 安全七法则
17-6 热点key
开源
基于键值对的存储服务系统
多种数据结构
高性能、功能丰富
速度块 --10w OPS 存在内存,使用c语言,单线程
持久化 --将数据的更新异步地保存在磁盘上,断电不丢失数据
支持多种编辑语言 --JAVA PHP PYTHON RUBY LUA NODEJS
功能丰富 --发布订阅 LUA脚本 事务 pipeline(并发效率
简单 --不依赖外部库 单线程模型
多种数据结构 --字符串 hash 列表 集合 有序集合 --延申:位图BitMaps 超小内存唯一计数HyperLogLog 地理信息定位GEO
主从复制
高可用、分布式 重点
v2.8开始支持Redis-Sentinel(哨兵)高可用
v3.0开始支持Redis-Cluster 分布式
缓存系统
计数器
消息队列系统
排行榜
社交网络
实时系统(垃圾邮件处理,过滤器)
Window 下安装
下载地址:https://github.com/MSOpenTech/redis/releases
下载解压后将redis 的路径加到系统变量的Path中
打卡一个cmd窗口启动服务:redis-server.exe
新建一个cmd窗口连接服务器:redis-cli.exe -h 127.0.0.1 -p 6379
Linux 下安装
下载地址:http://redis.io/download
下载并安装:
$ wget http://download.redis.io/releases/redis-2.8.17.tar.gz
$ tar xzf redis-2.8.17.tar.gz
$ cd redis-2.8.17
$ make
make完后 redis-2.8.17目录下会出现编译后的redis服务程序redis-server,还有用于测试的客户端程序redis-cli,两个程序位于安装目录 src 目录下:
下面启动redis服务.
$ cd src
$ ./redis-server
注意这种方式启动redis 使用的是默认配置。也可以通过启动参数告诉redis使用指定配置文件使用下面命令启动。
$ cd src
$ ./redis-server ../redis.conf
三种启动方式
ps -ef|grep redis
netstat -antpl|grep redis
redis-cli -h ip -p port ping
redis-server --port 6380 (默认6379)
redis-server configPath
比较
生产环境选择配置启动
单机多实例配置文件开源用端口号区分开
简单的客户端链接:
Redis客户端返回值
状态回复、错误回复、整数回复、(多行)字符串回复
Redis常用配置
deamonize 是否是守护进程默认no建议yes
prot redis对外端口号
logfile redis系统日志
dir redis工作目录
配置文件方式启动
在redis目录下新建config文件夹 --mkdir config
将redis中配置文件复制进去 --cp redis.conf config
在config目录下创建对应端口服务器配置文件 --mv redis-6380.conf --mv redis.conf redis-6380.conf
查看配置文件 --vim redis-6380.conf --:q
对配置文件进行修改 --cat redis-6380.conf | grep -v "#" | grep -v "^$"
只留下以下参数
daemonize yes
port 6382
dir "/opt/moudels/redis/data" ----日志位置,根据需要建立文件夹
logfile "6382.log"
保存退出 --:wq
启动服务 --redis-server config/redis-6380.conf
查看进程是否启动 --ps -ef | grep redis-server | grep 6382
查看日志 --cd data --cat 6380.log
2.1.1 通用命令
mset /mget 批量设置 减少了网络时间 一般而言=网络时间+命令时间
sadd myset a b c d e 将一个或多个成员元素加入到集合中
keys * 生产不适用,适用于热备从节点、scan
dbsize 计算key的总数
exists key 检查key是否存在
expire key seconds 在seconds秒后key过期
ttl key 查看key剩余的过期时间
persist key 去掉key的过期时间
type key 返回key的类型
2.1.2 数据结构和内部编码
时间 <=> 空间
2.1.3 单线程架构
单线程为什么这么块?
1.纯内存,响应速度快
2.非阻塞IO
3.避免现场切换和竟态消耗
注意事项:
1.一次只执行一条命令
2.拒绝长/慢命令
3.其实不是单线程
使用场景:缓存、计数器、分布式锁...
命令:
incr key #自增1
decr key #自减1
incrby key k #自增k
decrby key k #自减k
set key value #不管key是否存在,都设置
setnx key value #key不存在,才设置
set key value xx #key存在,才设置
getset key newvalue #set key newvalue并返回旧的value
append key value #将value追加到旧的value
strlen key #返回字符串的长度
incrbyfloat key 3.5 #增加key对应的值3.5
getrange key start end #获取字符串指定下标的所有值
setrange key index value #设置指定下标所对应的值
实战:缓存视频
哈希键值结构
命令:
hdel key field1 [field2] :删除一个或多个字段
hexists key field :查看字段是否存在
hget key field :获取指定字段的值
hgetall key :获取所有字段和值
hincrby key field increment :字段的整数值加上增量 increment 。
hkeys key 获取所有哈希表中的字段
hlen key 获取哈希表中字段的数量
hmget key field1 [field2] 获取所有给定字段的值
hmset key field1 value1 [field2 value2 ] 同时将多个 field-value (域-值)对设置到哈希表 key 中。
hset key field value 将哈希表 key 中的字段 field 的值设为 value 。
hsetnx key field value 只有在字段 field 不存在时,设置哈希表字段的值。
hvals key 获取哈希表中所有值
hscan key cursor [MATCH pattern] [COUNT count] :迭代哈希表中的键值对。
string VS hash:
有序 可以重复
lpush和rpush 从左边/右边插入
lpop和rpop 从左边/右边弹出
lrem key count value 移除多少个value相等元素,count>0从左,count<0从右,count=0删除所有
ltrim key start end 按照索引范围进行修减列表,只保留下标索引从start到end元素
linsert listkey before|after pivot value 在元素pivot之前/之后插入value
lrange key start end 获取指定范围内的元素
lindex key index 获取下标索引的元素
blpop key1 [key2 ] timeout 移出并获取列表首元素, 没有元素会阻塞列表直到超时或发现元素。
brpop key1 [key2 ] timeout 移出并获取列表尾元素, 没有元素会阻塞列表直到超时或发现元素。
lpush + lpop = Stack(栈)
lpush + rpop = Queue(队列)
lpush + ltrim = Capped Collection(有限制的列表)
lpush + brpop = Message Queue(消息队列)
实战:微博新消息-lpush
无序 无重复 支持集合间操作
sadd 添加 srem 删除
scard key 获取集合的成员数
spop 移除并返回随机一个元素
srandmember 返回集合中一个或多个随机数
sismember key member 判断元素是否是集合 key 的成员
smembers 返回集合中的所有成员
sinter 取出两个集合相同的元素
sdiff 取出两个集合的差集
sunion 取出两个集合的并集
实战:随机抽奖-spop/srandmember ,添加标签-sadd,共同关注-sinter
有序集合结构
命令:
zadd key score1 member1 添加/更新 一/多个成员
zcard key 获取成员数
zcount key min max 计算区间内成员数
zincrby key increment member 对指定成员的分数加上增量 increment
zincrby destination numkeys key [key ...] 计算一/多个有序集的交集并存储在新的有序集合 key 中
zrem key member [member ...] 移除有序集合中的一个或多个成员
zremrangebyrank key start end 删除指定排名内的升序元素
zremrangebyscore key minScore maxScore 删除指定分数内的升序元素
zrange key start stop 返回索引区间内的成员
zrank key member 返回有序集合中指定成员的索引
zrevrange key start stop [WITHSCORES] 返回有序集中指定区间内的成员,通过索引,分数从高到底
zscore key member 返回有序集中,成员的分数值
zunionstoredestination numkeys key [key ...] 计算给定的一个或多个有序集的并集,并存储在新的 key 中
zscan key cursor [MATCH pattern] [COUNT count] 迭代有序集合中的元素(包括元素成员和元素分值)
zrangebylex key min max [LIMIT offset count] 返回value在区间内的成员,(为不包括,[为包括,-为小于
zrangebyscore key min max [WITHSCORES] [LIMIT] 返回score在区间内的成员,(1 5 表示1 < score <= 5
实战:排行榜
总结
maven依赖
redis.clients
jedis
2.9.0
import redis.clients.jedis.Jedis;
public class RedisTest {
public static void main(String[] args) {
//连接本地的 Redis 服务
Jedis jedis = new Jedis("192.168.136.158",6380);
System.out.println("连接成功");
//设置 redis 字符串数据
jedis.set("runoobkey", "www.runoob.com");
// 获取存储的数据并输出
System.out.println("redis 存储的字符串为: "+ jedis.get("runoobkey"));
}
}
import java.util.Iterator;
import java.util.List;
import java.util.Set;
import redis.clients.jedis.Jedis;
public class jedis {
public static void main(String[] args) {
//连接本地的 Redis 服务
Jedis jedis = new Jedis("localhost");
System.out.println("连接成功");
//jedis.set("mykey", "root");
//System.out.println("redis 存储的字符串为: "+ jedis.get("mykey"));
/*jedis.lpush("word", "one");
jedis.lpush("word", "two");
List lists = jedis.lrange("word", 0 ,-1);
for(int i=0; i keys = jedis.keys("*");
Iterator it = keys.iterator();
while(it.hasNext()){
String akey = it.next();
System.out.println(akey);
}
}
}
Jedis直连和连接池连接
连接池的使用
commons-pool配置:
资源数控制
借还参数
maxTotal
合适的maxIdle和minIdle
常见问题:连接超时,资源耗尽
解决思路:
作用
将查询时间超过一定限制的语句记录到日志中,找到系统中瓶颈的命令
客户端请求的生命周期
两点说明:
1.慢查询发生在第三阶段,判断依据是执行时长
2.客户端超时不一定慢查询(四个步骤都可能),但慢查询是客户端超时的一个可能因素
两个配置
config get slowlog-max-len=128 先进先出队列 通常设置1000,固定长度、保存在内存中
config get slowlog-log-slower-than=10000 慢查询阈值,单位微秒,即10ms,通常设置1ms
=0即记录所有命令(查看命令所用时间),<0即不记录任何命令
慢查询命令
slowlog get [n] 获取慢查询队列
slowlog len 获取慢查询队列长度 队列里面有多少慢查询
slowlog reset 清空慢查询队列
定期持久化慢查询
动态配置
config set slowlog-max-len 1000
config set slowlog-log-slower-than 1000
作用
提高客户端的效率,减少网络时间的消耗
流水线的作用
注意:
redis命令是微秒级别
pipeline每次条数要控制(网络)
pipeline-Jedis使用
maven依赖
不使用pipeline,1w hset -> 50s
使用pipeline,1w hset -> 0.7s
使用建议:
注意每次pipeline携带数据量
pipeline每次只能作用在一个redis节点上
M操作与pipeline区别
角色:发布者 订阅者 频道
订阅者可以订阅多频道,但无法接收到订阅前的消息
命令
subscribe channel [channel ...] 订阅一个或多个频道的信息
publish channel message 信息发送到指定的频道
unsubscribe [channel [channel ...]] 指退订给定频道
Redis不仅可作为缓存服务器,还可用作消息队列。它的列表类型天生支持用作消息队列
消息队列 要抢 比如红包
发布订阅 都有 比如公告
作用:减少内存的方案
命令
setbit key offset value 设置指定位置偏移量为0/1
getbit key offset 获取指定位的值
bitcount key [start end] 获取指定范围值为1的个数,不指定则为全部
bitop op destkey key [key...] 做多个Bitmap的and(交集)、or(并集)、not(非)、xor(异或),并将结果保存在destkey
bitpos key targetBit [start] [end] 计算范围内,偏移量等于targetBit的,第一个位置,不指定范围则为全部
实战:独立用户统计
1亿用户,5千五独立,使用set和Bitmap区别
只有10万独立用户
使用经验
type=string,最大512MB
注意setbit时的偏移量,可能有较大耗时
位图不是绝对好
作用
极小空间完成独立数据统计,用来做基数统计(不重复元素统计)的算法,HyperLogLog 的优点是,在输入元素的数量或者体积非常非常大时,计算基数所需的空间总是固定 的、并且是很小的,本质还是字符串
命令
pfadd key element [element ...] 添加指定元素到 HyperLogLog 中
pfcount key [key ...] 返回给定 HyperLogLog 的基数估算值
pfmerge destkey sourcekey [sourcekey ...] 将多个 HyperLogLog 合并为一个 HyperLogLog
使用经验
是否能容忍错误,基数估计就是在误差可接受的范围内,快速计算基数。
是否需要单挑数据
作用
用于存储经纬度,计算两地距离,范围计算等, 其实zset类型实现
命令
geoadd key 经度longitude 纬度latitude 城市member 添加地理位置信息
geopos key member 获取地理位置信息
geodist key member1 member2[unit] 获取两地距离,单位m、km、mi(英里)、ft(尺)
参考:https://www.cnblogs.com/jiang910/p/10020048.html