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

网站规划对网站建设起到app推广营销

网站规划对网站建设起到,app推广营销,做logo好的网站,公司网站开发哪家好缓存架构 京东HotKey架构 代码结构 代码详情 功能点:(如代码有错误,欢迎讨论纠正) 多级缓存,先查HotKey缓存,再查Redis,最后才查数据库热点数据重建逻辑使用分布式锁,二次查询更新…

缓存架构

京东HotKey架构

代码结构

代码详情

功能点:(如代码有错误,欢迎讨论纠正)

  1. 多级缓存,先查HotKey缓存,再查Redis,最后才查数据库
  2. 热点数据重建逻辑使用分布式锁,二次查询
  3. 更新缓存采用读写锁提升性能
  4. 利用HotKey系统推送热点Key到应用服务端(HotKey客户端角色)
  5. 适用读多写少的场景
/*** 常量**/
public class Constants {public static final String PRODUCT_CACHE = "product:cache:";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:";
}
/**初始化京东HotKey**/
@Component
public class HotkeyInitializer {@PostConstructpublic void initHotkey() {ClientStarter.Builder builder = new ClientStarter.Builder();// 注意,setAppName很重要,它和dashboard中相关规则是关联的。ClientStarter starter = builder.setAppName("redis-multi-cache").setEtcdServer("http://127.0.0.1:2379").setCaffeineSize(10).build();starter.startPipeline();}
}
/*** 控制器**/
@RestController
@RequestMapping("/api/product/")
public class ProductController {@Autowiredprivate ProductService productService;@PostMapping(value = "/create")public Product createProduct(@RequestBody Product product) {return productService.createProduct(product);}@PostMapping(value = "/update")public Product updateProduct(@RequestBody Product product) {return productService.updateProduct(product);}@GetMapping("/get/{productId}")public Product getProduct(@PathVariable Long productId) {return productService.getProduct(productId);}}
/*** DAO层**/
@Repository
public class ProductDao {public Product createProduct(Product product) {try {Thread.sleep(10);} catch (InterruptedException e) {throw new RuntimeException(e);}System.out.println("创建商品成功");return product;}public Product updateProduct(Product product) {try {Thread.sleep(10);} catch (InterruptedException e) {throw new RuntimeException(e);}System.out.println("修改商品成功");return product;}public Product getProduct(Long productId) {try {Thread.sleep(10);} catch (InterruptedException e) {throw new RuntimeException(e);}System.out.println("查询商品成功");Product product = new Product();product.setId(productId);product.setName("test");return product;}}
/*** 商品实体**/
@Data
public class Product implements Serializable {private Long id; // 商品IDprivate String name; // 商品名称private String category; // 商品分类(如 "电子产品"、"图书")private BigDecimal price; // 价格(精确到分,使用BigDecimal避免浮点精度问题)private int stock; // 库存数量private String description; // 商品描述private LocalDateTime createTime; // 创建时间private LocalDateTime updateTime; // 更新时间
}
/*** 商品服务**/
@Service
public class ProductService {@Autowiredprivate ProductDao productDao;@Autowiredprivate Redisson redisson;//写锁public Product createProduct(Product product) {Product productResult = null;RReadWriteLock readWriteLock = redisson.getReadWriteLock(Constants.LOCK_PRODUCT_UPDATE_PREFIX + product.getId());RLock writeLock = readWriteLock.writeLock();writeLock.lock();try {productResult = productDao.createProduct(product);redisson.getBucket(Constants.LOCK_PRODUCT_UPDATE_PREFIX + product.getId()).set(JSON.toJSONString(productResult), Duration.ofSeconds(genProductCacheTimeout()));JdHotKeyStore.smartSet(Constants.PRODUCT_CACHE + productResult.getId(), productResult);} finally {writeLock.unlock();}return productResult;}//写锁public Product updateProduct(Product product) {Product productResult = null;RReadWriteLock readWriteLock = redisson.getReadWriteLock(Constants.LOCK_PRODUCT_UPDATE_PREFIX + product.getId());RLock writeLock = readWriteLock.writeLock();writeLock.lock();try {productResult = productDao.updateProduct(product);redisson.getBucket(Constants.LOCK_PRODUCT_UPDATE_PREFIX + product.getId()).set(JSON.toJSONString(productResult), Duration.ofSeconds(genProductCacheTimeout()));JdHotKeyStore.smartSet(Constants.PRODUCT_CACHE + productResult.getId(), productResult);} finally {writeLock.unlock();}return productResult;}public Product getProduct(Long productId) {Product product = null;String productCacheKey = Constants.PRODUCT_CACHE + productId;product = getProductFromCache(productCacheKey);if (product != null) {return product;}//热点缓存重建,加分布式锁,第一个请求写缓存成功后,做二次读取缓存操作,其余请求都可以走RedisRLock hotCacheLock = redisson.getLock(Constants.LOCK_PRODUCT_HOT_CACHE_PREFIX + productId);hotCacheLock.lock();try {product = getProductFromCache(productCacheKey);if (product != null) {return product;}RReadWriteLock readWriteLock = redisson.getReadWriteLock(Constants.LOCK_PRODUCT_UPDATE_PREFIX + productId);RLock rLock = readWriteLock.readLock();rLock.lock();try {product = productDao.getProduct(productId);if (product != null) {redisson.getBucket(productCacheKey).set(JSON.toJSONString(product),Duration.ofSeconds(genProductCacheTimeout()));JdHotKeyStore.smartSet(productCacheKey, product);} else {redisson.getBucket(productCacheKey).set(Constants.EMPTY_CACHE, Duration.ofSeconds(genEmptyCacheTimeout()));}} finally {rLock.unlock();}} finally {hotCacheLock.unlock();}return product;}//随机超时时间,防止缓存击穿(失效)private Integer genProductCacheTimeout() {return Constants.PRODUCT_CACHE_TIMEOUT + new Random().nextInt(5) * 60 * 60;}//空数据的超时时间private Integer genEmptyCacheTimeout() {return 60 + new Random().nextInt(30);}//从缓存获取数据private Product getProductFromCache(String productCacheKey) {//检测是不是热点Key并上报if (JdHotKeyStore.isHotKey(productCacheKey)) {Object productObj = JdHotKeyStore.get(productCacheKey);if (productObj != null) {//如果是热点Key并且有值就直接返回return (Product) JdHotKeyStore.get(productCacheKey);} else {Product product = getProductFromRedis(productCacheKey);//按文档如果是热点Key,第一次返回的Value是空的,要主动设置一次到本地缓存JdHotKeyStore.smartSet(productCacheKey, product);return product;}} else {return getProductFromRedis(productCacheKey);}}private Product getProductFromRedis(String productCacheKey) {Product product = null;RBucket<String> bucket = redisson.getBucket(productCacheKey);String productStr = bucket.get();if (!StringUtils.isEmpty(productStr)) {if (Constants.EMPTY_CACHE.equals(productStr)) {bucket.expire(Duration.ofSeconds(genEmptyCacheTimeout()));return new Product();}product = JSON.parseObject(productStr, Product.class);bucket.expire(Duration.ofSeconds(genProductCacheTimeout())); //读延期}return product;}}
@SpringBootApplication
public class RedisMultiCacheApplication {public static void main(String[] args) {SpringApplication.run(RedisMultiCacheApplication.class, args);}@Beanpublic Redisson redisson() {// 此为单机模式Config config = new Config();config.useSingleServer().setAddress("redis://localhost:6379").setDatabase(0);return (Redisson) Redisson.create(config);}}
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd"><modelVersion>4.0.0</modelVersion><parent><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-parent</artifactId><version>3.3.12</version><relativePath/> <!-- lookup parent from repository --></parent><groupId>com.example.mutilcache</groupId><artifactId>redis-multi-cache</artifactId><version>0.0.1-SNAPSHOT</version><name>redis-multi-cache</name><description>redis-multi-cache</description><url/><licenses><license/></licenses><developers><developer/></developers><scm><connection/><developerConnection/><tag/><url/></scm><properties><java.version>17</java.version></properties><dependencies><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId></dependency><dependency><groupId>com.jd.platform.hotkey</groupId><artifactId>hotkey-client</artifactId><version>0.0.4-SNAPSHOT</version></dependency><dependency><groupId>org.projectlombok</groupId><artifactId>lombok</artifactId><optional>true</optional></dependency><dependency><groupId>org.redisson</groupId><artifactId>redisson</artifactId><version>3.48.0</version></dependency><dependency><groupId>com.alibaba</groupId><artifactId>fastjson</artifactId><version>1.2.83</version></dependency><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-test</artifactId><scope>test</scope></dependency><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-actuator</artifactId></dependency></dependencies><build><plugins><plugin><groupId>org.apache.maven.plugins</groupId><artifactId>maven-compiler-plugin</artifactId><configuration><annotationProcessorPaths><path><groupId>org.projectlombok</groupId><artifactId>lombok</artifactId></path></annotationProcessorPaths></configuration></plugin><plugin><groupId>org.springframework.boot</groupId><artifactId>spring-boot-maven-plugin</artifactId><configuration><excludes><exclude><groupId>org.projectlombok</groupId><artifactId>lombok</artifactId></exclude></excludes></configuration></plugin></plugins></build></project>
http://www.dtcms.com/wzjs/295064.html

相关文章:

  • 嘉兴做网站建设近期国际热点大事件
  • 广东微信网站制作报价国际军事新闻最新消息视频
  • 制作ppt的软件电脑seo 的作用和意义
  • 网站服务器 数据库服务器那个推广平台好用
  • 云做网站宁波seo网络推广优化价格
  • 网站图片多大合适网络营销推广的总结
  • 网站建设大企业电商广告
  • 网站做301跳转的方法脱发严重是什么原因引起的
  • wordpress商品主题沈阳关键词优化价格
  • 网站切片怎么做百度关键词搜索怎么弄
  • 用最少的钱做网站网站服务器地址查询
  • 中国人民银行官网入口网站优化教程
  • 宝安做网站哪家好谷歌浏览器官方正版下载
  • 做外贸有哪些网站比较好微信广告平台
  • 校园网站建设管理及责任表中山seo排名
  • 怎么做外国网站aso优化方法
  • 做网站 嵌入支付宁波专业seo外包
  • 长沙做网站要多少钱高端网站建设哪个好
  • 做电影网站技术沈阳网站seo公司
  • 西安哪个公司可以做网站平板电视seo优化关键词
  • 小荷特卖的网站谁做的企业qq和个人qq有什么区别
  • 百度公司做网站吗保定百度首页优化
  • 滨州淘宝网站建设长沙官网seo收费
  • 婚恋网站女孩子都是做美容整合营销包括哪些内容
  • 能够做冶金工程毕业设计的网站快速优化seo软件推广方法
  • 做直播网站找哪家网站培训机构管理系统哪个好
  • 阿里妈妈网站建设不完整百度搜索推广的定义
  • 个人博客网页模板seo分析
  • 农业网站怎么做培训
  • 网站建设的流程和内容上海站群优化公司