查询优化技术方案

本文涉及的产品
云数据库 Tair(兼容Redis),内存型 2GB
Redis 开源版,标准版 2GB
推荐场景:
搭建游戏排行榜
简介: 查询优化技术方案

查询优化技术之多级缓存  配置Jedis不需要序列化存入json

   image.pngimage.png



 一级缓存             二级缓存                              三级缓存                            四级缓存

redis缓存  --> 热点内存本地缓存JVM  --> nginx proxy chache 缓存 --> nginx lua缓存


   redis缓存 :

      单机版 : 存在单点故障,存在容量上限

         sentinal 哨兵模式 :  解决单机版问题,解决redis哪台坏了,那个redis备份是最新的。单点机器。

                                           master机器通过心跳机制和sentinal建立链接,当master出现异常,sentinal则将                                                master机器改为slave,slave变成master进行切换。

         集群cluster模式:不需要知道redis集群的状态


        jedis已经集成三种模式支持,只需配制Redis 集群模式cluster配置及搭建

         Springboot整合luttuce 当集群主节点宕机之后需要重新拓扑刷新

      查询资料 https://blog.csdn.net/qq_30062125/article/details/101689894

                        https://www.twblogs.net/a/5c9edae4bd9eee75238884b8/zh-cn


package cn.duckerkj.springbootguide.config.redis;

import java.time.Duration;

import org.joda.time.DateTime;

import org.springframework.beans.factory.annotation.Autowired;

import org.springframework.beans.factory.annotation.Value;

import  org.springframework.boot.autoconfigure.data.redis.RedisProperties;

import org.springframework.context.annotation.Bean;

import org.springframework.context.annotation.Configuration;

import  org.springframework.data.redis.connection.RedisClusterConfiguration;

import  org.springframework.data.redis.connection.lettuce.LettuceClientConfiguration;

import  org.springframework.data.redis.connection.lettuce.LettuceConnectionFactory;

import org.springframework.data.redis.core.RedisTemplate;

import  org.springframework.data.redis.serializer.Jackson2JsonRedisSerializer;

import  org.springframework.data.redis.serializer.StringRedisSerializer;

import com.fasterxml.jackson.annotation.JsonAutoDetect;

import com.fasterxml.jackson.annotation.PropertyAccessor;

import com.fasterxml.jackson.databind.ObjectMapper;

import com.fasterxml.jackson.databind.module.SimpleModule;

import io.lettuce.core.ReadFrom;

import io.lettuce.core.cluster.ClusterClientOptions;

import io.lettuce.core.cluster.ClusterTopologyRefreshOptions;

/**

* @author pgig

* @date 2019/3/21

*/

@Configuration

public class RedisConfiguration {

   @Autowired

   private RedisProperties redisProperties;

   @Value("${redis.maxRedirects:3}")

   private int maxRedirects;

   @Value("${redis.refreshTime:5}")

   private int refreshTime;

   @Bean

   public LettuceConnectionFactory redisConnectionFactory() {

       RedisClusterConfiguration redisClusterConfiguration =  new  RedisClusterConfiguration(redisProperties.getCluster().getNodes());

       redisClusterConfiguration.setMaxRedirects(maxRedirects);

       //支持自适应集群拓扑刷新和静态刷新源

       ClusterTopologyRefreshOptions  clusterTopologyRefreshOptions =   ClusterTopologyRefreshOptions.builder()

               .enablePeriodicRefresh()

               .enableAllAdaptiveRefreshTriggers()

               .refreshPeriod(Duration.ofSeconds(refreshTime))

               .build();

       ClusterClientOptions clusterClientOptions =  ClusterClientOptions.builder()

                .topologyRefreshOptions(clusterTopologyRefreshOptions).build();

       //从优先,读写分离,读从可能存在不一致,最终一致性CP

       LettuceClientConfiguration lettuceClientConfiguration =  LettuceClientConfiguration.builder()

               .readFrom(ReadFrom.SLAVE_PREFERRED)

               .clientOptions(clusterClientOptions).build();

       return new  LettuceConnectionFactory(redisClusterConfiguration,  lettuceClientConfiguration);

   }

   @Bean

   public RedisTemplate<Object, Object>  redisTemplate(LettuceConnectionFactory redisConnectionFactory) {

       RedisTemplate<Object, Object> redisTemplate = new  RedisTemplate<>();

        redisTemplate.setConnectionFactory(redisConnectionFactory);

       Jackson2JsonRedisSerializer jackson2JsonRedisSerializer = new  Jackson2JsonRedisSerializer(Object.class);      

       ObjectMapper om = new ObjectMapper();

       

       SimpleModule simpleModule = new SimpleModule();

       simpleModule.addSerializer(DateTime.class,new  JodaDateTimeJsonSerializer());

       simpleModule.addDeserializer(DateTime.class,new  JodaDateTimeJsonDeserializer());

       om.registerModule(simpleModule);

        om.setVisibility(PropertyAccessor.ALL,JsonAutoDetect.Visibility.ANY);

        om.enableDefaultTyping(ObjectMapper.DefaultTyping.NON_FINAL);

       jackson2JsonRedisSerializer.setObjectMapper(om);

       

        redisTemplate.setValueSerializer(jackson2JsonRedisSerializer);

       redisTemplate.setKeySerializer(new  StringRedisSerializer());

       redisTemplate.afterPropertiesSet();

       return redisTemplate;

   }

}

     



