IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 大数据 -> Redis -> 正文阅读

[大数据]Redis

目录

1?Redis是什么

2?Redis能干嘛

3?Redis特点

4 Redis数据类型

1 key键

2?五大数据类型-String(字符串)

1 String简介

2 String常用命令

3?String底层数据结构?

?3?五大数据类型-List(列表)

3.1 简介

3.2 常用命令

?4 五大数据类型-Set(集合)

4.1 简介

4.2 常用命令

?5 五大数据类型-Hash(哈希)

5.1 简介

5.2 常用命令

6 五大数据类型-Zset(有序集合)

6.1 简介?

6.2 常用命令

?7 新数据类型-Bitmaps

7.1 简介

7.2 常用命令?

8 新数据类型-Geospatia ?

8.1 简介

8.2 常用命令

9 新数据类型-Hyperloglog?

9.1 简介

9.2 常用命令

10 Redis配置文件详解?

10.1 units单位

10.2 #### INCLUDES?

10.3 #### NETWORK ?

10.4 #### GENERAL

10.5 #### SECURITY ?

10.6 其他配置 ?

11 发布与订阅 ?

?11.1 什么是发布与订阅

11.2 Redis的发布与订阅

1. 客户端订阅频道

2. 当给这个频道发送消息后,消息就会发送给订阅的客户端?

3. Redis中发布与订阅命令 ?

12?Redis持久化

1 持久化操作-RDB

1.1 RDB是什么?

?1.2 备份过程

1.3 dump.rdb文件 ?

1.4 如何触发快照?

2 持久化操作-AOF ?

2.1 AOF是什么?

2.2 AOF持久化流程

2.3 AOF默认不开启

2.4 AOF启动/修复/恢复

2.5 AOF同步频率设置?

2.6 Rewrite

13?Redis事务

1 Redis事务简介

2 Redis事务基本操作

2.1 Multi、Exec、discard

2.2 事务的错误处理 ?

3 悲观锁与乐观锁 ?

3.1 事务应用场景

3.2 悲观锁(Pessimistic Lock) ?

3.3 乐观锁(Optimistic Lock) ?

4 Redis中的乐观锁

4.1 watch key [key……] ?

4.2 unwatch ?

15 Redis主从复制

1 Redis主从复制简介

2 Redis主从复制-一主多从

3 Redis主从复制-复制原理

3.1 主从复制的一些问题

3.2 复制原理

3.3 薪火相传

3.4 反客为主

?4 Redis主从复制-哨兵模式(Sentinel)

4.1 哨兵模式的使用?

4.2 复制延迟

16?Redis集群

1 Redis集群简介

1.1 Redis集群(RedisCluster)

2 Redis集群搭建

3 Redis集群操作

3.1 Slot

3.2 命令执行 ?

??3.3 故障恢复

17 JAVA操作Redis

18?SpringData整合Redis

19?Redis企业级解决方案


1?Redis是什么

1. Redis Remote Dictionary Server 远程字段服务)是一个开源的使用 ANSI C 语言编写、支持网
络、内存亦可持久化的 key-value 数据库,并提供多种语言的 API
2. Redis 是一个 key-value 存储系统,它支持存储的 value 类型相对更多,包括 string list set
zset sorted set -- 有序集合)和 hash 。这些数据结构都支持 push/pop add/remove 及取交集并
集和差集及更丰富的操作,而且这些操作都是原子性的。在此基础上, Redis 支持各种不同方式的
排序。为了保证效率,数据都是缓存在内存中, Redis 会周期性的把更新的数据写入磁盘或者把修
改操作写入追加的记录文件,并且在此基础上实现了 master-slave (主从)同步。
3. Redis 提供了 java C/C++ PHP JavaScript Perl Object-C Python Ruby Erlang 等客户端,使用很方便。

2?Redis能干嘛

1. 读写效率高,用于高速缓存
2. 发布,订阅消息(消息通知)
3. 地图信息分析
4. 活动排行榜或计数
5. …………

3?Redis特点

1. 多样的数据类型: Redis 不仅仅支持简单的 key-value 类型的数据,同时还提供 list set zset
hash 等数据结构的存储。
2. Redis 支持数据的持久化,可以将内存中的数据保存在磁盘中,重启的时候可以再次加载进行使
用。
3. Redis 的所有操作都是原子性的。
4. 支持主从复制及集群。

4 Redis数据类型

1 key键

1. keys * 查看当前库中所有的 key
2. exists key 判断某个 key是否存在。 可以设置多个 key ,只返回存在的个数,但不返回哪一个存在 / 不存在。
3. move key db 将当前数据库的 key 移动到给定的数据库 db 当中。
4. type key 查看当前 key 所储存的值的类型。返回当前 key 所储存的值的类型,如 string list
5. del key 删除已存在的 key ,不存在的 key 会被忽略。 可以设置多个key ,返回删除成功的个数
6. expire key time key 设置 time秒的过期时间。 设置成功返回 1 。 当 key 不存在返回 0
7. ttl key 以秒为单位返回 key 的剩余过期时间。 key 不存在时,返回 -2 。 当 key 存在但没有设置剩余生存时间时,返回 -1 。 否则,以秒为单 位,返回 key 的剩余生存时间。
8. persist key 移除给定 key 的过期时间,使得 key 永不过期。 当过期时间移除成功时,返回 1 。 如果 key 不存在或 key 没有设置过期时间,返回 0

