内存配置和查看
Redis最大内存配置建议
- Redis默认占用的内存:在64位操作系统下不限制内存大小,在32位操作系统下最多使用3GB。
- 在生产环境下,一般推荐设置为最大物理内存的四分之三。
- 配置单位是字节Bytes,如果设置为
maxmemory 0
即代表内存无限制。
Redis 持久化 RDB AOF
Redis作为一个键值对内存数据库(NoSQL),数据都存储在内存当中,在处理客户端请求时,所有操作都在内存当中进行,如下所示:
这样做有什么问题呢?
存储在内存当中的数据,只要服务器关机(各种原因引起的),内存中的数据就会消失了,不仅服务器关机会造成数据消失,Redis服务器守护进程退出,内存中的数据也一样会消失。
对于只把Redis当缓存来用的项目来说,数据消失或许问题不大,重新从数据源把数据加载进来就可以了,但如果直接把用户提交的业务数据存储在Redis当中,把Redis作为数据库来使用,在其放存储重要业务数据,那么Redis的内存数据丢失所造成的影响也许是毁灭性。
为了避免内存中数据丢失,Redis提供了对持久化的支持,可以选择不同的方式将数据从内存中保存到硬盘当中,使数据可以持久化保存。
Redis提供了RDB和AOF两种不同的数据持久化方式。
Redis
Redis 的 VM (虚拟内存)机制就是暂时把不经常访问的数据(冷数据)从内存交换到磁盘中,从而腾出宝贵的内存空间用于其它需要访问的数据(热数据)。通过 VM 功能可以实现冷热数据分离,使热数据仍在内存中、冷数据保存到磁盘。这样就可以避免因为内存不足而造成访问速度下降的问题。Redis 提高数据库容量的办法有两种:一种是可以将数据分割到多个 Redis Server上;另一种是使用虚拟内存把那些不经常访问的数据交换到磁盘上。「需要特别注意的是 Redis 并没有使用 OS 提供的 Swap,而是自己实现。」
Redis 为了保证查找的速度,只会将 value 交换出去,而在内存中保留所有的 Key。所以它非常适合 Key 很小,Value 很大的存储结构。如果 Key 很大,value 很小,那么vm可能还是无法满足需求。
在实际的开发中总是会遇到如下的场景:A,B两个成员一起开发,A在开发C服务,B在开发D服务,测试环境中也部署有C服务和D服务,A和B的诉求是不互相干扰对方。但是实际中nacos中注册了服务之后默认的负载策略是根据权重来决定访问哪个服务,当权重一致时就是各50%的访问,很容易就对其他成员造成干扰,所以我们需要一个自定义负载均衡器来做一个分流。
在springcloud的解决方案中负载均衡器使用的LoadBalancer框架,我们需要实现ReactorServiceInstanceLoadBalancer接口来完成自定义负载均衡。所以我们的思路就是在网关中进行打标,然后通过自定义负载均衡器来确定具体调用的服务。
在上一片文章中我们解决了网关层认证后向后端服务传递用户信息的问题。今天我们来解决另外一个问题:如何在 OpenFeign 中传递 Token,并且保证多线程情况下也能适用。
我们在权限验证中提到了在网关中会通过缓存取出用户数据。当我们获取到用户信息后应该怎么传递下去,有两种方案:
一种是通过redis对数据进行存储,在不同的服务中通过同一个redis进行调用。
第二种:在SpringCloudGateway中将数据取出后放入请求头,然后通过请求头进行传输