尚硅谷大数据之Redis笔记

尚硅谷大数据之Redis笔记_第1张图片
需要文档的加威信
:威信连接

redis 课程系列
—————————————————————————————
Redis
版本:V 1.0 Redis 简介
是一个开源的使用 C 语言编写,支持网络,可基于内存亦可持久化的日志 key-value 数据库
[非关系型数据库]。并支持多种语言的 API。 注意:非关系型数据库 mysql,oracle,
sqlserver,db2 关系型数据库。
支持的语言:
Redis 特性
Redis 远程的:分为客户端,服务端。可以分别部署在不同的机器上,通过自定义协议进行
传输和交互的。平时说的 Redis 通常指的是 Redis 的服务端。
Redis 基于内存的:所有数据结构存在内存中。所有操作非常高速。性能优越于硬盘存储的
mysql,因为存在内存中,所有也是比较吃内存的。
Redis 非关系型数据库:本质是数据库,存储数据,区别于 Mysql。
关系型数据库在存储之前,必须要定义好所谓的数据字典,后续的存储数据按照存储字典来
存储,而 Redis 就不需要了。
Redis 应用场景
1.缓存:当系统的接口数据比较慢的时候,可以把系统数据接口的数据缓存起来,当下次取
的时候,可以直接从缓存中取就可以了。
2.数据存储:redis 有两种非常完备的持久化机制【AOF 和 RDB】,可以定期将数据持久化硬
盘中,保障数据的完整性,安全性。
1
更多 Java –大数据 –前端 –python 人工智能资料下载,可访问百度:尚硅谷官网
redis 课程系列
—————————————————————————————
https://db-engines.com/en/ranking 使用排行榜
为什么使用 redis
性能
如下图所示,我们在碰到需要执行耗时特别久,且结果不频繁变动的 SQL,就
特别适合将运行结果放入缓存。这样,后面的请求就去缓存中读取,使得请求
能够迅速响应。
什么叫迅速:
”在理想状态下,我们的页面跳转需要在瞬间解决,对于页内操作则需要在刹那间
解决。另外,超过一弹指的耗时操作要有进度提示,并且可以随时中止或取消,这
样才能给用户最好的体验。”
那么瞬间、刹那、一弹指具体是多少时间呢?
根据《摩诃僧祗律》记载
2
更多 Java –大数据 –前端 –python 人工智能资料下载,可访问百度:尚硅谷官网
redis 课程系列
—————————————————————————————
一刹那者为一念,二十念为一瞬,二十瞬为一弹指,二十弹指为一罗预,二十罗预
为一须臾,一日一夜有三十须臾。
那么,经过周密的计算,一瞬间为 0.36 秒,一刹那有 0.018 秒.一弹指长达 7.2
秒。
并发
如下图所示,在大并发的情况下,所有的请求直接访问数据库,数据库会出现
连接异常。这个时候,就需要使用 redis 做一个缓冲操作,让请求先访问到 redis,
而不是直接访问数据库。
3
更多 Java –大数据 –前端 –python 人工智能资料下载,可访问百度:尚硅谷官网
redis 课程系列
—————————————————————————————
单线程 redis 为什么这么快?
(一)纯内存操作
(二)单线程操作,避免了频繁的上下文切换
(三)采用了非阻塞 I/O 多路复用机制
多路复用案例:
小明在紫禁城开了一家快递店,负责同城快送服务。小明因为资金限制,雇佣
了一批快递员,然后小明发现资金不够了,只够买一辆车送快递。
经营方式一
客户每送来一份快递,小明就让一个快递员盯着,然后快递员开车去送快递。
慢慢的小明就发现了这种经营方式存在下述问题
1、几十个快递员基本上时间都花在了抢车上了,大部分快递员都处在闲置状态,谁抢到了
车,谁就能去送快递
2、随着快递的增多,快递员也越来越多,小明发现快递店里越来越挤,没办法雇佣新的快
递员了
3、快递员之间的协调很花时间。
经营方式二
小明只雇佣一个快递员。然后呢,客户送来的快递,小明按送达地点标注好,然后依次放在
一个地方。最后,那个快递员依次的去取快递,一次拿一个,然后开着车去送快递,送好了
就回来拿下一个快递
4
更多 Java –大数据 –前端 –python 人工智能资料下载,可访问百度:尚硅谷官网
redis 课程系列
—————————————————————————————
上述两种经营方式对比,是不是明显觉得第二种,效率更高,更好呢。在上述
比喻中:
每个快递员——————>每个线程
每个快递——————–>每个 socket(I/O 流)
快递的送达地点————–>socket 的不同状态
客户送快递请求————–>来自客户端的请求
小明的经营方式————–>服务端运行的代码
一辆车———————->CPU 的核数
结论:
经营方式一就是传统的并发模型,每个 I/O 流(快递)都有一个新的线程(快递员)
管理。
经营方式二就是 I/O 多路复用。只有单个线程(一个快递员),通过跟踪每个 I/O
流的状态(每个快递的送达地点),来管理多个 I/O 流。
面试的时候:
将复杂的东西简单化:生活化!
5
更多 Java –大数据 –前端 –python 人工智能资料下载,可访问百度:尚硅谷官网
redis 课程系列
—————————————————————————————
Redis 安装
导入 redis 的压缩包,root 目录即可!
解压(解压到当前目录即可/root)
tar -zxvf redis-3.2.8.tar.gz
要添加依赖。(Redis 是使用 c 语言编写的。)在 root 目录下
添加。
yum install gcc-c++ automake autoconf,一般情况下只添加 gcc-c++即可。automake autoconf 是
为了确保不会出现其他问题而添加的依赖。
yum :最好在有外网的情况下安装使用
6
更多 Java –大数据 –前端 –python 人工智能资料下载,可访问百度:尚硅谷官网
redis 课程系列
—————————————————————————————
如果环境不允许,使用本地 yum 源。
创建安装目录
/opt 存在临时文件
/usr/local 安装应用程序的目录
mkdir -p /usr/local/redis
进行编译:在解压后的 redis 文件夹中,使用 make 命令。

cd /root/redis-3.2.8

make