2?五大数据类型-String(字符串)

1 String简介

String Redis 最基本的类型,一个 key 对应一个 value
String 是二进制安全的,意味着 String 可以包含任何数据,比如序列化对象或者一张图片。
String 最多可以放 512M 的数据。

2 String常用命令

1. set key value 用于设置给定 key 的值。如果 key 已经存储其他值, set 就重写旧值,且无视类
型。

2. get key 用于获取指定 key 的值。如果 key 不存在,返回 nil

3. append key value 将给定的value追加到key原值末尾。

如果 key 已经存在并且是一个字符串, append 命令将 value 追加到 key 原来的值的末尾。
如果 key 不存在, append 就简单地将给定 key 设为 value ,就像执行 set key value 一样。
4. strlen key 获取指定 key 所储存的字符串值的长度。当 key 储存的不是字符串值时,返回一个错 误。
5. setex key time value 给指定的 key 设置值及 time 秒的过期时间。如果 key 已经存在, setex
令将会替换旧的值,并设置过期时间。

6. setnx key valuekey不存在时,设置给定 key 的值。如果key存在,则没有任何影响。

?7. incr key key 中储存的数字值增一。如果 key 不存在,那么 key 的值会先被初始化为 0 ,然后再执行 incr 操作。 如字符串类型的值不能表示为数字、或者是其他类型,那么返回一个错误。 ?

?

8. decr key key 中储存的数字值减一。

如果 key 不存在,那么 key 的值会先被初始化为 0 ,然后再执行 decr 操作。
如字符串类型的值不能表示为数字、或者是其他类型,那么返回一个错误。

9. incrby/decrby key step key存储的数字值按照step进行增减。

如果 key 不存在,那么 key 的值会先被初始化为 0 ,然后再执行 incrby/decrby 命令。
如字符串类型的值不能表示为数字、或者是其他类型,那么返回一个错误。
10. mset key1 value1 key2 value2 …… 同时设置一个或多个 key-value

11. mget key1 key2 ……返回所有(一个或多个)给定 key 的值。 ?

如果给定的 key 里面,有某个 key 不存在,那么这个 key 返回特殊值 nil
12. msetnx key1 value1 key2 value2 …… 用于所有给定 key 都不存在时,同时设置一个或多个
key-value
msetnx 具有原子性特性,有一个失败,则都失败。
13. getrange key start end 用于获取存储在指定 key 中字符串的子字符串。字符串的截取范围由
start end 两个偏移量决定 ( 包括 start end 在内 )
14. setrange key offset value 用指定的字符串重写给定 key 所储存的字符串值,重写的位置从移
offset 开始。

3?String底层数据结构?

String 底层数据结构是简单动态字符串( simple dynamic string,SDS )。
类似于 JAVA 中的 ArrayList ,采用预分配方式来减少内存的频繁分配。

如图,内存实际大小一般都要高于字符串实际大小。当字符串长度小于 1M 时,扩容都是加倍现有的空 间,如果超过1M ,扩容时每次只会多扩 1M 的空间。字符串最大长度为 512M

?

?3?五大数据类型-List(列表)

3.1 简介

List 是简单的字符串列表,按照插入顺序排序。你可以添加一个元素到列表的头部(左边)或者尾部(右 边)。
底层是一个双向链表,对两段操作性能极高,通过索引操作中间的节点性能较差。
一个 List 最多可以包含 个元素 ( 每个列表超过40 亿个元素)。

?

3.2 常用命令

1. lpush/ rpush key1 value1 value2 value3…… 从左边(头部) / 右边(尾部)插入一个或多个

lpush过程:

?

? ? ? ? ? ? ? ?

rpush过程:

? ? ? ? ? ? ? ??

?

2. lrange key start end 返回 key 列表中的 start end 之间的元素(包含 start end )。 其中 0 表示
列表的第一个元素, -1 表示最后一个元素。

3. lpop/rpop key 移除并返回第一个值 / 最后一个值。
值在键在,值光键亡。

4. lindex key index 获取列表index位置的值(从左开始)。

5. llen key获取列表长度。

6. lrem key count value从左边开始删除与value相同的count个元素。

?

7. linsert key before/after value newvalue 在列表中 value 值的前边 / 后边插入一个 newvalue
(从左开始)。

8. lset key index value将索引为index的值设置为value

?4 五大数据类型-Set(集合)

4.1 简介

List 类似是一个列表功能,但 Set 是自动排重的,当需要存储一个列表数据,又不希望出现重复数据 时,Set 是一个很好的选择。
Set String 类型的无序集合,它底层其实是一个 value null hash 表,所以添加、删除、查找的时间 复杂度都是O(1)
一般来说,一个算法如果是 O(1) ,随着数据增加,查找数据的时间不变。
集合中最大的成员数为 2^32-1( 每个集合超过40 亿个元素)。

4.2 常用命令

1. sadd key value1 value2…… 将一个或多个元素添加到集合 key 中,已经存在的元素将被忽略。

2. smembers key取出该集合的所有元素。

?3. sismember key value判断集合key中是否含有value元素,如有返回1,否则返回0

?4. scard key返回该集合的元素个数。

5. srem key value1 value2……删除集合中的一个或多个成员元素,不存在的成员元素会被略。

