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

网站一个一个关键词做wordpress 移除 新闻

网站一个一个关键词做,wordpress 移除 新闻,登录入口注册,安卓系统上怎样做网站前端开发hello#xff0c;伙伴们好久不见#xff0c;我是shigen。发现有两周没有更新我的文章了。也是因为最近比较忙#xff0c;基本是993了。 缓存大家再熟悉不过了#xff0c;几乎是现在任何系统的标配#xff0c;并引申出来很多的问题#xff1a;缓存穿透、缓存击穿、缓存雪崩… hello伙伴们好久不见我是shigen。发现有两周没有更新我的文章了。也是因为最近比较忙基本是993了。 缓存大家再熟悉不过了几乎是现在任何系统的标配并引申出来很多的问题缓存穿透、缓存击穿、缓存雪崩…哎作为天天敲业务代码的人哪有时间天天考虑这么多的破事。直接封装一个东西我们直接拿来就用岂不是美哉。看了项目组的代码我也忍不住 diy 了对于增删就算了就是 get set 的 API 调用修改直接删了重新添加吧哪有先查缓存再去修改保存的。难点就在于缓存的查询要不缓存的穿透、击穿、雪崩会诞生对吧。 我们先看下缓存的逻辑 是的其实就是这么简单剩下的就是考虑一下缓存穿透问题最常见的处理方式就是加锁。这里我采用的是信号量 Semaphore。 好的现在展示我的代码代码结构如下 . ├── CacheEnum.java -- 缓存枚举 ├── CacheLoader.java -- 缓存加载接口 ├── CacheService.java -- 缓存服务 └── CacheServiceImpl.java -- 缓存服务实现类1 directory, 4 filesok现在我们一一讲解下 CacheEnum 主要的代码 public enum CacheEnum {/** 用户token缓存 */USER_TOKEN(USER_TOKEN, 60, 用户token),/** 用户信息缓存 */USER_INFO(USER_INFO, 60, 用户信息),;/** 缓存前缀 */private final String cacheName;/** 缓存过期时间 */private final Integer expire;/** 缓存描述 */private final String desc;其他的就是 get/set 方法这里不做展示。主要解决的痛点就是缓存过期时间的统一管理、缓存名称的统一管理。 CacheService 这里边就是定义了缓存操作的接口 public interface CacheService {/*** 获取缓存* param cacheName 缓存名称* param key 缓存key* param type 缓存类型* return 缓存值* param T 缓存类型*/T T get(String cacheName, String key, ClassT type);/*** 获取缓存* param cacheName 缓存名称* param key 缓存key* param type 缓存类型* param loader 缓存加载器* return 缓存值* param T 缓存类型*/T T get(String cacheName, String key, ClassT type, CacheLoaderT loader);/*** 删除缓存* param cacheName 缓存名称* param key 缓存key*/void delete(String cacheName, String key);/*** 设置缓存* param cacheName 缓存名称* param key 缓存key* param value 缓存值*/void set(String cacheName, String key, Object value); } 其实就是一些增删查的方法。只不过这里我们更加关注的是缓存的名称缓存的 key缓存对象缓存对象的类型。 在 22 行这里用到了CacheLoader 接口其实就是处理缓存对象在缓存中拿不到的问题它的定义也很简单 FunctionalInterface public interface CacheLoaderV {/*** 加载缓存* param key 缓存key* return 缓存值*/V load(String key); }就一个方法直接使用上 lambda 表达式下边的测试类会讲到。 CacheServiceImpl Slf4j Service public class CacheServiceImpl implements CacheService {/** Semaphore */private static final Semaphore CACHE_LOCK new Semaphore(100);/** 缓存操作 */Autowiredprivate RedisTemplateString, Object redisTemplate;/*** 获取缓存key* param cacheName 缓存名称* param key 缓存key* return 缓存key*/private String getCacheKey(String cacheName, String key) {Assert.isTrue(StrUtil.isNotBlank(cacheName), cacheName不能为空);Assert.isTrue(StrUtil.isNotBlank(key), key不能为空);Assert.isTrue(CacheEnum.getByCacheName(cacheName) ! null, 需要使用CacheEnum枚举创建缓存);return cacheName : key;}Overridepublic T T get(String cacheName, String key, ClassT type) {Object value redisTemplate.opsForValue().get(getCacheKey(cacheName, key));if (value ! null) {return type.cast(value);}return null;}Overridepublic T T get(String cacheName, String key, ClassT type, CacheLoaderT cacheLoader) {try {// 获取锁, 防止缓存击穿CACHE_LOCK.acquire();String cacheKey getCacheKey(cacheName, key);Object value redisTemplate.opsForValue().get(cacheKey);if (value ! null) {return type.cast(value);}value cacheLoader.load(cacheKey);if (value ! null) {this.set(cacheName, key, value);return type.cast(value);}} catch (InterruptedException e) {log.warn(获取锁失败);} finally {CACHE_LOCK.release();}return null;}Overridepublic void delete(String cacheName, String key) {redisTemplate.opsForValue().getOperations().delete(getCacheKey(cacheName, key));}Overridepublic void set(String cacheName, String key, Object value) {String cacheKey getCacheKey(cacheName, key);CacheEnum cacheEnum CacheEnum.getByCacheName(cacheName);Assert.isTrue(cacheEnum ! null, 需要使用CacheEnum枚举创建缓存);redisTemplate.opsForValue().set(cacheKey, value, cacheEnum.getExpire(), TimeUnit.SECONDS);} }这里就是接口的具体实现。需要注意 在获得完整的缓存 key 的时候我们其实对于缓存的 cacheName 做了验证参见上代码块 21 行不允许自己定义缓存的 cacheName统一在枚举类中定义。因为 tair 的资源有点不好申请这里使用的 redis 作为缓存的工具结合 spring-boot-starter-data-redis 作为操作的 API。应对缓存穿透问题这里使用的是Semaphore 信号量。 别的就没什么好说的现在我们来测试一下我们的封装是否管用。 测试代码 设置缓存 测试用定义的枚举类创建缓存 Testvoid set() {cacheService.set(CacheEnum.USER_INFO.getCacheName(), 10001, getFakeUser(10001));}是没问题的不用枚举类创建 Testvoid testSetSelfDefinedCacheName() {cacheService.set(user, 10001, getFakeUser(10001));}直接异常出来了 java.lang.IllegalArgumentException: 需要使用CacheEnum枚举创建缓存读取缓存 读取缓存我的 API 中分为两种情况直接读取没有就算了读取缓存没有的话再从 DB 中拿。对应的单测如下 Testvoid testGet() {UserEntity user cacheService.get(CacheEnum.USER_INFO.getCacheName(), 10001,UserEntity.class);log.info(user: {}, user);}Testvoid testGetWithCacheLoader() {UserEntity user cacheService.get(CacheEnum.USER_INFO.getCacheName(), 10001,UserEntity.class, new CacheLoaderUserEntity() {Overridepublic UserEntity load(String key) {return getFakeUser(10001);}});log.info(user: {}, user);}Testvoid testGetWithSimpledCacheLoader() {UserEntity user cacheService.get(CacheEnum.USER_INFO.getCacheName(), 10001,UserEntity.class, key - getFakeUser(key));log.info(user: {}, user);}第三种就是对于 lambda 接口的简化写法。 基于以上的方式我们操作缓存就变得更加容易了。
http://www.hkea.cn/news/14309736/

