当前位置: 首页 > news >正文

安全电子商务网站设计手机之家论坛官网

安全电子商务网站设计,手机之家论坛官网,数字营销的定义是,注册公司流程需要多久文章目录一、本地缓存介绍二、缓存组件 Caffeine 介绍2.1. Caffeine 性能2.2. Caffeine 配置说明2.3. 软引用与弱引用三、SpringBoot 集成 Caffeine 方式一3.1. Maven 引入相关依赖3.2. 配置缓存配置类3.3. 定义实体对象3.4. 定义服务接口类3.5. 定义服务接口实现类3.6. Caffei… 文章目录一、本地缓存介绍二、缓存组件 Caffeine 介绍2.1. Caffeine 性能2.2. Caffeine 配置说明2.3. 软引用与弱引用三、SpringBoot 集成 Caffeine 方式一3.1. Maven 引入相关依赖3.2. 配置缓存配置类3.3. 定义实体对象3.4. 定义服务接口类3.5. 定义服务接口实现类3.6. Caffeine工具类3.7. 测试案例四、测试案例4.1. 添加用户4.2. 查询用户4.3. 更新用户4.4. 删除用户4.5. 效果图五、第二种整合方式5.1. 依赖5.2. 接口实现类替换一、本地缓存介绍 缓存在日常开发中启动至关重要的作用由于是存储在内存中数据的读取速度是非常快的能大量减少对数据库的访问减少数据库的压力。 之前介绍过 Redis 这种 NoSql 作为缓存组件它能够很好的作为分布式缓存组件提供多个服务间的缓存但是 Redis 这种还是需要网络开销增加时耗。本地缓存是直接从本地内存中读取没有网络开销例如秒杀系统或者数据量小的缓存等比远程缓存更合适。 二、缓存组件 Caffeine 介绍 按 Caffeine Github 文档描述Caffeine 是基于 JAVA 8 的高性能缓存库。并且在 spring5 (springboot 2.x) 后spring 官方放弃了 Guava而使用了性能更优秀的 Caffeine 作为默认缓存组件。 2.1. Caffeine 性能 可以通过下图观测到在下面缓存组件中 Caffeine 性能是其中最好的。 2.2. Caffeine 配置说明 注意 weakValues 和 softValues 不可以同时使用。 maximumSize 和 maximumWeight 不可以同时使用。 expireAfterWrite 和 expireAfterAccess 同事存在时以 expireAfterWrite 为准。 2.3. 软引用与弱引用 软引用如果一个对象只具有软引用则内存空间足够垃圾回收器就不会回收它如果内存空间不足了就会回收这些对象的内存。 弱引用弱引用的对象拥有更短暂的生命周期。在垃圾回收器线程扫描它所管辖的内存区域的过程中一旦发现了只具有弱引用的对象不管当前内存空间足够与否都会回收它的内存. // 软引用 Caffeine.newBuilder().softValues().build();// 弱引用 Caffeine.newBuilder().weakKeys().weakValues().build();三、SpringBoot 集成 Caffeine 方式一 3.1. Maven 引入相关依赖 dependencygroupIdorg.springframework.boot/groupIdartifactIdspring-boot-starter-web/artifactId/dependency!--字符串工具类--dependencygroupIdorg.apache.commons/groupIdartifactIdcommons-lang3/artifactIdversion3.12.0/version/dependencydependencygroupIdcom.github.ben-manes.caffeine/groupIdartifactIdcaffeine/artifactId/dependencydependencygroupIdorg.projectlombok/groupIdartifactIdlombok/artifactId/dependency3.2. 配置缓存配置类 package com.gblfy.config;import com.github.benmanes.caffeine.cache.Cache; import com.github.benmanes.caffeine.cache.Caffeine; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration;import java.util.concurrent.TimeUnit;/*** 本地caffeine缓存配置** author gblfy* date 2022-03-15*/ Configuration public class CaffeineCacheConfig {Beanpublic CacheString, Object caffeineCache() {return Caffeine.newBuilder()// 设置最后一次写入或访问后经过固定时间过期.expireAfterWrite(6000, TimeUnit.SECONDS)// 初始的缓存空间大小.initialCapacity(100)// 缓存的最大条数.maximumSize(1000).build();} } 3.3. 定义实体对象 package com.gblfy;import lombok.Data; import lombok.ToString;Data ToString public class UserInfo {private Integer id;private String name;private String sex;private Integer age; } 3.4. 定义服务接口类 package com.gblfy.service;import com.gblfy.entity.UserInfo;/*** 用户模块接口** author gblfy* date 2022-03-15*/ public interface UserInfoService {/*** 增加用户信息** param userInfo 用户信息*/void addUserInfo(UserInfo userInfo);/*** 获取用户信息** param id 用户ID* return 用户信息*/UserInfo getByName(Integer id);/*** 修改用户信息** param userInfo 用户信息* return 用户信息*/UserInfo updateUserInfo(UserInfo userInfo);/*** 删除用户信息** param id 用户ID*/void deleteById(Integer id);} 3.5. 定义服务接口实现类 package com.gblfy.service.impl;import com.gblfy.entity.UserInfo; import com.gblfy.service.UserInfoService; import com.gblfy.uitls.CaffeineUtils; import lombok.extern.slf4j.Slf4j; import org.apache.commons.lang3.StringUtils; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service;import java.util.Map; import java.util.concurrent.ConcurrentHashMap;/*** 用户模块接口实现类** author gblfy* date 2022-03-15*/ Slf4j Service public class UserInfoServiceImpl implements UserInfoService {/*** 模拟数据库存储数据*/private MapInteger, UserInfo userInfoMap new ConcurrentHashMap();Autowiredprivate CaffeineUtils caffeineUtils;Overridepublic void addUserInfo(UserInfo userInfo) {log.info(create);userInfoMap.put(userInfo.getId(), userInfo);// 加入缓存caffeineUtils.putAndUpdateCache(String.valueOf(userInfo.getId()), userInfo);}Overridepublic UserInfo getByName(Integer userId) {// 先从缓存读取UserInfo userInfo caffeineUtils.getObjCacheByKey(String.valueOf(userId), UserInfo.class);if (userInfo ! null) {return userInfo;}// 如果缓存中不存在则从库中查找log.info(get);userInfo userInfoMap.get(userId);// 如果用户信息不为空则加入缓存if (userInfo ! null) {caffeineUtils.putAndUpdateCache(String.valueOf(userInfo.getId()), userInfo);}return userInfo;}Overridepublic UserInfo updateUserInfo(UserInfo userInfo) {log.info(update);if (!userInfoMap.containsKey(userInfo.getId())) {return null;}// 取旧的值UserInfo oldUserInfo userInfoMap.get(userInfo.getId());// 替换内容if (StringUtils.isNotBlank(oldUserInfo.getName())) {oldUserInfo.setName(userInfo.getName());}if (StringUtils.isNotBlank(oldUserInfo.getSex())) {oldUserInfo.setSex(userInfo.getSex());}oldUserInfo.setAge(userInfo.getAge());// 将新的对象存储更新旧对象信息userInfoMap.put(oldUserInfo.getId(), oldUserInfo);// 替换缓存中的值caffeineUtils.putAndUpdateCache(String.valueOf(oldUserInfo.getId()), oldUserInfo);return oldUserInfo;}Overridepublic void deleteById(Integer id) {log.info(delete);userInfoMap.remove(id);// 从缓存中删除caffeineUtils.removeCacheByKey(String.valueOf(id));}} 3.6. Caffeine工具类 package com.gblfy.uitls;import com.github.benmanes.caffeine.cache.Cache; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Component;/*** Caffeine缓存工具类** Author gblfy* Date 2022-03-15 14:58**/ Component public class CaffeineUtils {AutowiredCacheString, Object caffeineCache;/*** 添加或更新缓存** param key* param value*/public void putAndUpdateCache(String key, Object value) {caffeineCache.put(key, value);}/*** 获取对象缓存** param key* return*/public T T getObjCacheByKey(String key, ClassT t) {caffeineCache.getIfPresent(key);return (T) caffeineCache.asMap().get(key);}/*** 根据key删除缓存** param key*/public void removeCacheByKey(String key) {// 从缓存中删除caffeineCache.asMap().remove(key);} } 3.7. 测试案例 package com.gblfy;import org.springframework.beans.factory.annotation.Autowired; import org.springframework.web.bind.annotation.*;/*** 用户模块入口** author gblfy* date 2022-03-15*/ RestController RequestMapping public class UserInfoController {Autowiredprivate UserInfoService userInfoService;GetMapping(/userInfo/{id})public Object getUserInfo(PathVariable Integer id) {UserInfo userInfo userInfoService.getByName(id);if (userInfo null) {return 没有该用户;}return userInfo;}PostMapping(/userInfo)public Object createUserInfo(RequestBody UserInfo userInfo) {userInfoService.addUserInfo(userInfo);return SUCCESS;}PutMapping(/userInfo)public Object updateUserInfo(RequestBody UserInfo userInfo) {UserInfo newUserInfo userInfoService.updateUserInfo(userInfo);if (newUserInfo null) {return 不存在该用户;}return newUserInfo;}DeleteMapping(/userInfo/{id})public Object deleteUserInfo(PathVariable Integer id) {userInfoService.deleteById(id);return SUCCESS;}}四、测试案例 4.1. 添加用户 请求方式POST content-typeapplication/json 测试地址:localhost:8080/userInfo报文内容 {id:1,name:yx,sex:女,age:2 }4.2. 查询用户 请求方式GET 测试地址:localhost:8080/userInfo/14.3. 更新用户 请求方式PUT content-typeapplication/json 测试地址:localhost:8080/userInfo报文内容 {id:1,name:gblfy,sex:男,age:22 }4.4. 删除用户 请求方式DELETE 测试地址:localhost:8080/userInfo/14.5. 效果图 五、第二种整合方式 5.1. 依赖 上面基础上添加 dependencygroupIdorg.springframework.boot/groupIdartifactIdspring-boot-starter-cache/artifactId/dependency5.2. 接口实现类替换 package com.gblfy;import lombok.extern.slf4j.Slf4j; import org.springframework.cache.annotation.CacheConfig; import org.springframework.cache.annotation.CacheEvict; import org.springframework.cache.annotation.CachePut; import org.springframework.cache.annotation.Cacheable; import org.springframework.stereotype.Service; import org.springframework.util.StringUtils;import java.util.HashMap;/*** 用户模块接口实现类** author gblfy* date 2022-03-15*/ Slf4j Service CacheConfig(cacheNames caffeineCacheManager) public class UserInfoServiceImpl implements UserInfoService {/*** 模拟数据库存储数据*/private HashMapInteger, UserInfo userInfoMap new HashMap();OverrideCachePut(key #userInfo.id)public void addUserInfo(UserInfo userInfo) {log.info(create);userInfoMap.put(userInfo.getId(), userInfo);}OverrideCacheable(key #id)public UserInfo getByName(Integer id) {log.info(get);return userInfoMap.get(id);}OverrideCachePut(key #userInfo.id)public UserInfo updateUserInfo(UserInfo userInfo) {log.info(update);if (!userInfoMap.containsKey(userInfo.getId())) {return null;}// 取旧的值UserInfo oldUserInfo userInfoMap.get(userInfo.getId());// 替换内容if (!StringUtils.isEmpty(oldUserInfo.getAge())) {oldUserInfo.setAge(userInfo.getAge());}if (!StringUtils.isEmpty(oldUserInfo.getName())) {oldUserInfo.setName(userInfo.getName());}if (!StringUtils.isEmpty(oldUserInfo.getSex())) {oldUserInfo.setSex(userInfo.getSex());}// 将新的对象存储更新旧对象信息userInfoMap.put(oldUserInfo.getId(), oldUserInfo);// 返回新对象信息return oldUserInfo;}OverrideCacheEvict(key #id)public void deleteById(Integer id) {log.info(delete);userInfoMap.remove(id);}}
http://www.yutouwan.com/news/459568/