?6. spop key随机删除集合中一个元素并返回该元素。

7. srandmember key count随机取出集合中count个元素,但不会删除。

?

8. smove sourcekey destinationkey value value 元素从 sourcekey 集合移动到 destinationkey
集合中。
如果 sourcekey 集合不存在或不包含指定的 value 元素,则 smove 命令不执行任何操作,仅返回 0

9. sinter key1 key2返回两个集合的交集元素?

10. sunion key1 key2 返回两个集合的并集元素。
11. sdiff key1 key2 返回两个集合的差集元素( key1 中的,不包含 key2

?

?5 五大数据类型-Hash(哈希)

5.1 简介

?

Hash存储结构优化:

?????????如果field数量较少,存储结构优化为类数组结构

? ? ? ? ?如果field数量较多,存储结构使用HashMap结构

5.2 常用命令

1. hset key field value key 集合中的 field 赋值 value
如果哈希表不存在,一个新的哈希表被创建并进行 HSET 操作。
如果字段已经存在于哈希表中,旧值将被重写。

2. hget key fieldkey哈希中,取出field字段的值

hget user name keyuser的哈希中取出name字段的值,结果为zhangsan

3. hmset key field1 value1 field2 value2……批量设置哈希的字段及值。

hmset user1 name lisi?age 15 创建一个keyuser1的哈希,有两个字段nameage?

4. hexists key field 判断指定 key 中是否存在 field
如果哈希表含有给定字段,返回 1 。 如果哈希表不含有给定字段,或 key 不存在,返回 0

5. hkeys key获取该哈希中所有的field

6. hvals key获取该哈希中所有的value

7. hincrby key field increment为哈希表key中的field字段的值加上增量increment

增量也可以为负数,相当于对指定字段进行减法操作。
如果哈希表的 key 不存在,一个新的哈希表被创建并执行 hincrby 命令。
如果指定的字段不存在,那么在执行命令前,字段的值被初始化为 0
对一个储存字符串值的字段执行 hincrby 命令将造成一个错误。
8. hdel key field1 field2…… 删除哈希表 key 中的一个或多个指定字段,不存在的字段将被忽略。
返回被成功删除字段的数量,不包括被忽略的字段。

9. hsetnx key field valuekey哈希表中不存在的的字段赋值

如果哈希表不存在,一个新的哈希表被创建并进行 hsetnx 操作。
如果字段已经存在于哈希表中,操作无效。
如果 key 不存在,一个新哈希表被创建并执行 hsetnx 命令。

6 五大数据类型-Zset(有序集合)

6.1 简介?

Zset Set 非常相似,是一个没有重复元素的 String 集合。
不同之处是 Zset 的每个元素都关联了一个分数( score ),这个分数被用来按照从低分到高分的方式排序
集合中的元素。集合的元素是唯一的,但分数可以重复。
因为元素是有序的,所以可以根据分数( score )或者次序( position )来获取一个范围内的元素。

6.2 常用命令

1. zadd key score1 value1 score2 value2…… 将一个或多个元素( value )及分数( score )加入到
有序集 key 中。
如果某个元素已经是有序集的元素,那么更新这个元素的分数值,并通过重新插入这个元素,来保
证该元素在正确的位置上。
分数值可以是整数值或双精度浮点数。
如果有序集合 key 不存在,则创建一个空的有序集并执行 zadd 操作。

?

2. zrange key start end [withscores] 返回 key 集合中的索引 start 和索引 end 之间的元素(包含 start
end )。
其中元素的位置按分数值递增 ( 从小到大 ) 来排序。 其中 0 表示列表的第一个元素, -1 表示最后一个
元素。
withscores 是可选参数,是否返回分数。

3. zrangebyscore key minscore maxscore [withscores] 返回 key 集合中的分数 minscore 和分数
maxscore 之间的元素(包含 minscore maxscore )。其中元素的位置按分数值递增 ( 从小到大 )
来排序。
4. zrevrangebyscore key maxscore minscore [withscores] 返回 key 集合中的分数 maxscore
分数 minxscore 之间的元素(包含 maxscore minxscore )。其中元素的位置按分数值递减 ( 从大
到小 ) 来排序。

5. zincrby key increment value为元素valuescore加上increment的值

?6. zrem key value删除该集合下value的元素

?

7. zcount key minscore maxscore统计该集合在minscore maxscore分数区间中元素的个数。 ?

?8. zrank key value返回value在集合中的排名,从0开始。

?7 新数据类型-Bitmaps

7.1 简介

在计算机中,用二进制(位)作为存储信息的基本单位, 1 个字节等于 8 位。
例如 "abc" 字符串是由 3 个字节组成,计算机存储时使用其二进制表示, "abc" 分别对应的 ASCII 码是
97 98 99 ,对应的二进制是 01100001 01100010 01100011 ,在内存中表示如下:
合理地使用 位 能够有效地提高内存使用率和开发效率。
Redis 提供了 Bitmaps 这个 数据结构 可以实现对位的操作:
1. Bitmaps 本身不是一种数据结构,实际上它就是字符串( key 对应的 value 就是上图中的一串二进 制),但是它可以对字符串的位进行操作。
2. Bitmaps 单独提供了一套命令,所以在 Redis 中使用 Bitmaps 和使用字符串的方法不太相同。可 以把 Bitmaps 想象成一个以位为单位的数组,数组的每个单元只能存储 0 1 ,数组的下标在
Bitmaps 中叫做偏移量。

7.2 常用命令?

1. setbit key offset value 设置 Bitmaps 中某个偏移量的值。
偏移量从 0 开始,且 value 值只能为 0 1

?

2. getbit key offset 获取 Bitmaps 中某个偏移量的值。
获取 key offset 的值

如果偏移量未设置值,则也返回0

?

3. bitcount key [start end] 统计字符串被设置为 1 bit 数量。一般情况下,给定的整个字符串都会
被进行统计,可以选择通过额外的 start end 参数,指定 字节组 范围内进行统计(包括 start
end ), 0 表示第一个元素, -1 表示最后一个元素。
如:当前存在一个 key k1 bitmaps 存储着 [00000001,00000001,00000010,00000011] ,分别对
[1,1,2,3]

setbit设置或获取的是bit(位)的位置,bitcount计算的是byte(字节)位置。

4. bitop and/or destkey sourcekey1 sourcekey2…… 将多个 bitmaps 通过求交集 / 并集方式合并成 一个新的bitmaps

?

?

8 新数据类型-Geospatia ?

8.1 简介

GEO Geographic, 地理信息的缩写。
该类型就是元素的二维坐标,在地图上就是经纬度。 Redis 基于该类型,提供了经纬度设置、查询、范围
查询、距离查询、经纬度 Hash 等常见操作。

?

8.2 常用命令

1. geoadd key longitude latitude member [longitude latitude member ..……] 用于存储指定
的地理空间位置,可以将一个或多个经度 (longitude) 、纬度 (latitude) 、位置名称 (member) 添加到
指定的 key 中。
有效的经度: -180 ~ +180 有效的纬度: -85.05 ~ +85.05 ,当设置的经度纬度值超过范围会报错。
两级无法直接添加。
一般会直接下载城市数据,直接通过 java 程序直接一次性导入。
2. geopos key member [member ……]** 从给定的 key 里返回所有指定名称 (member) 的位置(经度 纬度),不存在的返回 nil

3. geodist key member1 member2 [m|km|ft|mi]用于返回两个给定位置之间的距离。

最后一个距离单位参数说明:
m :米,默认单位。
km :千米。
mi :英里。
ft :英尺。
4. georadius key longitude latitude radius m|km|ft|mi 以给定的经纬度( longitude
latitude )为中心, 返回键包含的位置元素当中, 与中心的距离不超过给定最大距离( radius )的
所有位置元素。

9 新数据类型-Hyperloglog?

9.1 简介

在我们做站点流量统计的时候一般会统计页面 UV( 独立访客 :unique visitor) PV( 即页面浏览量: page view)。
什么是基数?
数据集{ 1 2 5 7 5 7 9 },那么这个数据集的基数集为{ 1 2 5 7 9 },基数(不重复元 素)为5 ,基数估计就是在误差可接受范围内,快速计算基数。
如果是通过 Redis 来处理,我们可以使用 String 类型然后自增计数即可达到统计 PV ,统计 UV 可以使用 Set,每个用户 id 是唯一的可以放到这个集合里。
以上方案虽然结果准确,但随着数据不断增加,导致占用的内存空间越来越大,对于非常大的数据集是
不合适的。
Hyperloglog 是一种基数估算统计,在输入元素的数量特别巨大时,计算基数所需的空间是固定的,并 且很小。
Redis 中,每个 Hyperloglog 只占用 12KB 内存,就可以计算接近2^64个不同元素的基数。
因为 HyperLogLog 只会根据输入元素来计算基数,而不会存储输入元素本身,所以 Hyperloglog 不能像 集合那样,返回输入的各个元素。

9.2 常用命令

1. pfadd key element1 element2…… 将所有元素参数添加到 Hyperloglog 数据结构中。
如果至少有个元素被添加返回 1 , 否则返回 0
2. pfcount key1 key2…… 计算 Hyperloglog 近似基数,可以计算多个 Hyperloglog ,统计基数总数

?

3. pfmerge destkey sourcekey1 sourcekey2…… 将一个或多个 Hyperloglog sourcekey1 ) 合并
成一个 Hyperloglog destkey )。
比如每月活跃用户可用每天活跃用户合并后计算。

