1
0
mirror of https://github.com/Snailclimb/JavaGuide synced 2025-06-16 18:10:13 +08:00

Update Redis.md

This commit is contained in:
shuang.kou 2020-05-12 22:45:53 +08:00
parent db9a8cf860
commit 6ceb255956

View File

@ -36,18 +36,14 @@
![](http://my-blog-to-use.oss-cn-beijing.aliyuncs.com/18-9-24/54316596.jpg) ![](http://my-blog-to-use.oss-cn-beijing.aliyuncs.com/18-9-24/54316596.jpg)
**高并发:** **高并发:**
直接操作缓存能够承受的请求是远远大于直接访问数据库的,所以我们可以考虑把数据库中的部分数据转移到缓存中去,这样用户的一部分请求会直接到缓存这里而不用经过数据库。 直接操作缓存能够承受的请求是远远大于直接访问数据库的,所以我们可以考虑把数据库中的部分数据转移到缓存中去,这样用户的一部分请求会直接到缓存这里而不用经过数据库。
![](http://my-blog-to-use.oss-cn-beijing.aliyuncs.com/18-9-24/85146760.jpg) ![](http://my-blog-to-use.oss-cn-beijing.aliyuncs.com/18-9-24/85146760.jpg)
### 为什么要用 redis 而不用 map/guava 做缓存? ### 为什么要用 redis 而不用 map/guava 做缓存?
> 下面的内容来自 segmentfault 一位网友的提问地址https://segmentfault.com/q/1010000009106416 > 下面的内容来自 segmentfault 一位网友的提问地址https://segmentfault.com/q/1010000009106416
缓存分为本地缓存和分布式缓存。以 Java 为例,使用自带的 map 或者 guava 实现的是本地缓存,最主要的特点是轻量以及快速,生命周期随着 jvm 的销毁而结束,并且在多实例的情况下,每个实例都需要各自保存一份缓存,缓存不具有一致性。 缓存分为本地缓存和分布式缓存。以 Java 为例,使用自带的 map 或者 guava 实现的是本地缓存,最主要的特点是轻量以及快速,生命周期随着 jvm 的销毁而结束,并且在多实例的情况下,每个实例都需要各自保存一份缓存,缓存不具有一致性。
@ -69,7 +65,6 @@ redis 内部使用文件事件处理器 `file event handler`,这个文件事
多个 socket 可能会并发产生不同的操作,每个操作对应不同的文件事件,但是 IO 多路复用程序会监听多个 socket会将 socket 产生的事件放入队列中排队,事件分派器每次从队列中取出一个事件,把该事件交给对应的事件处理器进行处理。 多个 socket 可能会并发产生不同的操作,每个操作对应不同的文件事件,但是 IO 多路复用程序会监听多个 socket会将 socket 产生的事件放入队列中排队,事件分派器每次从队列中取出一个事件,把该事件交给对应的事件处理器进行处理。
### redis 和 memcached 的区别 ### redis 和 memcached 的区别
对于 redis 和 memcached 我总结了下面四点。现在公司一般都是用 redis 来实现缓存,而且 redis 自身也越来越强大了! 对于 redis 和 memcached 我总结了下面四点。现在公司一般都是用 redis 来实现缓存,而且 redis 自身也越来越强大了!
@ -79,24 +74,22 @@ redis 内部使用文件事件处理器 `file event handler`,这个文件事
3. **集群模式**memcached 没有原生的集群模式,需要依靠客户端来实现往集群中分片写入数据;但是 redis 目前是原生支持 cluster 模式的. 3. **集群模式**memcached 没有原生的集群模式,需要依靠客户端来实现往集群中分片写入数据;但是 redis 目前是原生支持 cluster 模式的.
4. **Memcached 是多线程,非阻塞 IO 复用的网络模型Redis 使用单线程的多路 IO 复用模型。** 4. **Memcached 是多线程,非阻塞 IO 复用的网络模型Redis 使用单线程的多路 IO 复用模型。**
> 来自网络上的一张图,这里分享给大家! > 来自网络上的一张图,这里分享给大家!
![redis 和 memcached 的区别](http://my-blog-to-use.oss-cn-beijing.aliyuncs.com/18-9-24/61603179.jpg) ![redis 和 memcached 的区别](http://my-blog-to-use.oss-cn-beijing.aliyuncs.com/18-9-24/61603179.jpg)
### redis 常见数据结构以及使用场景分析 ### redis 常见数据结构以及使用场景分析
#### 1.String #### 1.String
> **常用命令:** set,get,decr,incr,mget 等。 > **常用命令:** set,get,decr,incr,mget 等。
String 数据结构是简单的 key-value 类型value 其实不仅可以是 String也可以是数字。 String 数据结构是简单的 key-value 类型value 其实不仅可以是 String也可以是数字。
常规 key-value 缓存应用; 常规 key-value 缓存应用;
常规计数:微博数,粉丝数等。 常规计数:微博数,粉丝数等。
#### 2.Hash #### 2.Hash
> **常用命令:** hget,hset,hgetall 等。 > **常用命令:** hget,hset,hgetall 等。
hash 是一个 string 类型的 field 和 value 的映射表hash 特别适合用于存储对象,后续操作的时候,你可以直接仅仅修改这个对象中的某个字段的值。 比如我们可以 hash 数据结构来存储用户信息,商品信息等等。比如下面我就用 hash 类型存放了我本人的一些信息: hash 是一个 string 类型的 field 和 value 的映射表hash 特别适合用于存储对象,后续操作的时候,你可以直接仅仅修改这个对象中的某个字段的值。 比如我们可以 hash 数据结构来存储用户信息,商品信息等等。比如下面我就用 hash 类型存放了我本人的一些信息:
@ -112,8 +105,8 @@ value={
``` ```
#### 3.List #### 3.List
> **常用命令:** lpush,rpush,lpop,rpop,lrange 等 > **常用命令:** lpush,rpush,lpop,rpop,lrange 等
list 就是链表Redis list 的应用场景非常多,也是 Redis 最重要的数据结构之一,比如微博的关注列表,粉丝列表,消息列表等功能都可以用 Redis 的 list 结构来实现。 list 就是链表Redis list 的应用场景非常多,也是 Redis 最重要的数据结构之一,比如微博的关注列表,粉丝列表,消息列表等功能都可以用 Redis 的 list 结构来实现。
@ -125,9 +118,9 @@ Redis list 的实现为一个双向链表,即可以支持反向查找和遍历
#### 4.Set #### 4.Set
> **常用命令:** > **常用命令:**
sadd,spop,smembers,sunion 等 > sadd,spop,smembers,sunion 等
set 对外提供的功能与list类似是一个列表的功能特殊之处在于 set 是可以自动排重的 Redis 中的 set 类型是一种无序集合,集合中的元素没有先后顺序
当你需要存储一个列表数据又不希望出现重复数据时set 是一个很好的选择,并且 set 提供了判断某个成员是否在一个 set 集合内的重要接口,这个也是 list 所不能提供的。可以基于 set 轻易实现交集、并集、差集的操作。 当你需要存储一个列表数据又不希望出现重复数据时set 是一个很好的选择,并且 set 提供了判断某个成员是否在一个 set 集合内的重要接口,这个也是 list 所不能提供的。可以基于 set 轻易实现交集、并集、差集的操作。
@ -138,14 +131,13 @@ sinterstore key1 key2 key3 将交集存在key1内
``` ```
#### 5.Sorted Set #### 5.Sorted Set
> **常用命令:** zadd,zrange,zrem,zcard等
> **常用命令:** zadd,zrange,zrem,zcard 等
和 set 相比sorted set 增加了一个权重参数 score使得集合中的元素能够按 score 进行有序排列。 和 set 相比sorted set 增加了一个权重参数 score使得集合中的元素能够按 score 进行有序排列。
**举例:** 在直播系统中,实时排行信息包含直播间在线用户列表,各种礼物排行榜,弹幕消息(可以理解为按消息维度的消息排行榜)等信息,适合使用 Redis 中的 Sorted Set 结构进行存储。 **举例:** 在直播系统中,实时排行信息包含直播间在线用户列表,各种礼物排行榜,弹幕消息(可以理解为按消息维度的消息排行榜)等信息,适合使用 Redis 中的 Sorted Set 结构进行存储。
### redis 设置过期时间 ### redis 设置过期时间
Redis 中有个设置时间过期的功能,即对存储在 redis 数据库中的值可以设置一个过期时间。作为一个缓存数据库,这是非常实用的。如我们一般项目中的 token 或者一些登录信息,尤其是短信验证码都是有时间限制的,按照传统的数据库处理方式,一般都是自己判断过期,这样无疑会严重影响项目性能。 Redis 中有个设置时间过期的功能,即对存储在 redis 数据库中的值可以设置一个过期时间。作为一个缓存数据库,这是非常实用的。如我们一般项目中的 token 或者一些登录信息,尤其是短信验证码都是有时间限制的,按照传统的数据库处理方式,一般都是自己判断过期,这样无疑会严重影响项目性能。
@ -161,7 +153,6 @@ Redis中有个设置时间过期的功能即对存储在 redis 数据库中
- **定期删除**redis 默认是每隔 100ms 就**随机抽取**一些设置了过期时间的 key检查其是否过期如果过期就删除。注意这里是随机抽取的。为什么要随机呢你想一想假如 redis 存了几十万个 key ,每隔 100ms 就遍历所有的设置过期时间的 key 的话,就会给 CPU 带来很大的负载! - **定期删除**redis 默认是每隔 100ms 就**随机抽取**一些设置了过期时间的 key检查其是否过期如果过期就删除。注意这里是随机抽取的。为什么要随机呢你想一想假如 redis 存了几十万个 key ,每隔 100ms 就遍历所有的设置过期时间的 key 的话,就会给 CPU 带来很大的负载!
- **惰性删除** :定期删除可能会导致很多过期 key 到了时间并没有被删除掉。所以就有了惰性删除。假如你的过期 key靠定期删除没有被删除掉还停留在内存里除非你的系统去查一下那个 key才会被 redis 给删除掉。这就是所谓的惰性删除,也是够懒的哈! - **惰性删除** :定期删除可能会导致很多过期 key 到了时间并没有被删除掉。所以就有了惰性删除。假如你的过期 key靠定期删除没有被删除掉还停留在内存里除非你的系统去查一下那个 key才会被 redis 给删除掉。这就是所谓的惰性删除,也是够懒的哈!
但是仅仅通过设置过期时间还是有问题的。我们想一下:如果定期删除漏掉了很多过期 key然后你也没及时去查也就没走惰性删除此时会怎么样如果大量过期 key 堆积在内存里,导致 redis 内存块耗尽了。怎么解决这个问题呢? **redis 内存淘汰机制。** 但是仅仅通过设置过期时间还是有问题的。我们想一下:如果定期删除漏掉了很多过期 key然后你也没及时去查也就没走惰性删除此时会怎么样如果大量过期 key 堆积在内存里,导致 redis 内存块耗尽了。怎么解决这个问题呢? **redis 内存淘汰机制。**
### redis 内存淘汰机制(MySQL 里有 2000w 数据Redis 中只存 20w 的数据,如何保证 Redis 中的数据都是热点数据?) ### redis 内存淘汰机制(MySQL 里有 2000w 数据Redis 中只存 20w 的数据,如何保证 Redis 中的数据都是热点数据?)
@ -184,7 +175,6 @@ redis 配置文件 redis.conf 中有相关注释,我这里就不贴了,大
**备注: 关于 redis 设置过期时间以及内存淘汰机制,我这里只是简单的总结一下,后面会专门写一篇文章来总结!** **备注: 关于 redis 设置过期时间以及内存淘汰机制,我这里只是简单的总结一下,后面会专门写一篇文章来总结!**
### redis 持久化机制(怎么保证 redis 挂掉之后再重启数据可以进行恢复) ### redis 持久化机制(怎么保证 redis 挂掉之后再重启数据可以进行恢复)
很多时候我们需要持久化数据也就是将内存中的数据写入到硬盘里面,大部分原因是为了之后重用数据(比如重启机器、机器故障之后恢复数据),或者是为了防止系统故障而将数据备份到一个远程位置。 很多时候我们需要持久化数据也就是将内存中的数据写入到硬盘里面,大部分原因是为了之后重用数据(比如重启机器、机器故障之后恢复数据),或者是为了防止系统故障而将数据备份到一个远程位置。
@ -244,7 +234,6 @@ AOF重写是一个有歧义的名字该功能是通过读取数据库中的
- [Redis 持久化](Redis持久化.md) - [Redis 持久化](Redis持久化.md)
### redis 事务 ### redis 事务
Redis 通过 MULTI、EXEC、WATCH 等命令来实现事务(transaction)功能。事务提供了一种将多个命令请求打包,然后一次性、按顺序地执行多个命令的机制,并且在事务执行期间,服务器不会中断事务而改去执行其他客户端的命令请求,它会将事务中的所有命令都执行完毕,然后才去处理其他客户端的命令请求。 Redis 通过 MULTI、EXEC、WATCH 等命令来实现事务(transaction)功能。事务提供了一种将多个命令请求打包,然后一次性、按顺序地执行多个命令的机制,并且在事务执行期间,服务器不会中断事务而改去执行其他客户端的命令请求,它会将事务中的所有命令都执行完毕,然后才去处理其他客户端的命令请求。