7
更多 Java –大数据 –前端 –python 人工智能资料下载,可访问百度:尚硅谷官网
redis 课程系列
—————————————————————————————
使用 make 命令进行编译 :
进行安装:
使用 make install 安装路径 /usr/loca/redis
make install PREFIX=/usr/local/redis install 放在前后没有任何影响。
8
更多 Java –大数据 –前端 –python 人工智能资料下载,可访问百度:尚硅谷官网
redis 课程系列
—————————————————————————————
进入安装目录
cd /usr/local/redis 目录下会一个 bin 文件夹
9
更多 Java –大数据 –前端 –python 人工智能资料下载,可访问百度:尚硅谷官网
redis 课程系列
—————————————————————————————
redis-cli :表示 redis 的客户端
redis-server :表示 redis 的服务器
开始启动服务
./redis-server 启动服务
Port 6379 :redis 默认的端口号
10
更多 Java –大数据 –前端 –python 人工智能资料下载,可访问百度:尚硅谷官网
redis 课程系列
—————————————————————————————
启动服务后则该窗口什么也不能做了!
因为 redis 启动方式默认前台启动。为了是窗口可以用,可以设置 redis 为后台启动。
redis 配置
redis.conf 配置文件
bind 绑定那个 ip 地址
protected-mode yes 保护模式是否开启
port 6379 端口号
tcp-backlog 511 确定了 TCP 连接中已完成队列
timeout 0 设置客户端空闲超时时间,服务端不会主动断开连接,不能小于 0。
tcp-keepalive 300 每个一段时间 300 秒发送一次请求.看是否还活着
11
更多 Java –大数据 –前端 –python 人工智能资料下载,可访问百度:尚硅谷官网
redis 课程系列
—————————————————————————————
daemonize yes 是否在后台执行!
supervised no 无监督交互
pidfile /var/run/redis_6379.pid 指定存储 Redis 进程号的文件路径
loglevel notice 日志级别 notice (仅试用于生产)
logfile “” 配置 log 文件地址,默认打印在命令行终端的窗口上,也可设为/dev/null 屏蔽日志
databases 16 指定数据库个数
maxclient 最大客户端连接数
Maxmemory :
设置 Redis 可以使用的内存量。一旦到达内存使用上限,Redis 将会试图移除内部数据,
移除规则 可以通过 maxmemory-policy 来指定。如果 Redis 无法根据移除规则来移除内存中
的数据,或者设置了“不允许移除”,
那么 Redis 则会针对那些需要申请内存的指令返回错误信息,比如 SET、LPUSH 等。
Maxmemory-policy noeviction 默认配置
(1)volatile-lru:使用 LRU 算法移除 key,只对设置了过期时间的键
(2)allkeys-lru:使用 LRU 算法移除 key
(3)volatile-random:在过期集合中移除随机的 key,只对设置了过期时间的键
(4)allkeys-random:移除随机的 key
(5)volatile-ttl:移除那些 TTL 值最小的 key,即那些最近要过期的 key
(6)noeviction:不进行移除。针对写操作,只是返回错误信息
cluster-enabled yes 是否开启集群
设置 redis 后台启动
先使用 ctrl+c 退出前台启动

  1. 回到 redis 的解压目录去找 redis.conf 配置文件
    12
    更多 Java –大数据 –前端 –python 人工智能资料下载,可访问百度:尚硅谷官网
    redis 课程系列
    —————————————————————————————
    13
    更多 Java –大数据 –前端 –python 人工智能资料下载,可访问百度:尚硅谷官网
  2. 找到之后,拷贝到安装目录
    cp redis.conf /usr/local/redis/bin
    要修改 redis.conf 配置文件
    daemonize no – daemonize yes 此属性表示设置 redis 的启动方式。
    no 表示前台启动,yes 表示后台启动。
    修改完成之后,再从新启动 redis
    ./redis-server ./redis.conf
    redis 课程系列
    —————————————————————————————
    如果将 redis 的进程 kill 掉。 则再去找 redis 的服务进程。就找不到了!
    Redis 的五种数据类型
    String : 是 Redis 最基本的类型,你可以理解成与 Memcached 一模一样的类型,一个 key 对
    应一个 value。 Map key-value
    a) String str = “hello”; redis key – value String s = new String(“”);
     String 类型是二进制安全的。意味着 Redis 的 string 可以包含任何数据。比如 jpg 图
    片或者序列化的对象。
     String 类型是 Redis 最基本的数据类型,一个 Redis 中字符串 value 最多可以是 512M.
    14
    更多 Java –大数据 –前端 –python 人工智能资料下载,可访问百度:尚硅谷官网
    redis 课程系列
    —————————————————————————————
    List: 单键多值
     Redis 列表是简单的字符串列表,按照插入顺序排序。你可以添加一个元素导列表的
    头部(左边)或者尾部(右边)。
     它的底层实际是个双向链表,对两端的操作性能很高,通过索引下标的操作中间的
    节点性能会较差。
    Set: Redis set 对外提供的功能与 list 类似是一个列表的功能,特殊之处在于 set 是可以自
    动排重的,当你需要存储一个列表数据,又不希望出现重复数据时,set 是一个很好
    的选择。
    Hash: Redis hash 是一个键值对集合。
     Redis hash 是一个 string 类型的 field 和 value 的映射表,hash 特别适合用于存储对
    象。
     类似 Java 里面的 Map
    15
    更多 Java –大数据 –前端 –python 人工智能资料下载,可访问百度:尚硅谷官网
    redis 课程系列
    —————————————————————————————
    16
    更多 Java –大数据 –前端 –python 人工智能资料下载,可访问百度:尚硅谷官网
    Zset:  Redis 有序集合 zset 与普通集合 set 非常相似,是一个没有重复元素的字符串集合。不
    同之处是有序集合的没有成员都关联了一个评分(score) ,这个评分(score)被用来
    按照从最低分到最高分的方式排序集合中的成员。集合的成员是唯一的,但是评分可以
    是重复了 。  因为元素是有序的, 所以你也可以很快的根据评分(score)或者次序(position)来获取
    一个范围的元素。访问有序集合的中间元素也是非常快的,因此你能够使用有序集合作
    为一个没有重复成员的智能列表。
    使用场景:
    数据类型 项目中的应用
    String 字符串 比如说当一个 ip 地址访问网站超过了预定的次数,可以禁止访
    问,则这个预定次数就可以使用 String 来存储
    List 列表 实现最新消息信息排列展示【消息队列】
    Set 集合 特殊之处在于 set 是可以自动排重的。比如在微博应用中,每个
    redis 课程系列
    —————————————————————————————
    17
    更多 Java –大数据 –前端 –python 人工智能资料下载,可访问百度:尚硅谷官网
    人的好友存在一个集合(set)中,这样求两个人的共同好友的操
    作,可能就只需要用求交集命令即可。
    Hash 散列 存储用户信息:key(用户 ID) + field(属性标签) 操作对应属
    性数据了,既不需要重复存储数据,也不会带来序列化和并发修
    改控制的问题。很好的解决了问题
    Zset 有序集合 以某个条件为权重,比如按顶的次数排序。
    需要精准设定过期时间的应用
    使用 sorted set 的设置过期时间的时间戳,那么就可以简单地
    通过过期时间排序,定时清除过期数据。
    常用命令:
    非数据类型常用命令
  3. 切换库
    a) select 0
  4. 启动服务器,用客户端访问
    a) ./redis-server redis.conf
    b) ./redis-cli
  5. 测试验证连接是否正常
    a) ping
  6. 查看当前库的所有键
    a) keys *
  7. 判断 key 是否存在
    a) exists
  8. 查看键的类型
    redis 课程系列
    —————————————————————————————
    a) type
  9. 删除某个键
    a) del
  10. 设置 key 的过期时间单位为 秒
    a) expire
  11. 查看还有多少秒过期,-1 表示永不过期,-2 表示已过期
    a) ttl
  12. 查看当前数据库的 key 的数量
    a) dbsize
  13. 清空当前库
    a) flushdb
  14. 通杀全部库
    a) flushall
    String 类型常用命令
    1、 添加键值对
    a) set
    2、 查询对应键值
    a) get
    3、 将给定的 追加到原值的末尾
    a) append
    4、 获得值的长度
    a) strlen
    5、 只有在 key 不存在时设置 key 的值
    a) setnx
    6、 将 key 中储存的数字值增 1,只能对数字值操作,如果为空,新增值为 1
    a) incr
    18
    更多 Java –大数据 –前端 –python 人工智能资料下载,可访问百度:尚硅谷官网
    redis 课程系列
    —————————————————————————————
    19
    更多 Java –大数据 –前端 –python 人工智能资料下载,可访问百度:尚硅谷官网
    7、 将 key 中储存的数字值减 1,只能对数字值操作,如果为空,新增值为-1
    a) decr
    8、 将 key 中储存的数字值增减。自定义步长。
    a) incrby / decrby <步长> 9、 同时设置一个或多个 key-value 对
    a) mset …
    10、 同时获取一个或多个 value
    a) mget …
    11、 同时设置一个或多个 key-value 对,当且仅当所有给定 key 都不存在。
    a) msetnx …
    12、 获得值的范围
    a) getrange <起始位置> <结束位置>
    13、 用 覆写 所储存的字符串值,从<起始位置>开始。
    a) setrange <起始位置>
    14、 设置键值的同时,设置过期时间,单位秒。
    a) setex <过期时间>
    15、 以新换旧,设置了新值同时获得旧值
    a) getset
    List 类型常用命令
    1、 从左边/右边插入一个或多个值。
    a) lpush/rpush …
    2、 从左边/右边吐出一个值。值在键在,值光键亡
    a) lpop/rpop
    3、 按照索引下标获得元素(从左到右) 元素不会丢失!
    a) lrange
    4、 获得列表长度
    redis 课程系列
    —————————————————————————————
    a) llen
    5、 在的后面插入 插入值
    a) linsert before
    Set 类型常用命令
    1、 将一个或多个 member 元素加入到集合 key 当中,已经存在于集合的 member 元素
    将被忽略。
    a) sadd …
    2、 取出该集合的所有值。
    a) smembers
    3、 判断集合是否为含有该值,有返回 1,没有返回 0
    a) sismember
    4、 删除集合中的某个元素。
    a) srem …
    5、 随机从该集合中吐出一个值。
    a) spop
    6、 随机从该集合中取出 n 个值,不会从集合中删除。
    a) srandmember
    7、 返回两个集合的交集元素。
    a) sinter
    8、 返回两个集合的并集元素。
    a) sunion
    9、 返回两个集合的差集元素,返回的结果跟 key 的顺序有关系
    a) sdiff
    20
    更多 Java –大数据 –前端 –python 人工智能资料下载,可访问百度:尚硅谷官网
    redis 课程系列
    —————————————————————————————
    Hash 类型常用命令
    1、 给集合中的 键赋值
    a) hset
    2、 从集合 取出 value
    a) hget
    3、 批量设置 hash 的值
    a) hmset …
    4、 批量取出 hash 的值
    a) hmget …
    5、 查看哈希表 key 中,给定域 field 是否存在。 有返回 1,没有返回 0
    a) hexists key
    6、 列出该 hash 集合的所有 field
    a) hkeys
    7、 列出该 hash 集合的所有 value
    a) hvals
    Zset 类型常用命令
    1、 将一个或多个 member 元素及其 score 值加入到有序集 key 当中。
    a) zadd …
    2、 返回有序集 key 中,下标在 之间的元素带 WITHSCORES,可以让分数一起
    和值返回到结果集。
    a) zrange [WITHSCORES]
    ① WITHSCORES 如果在命令行上加上该选项,则将 score 和 value 一同取出,如
    果不加该选项,则只取 value 值!
    3、 返回有序集 key 中,所有 score 值介于 min 和 max 之间(包括等于 min 或 max )的
    成员。有序集成员按 score 值递增(从小到大)次序排列。
    21
    更多 Java –大数据 –前端 –python 人工智能资料下载,可访问百度:尚硅谷官网
    redis 课程系列
    —————————————————————————————
    a) zrangebyscore key min max [withscores] [limit offset count]
    b) zrevrangebyscore key max min [withscores] [limit offset count] 从大到小 4、 为元素的 score 加上增量
    a) zincrby 5、 删除该集合下,指定值的元素
    a) zrem
    6、 统计该集合,分数区间内的元素个数
    a) zcount
    7、 返回该值在集合中的排名,从 0 开始。
    a) zrank
    使用 eclipse 连接操作 redis
  15. 关闭防火墙
  16. 修改 bind 标签 为* ,或者直接注释点 可以使用 windows 客户端连接
    创建工程
  17. 导入 jar 包
    commons-pool2-2.4.2.jar
    jedis-2.9.0.jar
    junit-4.8.jar
  18. 创建测试类
    22
    更多 Java –大数据 –前端 –python 人工智能资料下载,可访问百度:尚硅谷官网
    redis 课程系列
    —————————————————————————————
    23
    更多 Java –大数据 –前端 –python 人工智能资料下载,可访问百度:尚硅谷官网
    a) Jedis:这个类是用来操作 redis 的。该类中包含了操作 redis 的所有方法。
    public class TestJedis {
    @Test
    public void connection(){
    // 创建连接使用Jedis类
    Jedis jd = new Jedis(“192.168.67.201”, 6379);
    System.out.println(jd.ping());
    jd.set(“gyy”, “大美女”);
    jd.set(“ty”, “清纯小美女”);
    System.out.println(jd.get(“gyy”));
    } }
  19. 使用连接池进行测试
    JedisPool jp = null;
    Jedis jd = null;
    @Before
    public void connection() {
    jp = new JedisPool(“192.168.67.201”, 6379);
    jd = jp.getResource();
    System.out.println(jd.ping());
    }
    // 测试 String 添加单条数据
    @Test
    public void tStr() {
    jd.set(“name0”, “陈乔恩”);
    System.out.println(jd.get(“name0”));
    }
    redis 课程系列
    —————————————————————————————
    24
    更多 Java –大数据 –前端 –python 人工智能资料下载,可访问百度:尚硅谷官网
    // 测试 String 添加多条数据 json {“name”:“value”}
    @Test
    public void tStrs() {
    jd.mset(“name1”, “赵丽颖”, “sex”, “女”);
    System.out.println(jd.mget(“name1”, “sex”));
    }
    // 测试 hash 添加单条数据
    @Test
    public void tHash() {
    jd.hset(“h01”, “name2”, “妲己”);
    System.out.println(jd.hget(“h01”, “name2”));
    }
    // 测试 hash 添加多条数据
    @Test
    public void tHashs() {
    Map map = new HashMap<>();
    map.put(“name3”, “大乔”);
    map.put(“name4”, “曹操”);
    jd.hmset(“h02”, map);
    System.out.println(jd.hmget(“h02”, “name3”, “name4”));
    }
    // 测试 list
    @Test
    redis 课程系列
    —————————————————————————————
    25
    更多 Java –大数据 –前端 –python 人工智能资料下载,可访问百度:尚硅谷官网
    public void tlist() {
    // jd.lpush(“list01”, “赵云”);
    // jd.lpush(“list01”, “张飞”);
    // jd.lpush(“list01”, “关羽”);
    // jd.lpush(“list01”, “刘备”);
    // 再次运行结果是:
    jd.lpush(“list01”, “赵云”);
    jd.lpush(“list02”, “张飞”);
    jd.lpush(“list03”, “关羽”);
    jd.lpush(“list04”, “刘备”);
    // 从新添加一个集合
    jd.lpush(“list05”, “凯”);
    jd.lpush(“list06”, “虞姬”);
    jd.lpush(“list07”, “孙悟空”);
    System.out.println(jd.lrange(“list05”, 0, 5));
    }
    // 测试 set
    @Test
    public void tset() {
    jd.sadd(“set01”, “太乙真人”);
    jd.sadd(“set01”, “蔡文姬”);
    jd.sadd(“set01”, “扁鹊”);
    System.out.println(jd.smembers(“set01”));
    }
    redis 课程系列
    —————————————————————————————
    26
    更多 Java –大数据 –前端 –python 人工智能资料下载,可访问百度:尚硅谷官网
    // 测试 sorted Set 对数据进行排序
    @Test
    public void tsortSet() {
    Map map = new HashMap<>();
    map.put(“100”, new Double(1));
    map.put(“98”, new Double(3));
    map.put(“99”, new Double(2));
    jd.zadd(“sorted01”, map);
    // 0,1 取得集合中的元素 ,主要排序是根据 Double 数值进行排序。
    System.out.println(jd.zrange(“sorted01”, 0, 1));
    }
    Redis
    版本:V 1.0
    Redis 持久化
    Redis 主要是工作在内存中。内存本身就不是一个持久化设备,断电后数据会清空。所
    以 Redis 在工作过程中,如果发生了意外停电事故,如何尽可能减少数据丢失。
    redis 课程系列
    —————————————————————————————
  20. RDB
    1.1 RDB 简介
    RDB:在指定的时间间隔内将内存中的数据集快照写入磁盘,也就是行话讲的 Snapshot
    快照,它恢复时是将快照文件直接读到内存里。
    工作机制:每隔一段时间,就把内存中的数据保存到硬盘上的指定文件中。
    RDB 是默认开启的!
    Redis 会单独创建(fork)一个子进程来进行持久化,会先将数据写入到一个临时文件中
    【xxx.rdb】,待持久化过程都结束了,再用这个临时文件替换上次持久化好的文件。整个过
    程中,主进程是不进行任何 IO 操作的,这就确保了极高的性能如果需要进行大规模数据的
    恢复,且对于数据恢复的完整性不是非常敏感,那 RDB 方式要比 AOF 方式更加的高效。
    RDB 的缺点是最后一次持久化后的数据可能丢失。
    1.2 RDB 保存策略
    save 900 1 900 秒内如果至少有 1 个 key 的值变化,则保存
    save 300 10 300 秒内如果至少有 10 个 key 的值变化,则保存
    save 60 10000 60 秒内如果至少有 10000 个 key 的值变化,则保存
    save “” 就是禁用 RDB 模式;
    27
    更多 Java –大数据 –前端 –python 人工智能资料下载,可访问百度:尚硅谷官网
    redis 课程系列
    —————————————————————————————
    28
    更多 Java –大数据 –前端 –python 人工智能资料下载,可访问百度:尚硅谷官网
    1.3 RDB 常用属性配置
    属性 含义 备注
    save 保存策略
    dbfilename RDB 快照文件名
    dir RDB 快照保存的目录 必须是一个目录,不能是文件名。最好改
    为固定目录。默认为./代表执行 redisserver 命令时的当前目录!
    stop-writes-on-bgsaveerror
    是否在备份出错时,继
    续接受写操作
    如果用户开启了 RDB 快照功能,那么在
    redis 持久化数据到磁盘时如果出现失
    败,默认情况下,redis 会停止接受所有
    的写请求
    rdbcompression 对于存储到磁盘中的
    快照,可以设置是否进
    行压缩存储。
    如果是的话,redis 会采用 LZF 算法
    进行压缩。如果你不想消耗 CPU 来进行
    压缩的话,
    可以设置为关闭此功能,但是存储
    在磁盘上的快照会比较大。
    rdbchecksum 是否进行数据校验 在存储快照后,我们还可以让 redis
    使用 CRC64 算法来进行数据校验,但是
    这样做会增加大约 10%的性能消耗,
    如果希望获取到最大的性能提升,
    可以关闭此功能。
    1.4 RDB 数据丢失的情况
    两次保存的时间间隔内,服务器宕机,或者发生断电问题。
    redis 课程系列
    —————————————————————————————
    29
    更多 Java –大数据 –前端 –python 人工智能资料下载,可访问百度:尚硅谷官网
    1.5 RDB 的触发
    设置 save 30 10 条的时候触发
    在指定范围内向数据库添加数据
    ① 拷贝 rdb 文件 cp dump.rdb dump_bak.rdb
    ② 执行 flushdb ,再执行 shutdown 命令,也会产生 dump.rdb,但里面是空的,
    没有意义。空的 dump.rdb 默认大小 76
    ③ 当执行 shutdown 命令时,也会主动地备份数据。
    ④ 重新将赋值的 rdb 文件数据在拷贝回去。在进行连接测试。则数据产生了。
    ⑤ 注意:使用 rdb 备份的时候,如果使用了 flushdb,则数据将会被取消!
    1.6 RDB 的优缺点
    redis 课程系列
    —————————————————————————————
    30
    更多 Java –大数据 –前端 –python 人工智能资料下载,可访问百度:尚硅谷官网
  21. AOF
    2.1 AOF 简介
     AOF 是以日志的形式来记录每个写操作,将每一次对数据进行修改,都把新建、修
    改数据的命令保存到指定文件中。Redis 重新启动时读取这个文件,重新执行新建、
    修改数据的命令恢复数据。
     默认不开启,需要手动开启 593 行 appendonly yes
     AOF 文件的保存路径,同 RDB 的路径一致。# dir ./
     AOF 在保存命令的时候,只会保存对数据有修改的命令,也就是写操作!
     当 RDB 和 AOF 存的不一致的情况下,按照 AOF 来恢复。因为 AOF 是对 RDB 的补
    充。备份周期更短,也就更可靠。
    2.2 AOF 保存策略
    appendfsync always:每次产生一条新的修改数据的命令都执行保存操作;效率低,但是安全!
    appendfsync everysec:每秒执行一次保存操作。如果在未保存当前秒内操作时发生了断电,
    仍然会导致一部分数据丢失(即 1 秒钟的数据)。
    appendfsync no:从不保存,将数据交给操作系统来处理。更快,也更不安全的选择。
    推荐(并且也是默认)的措施为每秒 fsync 一次,这种 fsync 策略可以兼顾速度和安全性。
    2.3 AOF 常用属性
    属性 含义 备注
    appendonly 是否开启 AOF 功能 默认是关闭的 yes
    redis 课程系列
    —————————————————————————————
    31
    更多 Java –大数据 –前端 –python 人工智能资料下载,可访问百度:尚硅谷官网
    appendfilename AOF 文件名称 appendonly.aof
    appendfsync AOF 保存策略 官方建议 everysec
    no-appendfsync-on-rewrite 在重写时,是否执
    行保存策略
    执行重写,可以节省 AOF 文件的体积;
    而且在恢复的时候效率也更高。
    auto-aof-rewritepercentage
    重写的触发条件 当目前aof文件大小超过上一次重写的
    aof 文件大小的百分之多少进行重写
    auto-aof-rewrite-min-size 设置允许重写的最
    小 aof 文件大小
    避免了达到约定百分比但尺寸仍然很
    小的情况还要重写
    Aof :属于实时备份。文件大小,应该比 rdb 要大。
    Rdb : 间隔备份。
    2.4 AOF 文件的修复
    2.4.1 # vim redis.conf
    2.4.2 开启 aof 配置 appendonly yes ,则会产生对应的日志文件 appendonly.aof
    2.4.3 启动空的服务,写入命令
    2.4.4 写入完成命令之后,flushall ,shutdown。
    2.4.5 结果 error!还是空的: aof 备份的实在就是记录所有的命令!
    2.4.6 分析原因:查看 vim appendonly.aof 将最后的 flushall 删除,再重新查询。
    2.4.7 使用 vim 命令在 appendonly.aof 添加一些无效信息,再启动,并使用客户端连接,
    则会发现链接失败!
    如果 AOF 文件中出现了残余命令,会导致服务器无法重启。此时需要借助 redis-checkaof 工具来修复!
    命令: redis-check-aof --fix 文件
    注意:只要是 aof 开启,则无论怎么样都会读取 aop 的配置文件。
    redis 课程系列
    —————————————————————————————
    2.5 AOF 的优缺点
    优点:
     备份机制更稳健,丢失数据概率更低
     可读的日志文本,通过操作 AOF 稳健,可以处理误操作【redis-check-aof --fix 文件】
    缺点:
     比起 RDB 占用更多的磁盘空间
     恢复备份速度要慢
     每次读写都同步的话,有一定的性能压力
     存在个别 Bug,造成恢复不能。
    32
    更多 Java –大数据 –前端 –python 人工智能资料下载,可访问百度:尚硅谷官网
    redis 课程系列
    —————————————————————————————
    33
    更多 Java –大数据 –前端 –python 人工智能资料下载,可访问百度:尚硅谷官网
    Redis 主从复制
  22. 主从简介
    配置多台 Redis 服务器,以主机和备机的身份分开。主机数据更新后,根据配置和策略,
    自动同步到备机的 master/salver 机制,Master 以写为主,Slave 以读为主,二者之间自动同
    步数据。
    目的:
    读写分离提高 Redis 性能;
    避免单点故障,容灾快速恢复
    原理:
    每次从机联通后,都会给主机发送 sync 指令,主机立刻进行存盘操作,发送 RDB 文件,
    给从机
    从机收到 RDB 文件后,进行全盘加载。之后每次主机的写操作,都会立刻发送给从机,从机
    执行相同的命令
    redis 课程系列
    —————————————————————————————
  23. 主从准备
    除非是不同的主机配置不同的 Redis 服务,否则在一台机器上面跑多个 Redis 服务,需
    要配置多个 Redis 配置文件。
    ①准备多个 Redis 配置文件,每个配置文件,需要配置以下属性
    daemonize yes: 服务在后台运行
    port:端口号
    pidfile:pid 保存文件
    logfile:日志文件(如果没有指定的话,就不需要)
    dump.rdb: RDB 备份文件的名称
    appendonly 关掉,或者是更改 appendonly 文件的名称。 aof
    样本:
    include /usr/local/redis/bin/redis.conf
    port 6379
    pidfile /var/run/redis_6379.pid
    dbfilename dump_6379.rdb
    ②根据多个配置文件,启动多个 Redis 服务
    34
    更多 Java –大数据 –前端 –python 人工智能资料下载,可访问百度:尚硅谷官网
    redis 课程系列
    —————————————————————————————
    ./redis-cli -p 6379
    -p :表示要连接到哪个端口上的服务器!
  24. 主从建立
    3.1 临时建立
    原则:配从不配主。
    配置:在从服务器上执行 SLAVEOF ip:port 命令;
    查看:执行 info replication 命令;
    35
    更多 Java –大数据 –前端 –python 人工智能资料下载,可访问百度:尚硅谷官网
    redis 课程系列
    —————————————————————————————
    确立关系之后,set key value 查看效果。关键是以前的 k1,k2 从机同样能够得到
    注意:从机只会读取,不能写入
    36
    更多 Java –大数据 –前端 –python 人工智能资料下载,可访问百度:尚硅谷官网
    redis 课程系列
    —————————————————————————————
    3.2 永久建立
    在从机的配置文件中,编写 slaveof 属性配置!

