精华内容
下载资源
问答
  • web项目启动缓存数据
    千次阅读
    2020-03-22 20:49:59

    1:启动项目时加载数据库数据到缓存中

    大体思路:
    1:自定义类实现InitializingBean接口
    2:并追加注解@Component
    3:set方法注入mapper
    4:从数据库查出的数据放入map中
    5:页面配置要改变的数据,修改后刷新map中的值,动态更新缓存数据

    2:具体实现的代码如下

    注意:需要引入自己的mapper查询结果

    import org.slf4j.Logger;
    import org.slf4j.LoggerFactory;
    import org.springframework.beans.factory.InitializingBean;
    import org.springframework.stereotype.Component;
    
    import javax.annotation.Resource;
    import java.util.HashMap;
    import java.util.List;
    import java.util.Map;
    
    /**
     * @description: TestPropertiesInit 属性数据初始化:
     * 实现InitializingBean接口,重写方法afterPropertiesSet()方法,可以在项目启动时进行加载
     * @author: 
     * @create: 2020.2.25
     */
    @Component("TestPropertiesInit")
    public class TestPropertiesInit implements InitializingBean {
    
        private static Logger logger = LoggerFactory.getLogger(TestPropertiesInit.class);
        //项目启动加载数据存入map中
        public static Map<String, String> map = new HashMap<String, String>();
    
        public static Map<String, String> getMap() {
            return map;
        }
    
    
        public static void setMap(Map<String, String> map) {
            TestPropertiesInit.map = map;
        }
    
        private ConstantMapper constantMapper;
    
        public ConstantMapper getConstantMapper() {
            return constantMapper;
        }
    
        //采用set方式获取对象,不能采用autowire,项目启动时未初始化完成spring对象
        @Resource
        public void setConstantMapper(ConstantMapper constantMapper) {
            this.constantMapper = constantMapper;
        }
    
        @Override
        public void afterPropertiesSet() throws Exception {
            logger.info("----初始化系统参数开始---------------start");
    
            List<Constant> constants = this.constantMapper.queryAllCode();
            for (Constant c : constants) {
                map.put(c.getCode(), c.getValue());
                //System.out.println("map====="+map.toString());
            }
            //System.out.println(map);
            logger.info("----初始化系统参数结束--------success-------end" + map.toString());
        }
    }
    
    
    更多相关内容
  • 实际应用中,我们会有在项目服务启动完成以后去加载一些数据或做一些事情(比如缓存)这样的需求。 为了解决这样的问题,Spring Boot 为我们提供了一个方法,通过实现接口 CommandLineRunner 来实现。很简单,只需要...

    实际应用中,我们会有在项目服务启动完成以后去加载一些数据或做一些事情(比如缓存)这样的需求。
    为了解决这样的问题,Spring Boot 为我们提供了一个方法,通过实现接口 CommandLineRunner 来实现。很简单,只需要一个类就可以,无需其他配置。

    Spring Boot应用程序在启动后,会遍历CommandLineRunner接口的实例并运行它们的run方法。也可以利用@Order注解(或者实现Order接口)来规定所有CommandLineRunner实例的运行顺序。@Order 注解的执行优先级是按value值从小到大顺序

    package com.tengjie.base.common.web;
    import com.tengjie.base.modules.province.entity.Province;
    import com.tengjie.base.modules.province.service.ProvinceService;
    import org.slf4j.Logger;
    import org.slf4j.LoggerFactory;
    import org.springframework.beans.factory.annotation.Autowired;
    import org.springframework.boot.CommandLineRunner;
    import org.springframework.core.annotation.Order;
    import org.springframework.scheduling.annotation.Scheduled;
    import org.springframework.stereotype.Component;
    import java.sql.ResultSet;
    import java.sql.SQLException;
    import java.util.ArrayList;
    import java.util.List;
    import java.util.Map;
    
    @Component
    @Order(value=2)
    public class AreaData implements CommandLineRunner {
        /**
         * 日志
         */
        private static final Logger logger= LoggerFactory.getLogger(AreaData.class);
    
        @Autowired
        private ProvinceService provinceService;
    
        public static List<Map<String, Object>> areaListMap = new ArrayList<>();
    
        @Override
        public void run(String... args) throws Exception {
            logger.info("***************开始加载省数据***************");
            Province province = Province.newInstance();
            areaListMap = provinceService.findListMap(province);
            logger.info("***************结束加载省数据***************");
        }
    }
    
    展开全文
  • 项目启动加载缓存

    千次阅读 2017-04-21 14:07:31
    Tomcat启动时加载数据缓存--Web.xml里listener的加载顺序,优先初始化Spring IOC容器 多个listener加载顺序  最近用到在Tomcat服务器启动时自动加载数据缓存,这就需要创建一个自定义的缓存监听器并...

    最近用到在Tomcat服务器启动时自动加载数据到缓存,这就需要创建一个自定义的缓存监听器并实现ServletContextListener接口,并且在此自定义监听器中需要用到Spring的依赖注入功能.在web.xml文件中监听器配置如下:

     

    Xml代码  
    1. <listener>  
    2.         <listener-class>  
    3.             org.springframework.web.context.ContextLoaderListener  
    4.         </listener-class>  
    5. </listener>  
    6. <listener>  
    7.     <listener-class>  
    8.         com.wsjiang.test.listener.CacheListener  
    9.     </listener-class>  
    10. </listener>  

     

          上面的配置细细大意为,先配置spring监听器,启动spring,再配置一个缓存监听器,我希望他们是顺序执行的,因为在缓存监听器中需要 spring注入其他对象的实例,我期望在服务器加载缓存监听器前加载Spring的监听器,将其优先实例化。但是实际运行发现他们并不是按照配置的顺序 加载的。


          对上面的问题我查询了很多资料,找到了一种解决方案,希望能帮助遇到同类问题的朋友。
          思路就是,既然listener的顺序是不固定的,那么我们可以整合两个listener到一个类中,这样就可以让初始化的顺序固定了。我就重写了 org.springframework.web.context.ContextLoaderListener这个类的 contextInitialized方法.大致代码如下:

    Java代码  
    1. public class ContextLoaderListenerOverWrite extends ContextLoaderListener {  
    2.     private IStationService stationService;  
    3.     private IOSCache osCache;  
    4.     @Override  
    5.     /** 
    6.      * @description 重写ContextLoaderListener的contextInitialized方法 
    7.      */  
    8.     public void contextInitialized(ServletContextEvent event) {  
    9.         super.contextInitialized(event);  
    10.         ApplicationContext applicationContext = WebApplicationContextUtils.getWebApplicationContext(event.getServletContext());  
    11.         //获取bean  
    12.         stationService = (IStationService) applicationContext.getBean("stationService");   
    13.         osCache = (IOSCache) applicationContext.getBean("osCache");  
    14.         /* 
    15.          具体地业务代码 
    16.          */  
    17.     }  
    18. }  

     

          web.xml的配置就由两个listener变为一个:

    Xml代码  
    1. <listener>  
    2.     <listener-class>  
    3.                  com.wsjiang.test.listener.ContextLoaderListenerOverWrite  
    4.         </listener-class>  
    5. </listener>  

           这样就能保证Spring的IOC容器先于自定义的缓存监听器初始化,在缓存监听器加载的时候就能使用依赖注入的实例.

    展开全文
  • 如何在web项目中添加redis缓存

    千次阅读 2018-09-26 20:58:48
    首先你需要明白,为什么要在你的项目中使用redis缓存?现在很多应用程序要存储结构简单更新频繁的数据,在我看来,字典表里的数据就是存储结构简单且更新频繁的数据,因此,需要读取字典表里的数据时,可以考虑使用redis了...
    • 摘要:redis是什么?这个应该是你做一下工作的前提,不明白的可以百科一下。如果你大概明白了redis的工作原理。那么请继续往下看:一。首先你需要明白,为什么要在你的项目中使用redis缓存?现在很多应用程序要存储结构简单更新频繁的数据,在我看来,字典表里的数据就是存储结构简单且更新频繁的数据,因此,需要读取字典表里的数据时,可以考虑使用redis了。这只是其中之一的例子。二。如何在web项目添加redis?在java项目中,redis提供了很多客户端库,我用的jedis,它封装了
    • redis 是什么?这个应该是你做一下工作的前提,不明白的可以百科一下。如果你大概明白了redis的工作原理。那么请继续往下看:

      一。首先你需要明白,为什么要在你的项目中使用redis缓存?

      现在很多应用程序要存储结构简单更新频繁的数据,在我看来,字典表里的数据就是存储结构简单且更新频繁的数据,因此,需要读取字典表里的数据时,可以考虑使用redis了。

      这只是其中之一的例子。

      二。如何在web项目添加redis?

      在java项目中,redis提供了很多客户端库,我用的jedis,它封装了对redis数据库的所有操作。

      一般web应用中,我们还会用到spring,方便的地方在于spring本身也提供了对redis的支持--spring-data-redis,可以到官网查看文档,并有实例。

      具体步骤:

      1.引入pom依赖(如果没用maven的话,自行引入jar包吧)

      <dependencies>
          <dependency>
              <groupId>org.springframework.data</groupId>
              <artifactId>spring-data-redis</artifactId>
              <version>1.5.0.RELEASE</version>
          </dependency>
      </dependencies>

      同时将jedis也依赖上,因为spring-data-redis底层就是用的jedis:

           <dependency>
                  <groupId>redis.clients</groupId>
                  <artifactId>jedis</artifactId>
                  <version>2.6.0</version>
                  <type>jar</type>
                  <scope>compile</scope>
              </dependency>

       

      2.在容器中配置RedisTemplate实例

      <bean id="jedisConnFactory" 
          class="org.springframework.data.redis.connection.jedis.JedisConnectionFactory" 
          p:use-pool="true"/>
      
      <!-- redis template definition -->
      <bean id="redisTemplate" 
          class="org.springframework.data.redis.core.RedisTemplate" 
          p:connection-factory-ref="jedisConnFactory"/>

      注意:这是官网直接复制过来的,我这样直接放在xml中,会报错,即使是引入p的命名空间。然后我就尝试将p属性写成property后,就没有报错了,但是在后面用的时候会key和value会出现类似"\xac\xed\x00\x05t\x00\tb "这样的情况,查询得知这是因为spring-data-redis需要将数据存储到jedis中,这中间需要序列化,再由jedis存储到数据库,问题就出在序列化上了,它会将key和value的类型信息也序列化后带上,这显然不是我们想要的结果。

      所以RedisTemplate提供了对key和value序列化类,于是我打算这样:

      <bean id="redisTemplate"
                class="org.springframework.data.redis.core.RedisTemplate">
              <property name="connectionFactory" ref="jedisConnFactory"/>
              <property name="keySerializer">
                  <bean class="org.springframework.data.redis.serializer.StringRedisSerializer"/>
              </property>
              <property name="hashKeySerializer">
                  <bean class="org.springframework.data.redis.serializer.GenericToStringSerializer"/>
              </property>
              <property name="valueSerializer">
                  <bean class="org.springframework.data.redis.serializer.GenericToStringSerializer"/>
              </property>
              <property name="hashValueSerializer">
                  <bean class="org.springframework.data.redis.serializer.StringRedisSerializer"/>
              </property>
          </bean>

      可是中间两个序列化类还是报错,没有无参构造器,所以就准备采用构造器注入的方式,但是要求注入的参数是一个Object.class类型,我也不知道怎么注入这种类型的,搞来搞去还是干脆就不要xml了,直接写配置类:

      @Configuration
      public class RedisConfig {
          @Bean
          JedisConnectionFactory jedisConnectionFactory() {
              return new JedisConnectionFactory();
          }
      
          @Bean
          RedisTemplate<String, Object> redisTemplate() {
              final RedisTemplate<String, Object> template = new RedisTemplate<>();
              template.setConnectionFactory(jedisConnectionFactory());
              template.setKeySerializer(new StringRedisSerializer());
              template.setHashKeySerializer(new GenericToStringSerializer<>(Object.class));
              template.setValueSerializer(new GenericToStringSerializer<>(Object.class));
              return template;
          }
      }

      这下可算可以了(当然要注意扫描包)。

      有了RedisTemplate之后,就可以写具体的实现业务类了,RedisTemplate基本支持所有redis操作,比如:

      @Component
      public class SpringRedisClientImpl implements SpringRedisClient {
          @Autowired
          private RedisTemplate<String, Object> template;
          @Autowired
          private JedisConnectionFactory jedisConnectionFactory;
      
          @Override
          public void setKey(String key, String value) {
              template.opsForValue().set(key, value);
          }
      
          @Override
          public Object getKey(String key) {
              return template.opsForValue().get(key);
          }
      
          @Override
          public void incr(String key) {
              template.opsForValue().increment(key, 1);
          }
      
          @Override
          public void lPush(String key, String value) {
              template.opsForList().leftPush(key, value);
          }
      
          @Override
          public boolean checkKey(String key) {
              return template.hasKey(key);
          }
      
          @Override
          public Object lIndex(String key) {
              return template.opsForList().index(key, 0);
          }
      
          @Override
          public Long llength(String key) {
              return template.opsForList().size(key);
          }
      
          @Override
          public String lpop(String key) {
      
              return (String) template.opsForList().leftPop(key);
          }
      
          @Override
          public Set<String> getKeys(String pattern) {
              return template.keys(pattern);
          }
      
          @Override
          public void flushAll() {
              Jedis jedis = jedisConnectionFactory.getShardInfo().createResource();
              jedis.flushAll();
              jedis.close();
          }
      }

      最后,启动redis-server.exe就可以了(这里要注意要先启动这个,再启动web项目,否则启动不了,原因未知),如果对redis比较熟悉的,可以自行配置redis.windows.conf文件。其实我也不太熟悉conf文件里面的配置,尤其是持久化到磁盘那个。所以在我的项目里,我是将数据以每天为单位保存到mysql中,并清空redis。

    展开全文
  • 因为在项目中,会有字典表,机构表,用户表,这些一般情况下,数据发生改变的的概率比较小,而且经常涉及到查询,转码,查询数据库的频率较高,因此在项目启动时将这些数据表加载到缓存中,以便使用。 redis是一种...
  • 最近用到在Tomcat服务器启动时自动加载数据缓存,这就需要创建一个自定义的缓存监听器并实现ServletContextListener接口,并且在此自定义监听器中需要用到Spring的依赖注入功能.在web.xml文件中监听器配置如下: ...
  • Nginx的Web缓存服务及清除缓存

    千次阅读 2021-10-20 09:29:38
    Nginx作为Web缓存服务器,它介于客户端和应用服务器之间,当用户通过浏览器访问一个URL时,web缓存服务器会去应用服务器获取要展示给用户的内容,将内容缓存到自己的服务器上,当下一次请求到来时,如果访问的是同一...
  • 这次项目配置服务器,需要nginx相关的一些反向代理的一些配置,所以简单研究了一下。关于nginx的配置,网上的文章也是众说纷纭,五花八门,大多都是直接一大段配置文件展示,然后,你懂滴…… 一、首先安装nginx  ...
  • 缓存,已经是现在系统中必不可少的内容,如何使用好缓存,对系统的性能和效率至关重要,这里我就来分析一下使用缓存的正确姿势吧。如今的微服务项目,都是前后端分离,上面就是简单的服务架构图。在整...
  • Asp.net 数据缓存

    千次阅读 2018-04-18 18:50:39
    Web应用程序的上下文中,缓存用于在HTTP请求时保留页或者数据,并在无须新创建的情况下多次使用它们。请记住,一旦应用程序停止或者重新启动,其缓存将被清除。 在我解释cache管理机制时,首先让我阐明下一个...
  • 记住,不能一次将所有的数据全部传入web界面,这样web界面的响应加载时间会特别长,速度非常慢;这样做,第一次查询的时间大概2-3s,但是翻页的结果是直接从redis数据库中取的,所以响应时间特别快。 使用...
  • Web缓存

    千次阅读 2015-11-17 15:01:43
    由于测试的同事比较细心和专业,发现了项目实现中一些效率低下的环节,比如在线预览图片没有经过压缩、重开打开同一张图片没有有效利用Web缓存等问题。而这些细节问题往往在做项目架构时,容易因为时间紧张等等因素...
  • HTTP和Web缓存

    万次阅读 2017-03-03 23:06:12
    场景:想象一下你是木叶村的火影,现在你想同砂忍村的风影建交。你必须指派一名忍者来传达建交文书,为确保文书的完好,你指派的忍者必须非常...即使你在北极,将数据传达到南极,HTTP也会完整地将数据传递过去。 在
  • 最近用到在Tomcat服务器启动时自动加载数据缓存,这就需要创建一个自定义的缓存监听器并实现ServletContextListener接口,并且在此自定义监听器中需要用到Spring的依赖注入功能.在web.xml文件中监听器配置如下:Xml...
  • VUE实现页面缓存

    千次阅读 2021-10-27 09:08:42
    主要利用keep-alive实现从列表页跳转到详情页,然后点击返回时,页面缓存不用重新请求资源。 一、在router里配置路由 import Vue from "vue"; import Router from "vue-router"; // 避免到当前位置的冗余导航 const...
  •  新建项目工程就不再演示,在整合mybatis的时候已经给出了.  链接地址在这里~Springboot整合mybatis 1、在pom.xml文件中添加依赖  基于上篇文章的,其实也就是多了redis的依赖和缓存依赖罢了 <!-- 引入缓存...
  • 快速从零搭建一个SpringBoot Web项目

    千次阅读 2020-12-02 11:15:56
    从零快速搭建一个SpringBoot Web项目 环境: IDEA+Navicat+Jdk1.8+Mysql5.7 SpringBoot+Thymeleaf+Mybatis+SpringSecurity 目录 从零快速搭建一个SpringBoot Web项目 1 一、新建一个SpringBoot项目 2 1.1 选择...
  • web本地客户端缓存图片实现

    千次阅读 2015-07-30 23:41:53
    如果要使用HTTP/1.0协议来告诉客户端(包括任何中介代理)是否要缓存数据,可以使用以下代码,如果设置liftTime参数则告诉客户端数据缓存的生命期为lifeTime的值: view plain copy to clipboard print ? ...
  • web开发中设置页面禁止缓存

    万次阅读 2015-02-04 14:38:18
    java代码: // 禁止缓存 response.setHeader("Cache-Control", "no-store"); response.setHeader("Pragrma", "no-cache"); response.setDateHeader("Expires", 0); jsp代码:
  • 基于Spring的Web缓存

    千次阅读 2016-04-30 13:16:57
    Spring作为一个成熟的java web 框架,自身有一套完善的缓存机制,同时,Spring还未其他缓存的实现提供了扩展。今天让我们在一个简单的应用中尝试spring的数据库缓存、应用层缓存、页面缓存的实现。
  • 我正在开发一个使用cefsharp浏览器作为其一部分的银行设备上的...我想在关闭后清除所有缓存的浏览器数据.public void InitBrowser(){settings = new CefSettings();settings.CachePath = AppDomain.CurrentDomain...
  • SpringBoot/Web项目防止表单/请求重复提交(单机和分布式) 一、场景/方案 说起web项目的防止表单/请求重复提交,不得不说幂等性。 幂等性, 通俗的说就是一个接口, 多次发起同一个请求, 必须保证操作只能执行一次。...
  • 微服务20_多级缓存01:JVM进程缓存

    千次阅读 2022-04-06 11:52:18
    微服务20_多级缓存01:JVM进程缓存前言:什么是多级缓存?1、传统缓存的问题:2、多级缓存方案一、JVM进程缓存(Tomcat内部编写进程缓存)1、导入商品案例1.安装mysql2.导入Demo3. 商品查询页面 来调用controller的...
  • nginx 缓存使用详解

    万次阅读 多人点赞 2022-05-08 10:30:24
    nginx 缓存使用详解
  • 深度解析数据缓存技术

    万次阅读 2018-03-21 17:54:39
    缓存是分布式系统中的重要组件,主要解决高并发,大数据场景下,热点数据访问的性能问题。提供高性能的数据快速访问。 1.1.缓存的原理 将数据写入/读取速度更快的存储(设备); 将数据缓存到离应用最近的...
  • Tomcat下发布Web项目

    千次阅读 2020-03-20 16:10:03
    为了可以通过浏览器访问到自己tomcat下的web项目,我们需要先了解以下内容: Web开发概述 1.1WEB通信 WEB采用B/S通信模式,通过超文本传送协议(HTTP, Hypertext transport protocol)进行通信。通过浏览器地址栏编写...
  • 如何在Vue项目中使用websql数据库

    千次阅读 2019-01-16 09:44:56
    *在移动端项目开发中,可能需要因为项目的特殊性需要在本地存储大量的数据,因为我选择使用websql数据库来实现大量数据的存储。 **对于一些懂数据库的可以很好的理解websql,说到底其实他就是一个存在于浏览器端的...
  • 很多小伙伴都选择从网上购买或者下载源码来作为毕业设计的参考,但是由于每个人运行环境各不相同,导致很多同学在运行过程中遇到一些奇怪的问题,比如最近经常有小伙伴跟我反映,在运行JavaWeb项目时,会碰到Web页面...
  • myeclipse 清理项目缓存的几大步骤

    万次阅读 2015-10-19 11:23:17
    相信大家被项目缓存折腾过吧,这里罗列几条清除项目缓存的方法 1、项目清理: 选择菜单栏的Project——>Clean..——>勾选需要清理的项目(也可以选择all) 切记:clean了项目,需要重新编译 2、项目如果...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 229,414
精华内容 91,765
关键字:

web项目启动缓存数据