本地数据热点缓存 (二级)

      不叫本地缓存是因为: 1、热点数据  2、脏读非常不敏感 3、内存可控 。使用的是JVM缓存。本地缓存生命周期比较短


        方式一 : Guava cache   Guava深入学习了解

                   可以控制的大小和超时时间

                   可配置的lru策略

                   线程安全

           

       <dependency>

           <groupId>com.google.guava</groupId>

           <artifactId>guava</artifactId>

           <version>23.0</version>

       </dependency>


         问题 : 存在数据更新,本地缓存没有更新的问题???




nginx proxy cache 缓存 (三级) 推荐nginx lua


      1、nginx反向代理 前置条件

        2、依靠文件系统存索引级的文件

        3、依靠内存缓存文件地址 就是key

       

      配置 :

    proxy_cache_path  

   key内存100m 保存时间7天 存在目录一共10G

   

   location 配置

image.png





      问题 : 不应该访问本地文件磁盘,降低读本地文件性能降低 应该读取远程NAS,文件应该无线大。





  16、nginx lua 推荐代替 nginx proxy cache


          1、lua 协程机制 。https://coding.imooc.com/lesson/338.html#mid=24955

               依托于线程 无需考虑异步机制 。如果阻塞 会想epoll放弃自己的调用权限

               image.png

         2、nginx 协程机制 https://coding.imooc.com/lesson/338.html#mid=24956

               image.png

               image.png

image.png

               

         3、nginx lua 插槽点

            image.png


image.png

         实战 https://coding.imooc.com/lesson/338.html#mid=24958

           主要常用在content_by_lua

               image.png

             好处: 使用lua脚本直接处理业务逻辑不用访问后端

               

           4、openresty

           image.png

               

               

           image.png


               4.1 openresty hellow world  注意路径地址

               4.2 share dic

                   4.2.1 配置share dic https://coding.imooc.com/lesson/338.html#mid=24961

image.png


           image.png

   


            4.4、openresty redis 可以代替share dichttps://coding.imooc.com/lesson/338.html#mid=24962


image.png

           

相关实践学习
基于Redis实现在线游戏积分排行榜
本场景将介绍如何基于Redis数据库实现在线游戏中的游戏玩家积分排行榜功能。
云数据库 Redis 版使用教程
云数据库Redis版是兼容Redis协议标准的、提供持久化的内存数据库服务,基于高可靠双机热备架构及可无缝扩展的集群架构,满足高读写性能场景及容量需弹性变配的业务需求。 产品详情:https://www.aliyun.com/product/kvstore &nbsp; &nbsp; ------------------------------------------------------------------------- 阿里云数据库体验:数据库上云实战 开发者云会免费提供一台带自建MySQL的源数据库&nbsp;ECS 实例和一台目标数据库&nbsp;RDS实例。跟着指引,您可以一步步实现将ECS自建数据库迁移到目标数据库RDS。 点击下方链接,领取免费ECS&amp;RDS资源,30分钟完成数据库上云实战!https://developer.aliyun.com/adc/scenario/51eefbd1894e42f6bb9acacadd3f9121?spm=a2c6h.13788135.J_3257954370.9.4ba85f24utseFl
目录
相关文章
|
人工智能 安全 物联网
程序员:除了技术,还有什么更重要?
本文分享崮德老师关于危机感、结构化思考、演讲力及商业化思考方面的经验心得,希望能带给大家一些启发。
|
存储 数据采集 监控
关于大规模实时数仓搭建,我有几条心得...
闲鱼数仓搭建之路——实时性的背后
475 0
关于大规模实时数仓搭建,我有几条心得...
|
存储 弹性计算 网络安全
基于OSS搭建个人云上博客
使用ECS和OSS搭建个人云上博客
1264 2
|
存储 开发工具 git
【软考学习16】用位示图法,轻松解决空闲存储空间的管理难题
【软考学习16】用位示图法,轻松解决空闲存储空间的管理难题
457 0
|
弹性计算
阿里云服务器公网宽带价格表(固定宽带+按量计费+使用流量)
2023阿里云服务器公网宽带价格表(固定宽带+按量计费+使用流量),阿里云服务器公网带宽计费模式按固定带宽和按使用流量哪个划算?按固定带宽计费1M带宽一个月23元,按使用流量计费1GB流量0.8元,如果云服务器带宽使用率低于10%,那么首选按使用流量计费,如果带宽实际利用率较高的话,按固定带宽计费更划算一些。云服务器吧来详细说下阿里云服务器带宽不同计费模式下收费价格、费用计算方法及如何选择更合适说明:
696 0
阿里云服务器公网宽带价格表(固定宽带+按量计费+使用流量)
|
9月前
|
机器学习/深度学习 数据可视化 数据挖掘
【视频】线性混合效应模型(LMM,Linear Mixed Models)和R语言实现案例(一)
【视频】线性混合效应模型(LMM,Linear Mixed Models)和R语言实现案例
|
存储 Prometheus Kubernetes
|
移动开发 Oracle 关系型数据库
Oracle分页查询语句(一)
Oracle的分页查询语句基本上可以按照本文给出的格式来进行套用。 分页查询格式: SELECT * FROM (SELECT A.*, ROWNUM RN FROM (SELECT * FROM TABLE_NAME) A WHERE ROWNUM = 21 其中最内层的查询SELECT * FROM TABLE_NAME表示不进行翻页的原始查询语句。
2536 0
|
机器学习/深度学习 自然语言处理 PyTorch
PyTorch应用实战六:利用LSTM实现文本情感分类
PyTorch应用实战六:利用LSTM实现文本情感分类
377 0
|
存储 监控 Linux
从网络I/O模型到Netty,先深入了解下I/O多路复用
从网络I/O模型到Netty,先深入了解下I/O多路复用
225 1
从网络I/O模型到Netty,先深入了解下I/O多路复用

热门文章

最新文章