南部县建设局网站,网页布局的基本概念,在线做投资网站,怎么制作网址内容原文地址#xff1a;Spring Boot 入门之缓存和 NoSQL 篇#xff08;四#xff09; 博客地址#xff1a;http://www.extlight.com 一、前言 当系统的访问量增大时#xff0c;相应的数据库的性能就逐渐下降。但是#xff0c;大多数请求都是在重复的获取相同的数据#xff… 原文地址Spring Boot 入门之缓存和 NoSQL 篇四 博客地址http://www.extlight.com 一、前言 当系统的访问量增大时相应的数据库的性能就逐渐下降。但是大多数请求都是在重复的获取相同的数据如果使用缓存将结果数据放入其中可以很大程度上减轻数据库的负担提升系统的响应速度。 本篇将介绍 Spring Boot 中缓存和 NoSQL 的使用。上篇文章《Spring Boot 入门之持久层篇三》。 二、整合缓存 Spring Boot 针对不同的缓存技术实现了不同的封装本篇主要介绍 EhCache 和 Redis 缓存。 Spring Boot 提供了以下几个注解实现声明式缓存 注解说明EnableCaching开启缓存功能放在配置类或启动类上CacheConfig缓存配置设置缓存名称Cacheable执行方法前先查询缓存是否有数据。有则直接返回缓存数据否则查询数据再将数据放入缓存CachePut执行新增或更新方法后将数据放入缓存中CacheEvict清除缓存Caching将多个缓存操作重新组合到一个方法中2.1 EhCache 缓存 2.1.1 添加依赖 dependencygroupIdorg.springframework.boot/groupIdartifactIdspring-boot-starter-cache/artifactId
/dependencydependencygroupIdnet.sf.ehcache/groupIdartifactIdehcache/artifactId
/dependency 2.1.2 添加配置 1在 src/main/resources 目录下创建 ehcache.xml 文件内容如下 ?xml version1.0 encodingUTF-8?
ehcache xmlns:xsihttp://www.w3.org/2001/XMLSchema-instancexsi:noNamespaceSchemaLocationhttp://ehcache.org/ehcache.xsd!-- 磁盘缓存位置 --diskStore pathjava.io.tmpdir/ehcache/!-- 默认缓存 --defaultCachemaxEntriesLocalHeap10000eternalfalsetimeToIdleSeconds120timeToLiveSeconds120maxEntriesLocalDisk10000000diskExpiryThreadIntervalSeconds120memoryStoreEvictionPolicyLRUpersistence strategylocalTempSwap//defaultCache!-- 自定义缓存 --cache namedepartmentmaxElementsInMemory1000eternalfalsetimeToIdleSeconds50timeToLiveSeconds50overflowToDiskfalsememoryStoreEvictionPolicyLRU/
/ehcache 说明 nameCache 的唯一标识
maxElementsInMemory内存中允许存储的最大的元素个数
maxElementsOnDisk硬盘最大缓存个数0代表无限个
clearOnFlush内存数量最大时是否清除
eternal缓存对象是否永久有效如果是超时设置将被忽略
overflowToDisk内存不足超过 maxElementsInMemory时是否启用磁盘缓存
timeToIdleSeconds设置对象在失效前的允许闲置时间单位秒。仅当eternalfalse对象不是永久有效时使用可选属性默认值是0也就是可闲置时间无穷大
timeToLiveSeconds缓存数据的生存时间TTL也就是一个元素从构建到消亡的最大时间间隔值这只能在元素不是永久驻留时有效如果该值是0就意味着元素可以停顿无穷长的时间
diskPersistent是否将缓存数据持久化到磁盘上如果为 trueJVM 重启数据依然存在。默认值是false
diskSpoolBufferSizeMB这个参数设置DiskStore磁盘缓存的缓存区大小。默认是30MB。每个Cache都应该有自己的一个缓冲区
diskExpiryThreadIntervalSeconds磁盘失效线程运行时间间隔默认是120秒
memoryStoreEvictionPolicy当达到 maxElementsInMemory 限制时Ehcache 将根据指定策略清除内存。默认为 LRU最近最少使用其他策略有 FIFO先进先出LFU较少使用 2application.properties # 缓存类型ehcache、redis
spring.cache.typeehcache# ehcache 配置文件
spring.cache.ehcache.configclasspath:ehcache.xml# 打印日志查看 sql
logging.level.com.light.springbootDEBUG 2.1.3 编码 在持久层篇的基础上结合 Mybatis 测试 Service 层 CacheConfig(cacheNames department)
Service
public class DepartmentService {Autowiredprivate DepartmentMapper departmentMapper;CachePut(key #department.id)public Department save(Department department) {System.out.println(保存 id department.getId() 的数据);this.departmentMapper.insert(department);return department;}CachePut(key #department.id)public Department update(Department department) {System.out.println(修改 id department.getId() 的数据);this.departmentMapper.update(department);return department;}Cacheable(key #id)public Department getDepartmentById(Integer id) {System.out.println(获取 id id 的数据);Department department this.departmentMapper.getById(id);return department;}CacheEvict(key #id)public void delete(Integer id) {System.out.println(删除 id id 的数据);this.departmentMapper.deleteById(id);}
} 控制层 Controller
RequestMapping(department)
ResponseBody
public class DepartmentController {Autowiredprivate DepartmentService departmentService;RequestMapping(save)public MapString,Object save(Department department) {this.departmentService.save(department);MapString,Object map new HashMapString,Object();map.put(code, 200);map.put(msg, 保存成功);return map;}RequestMapping(get/{id})public MapString,Object get(PathVariable(id) Integer id) {Department department this.departmentService.getDepartmentById(id);MapString,Object map new HashMapString,Object();map.put(code, 200);map.put(msg, 获取成功);map.put(data, department);return map;}RequestMapping(update)public MapString,Object update(Department department) {this.departmentService.update(department);MapString,Object map new HashMapString,Object();map.put(code, 200);map.put(msg, 修改成功);return map;}RequestMapping(delete/{id})public MapString,Object delete(PathVariable(id) Integer id) {this.departmentService.delete(id);MapString,Object map new HashMapString,Object();map.put(code, 200);map.put(msg, 删除成功);return map;}
} 启动类 添加 EnableCaching 注解开启缓存功能。 EnableCaching
SpringBootApplication
public class SpringbootNosqlApplication {public static void main(String[] args) {SpringApplication.run(SpringbootNosqlApplication.class, args);}
}2.1.4 测试说明 1) 发起保存请求 保存 id2 的数据
2017-12-06 14:50:48.800 DEBUG 680 --- [nio-8081-exec-7] c.l.s.dao.DepartmentMapper.insert : Preparing: insert into department(id,name,descr) values(?,?,?)
2017-12-06 14:50:48.801 DEBUG 680 --- [nio-8081-exec-7] c.l.s.dao.DepartmentMapper.insert : Parameters: 2(Integer), Ehcache 部门(String), Ehcache(String)
2017-12-06 14:50:48.868 DEBUG 680 --- [nio-8081-exec-7] c.l.s.dao.DepartmentMapper.insert : Updates: 1 2) 保存成功后立刻发起查询请求没有日志打印但返回对象数据说明数据是从缓存中获取。 3) 发起修改请求 修改 id2 的数据
2017-12-06 14:51:16.588 DEBUG 680 --- [nio-8081-exec-8] c.l.s.dao.DepartmentMapper.update : Preparing: update department set name ? , descr ? where id ?
2017-12-06 14:51:16.589 DEBUG 680 --- [nio-8081-exec-8] c.l.s.dao.DepartmentMapper.update : Parameters: Ehcache 部门2(String), Ehcache2(String), 2(Integer)
2017-12-06 14:51:16.657 DEBUG 680 --- [nio-8081-exec-8] c.l.s.dao.DepartmentMapper.update : Updates: 1 4) 修改成功后立刻发起查询请求没有日志打印但返回修改后的对象数据说明缓存中的数据已经同步。 5) 发起删除请求 删除 id2 的数据
2017-12-06 14:52:07.572 DEBUG 680 --- [nio-8081-exec-1] c.l.s.dao.DepartmentMapper.deleteById : Preparing: delete from department where id ?
2017-12-06 14:52:07.572 DEBUG 680 --- [nio-8081-exec-1] c.l.s.dao.DepartmentMapper.deleteById : Parameters: 2(Integer)
2017-12-06 14:52:07.613 DEBUG 680 --- [nio-8081-exec-1] c.l.s.dao.DepartmentMapper.deleteById : Updates: 1 6) 删除成功后立刻发起查询请求控制台打印 sql 语句说明缓存数据被删除需要查询数据库。 获取 id2 的数据
2017-12-06 14:52:40.324 DEBUG 680 --- [nio-8081-exec-3] c.l.s.dao.DepartmentMapper.getById : Preparing: select id,name,descr from department where id ?
2017-12-06 14:52:40.325 DEBUG 680 --- [nio-8081-exec-3] c.l.s.dao.DepartmentMapper.getById : Parameters: 2(Integer)
2017-12-06 14:52:40.328 DEBUG 680 --- [nio-8081-exec-3] c.l.s.dao.DepartmentMapper.getById : Total: 0 2.2 Redis 缓存 2.2.1 添加依赖 dependencygroupIdorg.springframework.boot/groupIdartifactIdspring-boot-starter-data-redis/artifactId
/dependency 2.2.2 添加配置 application.properties # redis 配置
spring.redis.host192.168.2.11
spring.redis.port6379
spring.redis.passwordredis123
# 缓存过期时间单位毫秒
spring.cache.redis.time-to-live60000# 缓存类型ehcache、redis
spring.cache.typeredis# 打印日志查看 sql
logging.level.com.light.springbootDEBUG 注意spring.cache.typeredis缓存类型设置成 redis。 完成上边 2 个步骤后其他步骤与测试 Ehcache 时的步骤一致。 测试结果也一致此处省略。 三、整合 Redis 上一个小节其实已经介绍了 Spring Boot 整合 Redis 的内容。 在添加 redis 依赖包启动项目后Spring Boot 会自动配置 RedisCacheManger 和 RedisTemplate 的 Bean。如果开发者不想使用 Spring Boot 写好的 Redis 缓存而是想使用其 API 自己实现缓存功能、消息队列或分布式锁之类的需求时可以继续往下浏览。 Spring Data Redis 为我们提供 RedisTemplate 和 StringRedisTemplate 两个模板进行数据操作它们主要 的访问方法如下 方法说明opsForValue()操作简单属性的数据opsForList()操作含有 list 的数据opsForSet()操作含有 set 的数据opsForZSet()操作含有 zset 的数据opsForHash()操作含有 hash 的数据3.1 添加依赖 dependencygroupIdorg.springframework.boot/groupIdartifactIdspring-boot-starter-data-redis/artifactId
/dependency 3.2 配置连接 spring.redis.host192.168.2.11
spring.redis.port6379
spring.redis.passwordredis123 3.3 编码 Component
public class RedisDao {Autowiredprivate StringRedisTemplate stringRedisTemplate;public void set(String key, String value) {this.stringRedisTemplate.opsForValue().set(key, value);}public String get(String key) {return this.stringRedisTemplate.opsForValue().get(key);}public void delete(String key) {this.stringRedisTemplate.delete(key);}
} 3.4 测试 RunWith(SpringRunner.class)
SpringBootTest
public class RedisDaoTest {Autowiredprivate RedisDao redisDao;Testpublic void testSet() {String key name;String value zhangsan;this.redisDao.set(key, value);}Testpublic void testGet() {String key name;String value this.redisDao.get(key);System.out.println(value);}Testpublic void testDelete() {String key name;this.redisDao.delete(key);}
}测试结果省略... 四、整合 MongoDB Spring Data MongoDB 提供了 MongoTemplate 模板 和 Repository 让开发者进行数据访问。 4.1 添加依赖 dependencygroupIdorg.springframework.boot/groupIdartifactIdspring-boot-starter-data-mongodb/artifactId
/dependency 4.2 配置连接 spring.data.mongodb.host192.168.2.31
spring.data.mongodb.port27017
spring.data.mongodb.databasetest 4.3 编码 4.3.1 使用 MongoTemplate Component
public class MongodbDao {Autowiredprivate MongoTemplate mongoTemplate;public void insert(Department department) {this.mongoTemplate.insert(department);}public void deleteById(int id) {Criteria criteria Criteria.where(id).is(id);Query query new Query(criteria);this.mongoTemplate.remove(query, Department.class);}public void update(Department department) {Criteria criteria Criteria.where(id).is(department.getId());Query query new Query(criteria);Update update new Update();update.set(descr, department.getDescr());this.mongoTemplate.updateMulti(query, update, Department.class);}public Department getById(int id) {Criteria criteria Criteria.where(id).is(id);Query query new Query(criteria);return this.mongoTemplate.findOne(query, Department.class);}public ListDepartment getAll() {ListDepartment userList this.mongoTemplate.findAll(Department.class);return userList;}} 4.3.2 使用 Repository public interface DepartmentRepository extends MongoRepositoryDepartment, Integer {} 测试方式与 Redis 测试大同小异测试结果省略... 五、源码下载 Spring Boot 入门之缓存和 NoSQL 篇测试源码六、参考资料 官方文档ehcache入门基础示例ML-BLOG 读者可参考笔者的开源博客源码学习转载于:https://www.cnblogs.com/moonlightL/p/8066033.html