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

济南旅游团购网站建设班级网站设计与制作

济南旅游团购网站建设,班级网站设计与制作,南昌网站建设机构,网站建设如何获取客户分布式锁redisson的使用#xff08;并发场景下) 1.基于缓存#xff0c;对热点数据进行刷新过期时间#xff0c;以实现“冷热数据分离”。 2.可以对“热点数据进行缓存重建”#xff08;双层获取#xff09; 3.使用分布式读写锁#xff0c;可解决“数据库与缓存双写不一…分布式锁redisson的使用并发场景下) 1.基于缓存对热点数据进行刷新过期时间以实现“冷热数据分离”。 2.可以对“热点数据进行缓存重建”双层获取 3.使用分布式读写锁可解决“数据库与缓存双写不一致”的场景 4.分布式读写锁的机制读读共享读写互斥写写互斥读写锁底层实现的是读写操作都是抢同一把锁已控制拿锁的顺序。 若是读读操作则底层实现的是可重入锁机制在进行读读操作是多个线程拿的都是同一把读锁通过对信号量state进行1来计算重入的次数及释放锁的量。 若是写写或写读场景则其他未获取到锁的线程则会处于等待阻塞状态。 Service public class ProductService {Autowiredprivate ProductDao productDao;Autowiredprivate RedisUtil redisUtil;Autowiredprivate Redisson redisson;public static final Integer PRODUCT_CACHE_TIMEOUT 60 * 60 * 24;public static final String EMPTY_CACHE {};public static final String LOCK_PRODUCT_HOT_CACHE_PREFIX lock:product:hot_cache:;public static final String LOCK_PRODUCT_UPDATE_PREFIX lock:product:update:;public static MapString, Product productMap new ConcurrentHashMap();Transactionalpublic Product create(Product product) {Product productResult productDao.create(product);redisUtil.set(RedisKeyPrefixConst.PRODUCT_CACHE productResult.getId(), JSON.toJSONString(productResult),genProductCacheTimeout(), TimeUnit.SECONDS);return productResult;}Transactionalpublic Product update(Product product) {Product productResult null;//RLock updateProductLock redisson.getLock(LOCK_PRODUCT_UPDATE_PREFIX product.getId());RReadWriteLock readWriteLock redisson.getReadWriteLock(LOCK_PRODUCT_UPDATE_PREFIX product.getId());//通过读写锁来控制并发读写锁 共用了是同一把锁RLock writeLock readWriteLock.writeLock();writeLock.lock();//这种不传时间值当在并发条件下那些未获取到锁的线程会在一直处于阻塞状态等待持有锁的线程执行完毕再去唤醒需要持有锁的线程// writeLock.lock(10,TimeUnit.SECONDS);// 这种传入时间值当在并发条件下那些未获取到锁的线程会在在10s时间内阻塞等待若超过10s还未获取到锁那么那些需要获取到锁的线程会重新再次去请求获取锁对象try {productResult productDao.update(product);redisUtil.set(RedisKeyPrefixConst.PRODUCT_CACHE productResult.getId(), JSON.toJSONString(productResult),genProductCacheTimeout(), TimeUnit.SECONDS); //更新缓存productMap.put(RedisKeyPrefixConst.PRODUCT_CACHE productResult.getId(), product);//使用map去存储高热点数据高热点数据比较少则需要的内存较少所以本地缓存可以使用本地缓存可支持百万级别的并发那么就服务就不会那么容易崩亏} finally {writeLock.unlock();}return productResult;}public Product get(Long productId) throws InterruptedException {Product product null;String productCacheKey RedisKeyPrefixConst.PRODUCT_CACHE productId;//先从本地缓存中获取数据product getProductFromCache(productCacheKey);if (product ! null) {return product;}//DCL//若本地缓存中不存在则通过分布式锁进行加锁RLock hotCacheLock redisson.getLock(LOCK_PRODUCT_HOT_CACHE_PREFIX productId);//并发条件下未获取到锁的线程在此等待hotCacheLock.lock();//boolean result hotCacheLock.tryLock(3, TimeUnit.SECONDS);try {//当加上分布式锁后再次中本地缓存中去获取数据此为“热点缓存并发重建”//加分布式锁后再次从本地缓存中去获取数据考虑到再加分布式锁过程中有其他线程已经执行完查询的数据并进行了缓存product getProductFromCache(productCacheKey);if (product ! null) {return product;}//若缓存中未获取到数据则通过redisson获取一把读写锁来控制读写顺序读写锁是共同抢同一把锁具有互斥性从而达到顺序执行//同时分布式的读写锁可以解决“数据库与缓存双写不一致”的问题//RLock updateProductLock redisson.getLock(LOCK_PRODUCT_UPDATE_PREFIX productId);RReadWriteLock readWriteLock redisson.getReadWriteLock(LOCK_PRODUCT_UPDATE_PREFIX productId);RLock rLock readWriteLock.readLock();rLock.lock();try {product productDao.get(productId);//读取数据库数据if (product ! null) {redisUtil.set(productCacheKey, JSON.toJSONString(product),genProductCacheTimeout(), TimeUnit.SECONDS); //将取到的数据进行redis缓存 和 本地缓存productMap.put(productCacheKey, product);} else {//若数据库中并没有该数据则将缓存一个空对象以防止恶意攻击redisUtil.set(productCacheKey, EMPTY_CACHE, genEmptyCacheTimeout(), TimeUnit.SECONDS);}} finally {rLock.unlock();//释放读锁}} finally {hotCacheLock.unlock(); //释放分布式锁}return product;}private Integer genProductCacheTimeout() {return PRODUCT_CACHE_TIMEOUT new Random().nextInt(5) * 60 * 60;//设置不同的缓存过期时间防止所有的key在同一时刻失效造成缓存击穿从而使服务瘫痪}private Integer genEmptyCacheTimeout() {return 60 new Random().nextInt(30);//对空对象也进行设置不同的过期时间}private Product getProductFromCache(String productCacheKey) {Product product productMap.get(productCacheKey);//先从本地缓存中获取数据以提高数据访问量和有效性if (product ! null) {return product;}String productStr redisUtil.get(productCacheKey);//若本地缓存不存在则从reids缓存中获取以减少磁盘IOif (!StringUtils.isEmpty(productStr)) { //判断需要获取的对象是否为空若为空则再次判断是否为空对象若是空对象则进行缓存if (EMPTY_CACHE.equals(productStr)) { //对获取的对象进行判断是否为空对象空对象存在的意义是防止恶意攻击黑客攻击等若为空对象则返回一个新建的对象redisUtil.expire(productCacheKey, genEmptyCacheTimeout(), TimeUnit.SECONDS);return new Product();}product JSON.parseObject(productStr, Product.class);redisUtil.expire(productCacheKey, genProductCacheTimeout(), TimeUnit.SECONDS);//读延期已实现“冷热数据分离”原理是当前被访问的对象每被查询一次就刷新一次过期时间}return product;}} 对于缓存架构基于热点爆发数据处理 1.当热点数据突然迸发时容易出现“缓存雪崩”场景则可通过前端进行限流处理。 2.前端有处理失效的情况那么可考虑使用多级缓存架构如前端缓存本地缓存redis缓存 3.可对某些不重要的服务可进行做熔断降级处理。
http://mrfarshtey.net/news/35099/