相关文章:

  • 定制企业网站开发公司wordpress定时备份
  • 微信支付 企业网站建站素材网站模板
  • html写手机网站吗做个企业网网站怎么做
  • 昆明网站建设公司排名天津建设工程信息网专家登录
  • 常熟市住房和城乡建设部网站语文建设编辑部官方网站
  • 专业网站优化电话上海网站制作网站
  • 如何查网站点击量战鼓的h5网站如何做
  • 百度里面企业网站怎么建设wordpress 插件 安装
  • 网站代运营公司排名南宁自助建站软件
  • 全国建设交易信息网站中华网
  • 百度如何把网站做链接地址互联网营销师报名入口官网
  • 网站做2微码天华建筑设计公司官网
  • 网站设计制作公司排名视觉中国设计网站
  • 常青花园做网站的公司阿里云自助建站模板
  • 项目推广网站江苏省住房和城乡建设厅
  • tomcat 建网站泰州网站建设推广
  • 网站优化如何做pc指数关于网站建设论文
  • 福建闽东建设网站成都纯手工seo
  • 设计案例的网站北京手机网站建设费用
  • 镇江地区做网站的公司有哪些app开发开发公司
  • 免费网站申请注册富拉尔基网站建设
  • 吴江网站制作大数据营销的核心
  • 在线做的网站企业门户平台登录
  • 微信手机版网站建设上线了做的网站可以登陆
  • 成都网站优化常识免费响应式网站建设
  • 网站建设详细报价fullpane 单页视差多用途 wordpress主题
  • 网站建设合同英文模板建设部监理资质申报网站
  • 上传网站代码什么是理财北京网站建设公司好
  • 互联网建站公司有哪些西安查派网站建设
  • 关键词挖掘爱网站seo排名优化服务