slaveof 127.0.0.1 6379

3.3 恢复身份
执行命令 slaveof no one 恢复自由身!【反客为主】
4. 主从常见问题
①从机是从头开始复制主机的信息,还是只复制切入以后的信息?
答:从头开始复制,即完全复制。实际上是读取主机的 rdb
②从机是否可以写?
答:不能
③主机 shutdown 后,从机是上位还是原地待命?
答:原地待命
37
更多 Java –大数据 –前端 –python 人工智能资料下载,可访问百度:尚硅谷官网
redis 课程系列
—————————————————————————————
④主机又回来了后,主机新增记录,从机还能否顺利复制?
答:可以
⑤从机宕机后,重启,宕机期间主机的新增记录,丛机是否会顺利复制?
答:可以
⑥其中一台从机 down 后重启,能否重认旧主?
答:不一定,看配置文件中是否配置了 slaveof

slaveof 127.0.0.1 6379

⑦如果两台从机都从主机同步数据,此时主机的 IO 压力会增大,如何解决?
答:按照主—从(主)—从模式配置![薪火相传] # slaveof 127.0.0.1 6380
38
更多 Java –大数据 –前端 –python 人工智能资料下载,可访问百度:尚硅谷官网
redis 课程系列
—————————————————————————————
39
更多 Java –大数据 –前端 –python 人工智能资料下载,可访问百度:尚硅谷官网
5. 哨兵模式
5.1 简介
作用: ①Master 状态检测
②如果 Master 异常,则会进行 Master-Slave 切换,将其中一个 Slave 作为 Master,
将之前的 Master 作为 Slave
5.2 配置
自定义的/usr/local/redis/bin 目录下新建 sentinel.conf 文件