10 Redis配置文件详解?

10.1 units单位

配置大小单位,开头定义基本度量单位,只支持 bytes ,大小写不敏感。

10.2 #### INCLUDES?

Redis 只有一个配置文件,如果多个人进行开发维护,那么就需要多个这样的配置文件,这时候多个配置 文件就可以在此通过 include /path/to/local.conf 配置进来,而原本的 redis.conf 配置文件就作为一个 总闸。

10.3 #### NETWORK ?

1. bind :绑定 redis 服务器网卡 IP ,默认为 127.0.0.1, 即本地回环地址。访问 redis 服务只能通过本机的 客户端连接,而无法通过远程连接。如果bind 选项为空的话,那会接受所有来自于可用网络接口的 连接。

2. protected-mode:本机保护模式,值为yes时只能本机访问不能远程访问。 ?

3. port:指定redis运行的端口,默认是6379?

4. timeout :设置客户端连接时的超时时间,单位为秒。当客户端在这段时间内没有发出任何指令, 那么关闭该连接。默认值为0 ,表示不关闭。

10.4 #### GENERAL

1. daemonize :设置为 yes 表示指定 Redis 以守护进程的方式启动(后台启动)。
2. pidfile :配置 PID 文件路径,当 redis 作为守护进程运行的时候,它会把 pid 默认写到
/var/redis/run/redis_6379.pid 文件里面。