相关文章:

  • php网站空间购买做网站需要什么技术支持
  • 国外展柜网站WordPress添加前台注册功能
  • 湖北公司响应式网站建设推荐python做网站
  • 北京注册公司多少钱seo培训学院官网
  • 为什么网站需要静态化生成htmlWordPress 导航 自适应
  • eclipse做企业网站网站建设与管理 答案
  • 网站建设案例要多少钱自己搭建局域网云桌面终端
  • 新余集团网站建设深圳网页设计
  • 网站很久没被收录的新闻怎么处理网站建设服务合同 律师
  • 宿迁网站建设报价广东省建设厅人才网站
  • 网站文章页301重定向怎么做wordpress商业主体
  • 网站备案填写电话一个交易网站开发的成本是多少
  • 怎么做黑客把网站余额更改大连工业大学是一本吗
  • 专业品牌网站建设上海外贸瓦屑包装袋有限公司
  • 受欢迎的集团网站建设网站建设与推广实训小结
  • 好网站在哪里室内装饰设计师
  • 中国十大知名网站帝国cms网站制作
  • 网奇e游通旅游网站建设系统如何修改上传到服务器劳力士手表网站
  • 国内红酒网站建设中文wordpress网站模板
  • 浙江网站建设售后保障商场网站 策划
  • 建立一个网站的费用杭州萧山区专业做网站的公司
  • 怎样用阿里云建设网站linux主机 安装wordpress
  • flash个人网站设计阿里巴巴做轮播网站
  • 网站开发 用户角色自己电脑做网站主机
  • 商城网站开发技术有哪些网络营销的八大职能是什么
  • 中国建设网站上报名塔吊司索工wordpress婚庆主题
  • 物流案例 网站网站设计公司哪家
  • 优秀的设计网站有哪些内容建立企业网站的意义
  • 建个人网站要花多少钱网站建设先有域名然后呢
  • 网站怎么做边框免费域名注册万网