vim sentinel.conf

哨兵模式需要配置哨兵的配置文件!
sentinel monitor mymaster 127.0.0.1 6379 1
redis 课程系列
—————————————————————————————
40
更多 Java –大数据 –前端 –python 人工智能资料下载,可访问百度:尚硅谷官网
启动哨兵:./redis-sentinel sentinel.conf
5.3 主机宕机后
redis 课程系列
—————————————————————————————

slave-priority 100

主推:
redis 集群
创建目录
配置文件:
conf 是用来放配置文件
mkdir -p opt/redis/conf
log 是用来放日志
mkdir -p /opt/redis/log
data 是用来放集群之后,产生的数据文件。
mkdir -p /opt/redis/data
不行知道用谁来管理集群?ruby!
41
更多 Java –大数据 –前端 –python 人工智能资料下载,可访问百度:尚硅谷官网
redis 课程系列
—————————————————————————————
上传 ruby 脚本:集群工具用来管理集群使用。
解压 ruby 脚本
进入 ruby-gems 文件中,进行安装
42
更多 Java –大数据 –前端 –python 人工智能资料下载,可访问百度:尚硅谷官网
redis 课程系列
—————————————————————————————
整理配置集群的配置文件。
Redis 在运行的时候,是通过处理 redis.conf 配置文件来运行的。而 redis.conf 配置文件中的
每个属性都有其特殊的含义。要想配置集群,则应该会有多个配置文件。集群的每个配置文
件中应该都有特殊的设置。比如说 port:应该不同。应该共同之处。在配置集群的时候,只要
将特殊部分取出来。再有一个公共的配置文件来处理公共的属性。
1-6.配置文件中每个端口号应该不一致! 除了端口号之外,可能其他的共同属性,把共同属
性放在一个配置文件中即可。7 配置文件。
为什么是 6 个配置文件
redis 集群,相对于项目来说,是保证项目能够正常运行!
每个集群都有一主一从:也就是说要有两个服务参与。
集群是采用选举方式来完成的!也就是说每次选举的结果应该大于 50%的时候,集群才能够
正常运行工作!否则集群就会失败!
43
更多 Java –大数据 –前端 –python 人工智能资料下载,可访问百度:尚硅谷官网
redis 课程系列
—————————————————————————————
比如:如果有只有两个?集群就不能正常工作了。
44
更多 Java –大数据 –前端 –python 人工智能资料下载,可访问百度:尚硅谷官网
redis 课程系列
—————————————————————————————
将配置文件放到/opt/redis/conf 目录中
启动配置好的集群配置文件
45
更多 Java –大数据 –前端 –python 人工智能资料下载,可访问百度:尚硅谷官网
redis 课程系列
—————————————————————————————