3. loglevel :定义日志级别。默认值为 notice ,有如下 4 种取值:
debug (记录大量日志信息,适用于开发、测试阶段)。
verbose (较多日志信息)。
notice (适量日志信息,使用于生产环境)。
warning (仅有部分重要、关键信息才会被记录)。

4. logfile :配置log文件地址,默认打印在命令行终端的窗口上。

?

5. databases:设置数据库的数目。

?

10.5 #### SECURITY ?

1. requirepass :设置 redis 连接密码。
比如 : requirepass 123 表示 redis 的连接密码为 123

10.6 其他配置 ?

1. maxclients :设置客户端最大并发连接数,默认无限制, Redis 可以同时打开的客户端连接数为
Redis 进程可以打开的最大数量。 如果设置 maxclients 0 ,表示不作限制。当客户端连接数到达
限制时, Redis 会关闭新的连接并向客户端返回错误信息。

2. maxmemory :设置 Redis 的最大内存,如果设置为 0 。表示不作限制。
通常是配合 maxmemory-policy参数一起使用。

3. maxmemory-policy :当内存使用达到maxmemory设置的最大值时,redis使用的内存清除策
略。
清除策略包括:
volatile-lru:利用LRU算法移除设置过过期时间的key (LRU:最近使用 Least Recently Used )
allkeys-lru:利用LRU算法移除任何key
volatile-random:移除设置过过期时间的随机key
allkeys-random:移除随机key
volatile-ttl:移除即将过期的key(minor TTL)
noeviction:不移除任何key,只是返回一个写错误 ,默认选项

11 发布与订阅 ?

?11.1 什么是发布与订阅

Redis 发布订阅 (pub/sub) 是一种消息通信模式:发送者 (pub) 发送消息,订阅者 (sub) 接收消息。
Redis 客户端可以订阅任意数量的频道。

11.2 Redis的发布与订阅

1. 客户端订阅频道

2. 当给这个频道发送消息后,消息就会发送给订阅的客户端?

3. Redis中发布与订阅命令 ?

订阅:subscribe channel 订阅频道channel。
发布:publish channel msg向频道channel 发送一条msg消息。

12?Redis持久化

由于 Redis 的数据都存放在内存中,如果没有配置持久化, Redis 重启后数据就全丢失了,于是需开启
Redis 的持久化功能,将数据保存到磁盘上,当 Redis 重启后,可以从磁盘中恢复数据。
Redis 提供了两个不同形式的持久化方式:
RDB(Redis DataBase)
AOF(Append Only File)

1 持久化操作-RDB

1.1 RDB是什么?

在指定的时间间隔内将内存的数据集快照写入磁盘,也就是行话讲的 Snapshot 快照,它恢复时是将快照 文件直接读到内存里。

?1.2 备份过程

Redis 会单独创建( fork )一个子进程来进行持久化,会先将数据写入到一个临时文件中,待持久化过程 都结束了,再用这个临时文件替换上次持久化好的文件。整个过程中,主进程是不进行任何IO 操作的, 这就确保了极高的性能如果需要进行大规模数据的恢复,且对于数据恢复的完整性不是非常敏感,那 RDB方式要比 AOF 方式更加的高效。 RDB的缺点是最后一次持久化后的数据可能丢失。

1.3 dump.rdb文件 ?

1. RDB 保存的文件,在 redis.conf 中配置文件名称,默认为 dump.rdb

2. rdb文件的保存位置,也可以修改。默认在Redis启动时命令行所在的目录下。

?

redis.conf中配置文件路径

?

1.4 如何触发快照?

1.4.1 配置文件中默认的快照配置

1. 快照默认配置

?

1.4.2 flushall

执行flushall命令,也会触发rdb规则。

1.4.3 savebgsave

手动触发 Redis 进行 RDB 持久化的命令有两种:
1. save
该命令会阻塞当前 Redis 服务器,执行 save 命令期间, Redis 不能处理其他命令,直到 RDB 过程完成 为止,不建议使用。
2. bgsave
执行该命令时, Redis 会在后台异步进行快照操作,快照同时还可以响应客户端请求。
这两个命令是在 Redis 客户端中执行,并不是 redis.conf 中修改。
1.4.4 stop-writes-on-bgsave-error
默认值是 yes 。当 Redis 无法写入磁盘的话,直接关闭 Redis 的写操作。

1.4.5 rdbcompression

默认值是 yes 。对于存储到磁盘中的快照,可以设置是否进行压缩存储。如果是的话, redis 会采用 LZF 算 法进行压缩。如果你不想消耗CPU 来进行压缩的话,可以设置为关闭此功能,但是存储在磁盘上的快照 会比较大。

1.4.6 rdbchecksum

默认值是 yes 。在存储快照后,我们还可以让 redis 使用 CRC64 算法来进行数据校验,但是这样做会增加 大约10% 的性能消耗,如果希望获取到最大的性能提升,可以关闭此功能。

?

1.5 恢复数据

只需要将rdb文件放在Redis的启动目录,Redis启动时会自动加载dump.rdb并恢复数据。