相关文章:

  • 简单的网站怎样做网站规划与开发实训室建设方案
  • 昆明网站开发河南微网站建设
  • 网站开发模板教务管理小工具文本wordpress
  • 无锡装饰网站建设wordpress静态链接
  • 网站域名备案和icp备案一样么旅游网站制作代码
  • 手机app界面设计网站大连开发区网页制作
  • 网站开发中网页上传和发布定制研发服务
  • 网站备案被注销了怎么办建网站什么网最好
  • 公司注册网站查询传媒公司取名 创意
  • 凡科网站代码网页在线设计
  • 保险业网站建设蓬莱做网站那家好
  • wordpress无法安装主题哈尔滨seo优化专注
  • 腾讯云学生怎么做网站的免费网站或软件
  • 设计网站公司湖南岚鸿公司专做logo网站叫什么地方
  • 怎样创作网站网站前端做出来后台怎么做
  • 没有主机怎么做自己的网站手机设计软件平面设计
  • 南宁建站公司有哪些西宁手机网站微站建设
  • 网站建设项目流程图哪里有做推文的网站
  • 公网ip做网站wordpress写入到磁盘
  • 网站主页模板图片wordpress如何安装网站主题
  • 网站建设维护费 会计科目怀化公司做网站
  • 昆明市网站制作公司wordpress mx主题VIP
  • 自建站需要多少钱企业市场推广
  • 优秀个人网站案例中关村在线对比
  • 在哪做网站建设建站哪家好社区
  • 网站开发项目详细计划书深圳网站设计哪家比较好
  • 境外服务器代理平台崇州seo
  • 营销型网站制作公司有赞云 wordpress
  • 大力推广建设电子商务网站技术潍坊大型网站建设平台
  • 邯郸怎么做网站沧州机械类网站建设