vim startup.sh

./redis-server /opt/redis/conf/redis-6379.conf
./redis-server /opt/redis/conf/redis-6380.conf
./redis-server /opt/redis/conf/redis-6381.conf
./redis-server /opt/redis/conf/redis-6382.conf
./redis-server /opt/redis/conf/redis-6383.conf
./redis-server /opt/redis/conf/redis-6384.conf

chomd +x startup.sh

查看一下是否启动成,相当于 6 个服务已经启动成功
ps –ef | grep redis
46
更多 Java –大数据 –前端 –python 人工智能资料下载,可访问百度:尚硅谷官网
redis 课程系列
—————————————————————————————
将 6 个 redis 服务通过 ruby 脚本来管理,实现集群。
cd /root/redis-3.2.8/src
将 ruby 脚本拷贝到 redis 安装目录
cp redis-trib.rb /usr/local/redis/bin/
开始创建集群
./redis-trib.rb create --replicas 1 192.168.26.30:6379 192.168.26.30:6380 192.168.26.30:6381
192.168.26.30:6382 192.168.26.30:6383 192.168.26.30:6384
问一句:192.168.26.30 = 127.0.0.1?
必须写虚拟机的真实 ip 地址!否则创建失败!
47
更多 Java –大数据 –前端 –python 人工智能资料下载,可访问百度:尚硅谷官网
redis 课程系列
—————————————————————————————
48
更多 Java –大数据 –前端 –python 人工智能资料下载,可访问百度:尚硅谷官网
redis 课程系列
—————————————————————————————
测试集群
./redis-cli -c -p 6379
-c : 表示集群
-p : 端口号
面试官:
Redis 服务是通过什么,实现在每个端口之间互相交互的?
集群原理:
Slots:(槽) redis 总共有 16384 个槽 每个服务器所占的槽的区间不一样。
Service1-6379 :0-5460
Service2-6380 :5461-10922
Service3-6381 :10923-16383
set name admin ,crc16 算法。返回一个槽的位置【5798】,判断你返回这个槽在那个区间?
crc16 (admin)=值 / 16384 = 5798.
对应的区间,就是对应的服务,无论是存,还是取都会遵循该算法!
关掉集群:实际就是关掉 redis 服务。 Kill 掉 redis 服务即可
killall redis-server
集群中写入数据
客户端重定向
①在 redis-cli 每次录入、查询键值,redis 都会计算出该 key 应该送往的插槽,如果不是
该客户端对应服务器插槽,redis 会报错,并告知应前往的 redis 实例地址和端口。
②redis-cli 客户端提供了 -c 参数实现自动重定向。如 redis-cli -c -p 6379 登入后,再
录入、查询键值对可以自动重定向。

redis-cli -c -p 6379

③每个 slot 可以存储一批键值对。
49
更多 Java –大数据 –前端 –python 人工智能资料下载,可访问百度:尚硅谷官网
redis 课程系列
—————————————————————————————
如何多键操作
采用哈希算法后,会自动地分配 slot,而 不在一个 slot 下的键值,是不能使用 mget,mset
等多键操作。
如果有需求,需要将一批业务数据一起插入呢?
解决:可以通过{}来定义组的概念,从而使 key 中{}内相同内容的键值对放到一个 slot 中
去。
集群中故障恢复
1、主机挂掉,从机会上位
./redis-cli -h:表示 host! 2、主节点恢复后如何
50
更多 Java –大数据 –前端 –python 人工智能资料下载,可访问百度:尚硅谷官网
redis 课程系列
—————————————————————————————
51
更多 Java –大数据 –前端 –python 人工智能资料下载,可访问百度:尚硅谷官网
当主节点:挂掉之后,从节点上位!当主节点恢复之后,不会成为主,应该改成从节点!

== 集群的从节点与主从复制的从节点有所有区别!

集群的从节点作用:当主节点挂掉,则会立即上位。
主从复制的从节点:只负责读取数据
集群的 Jedis 开发
@Test
public void testCluster(){
Set jedisClusterNodes = new
HashSet();
//Jedis Cluster will attempt to discover cluster nodes
automatically
jedisClusterNodes.add(new HostAndPort(“192.168.4.128”, 6379));
JedisCluster jc = new JedisCluster(jedisClusterNodes);
jc.set(“foo”, “bar”);
String value = jc.get(“foo”);
}
集群的优缺点
优点:
 实现扩容
 分摊压力
 无中心配置相对简单
缺点:  多键操作是不被支持的
 多键的 Redis 事务是不被支持的。lua 脚本不被支持。
 由于集群方案出现较晚,很多公司已经采用了其他的集群方案,而代理或者客