2 持久化操作-AOF ?

2.1 AOF是什么?

以日志的形式来记录每个写操作,将 Redis 执行过的所有写指令记录下来(读操作不记录),只允追加文件但不可以改写文件,redis 启动之初会读取该文件重新构建数据,换言之, Redis 重启的话就根据日志文件的内容将写指令从前到后执行一次以完成数据的恢复工作。

2.2 AOF持久化流程

1. 客户端的请求写命令会被 append 追加到 AOF 缓冲区内。
2. AOF 缓冲区根据 AOF 持久化策略 [always,everysec,no] 将操作同步到磁盘的 AOF 文件中。
3. AOF 文件大小超过重写策略或手动重写时,会对 AOF 文件 rewrite 重写,压缩 AOF 文件容量。
4. Redis 服务重启时,会重新 load 加载 AOF 文件中的写操作达到数据恢复的目的。

2.3 AOF默认不开启

可以在 redis.conf 中配置文件名称,默认为 appendonly.aof
AOF 文件的保存路径,同 RDB 的路径一致

2.4 AOF启动/修复/恢复

正常恢复
1. 启动:设置 Yes :修改默认的 appendonly no ,改为 yes
2. 恢复:重启 Redis 然后重新加载。
设置 appendonly yes ,配置修改后,需要重启 Redis 服务。

服务器启动后,生成appendonly.aof文件,且大小为0?

异常恢复
1. 启动:设置 Yes :修改默认的 appendonly no ,改为 yes
2. 修复:如遇到 AOF 文件损坏,通过 /user/local/bin/redis-check-aof --fix appendonly.aof 进行
恢复。
3. 恢复:重启 Redis 然后重新加载。
通过 /user/local/bin/redis-check-aof --fix 工具对 appendonly.aof 进行恢复。

?修复成功。再次查看aof文件,破坏的地方已经修复。再次启动服务器成功。

2.5 AOF同步频率设置?

1. appendfsync always
始终同步,每次 Redis 的写入都会立刻记入日志,性能较差但数据完整性比较好。
2. appendfsync everysec
每秒同步,每秒记入日志一次,如果宕机,本秒的数据可能丢失。
3. appendfsync no
redis 不主动进行同步,把同步时机交给操作系统。

2.6 Rewrite

1. AOF 采用文件追加方式,文件会越来越大为避免出现此种情况,新增了重写机制,当 AOF 文件的大 小超过所设定的阈值时,Redis 就会启动 AOF 文件的内容压缩,只保留可以恢复数据的最小指令集。
例:设置 k1 0 ,然后 incr 进行了 4 次, k1 对应的值会是 4 ,其实就相当于 set k1 4
2. 重写虽然可以节约大量磁盘空间,减少恢复时间。但是每次重写还是有一定的负担的,因此设定
Redis 要满足一定条件才会进行重写。
redis.conf 默认配置
auto-aof-rewrite-min-size :表示重写时,文件大小必须比这个值要大。
auto-aof-rewrite-percentage :表示目前文件大小比上次重写后的文件大小大这么多才行。

13?Redis事务

1 Redis事务简介

1. Redis 事务是一组命令的集合,一个事务中的所有命令都将被序列化,按照一次性、顺序性、排他 性的执行一系列的命令。
2. Redis 单条命令保证原子性,但是事务不保证原子性,且没有回滚。事务中任意命令执行失败,其 余的命令仍会被执行。
3. Redis 事务没有隔离级别的概念。批量操作在执行前被放入缓存队列,并不会被实际执行,也就不 存在事务内的查询要看到事务里的更新,事务外查询不能看到。
4. Redis 事务的三个阶段:
开始事务
命令入队
执行事务

2 Redis事务基本操作

2.1 MultiExecdiscard

事务从输入 Multi 命令开始,输入的命令都会依次压入命令缓冲队列中,并不会执行,直到输入 Exec 后, Redis会将之前的命令缓冲队列中的命令依次执行。
组队过程中,可以通过 discard 来放弃组队。

?

?

2.2 事务的错误处理 ?

1. 组队阶段某个命令出现了错误,整个队列中的命令都不执行。

2. 执行阶段某个命令出现了错误,只有报错的命令不会执行,其他正常执行。

?

3 悲观锁与乐观锁 ?

3.1 事务应用场景

一个请求想给余额减 8000
一个请求想给余额减 5000
一个请求想给余额减 1000

