Redis数据过期策略
引言Redis作为一个高性能的内存NoSQL数据库,其容量受到最大内存限制的限制。为了防止一次性清理大量过期Key导致Redis服务受影响,Redis只在空闲时清理过期Key。
Redis过期时间设置过期时间redis有四种命令可以用于设置键的生存时间和过期时间:
1234EXPIRE <KEY> <TTL> : 将键的生存时间设为 ttl 秒PEXPIRE <KEY> <TTL> : 将键的生存时间设为 ttl 毫秒EXPIREAT <KEY> <timestamp> : 将键的过期时间设为 timestamp 所指定的秒数时间戳PEXPIREAT <KEY> <timestamp>: 将键的过期时间设为 timestamp 所指定的毫秒数时间戳.
返回值
一个整数值1或0,如下:
如果成功地为该键设置了超时时间,返回 1
如果键不存在或无法设置超时时间,返回 0
保存过期时间redis中key的过期时间和生存时间保存方式:在数据库结构redisDb中的expires字典中保 ...
Spring之动态代理
引言Spring主要有两大思想,一个是AOP,一个是IOC。对于Spring的核心AOP来说,动态代理机制是其核心,想要明白AOP原理,一定要了解动态代理机制。
代理模式
给某个对象提供一个代理对象,并由代理对象控制对于原对象的访问,即操作者不直接操控原对象,而是通过代理对象简介地操控原对象。
实现代理模式分为静态代理和动态代理:
静态代理:代理类是在编译时就实现好。也就是说 Java 编译完成后代理类是一个实际的 class 文件。
动态代理:动态代理类的字节码是在程序运行时由Java反射机制动态生成。也就是说 Java 编译完之后并没有实际的 class 文件,而是在运行时动态生成的类字节码,并加载到JVM中。
Spring静态代理
由程序员创建或工具生成代理类的源码,再编译代理类。所谓静态也就是在程序运行前就已经存在代理类的字节码文件,代理类和委托类的关系在运行前就确定了。
静态代理之前已经说过 Spring-AOP两种配置方式
Spring动态代理JDK动态代理(对有实现接口的对象做代理)
实现方式说明JDK动态代理中 需要了解的两个重要的类或接口 [Invo ...
Apache-Commons-Email发送邮件
引言使用Apache-Commons-Email发送邮件
环境准备Maven的pom.xml 文件中引入依赖
12345<dependency> <groupId>org.apache.commons</groupId> <artifactId>commons-email</artifactId> <version>1.5</version></dependency>
一个简单的纯文本邮件HTTP模式下第一个例子是创建一个简单的email。
123456789101112131415161718192021222324252627282930313233343536373839import org.apache.commons.mail.EmailException;import org.apache.commons.mail.SimpleEmail;/*** 类名: TestSimpleEmail.java <br/>* 详细描述: 一个简单的纯文本邮件 ...
Mybatis之缓存
引言Mybatis中有一级缓存和二级缓存,默认情况下一级缓存是开启的,而且是不能关闭的。一级缓存是指SqlSession级别的缓存,当在同一个SqlSession中进行相同的SQL语句查询时,第二次以后的查询不会从数据库查询,而是直接从缓存中获取,一级缓存最多缓存1024条SQL。二级缓存是指可以跨SqlSession的缓存。
Mybatis缓存缓存的意义:将用户经常查询的数据放在缓存(内存)中,用户去查询数据就不用从磁盘上(关系型数据库数据文件)查询,从缓存中查询,从而提高查询效率,解决了高并发系统的性能问题。
Mybatis提供一级缓存和二级缓存
mybatis一级缓存是一个SqlSession级别,sqlsession只能访问自己的一级缓存的数据。
二级缓存是跨sqlSession,是mapper级别的缓存,对于mapper级别的缓存不同的sqlsession是可以共享的。
Mybatis一级缓存Mybatis的一级缓存原理:
第一次发出一个查询sql,sql查询结果写入sqlsession的一级缓存中,缓存使用的数据结构是一个map<key,value> ...
线程池之ThreadPoolExecutor
引言JAVA对于多线程的封装非常丰富,提供了多种适用于不同场景的多并发实现。但如果并发的线程数量很多,并且每个线程都是执行一个时间很短的任务就结束了,这样频繁创建线程就会大大降低系统的效率,因为频繁创建线程和销毁线程需要时间。这里就引入了线程池来管理线程,其中最基础、最核心的线程池要属ThreadPoolExecutor类了。
Java中的ThreadPoolExecutor类java.uitl.concurrent.ThreadPoolExecutor类是线程池中最核心的一个类,因此如果要透彻地了解Java中的线程池,必须先了解这个类。下面我们来看一下ThreadPoolExecutor类的具体实现源码。
在ThreadPoolExecutor类中提供了四个构造方法:
123456789101112131415161718192021public class ThreadPoolExecutor extends AbstractExecutorService { ..... public ThreadPoolExecutor(int corePoolSize,int ...
Spring+webSocket
引言websocket 是 HTML5新增加特性之一,目的是浏览器与服务端建立全双工的通信方式,解决 HTTP请求-响应带来过多的资源消耗,同时对特殊场景应用提供了全新的实现方式,比如聊天、股票交易、游戏等对对实时性要求较高的行业领域。
STOMPSTOMP(Simple Text-Orientated Messaging Protocol) 面向消息的简单文本协议。
WebSocket是一个消息架构,不强制使用任何特定的消息协议,它依赖于应用层解释消息的含义;
与处在应用层的HTTP不同,WebSocket处在TCP上非常薄的一层,会将字节流转换为文本/二进制消息,因此,对于实际应用来说,WebSocket的通信形式层级过低,因此,可以在 WebSocket 之上使用 STOMP协议,来为浏览器 和 server间的 通信增加适当的消息语义。
如何理解 STOMP 与 WebSocket 的关系:
HTTP协议解决了 web 浏览器发起请求以及 web 服务器响应请求的细节,假设 HTTP 协议 并不存在,只能使用 TCP 套接字来 编写 web 应用,你可能认为这是一件疯狂的事 ...
谈谈敏捷开发
引言敏捷开发是一种从上个世纪九十年代开始逐渐引起广泛关注的一些新型软件开发方法,是一种应对快速变化的需求的一种软件开发能力。常言道:“天下武功,唯快不破”,此言用于形容“敏捷”的威力相当合适。敏捷意思为快,但敏捷思想不仅仅求快,它更多强调“多快好省”,产出得多,产出得快,产出得好,同时节省各种成本,既经济又实用。它们更强调程序员团队与业务专家之间的紧密协作、面对面的沟通(认为比书面的文档更有效)、频繁交付新的软件版本、紧凑而自我组织型的团队、能够很好地适应需求变化的代码编写和团队组织方法,也更注重软件开发过程中人的作用。
敏捷开发宣言和原则敏捷宣言的价值观
个体和互动 高于 流程和工具
工作的软件 高于 详尽的文档
客户合作 高于 合同谈判
响应变化 高于 遵循计划
也就是说,尽管右项有其价值,我们更重视左项的价值。
敏捷宣言的原则
我们最重要的目标,是通过持续不断地及早交付有价值的软件使客户满意。
欣然面对需求变化,即使在开发后期也一样。为了客户的竞争优势,敏捷过程掌控变化。
经常地交付可工作的软件,相隔几星期或一两个月,倾向于采取较短的周期。
业务人员和开发人员必须相互合作, ...
Sping定时任务
引言在企业开发中,经常会遇到时间任务调度的需求,比如每天凌晨生成前天报表、数据汇总等动态配置是否开启定时的任务。在Java领域中,定时任务的开源工具也非常多,小到一个Timer类,大到Quartz框架。在Spring中最常见的定时任务方式属Spring schedule注解的方式和利用Quartz动态管理定时任务。总体来说,个人比较喜欢的还是Quartz,功能强大而且使用方便。
Spring-@scheduled对于较简单的任务可以使用Spring内置的定时任务方法@scheduled注解进行配置达到自己的需求。
spring配置文件配置spring项目的基础文件spring.xml
123456789101112131415161718<?xml version="1.0" encoding="UTF-8"?> <beans xmlns:task="http://www.springframework.org/schema/task" xmlns="http://www.sp ...