户端分片的方案想要迁移至 redis cluster,需要整体迁移而不是逐步过渡,复杂
度较大。
redis 课程系列
—————————————————————————————
52
更多 Java –大数据 –前端 –python 人工智能资料下载,可访问百度:尚硅谷官网
使用 eclipse 连接集群,进行数据操作
假如说,明天在使用集群的话。还需要创建么?NO
只需要启动集群即可 /usr/local/redis/bin ./start.sh

  1. 启动集群
    启动集群:也就是启动多个 redis 服务,而 redis 服务之前我们已经配置好了。/opt/redis/conf
    该目录下:redis-6379.conf----redis-6384.conf
  2. 使用 eclipse 连接集群。
    redis 课程系列
    —————————————————————————————
    53
    更多 Java –大数据 –前端 –python 人工智能资料下载,可访问百度:尚硅谷官网
    第一步: 应该要关闭防火墙,service iptables stop
    第二步:
    public static void main(String[] args) {
    // 创建多个redis服务的host和prot
    Set set = new HashSet<>();
    set.add(new HostAndPort(“192.168.26.30”, 6379));
    set.add(new HostAndPort(“192.168.26.30”, 6380));
    set.add(new HostAndPort(“192.168.26.30”, 6381));
    set.add(new HostAndPort(“192.168.26.30”, 6382));
    set.add(new HostAndPort(“192.168.26.30”, 6383));
    set.add(new HostAndPort(“192.168.26.30”, 6384));
    // 创建一个jedisCluster 对象 并将set集合中的host和prot给
    redis集群对象
    JedisCluster jc = new JedisCluster(set);
    jc.set(“one”, “小骨”);
    System.out.println(jc.get(“one”));
    }
    注意:导入 redis.jar,commons-pool.jar
    使用 spring 整合 redis
  3. 导入 jar 包:spring 和 redis
    commons-logging-1.1.3.jar
    commons-pool2-2.4.2.jar
    jedis-2.9.0.jar
    junit-4.8.jar
    spring-aop-4.1.6.RELEASE.jar
    redis 课程系列
    —————————————————————————————
    54
    更多 Java –大数据 –前端 –python 人工智能资料下载,可访问百度:尚硅谷官网
    spring-aspects-4.1.6.RELEASE.jar
    spring-beans-4.1.6.RELEASE.jar
    spring-context-4.1.6.RELEASE.jar
    spring-context-support-4.1.6.RELEASE.jar
    spring-core-4.1.6.RELEASE.jar
    spring-expression-4.1.6.RELEASE.jar
    spring-instrument-4.1.6.RELEASE.jar
    spring-instrument-tomcat-4.1.6.RELEASE.jar
    spring-jdbc-4.1.6.RELEASE.jar
    spring-jms-4.1.6.RELEASE.jar
    spring-messaging-4.1.6.RELEASE.jar
    spring-orm-4.1.6.RELEASE.jar
    spring-oxm-4.1.6.RELEASE.jar
    spring-test-4.1.6.RELEASE.jar
    spring-tx-4.1.6.RELEASE.jar
    spring-web-4.1.6.RELEASE.jar
    spring-webmvc-4.1.6.RELEASE.jar
    spring-webmvc-portlet-4.1.6.RELEASE.jar
    spring-websocket-4.1.6.RELEASE.jar
  4. 配置 spring 的核心配置文件
    Spring 核 心 配 置 文 件 的 主 要 工 作 就 是 将 JedisPool 类交给 spring 容 器 来 管 理 。
    redis.clients.jedis.JedisCluster 也要交给 spring 容器来管理。
    具体配置如下:

xmlns:context=“http://www.springframework.org/schema/context”
xmlns:p=“http://www.springframework.org/schema/p”
redis 课程系列
—————————————————————————————
55
更多 Java –大数据 –前端 –python 人工智能资料下载,可访问百度:尚硅谷官网
xmlns:aop=“http://www.springframework.org/schema/aop”
xmlns:tx=“http://www.springframework.org/schema/tx”
xmlns:xsi=“http://www.w3.org/2001/XMLSchema-instance”
xsi:schemaLocation=“http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans-4.0.xsd
http://www.springframework.org/schema/context
http://www.springframework.org/schema/context/spring-context-
4.0.xsd
http://www.springframework.org/schema/aop
http://www.springframework.org/schema/aop/spring-aop-4.0.xsd
http://www.springframework.org/schema/tx
http://www.springframework.org/schema/tx/spring-tx-4.0.xsd
http://www.springframework.org/schema/util
http://www.springframework.org/schema/util/spring-util-4.0.xsd”>

class=“redis.clients.jedis.JedisPoolConfig”>

value=“30000” />

redis 课程系列
—————————————————————————————
56
更多 Java –大数据 –前端 –python 人工智能资料下载,可访问百度:尚硅谷官网

value=“10000” />