3.2 悲观锁(Pessimistic Lock?

每次去拿数据的时候都认为别人会修改,所以在每次拿数据的时候都会上锁,这样别人想拿这个数据就 会阻塞,直到它拿到锁。传统关系型数据库就用到很多悲观锁,比如行锁、表锁等。

3.3 乐观锁(Optimistic Lock?

每次去拿数据的时候都认为别人不会修改,所以不会上锁,但在更新的时候会判断一下在此期间别人有 没有去更新这个数据,可以使用版本号机制。乐观锁适用于多读的应用类型,可以提高吞吐量。Redis 就是乐观锁机制实现事务的。

4 Redis中的乐观锁

4.1 watch key [key……] ?

在执行 multi 之前,先执行 watch 监视一个或多个 key ,如果在事务执行之前这个(或这些) key 被其它命令所改动,那么事务将被打断。
例:开启两个客户端

?

?

?

4.2 unwatch ?

取消 watch 命令对所有 key 的监视
如果在执行 watch 命令之后, exec 命令或 discard 命令先执行的话,那么就不需要再执行 unwatch

15 Redis主从复制

1 Redis主从复制简介

主从复制,是指将一台 Redis 服务器的数据,复制到其他的 Redis 服务器。前者称为主节点 (Master) ,后 者称为从节点(Slave) ;数据的复制是单向的,只能由主节点到从节点。
默认情况下,每台 Redis 服务器都是主节点;且一个主节点可以有多个从节点 ( 或没有从节点 ) ,但一个从 节点只能有一个主节点。
Master 以写为主, Slave 以读为主。

主从复制的作用
1. 数据冗余:主从复制实现了数据的热备份,是持久化之外的一种数据冗余方式。
2. 故障恢复:当主节点出现问题时,可以由从节点提供服务,实现快速的故障恢复;实际上是一种服务的冗余。
3. 负载均衡:在主从复制的基础上,配合读写分离,可以由主节点提供写服务,由从节点提供读服务 (即写Redis 数据时应用连接主节点,读 Redis 数据时应用连接从节点),分担服务器负载;尤其是 在写少读多的场景下,通过多个从节点分担读负载,可以大大提高Redis 服务器的并发量。
4. 高可用基石:除了上述作用以外,主从复制还是哨兵和集群能够实施的基础,因此说主从复制是
Redis 高可用的基础。
一般来说,要将 Redis 运用于工程项目中,只是用一台 Redis 是万万不能的,原因如下:
1. 从结构上,单个 redis 服务器会发生单点故障,并且一台服务器需要处理所有的请求负载,压较
大;
2. 从容量上,单个 redis 服务器内存容量有限,就算一台 Redis 服务器内容容量为 256G ,也不能将所有 内存用做Redis 存储内存,一般来说, 单台 Redis 最大使用内存不应该超过 20G

2 Redis主从复制-一主多从

redis 客户端中,通过 info replication 命令可以查看 Redis 服务器当前状态
可以给 redis-cli 命令添加 -p 参数,来指定链接哪个服务器
slaveof ip port 成为某个实例的从服务器。
注意:
在从库中进行写操作,会报错。
由于该主从复制在同一台虚拟机上搭建,所以需要修改端口号,如果在多台服务器上搭建主从复
制,则需要修改相对应的 ip
如果在多台服务器上搭建主从复制,一定要开放远程链接。

3 Redis主从复制-复制原理

3.1 主从复制的一些问题

1. 如果 Master 断开(宕机), Slave 依然连接着 Master ,可以正常使用读操作,但是没有写操作。如 果Master 恢复正常, Slave 依旧可以直接获取 Master 写的信息。
2. 如果 Slave 断开(宕机),当该 Slave 重启成功,则会变为 Master ,需要通过 slaveof 恢复成 Slave , 只要变为Slave ,立刻可以从 Master 同步所有数据。

3.2 复制原理

Slave 启动成功连接到 Master 后会主动发送一个同步( sync )命令。
Master 接到 Slave 的命令,把 Master 数据进行持久化,把 rdb 文件发送给 Slave Slave 拿到 rdb 进行
读取。 每次Master 进行写操作之后,会和 Slave 进行数据同步。

?

全量复制 :一般发生在 Slave 初始化阶段,这时 Slave 需要将 Master 上的所有数据都复制一份。
增量复制 :指 Slave 初始化后开始正常工作时主服务器发生的写操作同步到从服务器的过程

3.3 薪火相传

上一个 Slave (从机)是下一个 Slave (从机)的 Master (主机)。
优点: Slave 同样可以接收其他 Slave 的连接和同步请求,那么该 Slave 作为了链条中下一个的 Master, 可 以有效减轻Master 的压力,去中心化降低风险。
缺点: 一旦某个 Slave 宕机,后面的 Slave 都无法备份。
注意:
也是通过 slaveof ip port 命令修改 Master
中途变更转向 : 会清除之前的数据,重新建立拷贝最新的。
Slave6380 本质上仍然是从库,只能读、不能写。

3.4 反客为主

当一个 Master 宕机后,后面的 Slave 可以立刻升为 Master ,其后面的 Slave 不用做任何修改。

通过slaveof no one Slave变为Master

?

?4 Redis主从复制-哨兵模式(Sentinel

反客为主的自动版,能够后台监控 Master 是否故障,如果故障了,根据投票数自动将 Slave 转换为
Master
哨兵模式是一种特殊的模式,首先 Redis 提供了哨兵的命令,哨兵是一个独立的进程,作为进程,它会独 立运行。其原理是哨兵通过发送命令,等待 Redis 服务器响应,从而监控运行的多个 Redis 实例。

4.1 哨兵模式的使用?

1. 将服务器调整为一主多从( 6379 6380 6381 )。
我们模拟的话把redis.conf的配置文件复制两份,然后改端口号就行了

2. /usr/local/myredis文件夹下创建sentinel.conf文件(名字一定不能错)。

?

3. 配置哨兵,sentinel.conf添加内容

sentinel monitor myredis 127.0.0.1 6379 1
其中: myredis 为监控对象起的服务器名称(随意), 1 代表至少有 1 个哨兵投票同意迁移
如果 Master 存在密码,需要配置 sentinel auth-pass 服务器名 密码
sentinel auth-pass myredis 123456
4. 启动哨兵,在 /usr/local/bin/ 文件夹下执行 ./redis-sentinel /usr/local/myredis/sentinel.conf
令。
5. 模拟 Master 宕机,哨兵会切换 Master
通过 kill 命令关闭 Master 6379

等待一段时间,哨兵窗口就会输出信息

?

根据窗口信息可知,Master6379转换为6381,进入6381客户端执行info replication

?

6. 重新启动 6379 服务器后,自动转换为 Slave

4.2 复制延迟

由于所有的写操作都是先在 Master 上操作,然后同步更新到 Slave 上,所以从 Master 同步到 Slave 机器有 一定的延迟,Slave 机器数量的增加,会使延迟问题会更加严重。

16?Redis集群

1 Redis集群简介

1.1 Redis集群(RedisCluster

RedisCluster 实现了对 Redis 的水平扩容,即启动 N Redis 节点,将整个数据库分布存储在这 N 个节点当 中,每个节点存储总数据的1/N
RedisCluster 通过分区( partition )来提供一定程度的可用性( availability ):即集群有一部分节点失 效或者无法进行通讯,集群也可以继续处理命令。
Redis-Cluster采用无中心结构,每个节点保存数据和整个集群状态,每个节点都和其他所有节点连接,用来交换彼此的信息。
为了使得集群在一部分节点宕机或者无法与集群的大多数节点进行通讯的情况下, 仍然可以正常运作, Redis 集群对节点使用了主从复制功能。

2 Redis集群搭建

1. 删除持久化数据, aof dump
2. 创建 6 个实例,即在 /usr/local/myredis 文件夹下分别创建 6379 6380 6381 6389 6390
6391 conf
3. redis.conf 中关闭 appendonly
4. 在不同的 conf 文件中,配置对应的内容 可以通过include /usr/local/myredis/redis.conf 将公共基础配置直接引入文件。
include /usr/local/myredis/redis.conf 统一添加到这三个文件中
在各个文件中,添加对应的 pidfile port dbfilename cluster-enabled (是否打开集
群)、 cluster-config-file (设定节点配置文件名)、 cluster-node-timeout (设置节点失联
时间,超过该时间(毫秒),集群自动进行主从切换)
如:
redis6379.conf 中添加
pidfile /var/run/redis_6379.pid
port 6379
dbfilename dump6379.rdb
cluster-enabled yes
cluster-config-file nodes-6379.conf
cluster-node-timeout 15000

将其他文件按照相同规则创建出来。

5. 启动该 6 redis ,并确保是否全部生成 nodes-xxxx.conf 文件。(启动之前务必保证 redis 服务支持 远程连接)

?

6. 进入redis安装目录下的src文件夹

?

7. 在该文件夹下执行命令

redis-cli --cluster create --cluster-replicas 1 192.168.56.31:6379
192.168.56.31:6380 192.168.56.31:6381 192.168.56.31:6389 192.168.56.31:6390
192.168.56.31:6391
此处使用真实 ip 地址, -replicas 1 代表采用最简单的方式配置集群,一台主机,一台从机。
replicas 表示每个 master 需要有几个 slave

执行命令后,redis提供推荐的主从配置建议,执行同意。

?集群创建成功

8. 通过 ./redis-cli -c -p 6379 可连接至集群(由于所有节点相通,任意端口号均可)
redis 客户端中执行 cluster nodes 查看节点状态。

3 Redis集群操作

3.1 Slot

一个 Redis 集群包含 16384 个哈希槽( hash slot ),每个键都属于这 16384 个哈希槽的其中一个。
集群使用公式 CRC16(key) % 16384 来计算键 key 属于哪个槽, 其中 CRC16(key) 语句用于计算键 key 的 CRC16 校验和 。
集群中的每个节点负责处理一部分哈希槽。 举个例子, 一个集群可以有三个节点, 其中:
节点 1 负责处理 0 号至 5500 号哈希槽。
节点 2 负责处理 5501 号至 11000 号哈希槽。
节点 3 负责处理 11001 号至 16384 号哈希槽。

?

3.2 命令执行 ?

根据k1计算出的槽值进行切换节点,并存入数据。

不在一个slot下的键值,是不能使用mgetmset等多建操作。

?可以通过{}来定义组的概念,从而是key{}内相同内容的键值对放到同一个slot

mset k1{test} v1 k2{test} v2 k3{test} v3

?3.3 故障恢复

1. 关闭 6379 服务器,进入 redis-cli 执行 cluster nodes

2. 重新启动6379服务器,再次查看,6379成为了Slave

?

17 JAVA操作Redis

18?SpringData整合Redis

19?Redis企业级解决方案

?

?

?

?

?

?

?

?

?

?

?

?

?

?

?

?

?

?

?

?

?

?

?

?

?

?

?

  大数据 最新文章
实现Kafka至少消费一次
亚马逊云科技:还在苦于ETL?Zero ETL的时代
初探MapReduce
【SpringBoot框架篇】32.基于注解+redis实现
Elasticsearch:如何减少 Elasticsearch 集
Go redis操作
Redis面试题
专题五 Redis高并发场景
基于GBase8s和Calcite的多数据源查询
Redis——底层数据结构原理
上一篇文章      下一篇文章      查看所有文章
加:2021-09-13 09:20:26  更:2021-09-13 09:21:01 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/23 20:41:54-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码