1
0
mirror of https://github.com/Snailclimb/JavaGuide synced 2025-06-20 22:17:09 +08:00

Fix document error with Redis part

This commit is contained in:
dongzl 2019-04-24 14:23:08 +08:00
parent e7a988f110
commit 1f810d8231

View File

@ -24,7 +24,7 @@
### redis 简介 ### redis 简介
简单来说 redis 就是一个数据库,不过与传统数据库不同的是 redis 的数据是存在内存中的,所以写速度非常快,因此 redis 被广泛应用于缓存方向。另外redis 也经常用来做分布式锁。redis 提供了多种数据类型来支持不同的业务场景。除此之外redis 支持事务 、持久化、LUA脚本、LRU驱动事件、多种集群方案。 简单来说 redis 就是一个数据库,不过与传统数据库不同的是 redis 的数据是存在内存中的,所以写速度非常快,因此 redis 被广泛应用于缓存方向。另外redis 也经常用来做分布式锁。redis 提供了多种数据类型来支持不同的业务场景。除此之外redis 支持事务 、持久化、LUA脚本、LRU驱动事件、多种集群方案。
### 为什么要用 redis /为什么要用缓存 ### 为什么要用 redis /为什么要用缓存
@ -84,7 +84,7 @@ String数据结构是简单的key-value类型value其实不仅可以是String
#### 2.Hash #### 2.Hash
> **常用命令:** hget,hset,hgetall 等。 > **常用命令:** hget,hset,hgetall 等。
Hash 是一个 string 类型的 field 和 value 的映射表hash 特别适合用于存储对象,后续操作的时候,你可以直接仅仅修改这个对象中的某个字段的值。 比如我们可以Hash数据结构来存储用户信息,商品信息等等。比如下面我就用 hash 类型存放了我本人的一些信息: hash 是一个 string 类型的 field 和 value 的映射表hash 特别适合用于存储对象,后续操作的时候,你可以直接仅仅修改这个对象中的某个字段的值。 比如我们可以 hash 数据结构来存储用户信息,商品信息等等。比如下面我就用 hash 类型存放了我本人的一些信息:
``` ```
key=JavaUser293847 key=JavaUser293847
@ -128,7 +128,7 @@ sinterstore key1 key2 key3 将交集存在key1内
和set相比sorted set增加了一个权重参数score使得集合中的元素能够按score进行有序排列。 和set相比sorted set增加了一个权重参数score使得集合中的元素能够按score进行有序排列。
**举例:** 在直播系统中,实时排行信息包含直播间在线用户列表,各种礼物排行榜,弹幕消息(可以理解为按消息维度的消息排行榜)等信息,适合使用 Redis 中的 SortedSet 结构进行存储。 **举例:** 在直播系统中,实时排行信息包含直播间在线用户列表,各种礼物排行榜,弹幕消息(可以理解为按消息维度的消息排行榜)等信息,适合使用 Redis 中的 Sorted Set 结构进行存储。
### redis 设置过期时间 ### redis 设置过期时间
@ -160,7 +160,7 @@ redis 配置文件 redis.conf 中有相关注释,我这里就不贴了,大
1. **volatile-lru**从已设置过期时间的数据集server.db[i].expires中挑选最近最少使用的数据淘汰 1. **volatile-lru**从已设置过期时间的数据集server.db[i].expires中挑选最近最少使用的数据淘汰
2. **volatile-ttl**从已设置过期时间的数据集server.db[i].expires中挑选将要过期的数据淘汰 2. **volatile-ttl**从已设置过期时间的数据集server.db[i].expires中挑选将要过期的数据淘汰
3. **volatile-random**从已设置过期时间的数据集server.db[i].expires中任意选择数据淘汰 3. **volatile-random**从已设置过期时间的数据集server.db[i].expires中任意选择数据淘汰
4. **allkeys-lru**当内存不足以容纳新写入数据时在键空间中移除最近最少使用的key这个是最常用的. 4. **allkeys-lru**当内存不足以容纳新写入数据时在键空间中移除最近最少使用的key这个是最常用的
5. **allkeys-random**从数据集server.db[i].dict中任意选择数据淘汰 5. **allkeys-random**从数据集server.db[i].dict中任意选择数据淘汰
6. **no-eviction**:禁止驱逐数据,也就是说当内存不足以容纳新写入数据时,新写入操作会报错。这个应该没人使用吧! 6. **no-eviction**:禁止驱逐数据,也就是说当内存不足以容纳新写入数据时,新写入操作会报错。这个应该没人使用吧!
@ -172,7 +172,7 @@ redis 配置文件 redis.conf 中有相关注释,我这里就不贴了,大
很多时候我们需要持久化数据也就是将内存中的数据写入到硬盘里面,大部分原因是为了之后重用数据(比如重启机器、机器故障之后回复数据),或者是为了防止系统故障而将数据备份到一个远程位置。 很多时候我们需要持久化数据也就是将内存中的数据写入到硬盘里面,大部分原因是为了之后重用数据(比如重启机器、机器故障之后回复数据),或者是为了防止系统故障而将数据备份到一个远程位置。
Redis不同于Memcached的很重一点就是Redis支持持久化而且支持两种不同的持久化操作。**Redis的一种持久化方式叫快照snapshottingRDB,另一种方式是只追加文件append-only file,AOF**.这两种方法各有千秋,下面我会详细这两种持久化方法是什么,怎么用,如何选择适合自己的持久化方法。 Redis不同于Memcached的很重一点就是Redis支持持久化而且支持两种不同的持久化操作。**Redis的一种持久化方式叫快照snapshottingRDB另一种方式是只追加文件append-only file,AOF**。这两种方法各有千秋,下面我会详细这两种持久化方法是什么,怎么用,如何选择适合自己的持久化方法。
**快照snapshotting持久化RDB** **快照snapshotting持久化RDB**
@ -182,9 +182,9 @@ Redis可以通过创建快照来获得存储在内存里面的数据在某个时
```conf ```conf
save 900 1 #在900秒(15分钟)之后如果至少有1个key发生变化Redis就会自动触发BGSAVE命令创建快照。 save 900 1 #在900秒(15分钟)之后如果至少有1个key发生变化Redis就会自动触发BGSAVE命令创建快照。
save 300 10 #在300秒(5分钟)之后如果至少有10个key发生变化Redis就会自动触发BGSAVE命令创建快照。 save 300 10 #在300秒(5分钟)之后如果至少有10个key发生变化Redis就会自动触发BGSAVE命令创建快照。
save 60 10000 #在60秒(1分钟)之后如果至少有10000个key发生变化Redis就会自动触发BGSAVE命令创建快照。 save 60 10000 #在60秒(1分钟)之后如果至少有10000个key发生变化Redis就会自动触发BGSAVE命令创建快照。
``` ```
@ -203,9 +203,9 @@ appendonly yes
在Redis的配置文件中存在三种不同的 AOF 持久化方式,它们分别是: 在Redis的配置文件中存在三种不同的 AOF 持久化方式,它们分别是:
```conf ```conf
appendfsync always #每次有数据修改发生时都会写入AOF文件,这样会严重降低Redis的速度 appendfsync always #每次有数据修改发生时都会写入AOF文件,这样会严重降低Redis的速度
appendfsync everysec #每秒钟同步一次,显示地将多个写命令同步到硬盘 appendfsync everysec #每秒钟同步一次,显示地将多个写命令同步到硬盘
appendfsync no #让操作系统决定何时进行同步 appendfsync no #让操作系统决定何时进行同步
``` ```
为了兼顾数据和写入性能,用户可以考虑 appendfsync everysec选项 让Redis每秒同步一次AOF文件Redis性能几乎没受到任何影响。而且这样即使出现系统崩溃用户最多只会丢失一秒之内产生的数据。当硬盘忙于执行写入操作的时候Redis还会优雅的放慢自己的速度以便适应硬盘的最大写入速度。 为了兼顾数据和写入性能,用户可以考虑 appendfsync everysec选项 让Redis每秒同步一次AOF文件Redis性能几乎没受到任何影响。而且这样即使出现系统崩溃用户最多只会丢失一秒之内产生的数据。当硬盘忙于执行写入操作的时候Redis还会优雅的放慢自己的速度以便适应硬盘的最大写入速度。
@ -223,7 +223,7 @@ Redis 4.0 开始支持 RDB 和 AOF 的混合持久化(默认关闭,可以通
AOF重写可以产生一个新的AOF文件这个新的AOF文件和原有的AOF文件所保存的数据库状态一样但体积更小。 AOF重写可以产生一个新的AOF文件这个新的AOF文件和原有的AOF文件所保存的数据库状态一样但体积更小。
AOF重写是一个有歧义的名字该功能是通过读取数据库中的键值对来实现的程序无须对现有AOF文件进行任读入、分析或者写入操作。 AOF重写是一个有歧义的名字该功能是通过读取数据库中的键值对来实现的程序无须对现有AOF文件进行任读入、分析或者写入操作。
在执行 BGREWRITEAOF 命令时Redis 服务器会维护一个 AOF 重写缓冲区该缓冲区会在子进程创建新AOF文件期间记录服务器执行的所有写命令。当子进程完成创建新AOF文件的工作之后服务器会将重写缓冲区中的所有内容追加到新AOF文件的末尾使得新旧两个AOF文件所保存的数据库状态一致。最后服务器用新的AOF文件替换旧的AOF文件以此来完成AOF文件重写操作 在执行 BGREWRITEAOF 命令时Redis 服务器会维护一个 AOF 重写缓冲区该缓冲区会在子进程创建新AOF文件期间记录服务器执行的所有写命令。当子进程完成创建新AOF文件的工作之后服务器会将重写缓冲区中的所有内容追加到新AOF文件的末尾使得新旧两个AOF文件所保存的数据库状态一致。最后服务器用新的AOF文件替换旧的AOF文件以此来完成AOF文件重写操作
@ -237,7 +237,7 @@ AOF重写是一个有歧义的名字该功能是通过读取数据库中的
Redis 通过 MULTI、EXEC、WATCH 等命令来实现事务(transaction)功能。事务提供了一种将多个命令请求打包,然后一次性、按顺序地执行多个命令的机制,并且在事务执行期间,服务器不会中断事务而改去执行其他客户端的命令请求,它会将事务中的所有命令都执行完毕,然后才去处理其他客户端的命令请求。 Redis 通过 MULTI、EXEC、WATCH 等命令来实现事务(transaction)功能。事务提供了一种将多个命令请求打包,然后一次性、按顺序地执行多个命令的机制,并且在事务执行期间,服务器不会中断事务而改去执行其他客户端的命令请求,它会将事务中的所有命令都执行完毕,然后才去处理其他客户端的命令请求。
在传统的关系式数据库中,常常用 ACID 性质来检验事务功能的可靠性和安全性。在 Redis 中事务总是具有原子性Atomicity)、一致性(Consistency)和隔离性Isolation并且当 Redis 运行在某种特定的持久化模式下时事务也具有持久性Durability 在传统的关系式数据库中,常常用 ACID 性质来检验事务功能的可靠性和安全性。在 Redis 中事务总是具有原子性Atomicity、一致性Consistency和隔离性Isolation并且当 Redis 运行在某种特定的持久化模式下时事务也具有持久性Durability
### 缓存雪崩和缓存穿透问题解决方案 ### 缓存雪崩和缓存穿透问题解决方案