redis 课程系列 ————————————————————————————— 58 更多 Java –大数据 –前端 –python 人工智能资料下载,可访问百度:尚硅谷官网 相当于: JedisCluster jedisClients = new JedisCluster(); 相当于: redis 课程系列 ————————————————————————————— 59 更多 Java –大数据 –前端 –python 人工智能资料下载,可访问百度:尚硅谷官网 相当于:给 set 集合中赋予一个 HostAndPort 对象 通过构造器方式对HostAndPort 进行初始化数据 3. 编写测试类 public static void main(String[] args) { // 读取 spring 的配置文件 ApplicationContext ac = new ClassPathXmlApplicationContext("applicationContext-jedis.xml"); JedisCluster jc = (JedisCluster) ac.getBean("jedisClients"); jc.set("cluster", "集群"); System.out.println(jc.get("cluster")); } redis 课程系列 ————————————————————————————— Redis 版本:V 1.0 Redis 持久化 Redis 主要是工作在内存中。内存本身就不是一个持久化设备,断电后数据会清空。所 以 Redis 在工作过程中,如果发生了意外停电事故,如何尽可能减少数据丢失。 1. RDB 1.1 RDB 简介 RDB:在指定的时间间隔内将内存中的数据集快照写入磁盘,也就是行话讲的 Snapshot 快照,它恢复时是将快照文件直接读到内存里。 工作机制:每隔一段时间,就把内存中的数据保存到硬盘上的指定文件中。 RDB 是默认开启的! Redis 会单独创建(fork)一个子进程来进行持久化,会先将数据写入到一个临时文件中 【xxx.rdb】,待持久化过程都结束了,再用这个临时文件替换上次持久化好的文件。整个过 程中,主进程是不进行任何 IO 操作的,这就确保了极高的性能如果需要进行大规模数据的 恢复,且对于数据恢复的完整性不是非常敏感,那 RDB 方式要比 AOF 方式更加的高效。 60 更多 Java –大数据 –前端 –python 人工智能资料下载,可访问百度:尚硅谷官网 redis 课程系列 ————————————————————————————— 61 更多 Java –大数据 –前端 –python 人工智能资料下载,可访问百度:尚硅谷官网 RDB 的缺点是最后一次持久化后的数据可能丢失。 1.2 RDB 保存策略 save 900 1 900 秒内如果至少有 1 个 key 的值变化,则保存 save 300 10 300 秒内如果至少有 10 个 key 的值变化,则保存 save 60 10000 60 秒内如果至少有 10000 个 key 的值变化,则保存 save “” 就是禁用 RDB 模式; 1.3 RDB 常用属性配置 属性 含义 备注 save 保存策略 dbfilename RDB 快照文件名 dir RDB 快照保存的目录 必须是一个目录,不能是文件名。最好改 为固定目录。默认为./代表执行 redisserver 命令时的当前目录! stop-writes-on-bgsaveerror 是否在备份出错时,继 续接受写操作 如果用户开启了 RDB 快照功能,那么在 redis 持久化数据到磁盘时如果出现失 败,默认情况下,redis 会停止接受所有 的写请求 rdbcompression 对于存储到磁盘中的 快照,可以设置是否进 行压缩存储。 如果是的话,redis 会采用 LZF 算法 进行压缩。如果你不想消耗 CPU 来进行 压缩的话, 可以设置为关闭此功能,但是存储 在磁盘上的快照会比较大。 rdbchecksum 是否进行数据校验 在存储快照后,我们还可以让 redis 使用 CRC64 算法来进行数据校验,但是 redis 课程系列 ————————————————————————————— 62 更多 Java –大数据 –前端 –python 人工智能资料下载,可访问百度:尚硅谷官网 这样做会增加大约 10%的性能消耗, 如果希望获取到最大的性能提升, 可以关闭此功能。 1.4 RDB 数据丢失的情况 两次保存的时间间隔内,服务器宕机,或者发生断电问题。 1.5 RDB 的触发 设置 save 30 10 条的时候触发 在指定范围内向数据库添加数据 ⑥ 拷贝 rdb 文件 cp dump.rdb dump_bak.rdb ⑦ 执行 flushdb ,再执行 shutdown 命令,也会产生 dump.rdb,但里面是空的, 没有意义。空的 dump.rdb 默认大小 76 ⑧ 当执行 shutdown 命令时,也会主动地备份数据。 ⑨ 重新将赋值的 rdb 文件数据在拷贝回去。在进行连接测试。则数据产生了。 ⑩ 注意:使用 rdb 备份的时候,如果使用了 flushdb,则数据将会被取消! redis 课程系列 ————————————————————————————— 1.6 RDB 的优缺点 2. AOF 2.1 AOF 简介  AOF 是以日志的形式来记录每个写操作,将每一次对数据进行修改,都把新建、修 改数据的命令保存到指定文件中。Redis 重新启动时读取这个文件,重新执行新建、 修改数据的命令恢复数据。  默认不开启,需要手动开启 593 行 appendonly yes  AOF 文件的保存路径,同 RDB 的路径一致。# dir ./  AOF 在保存命令的时候,只会保存对数据有修改的命令,也就是写操作!  当 RDB 和 AOF 存的不一致的情况下,按照 AOF 来恢复。因为 AOF 是对 RDB 的补 充。备份周期更短,也就更可靠。 63 更多 Java –大数据 –前端 –python 人工智能资料下载,可访问百度:尚硅谷官网 redis 课程系列 ————————————————————————————— 64 更多 Java –大数据 –前端 –python 人工智能资料下载,可访问百度:尚硅谷官网 2.2 AOF 保存策略 appendfsync always:每次产生一条新的修改数据的命令都执行保存操作;效率低,但是安全! appendfsync everysec:每秒执行一次保存操作。如果在未保存当前秒内操作时发生了断电, 仍然会导致一部分数据丢失(即 1 秒钟的数据)。 appendfsync no:从不保存,将数据交给操作系统来处理。更快,也更不安全的选择。 推荐(并且也是默认)的措施为每秒 fsync 一次,这种 fsync 策略可以兼顾速度和安全性。 2.3 AOF 常用属性 属性 含义 备注 appendonly 是否开启 AOF 功能 默认是关闭的 yes appendfilename AOF 文件名称 appendonly.aof appendfsync AOF 保存策略 官方建议 everysec no-appendfsync-on-rewrite 在重写时,是否执 行保存策略 执行重写,可以节省 AOF 文件的体积; 而且在恢复的时候效率也更高。 auto-aof-rewritepercentage 重写的触发条件 当目前aof文件大小超过上一次重写的 aof 文件大小的百分之多少进行重写 auto-aof-rewrite-min-size 设置允许重写的最 小 aof 文件大小 避免了达到约定百分比但尺寸仍然很 小的情况还要重写 Aof :属于实时备份。文件大小,应该比 rdb 要大。 Rdb : 间隔备份。 2.5 AOF 文件的修复 2.5.1 # vim redis.conf redis 课程系列 ————————————————————————————— 2.5.2 开启 aof 配置 appendonly yes ,则会产生对应的日志文件 appendonly.aof 2.5.3 启动空的服务,写入命令 2.5.4 写入完成命令之后,flushall ,shutdown。 2.5.5 结果 error!还是空的: aof 备份的实在就是记录所有的命令! 2.5.6 分析原因:查看 vim appendonly.aof 将最后的 flushall 删除,再重新查询。 2.5.7 使用 vim 命令在 appendonly.aof 添加一些无效信息,再启动,并使用客户端连接, 则会发现链接失败! 如果 AOF 文件中出现了残余命令,会导致服务器无法重启。此时需要借助 redis-checkaof 工具来修复! 命令: redis-check-aof --fix 文件 注意:只要是 aof 开启,则无论怎么样都会读取 aop 的配置文件。 2.5 AOF 的优缺点 优点:  备份机制更稳健,丢失数据概率更低  可读的日志文本,通过操作 AOF 稳健,可以处理误操作【redis-check-aof --fix 文件】 65 更多 Java –大数据 –前端 –python 人工智能资料下载,可访问百度:尚硅谷官网 redis 课程系列 ————————————————————————————— 缺点:  比起 RDB 占用更多的磁盘空间  恢复备份速度要慢  每次读写都同步的话,有一定的性能压力  存在个别 Bug,造成恢复不能。 Redis 主从复制 2. 主从简介 配置多台 Redis 服务器,以主机和备机的身份分开。主机数据更新后,根据配置和策略, 自动同步到备机的 master/salver 机制,Master 以写为主,Slave 以读为主,二者之间自动同 步数据。 目的: 读写分离提高 Redis 性能; 避免单点故障,容灾快速恢复 66 更多 Java –大数据 –前端 –python 人工智能资料下载,可访问百度:尚硅谷官网 redis 课程系列 ————————————————————————————— 67 更多 Java –大数据 –前端 –python 人工智能资料下载,可访问百度:尚硅谷官网 原理: 每次从机联通后,都会给主机发送 sync 指令,主机立刻进行存盘操作,发送 RDB 文件, 给从机 从机收到 RDB 文件后,进行全盘加载。之后每次主机的写操作,都会立刻发送给从机,从机 执行相同的命令 2. 主从准备 除非是不同的主机配置不同的 Redis 服务,否则在一台机器上面跑多个 Redis 服务,需 要配置多个 Redis 配置文件。 ①准备多个 Redis 配置文件,每个配置文件,需要配置以下属性 daemonize yes: 服务在后台运行 port:端口号 pidfile:pid 保存文件 logfile:日志文件(如果没有指定的话,就不需要) dump.rdb: RDB 备份文件的名称 appendonly 关掉,或者是更改 appendonly 文件的名称。 aof 样本: include /usr/local/redis/bin/redis.conf port 6379 redis 课程系列 ————————————————————————————— pidfile /var/run/redis_6379.pid dbfilename dump_6379.rdb ②根据多个配置文件,启动多个 Redis 服务 ./redis-cli -p 6379 -p :表示要连接到哪个端口上的服务器! 3. 主从建立 3.1 临时建立 原则:配从不配主。 配置:在从服务器上执行 SLAVEOF ip:port 命令; 查看:执行 info replication 命令; 68 更多 Java –大数据 –前端 –python 人工智能资料下载,可访问百度:尚硅谷官网 redis 课程系列 ————————————————————————————— 确立关系之后,set key value 查看效果。关键是以前的 k1,k2 从机同样能够得到 注意:从机只会读取,不能写入 69 更多 Java –大数据 –前端 –python 人工智能资料下载,可访问百度:尚硅谷官网 redis 课程系列 ————————————————————————————— 3.2 永久建立 在从机的配置文件中,编写 slaveof 属性配置! # slaveof 127.0.0.1 6379 3.3 恢复身份 执行命令 slaveof no one 恢复自由身!【反客为主】 4. 主从常见问题 ①从机是从头开始复制主机的信息,还是只复制切入以后的信息? 答:从头开始复制,即完全复制。实际上是读取主机的 rdb ②从机是否可以写? 答:不能 ③主机 shutdown 后,从机是上位还是原地待命? 答:原地待命 70 更多 Java –大数据 –前端 –python 人工智能资料下载,可访问百度:尚硅谷官网 redis 课程系列 ————————————————————————————— ④主机又回来了后,主机新增记录,从机还能否顺利复制? 答:可以 ⑤从机宕机后,重启,宕机期间主机的新增记录,丛机是否会顺利复制? 答:可以 ⑥其中一台从机 down 后重启,能否重认旧主? 答:不一定,看配置文件中是否配置了 slaveof # slaveof 127.0.0.1 6379 ⑦如果两台从机都从主机同步数据,此时主机的 IO 压力会增大,如何解决? 答:按照主---从(主)---从模式配置![薪火相传] # slaveof 127.0.0.1 6380 71 更多 Java –大数据 –前端 –python 人工智能资料下载,可访问百度:尚硅谷官网 redis 课程系列 ————————————————————————————— 72 更多 Java –大数据 –前端 –python 人工智能资料下载,可访问百度:尚硅谷官网 5. 哨兵模式 5.1 简介 作用: ①Master 状态检测 ②如果 Master 异常,则会进行 Master-Slave 切换,将其中一个 Slave 作为 Master, 将之前的 Master 作为 Slave 5.2 配置 自定义的/usr/local/redis/bin 目录下新建 sentinel.conf 文件 # vim sentinel.conf 哨兵模式需要配置哨兵的配置文件! sentinel monitor mymaster 127.0.0.1 6379 1 redis 课程系列 ————————————————————————————— 73 更多 Java –大数据 –前端 –python 人工智能资料下载,可访问百度:尚硅谷官网 启动哨兵:./redis-sentinel sentinel.conf 5.3 主机宕机后 redis 课程系列 ————————————————————————————— # slave-priority 100 主推: redis 集群 创建目录 配置文件: conf 是用来放配置文件 mkdir -p opt/redis/conf log 是用来放日志 mkdir -p /opt/redis/log data 是用来放集群之后,产生的数据文件。 mkdir -p /opt/redis/data 不行知道用谁来管理集群?ruby! 74 更多 Java –大数据 –前端 –python 人工智能资料下载,可访问百度:尚硅谷官网 redis 课程系列 ————————————————————————————— 上传 ruby 脚本:集群工具用来管理集群使用。 解压 ruby 脚本 进入 ruby-gems 文件中,进行安装 75 更多 Java –大数据 –前端 –python 人工智能资料下载,可访问百度:尚硅谷官网 redis 课程系列 ————————————————————————————— 整理配置集群的配置文件。 Redis 在运行的时候,是通过处理 redis.conf 配置文件来运行的。而 redis.conf 配置文件中的 每个属性都有其特殊的含义。要想配置集群,则应该会有多个配置文件。集群的每个配置文 件中应该都有特殊的设置。比如说 port:应该不同。应该共同之处。在配置集群的时候,只要 将特殊部分取出来。再有一个公共的配置文件来处理公共的属性。 1-6.配置文件中每个端口号应该不一致! 除了端口号之外,可能其他的共同属性,把共同属 性放在一个配置文件中即可。7 配置文件。 为什么是 6 个配置文件 redis 集群,相对于项目来说,是保证项目能够正常运行! 每个集群都有一主一从:也就是说要有两个服务参与。 集群是采用选举方式来完成的!也就是说每次选举的结果应该大于 50%的时候,集群才能够 正常运行工作!否则集群就会失败! 76 更多 Java –大数据 –前端 –python 人工智能资料下载,可访问百度:尚硅谷官网 redis 课程系列 ————————————————————————————— 比如:如果有只有两个?集群就不能正常工作了。 77 更多 Java –大数据 –前端 –python 人工智能资料下载,可访问百度:尚硅谷官网 redis 课程系列 ————————————————————————————— 将配置文件放到/opt/redis/conf 目录中 启动配置好的集群配置文件 78 更多 Java –大数据 –前端 –python 人工智能资料下载,可访问百度:尚硅谷官网 redis 课程系列 ————————————————————————————— # vim startup.sh ./redis-server /opt/redis/conf/redis-6379.conf ./redis-server /opt/redis/conf/redis-6380.conf ./redis-server /opt/redis/conf/redis-6381.conf ./redis-server /opt/redis/conf/redis-6382.conf ./redis-server /opt/redis/conf/redis-6383.conf ./redis-server /opt/redis/conf/redis-6384.conf # chomd +x startup.sh 查看一下是否启动成,相当于 6 个服务已经启动成功 ps –ef | grep redis 79 更多 Java –大数据 –前端 –python 人工智能资料下载,可访问百度:尚硅谷官网 redis 课程系列 ————————————————————————————— 将 6 个 redis 服务通过 ruby 脚本来管理,实现集群。 cd /root/redis-3.2.8/src 将 ruby 脚本拷贝到 redis 安装目录 cp redis-trib.rb /usr/local/redis/bin/ 开始创建集群 ./redis-trib.rb create --replicas 1 192.168.26.30:6379 192.168.26.30:6380 192.168.26.30:6381 192.168.26.30:6382 192.168.26.30:6383 192.168.26.30:6384 问一句:192.168.26.30 = 127.0.0.1? 必须写虚拟机的真实 ip 地址!否则创建失败! 80 更多 Java –大数据 –前端 –python 人工智能资料下载,可访问百度:尚硅谷官网 redis 课程系列 ————————————————————————————— 81 更多 Java –大数据 –前端 –python 人工智能资料下载,可访问百度:尚硅谷官网 redis 课程系列 ————————————————————————————— 测试集群 ./redis-cli -c -p 6379 -c : 表示集群 -p : 端口号 面试官: Redis 服务是通过什么,实现在每个端口之间互相交互的? 集群原理: Slots:(槽) redis 总共有 16384 个槽 每个服务器所占的槽的区间不一样。 Service1-6379 :0-5460 Service2-6380 :5461-10922 Service3-6381 :10923-16383 set name admin ,crc16 算法。返回一个槽的位置【5798】,判断你返回这个槽在那个区间? crc16 (admin)=值 / 16384 = 5798. 对应的区间,就是对应的服务,无论是存,还是取都会遵循该算法! 关掉集群:实际就是关掉 redis 服务。 Kill 掉 redis 服务即可 killall redis-server 集群中写入数据 客户端重定向 ①在 redis-cli 每次录入、查询键值,redis 都会计算出该 key 应该送往的插槽,如果不是 该客户端对应服务器插槽,redis 会报错,并告知应前往的 redis 实例地址和端口。 ②redis-cli 客户端提供了 -c 参数实现自动重定向。如 redis-cli -c -p 6379 登入后,再 录入、查询键值对可以自动重定向。 # redis-cli -c -p 6379 ③每个 slot 可以存储一批键值对。 82 更多 Java –大数据 –前端 –python 人工智能资料下载,可访问百度:尚硅谷官网 redis 课程系列 ————————————————————————————— 如何多键操作 采用哈希算法后,会自动地分配 slot,而 不在一个 slot 下的键值,是不能使用 mget,mset 等多键操作。 如果有需求,需要将一批业务数据一起插入呢? 解决:可以通过{}来定义组的概念,从而使 key 中{}内相同内容的键值对放到一个 slot 中 去。 集群中故障恢复 1、主机挂掉,从机会上位 ./redis-cli -h:表示 host! 2、主节点恢复后如何 83 更多 Java –大数据 –前端 –python 人工智能资料下载,可访问百度:尚硅谷官网 redis 课程系列 ————————————————————————————— 84 更多 Java –大数据 –前端 –python 人工智能资料下载,可访问百度:尚硅谷官网 当主节点:挂掉之后,从节点上位!当主节点恢复之后,不会成为主,应该改成从节点! # == 集群的从节点与主从复制的从节点有所有区别! 集群的从节点作用:当主节点挂掉,则会立即上位。 主从复制的从节点:只负责读取数据 集群的 Jedis 开发 @Test public void testCluster(){ Set jedisClusterNodes = new HashSet(); //Jedis Cluster will attempt to discover cluster nodes automatically jedisClusterNodes.add(new HostAndPort("192.168.4.128", 6379)); JedisCluster jc = new JedisCluster(jedisClusterNodes); jc.set("foo", "bar"); String value = jc.get("foo"); } 集群的优缺点 优点:  实现扩容  分摊压力  无中心配置相对简单 缺点:  多键操作是不被支持的  多键的 Redis 事务是不被支持的。lua 脚本不被支持。  由于集群方案出现较晚,很多公司已经采用了其他的集群方案,而代理或者客 户端分片的方案想要迁移至 redis cluster,需要整体迁移而不是逐步过渡,复杂 度较大。 redis 课程系列 ————————————————————————————— 85 更多 Java –大数据 –前端 –python 人工智能资料下载,可访问百度:尚硅谷官网 使用 eclipse 连接集群,进行数据操作 假如说,明天在使用集群的话。还需要创建么?NO 只需要启动集群即可 /usr/local/redis/bin ./start.sh 3. 启动集群 启动集群:也就是启动多个 redis 服务,而 redis 服务之前我们已经配置好了。/opt/redis/conf 该目录下:redis-6379.conf----redis-6384.conf 4. 使用 eclipse 连接集群。 redis 课程系列 ————————————————————————————— 86 更多 Java –大数据 –前端 –python 人工智能资料下载,可访问百度:尚硅谷官网 第一步: 应该要关闭防火墙,service iptables stop 第二步: public static void main(String[] args) { // 创建多个redis服务的host和prot Set set = new HashSet<>(); set.add(new HostAndPort("192.168.26.30", 6379)); set.add(new HostAndPort("192.168.26.30", 6380)); set.add(new HostAndPort("192.168.26.30", 6381)); set.add(new HostAndPort("192.168.26.30", 6382)); set.add(new HostAndPort("192.168.26.30", 6383)); set.add(new HostAndPort("192.168.26.30", 6384)); // 创建一个jedisCluster 对象 并将set集合中的host和prot给 redis集群对象 JedisCluster jc = new JedisCluster(set); jc.set("one", "小骨"); System.out.println(jc.get("one")); } 注意:导入 redis.jar,commons-pool.jar 使用 spring 整合 redis 4. 导入 jar 包:spring 和 redis commons-logging-1.1.3.jar commons-pool2-2.4.2.jar jedis-2.9.0.jar junit-4.8.jar spring-aop-4.1.6.RELEASE.jar redis 课程系列 ————————————————————————————— 87 更多 Java –大数据 –前端 –python 人工智能资料下载,可访问百度:尚硅谷官网 spring-aspects-4.1.6.RELEASE.jar spring-beans-4.1.6.RELEASE.jar spring-context-4.1.6.RELEASE.jar spring-context-support-4.1.6.RELEASE.jar spring-core-4.1.6.RELEASE.jar spring-expression-4.1.6.RELEASE.jar spring-instrument-4.1.6.RELEASE.jar spring-instrument-tomcat-4.1.6.RELEASE.jar spring-jdbc-4.1.6.RELEASE.jar spring-jms-4.1.6.RELEASE.jar spring-messaging-4.1.6.RELEASE.jar spring-orm-4.1.6.RELEASE.jar spring-oxm-4.1.6.RELEASE.jar spring-test-4.1.6.RELEASE.jar spring-tx-4.1.6.RELEASE.jar spring-web-4.1.6.RELEASE.jar spring-webmvc-4.1.6.RELEASE.jar spring-webmvc-portlet-4.1.6.RELEASE.jar spring-websocket-4.1.6.RELEASE.jar 5. 配置 spring 的核心配置文件 Spring 核 心 配 置 文 件 的 主 要 工 作 就 是 将 JedisPool 类交给 spring 容 器 来 管 理 。 redis.clients.jedis.JedisCluster 也要交给 spring 容器来管理。 具体配置如下:

你可能感兴趣的:(大数据,redis,linux)