Redis缓存技术和ehcache缓存技术应用

缓存类型及优缺点:Ehcache、Caffeine、Memcached和Redis的比较 本文将对比分析四种常见的缓存类型:Ehcache、Caffeine、Memcached和Redis。通过探讨它们的优点、缺点以及适用场景,帮助读者更好地理解如何根据实际需求选择合适的缓存技术。同时,本文还将简要介绍这四种缓存类型支持的数据类型 阅读详情

1.了解缓存cache之前了解一下什么是cache?

所谓cache,就是将程序或系统经常使用的对象存在内存中或在磁盘中创建缓存数据文件,以便再次使用时可以快速调用,有效的减少了再次从数据库中获取数据的开销,从而提高运行效率,减少等待时间。按照存储方式分为内存或磁盘;

如图所示:

 

通俗点说,当用户访问某个系统,但系统跟服务器的交互比较频繁,但是同时又有10w+的用户都在访问,如果服务器强大的话还能承受的住,但是如果说数据量到100w,1000w的时候怎么处理,这个时候的处理方式就是服务器的集群以及缓存技术的应用,来降低服务器的压力;

常用的cache技术:


 

本文只介绍两种本人使用过的缓存技术EHCache和redis,下边我们了解一下两种缓存技术

1.EHCache

1.1 概念

Ehcache是一种广泛使用的开源Java分布式缓存。主要面向通用缓存,Java EE和轻量级容器。它具有内存和磁盘存储,缓存加载器,缓存扩展,缓存异常处理程序,一个gzip缓存servlet过滤器,支持REST和SOAP api等特点。


1.2 特点

  1. 快速简单,多种缓存策略
  2. 缓存数据有两级:内存和磁盘,因此无需担心容量问题
  3. 缓存数据会在虚拟机重启的过程中写入磁盘
  4. 可以通过RMI、可插入API等方式进行分布式缓存
  5. 具有缓存和缓存管理器的侦听接口
  6.  支持多缓存管理器实例,以及一个实例的多个缓存区域
  7. 提供Hibernate的缓存实现
  8. 使用磁盘Cache的时候非常占用磁盘空间:这是因为DiskCache的算法简单,该算法简单也导致Cache的效率非常高。它只是对元素直接追加存储。因此搜索元素的时候非常的快。如果使用DiskCache的,在很频繁的应用中,很快磁盘会满;
  9. 不能保证数据的安全:当突然kill掉java的时候,可能会产生冲突,EhCache的解决方法是如果文件冲突了,则重建cache。这对于Cache数据需要保存的时候可能不利。当然,Cache只是简单的加速,而不能保证数据的安全。如果想保证数据的存储安全,可以使用Bekeley DB Java Edition版本。这是个嵌入式数据库。可以确保存储安全和空间的利用率。

1.3应用(框架基于spring+springBoot+maven)

第一步

在pom.xml中加入ehcache依赖

        <dependency>
            <groupId>net.sf.ehcache</groupId>
            <artifactId>ehcache-core</artifactId>
            <version>${ehcache.version}</version>
        </dependency>
        <dependency>
            <groupId>net.sf.ehcache</groupId>
            <artifactId>ehcache-web</artifactId>
            <version>${ehcache-web.version}</version>
        </dependency>

 第二步

编写ehcache.xml文件


属性说明:

  •  name:缓存的名称;
  • maxElementsInMemory:缓存中最大元素个数。0表示不限制 ;
  • eternal:对象是否永久有效,一但设置了,timeout将不起作用,元素永久存在;
  • clearOnFlush:内存数量最大时是否清除;
  • timeToIdleSeconds : 设置对象在失效前的允许闲置时间(单位:秒)。仅当eternal=false对象不是永久有效时使用,可选属性,默认值是0,也就是可闲置时间无穷大;
  • imeToLiveSeconds:设置对象在失效前允许存活时间(单位:秒)。最大时间介于创建时间和失效时间之间。仅当eternal=false对象不是永久有效时使用,默认是0.,也就是对象存活时间无穷大;
  • diskExpiryThreadIntervalSeconds:磁盘失效线程运行时间间隔,默认是120秒;
  • diskPersistent:是否在VM重启时存储硬盘的缓存数据。默认值是false;
  • maxElementsOnDisk:硬盘最大缓存个数;
  • overflowToDisk:当内存中对象数量达到maxElementsInMemory时,Ehcache将会对象写到磁盘中;
  • diskSpoolBufferSizeMB:这个参数设置DiskStore(磁盘缓存)的缓存区大小。默认是30MB。每个Cache都应该有自己的一个缓冲区;
  • maxEntriesLocalDisk:当内存中对象数量达到maxElementsInMemory时,Ehcache将会对象写到磁盘中;memoryStoreEvictionPolicy:当达到maxElementsInMemory限制时,Ehcache将会根据指定的策略去清理内存。默认策略是LRU(最近最少使用);

<?xml version="1.0" encoding="UTF-8"?>
<ehcache updateCheck="false" name="defaultCache">

	<diskStore path="../temp/jeesite/ehcache" />

	<!-- 默认缓存配置. 自动失效:最后一次访问时间间隔300秒失效,若没有访问过自创建时间600秒失效。-->
	<defaultCache
			maxElementsInMemory="10000"
			maxEntriesLocalHeap="1000"
			eternal="false"
			timeToIdleSeconds="300"
			timeToLiveSeconds="600"
			overflowToDisk="true"
			statistics="true"/>
	
	<!-- 系统缓存 -->
	<cache name="sysCache" maxEntriesLocalHeap="1000" eternal="true" overflowToDisk="true" statistics="true"/>
	
	<!-- 用户缓存 -->
	<cache name="userCache" maxEntriesLocalHeap="1000" eternal="true" overflowToDisk="true" statistics="true"/>
	
	<!-- 集团缓存 -->
	<cache name="corpCache" maxEntriesLocalHeap="1000" eternal="true" overflowToDisk="true" statistics="true"/>
	
	<!-- 内容管理模块缓存 -->
	<cache name="cmsCache" maxEntriesLocalHeap="1000" eternal="true" overflowToDisk="true" statistics="true"/>
    
	<!-- 工作流模块缓存 -->
	<cache name="actCache" maxEntriesLocalHeap="100" eternal="true" overflowToDisk="true" statistics="true"/>
	
    <!-- 简单页面缓存 -->
    <cache name="pageCachingFilter" maxEntriesLocalHeap="1000" eternal="false" timeToIdleSeconds="120"
    	timeToLiveSeconds="120" overflowToDisk="true" memoryStoreEvictionPolicy="LFU" statistics="true"/>
	
	<!-- 系统活动会话缓存 -->
    <cache name="activeSessionsCache" maxEntriesLocalHeap="10000" eternal="true" overflowToDisk="true"
           diskPersistent="true" diskExpiryThreadIntervalSeconds="600" statistics="true"/>
    	
</ehcache>

第三步

在启动类上添加注解@EnableCaching以开启缓存支持。

@EnableCaching 
@SpringBootApplication 
@MapperScan("com.songguoliang.springboot.mapper") 
public class Application
{ 
  public static void main(String[] args) 
  { 
     SpringApplication.run(Application.class, args); 
  } 
}

 Spring提供了4个声明式缓存注解: 

  1. @Cacheable 在方法执行前Spring先查看缓存中是否存在,如果存在,则直接返回缓存数据,若不存在则调用方法并将方法返回值放进缓存
  2. @CachePut 无论怎样,都会将方法的返回值放到缓存中。@CachePut的属性与@Cacheable保持一致
  3. @CacheEvict 将一条或多条数据从缓存中删除。
  4. @Caching 可以通过@Caching注解组合多个注解策略在一个方法上。

2.Redis缓存技术

2.1概念

Redis(REmote DIctionary Server)是一个开源的使用ANSI C语言编写、遵守BSD协议、支持网络、可基于内存亦可持久化的日志型、Key-Value数据库,并提供多种语言的API。

它通常被称为数据结构服务器,因为值(value)可以是 字符串(String), 哈希(Map), 列表(list), 集合(sets) 和 有序集合(sorted sets)等类型。


2.2特点

  1. Redis支持数据的持久化,可以将内存中的数据保存在磁盘中,重启的时候可以再次加载进行使用。
  2. Redis不仅仅支持简单的key-value类型的数据,同时还提供list,set,zset,hash等数据结构的存储。
  3. Redis支持数据的备份,即master-slave模式的数据备份。
  4. 性能极高 – Redis能读的速度是110000次/s,写的速度是81000次/s 。
  5. 丰富的数据类型 – Redis支持二进制案例的 Strings, Lists, Hashes, Sets 及 Ordered Sets 数据类型操作。
  6. 原子 – Redis的所有操作都是原子性的,意思就是要么成功执行要么失败完全不执行。单个操作是原子性的。多个操作也支持事务,即原子性,通过MULTI和EXEC指令包起来。
  7. 丰富的特性 – Redis还支持 publish/subscribe, 通知, key 过期等等特性。

2.3应用(框架基于spring+springBoot+maven)


第一步

在windows系统中安装redis,redis下载地址(https://github.com/MicrosoftArchive/redis/releases)


第二步

在pom文件中引入redis依赖:

 <!-- springboot整合redis -->  
        <dependency>  
            <groupId>org.springframework.boot</groupId>  
            <artifactId>spring-boot-starter-data-redis</artifactId>  
        </dependency> 

这里只需引入这一个redis的依赖即可,其他3个自动进行了依赖:


第三步

在application.yml中配置redis

spring:
    application:
        name: spring-boot-redis
    redis:
        host: 192.168.145.132
        port: 6379
        timeout: 20000
        cluster:
            nodes: 192.168.211.134:7000,192.168.211.134:7001,192.168.211.134:7002
            maxRedirects: 6
        pool:
            max-active: 8
            min-idle: 0
            max-idle: 8
            max-wait: -1

第四步

编写redis配置类

/**
 * redis配置类
 *
 * @author zcc ON 2018/3/19
 **/
@Configuration
@EnableCaching//开启注解
public class RedisConfig {
    @Bean
    public CacheManager cacheManager(RedisTemplate<?, ?> redisTemplate) {
        CacheManager cacheManager = new RedisCacheManager(redisTemplate);
        return cacheManager;
        /*RedisCacheManager rcm = new RedisCacheManager(redisTemplate);
        // 多个缓存的名称,目前只定义了一个
        rcm.setCacheNames(Arrays.asList("thisredis"));
        //设置缓存默认过期时间(秒)
        rcm.setDefaultExpiration(600);
        return rcm;*/
    }
    // 以下两种redisTemplate自由根据场景选择
    @Bean
    public RedisTemplate<Object, Object> redisTemplate(RedisConnectionFactory connectionFactory) {
        RedisTemplate<Object, Object> template = new RedisTemplate<>();
        template.setConnectionFactory(connectionFactory);
        //使用Jackson2JsonRedisSerializer来序列化和反序列化redis的value值(默认使用JDK的序列化方式)
        Jackson2JsonRedisSerializer serializer = new Jackson2JsonRedisSerializer(Object.class);

        ObjectMapper mapper = new ObjectMapper();
        mapper.setVisibility(PropertyAccessor.ALL, JsonAutoDetect.Visibility.ANY);
        mapper.enableDefaultTyping(ObjectMapper.DefaultTyping.NON_FINAL);
        serializer.setObjectMapper(mapper);

        template.setValueSerializer(serializer);
        //使用StringRedisSerializer来序列化和反序列化redis的key值
        template.setKeySerializer(new StringRedisSerializer());
        template.afterPropertiesSet();
        return template;
    }
    @Bean
    public StringRedisTemplate stringRedisTemplate(RedisConnectionFactory factory) {
        StringRedisTemplate stringRedisTemplate = new StringRedisTemplate();
        stringRedisTemplate.setConnectionFactory(factory);
        return stringRedisTemplate;
    }
}

实现序列化接口(implements Serializable),然后就是逻辑代码;

以上内容主要介绍了EHCache和redis概念以及在本人实际项目中的应用,如有不好的地方请指出!!!


想深入学习redis,请点击以下网址:http://www.runoob.com/redis/redis-intro.html


原创不易,转载请注明出处!!!谢谢

Spring+ehcache+redis两级缓存--缓存实战篇(1) 在上篇《性能优化-缓存篇》中已经从理论上介绍了缓存,其实,缓存简单易用,更多精力关注的是根据实际业务的选择缓存策略。本文主要介绍为什么要构建ehcache+redis两级缓存?以及在实战中如何实现?思考如何配置缓存策略更合适?这样的方案可能遗留什么问题?JUST DO IT! GO!问题描述 场景:我们的应用系统是分布式集群的,可横向扩展的。应用中某个接口操作满足以下一个或多个条件: 1 阅读详情

相关推荐

springboot整合ehcache+redis实现双缓存

在一些对并发业务要求较高的场景下,对页面数据的响应是个急需解决的问题,对后端来说,ehcache+redis实现双缓存是解决这一问题的不错思路,而且在不少的电商项目中得到了很好的验证,但我在网上搜寻资料的时候总觉得一些材料不能很好的说明这个问题,要么太复杂,要么太简单,最近抽空思考了一下这一思路的简单实现,下面就用springboot整合ehcache和redis来说明一下实现的过程, 需求说明...

qwer1573037436的博客 2372

ehcache与redis

一 .ehcache 为什么需要缓存 拉高程序的性能 什么样的数据需要缓存 很少被修改或根本不改的数据 业务场景比如:耗时较高的统计分析sql、电话账单查询sql等 ehcache是什么 Ehcache 是现在最流行的纯Java开源缓存框架,配置简单、结构清晰、功能强大 注1:本章介绍的是2.X版本,3.x的版本和2.x的版本API差异比较大 ehcache的特点 4.1 够快 E...

f_1314520的博客 663

【SpringBoot】27、SpringBoot中整合Ehcache实现热点数据缓存

EhCache 是一个纯 Java 的进程内缓存框架,具有快速、精干等特点,是 Hibernate 中默认的CacheProvider。用惯了 Redis,很多人可能已经忘记了还有 EhCache 这么一个缓存框架 一、简介 EhCache 是一个纯 Java 的进程内缓存框架,具有快速、精干等特点,是 Hibernate 中默认CacheProvider。Ehcache 是一种广泛使用的开源 Java 分布式缓存。主要面向通用缓存,Java EE 和轻量级容器。它具有内存和磁盘存储,缓存加载器,缓存扩展,

JACKAL 21万+

java进程内的缓存框架Ehcach

1. 基本介绍 EhCache 是一个纯Java的进程内缓存框架,具有快速、精干等特点,是Hibernate中默认CacheProvider。Ehcache是一种广泛使用的开源Java分布式缓存。主要面向通用缓存,Java EE和轻量级容器。它具有内存和磁盘存储,缓存加载器,缓存扩展,缓存异常处理程序,一个gzip缓存servlet过滤器,支持REST和SOAP api等特点。 Spring...

有的话没说出来之前,你是他的主人,一旦说出来你就成了他的奴隶||想要干好事,别太把自己当人,别把别人太不当人||认识这个人就是开了一扇窗户,就能看到不一样的东西,听到不一样的声音,能让你思考、觉悟,这已经够了 1714

LabVIEW内存优化实战:用DVR和队列高效处理大型数组,告别数据副本

本文深入探讨LabVIEW内存优化技术,重点介绍数据值引用(DVR)和单元素队列(SEQs)在高效处理大型数组中的应用。通过对比传统方法与现代引用技术的性能差异,提供减少内存副本、提升程序效率的实战方案,帮助开发者在测试测量、图像处理等数据密集型场景中实现显著性能提升。

weixin_30835649的博客 1061

打造你自己的小程序容器 —— 一套能装得下整个未来的跨端技术!

摘要: 本文介绍了一种基于Capacitor框架开发的轻量级“小程序容器”解决方案——LapDrop。通过模拟微信小程序的运行逻辑(动态加载、原生能力调用、沙盒环境),LapDrop允许开发者自主构建跨平台(iOS/Android/Web)的小程序生态。其核心利用Capacitor的插件桥接机制,实现JS与原生功能的无缝调用,并支持浏览器调试与原生环境一致化。优势包括插件化架构、状态隔离、热更新及开放权限控制,适用于企业级模块化应用或开发者工具。未来计划扩展生命周期管理、远程加载等功能,目标成为开源的小程序

CangYuChenAi的博客 974

Springboot2.0整合Redis缓存+Ehcache缓存

整合Redis缓存与Ehcache缓存

Jack方 3646

ENSP之配置静态路由

ENSP之配置静态路由 两台路由器两台PC 拓扑图如下: 配置AR1线路上的两条IP地址 配置AR2线路上的两条IP地址 3.AR2上 配置静态IP 路由 AR1上 配置静态IP 路由 设置两台PC 的IP地址 网关 PC1 PC2 全部配置好了之后 现在测试PC1是否ping 得通PC2 在命令行输入 成功的话如下图 ...

浪友与泪的博客 3544

Ehcache缓存和Redis缓存数据

SpringBoot中使用JVM缓存 pom <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-cache</artifactId> </dependency> ehcache.xml <?xml version="1.0" encoding="UTF-8"?> <ehcache xmlns

小毕超博客 2558

鸿蒙5.0进阶开发:UI开发-不依赖UI组件的全局自定义弹出框 (openCustomDialog)(推荐)

本文介绍通过入参形式为ComponentContent创建自定义弹出框............

AyomQAQ的博客 1849

Yolov5s/Yolov8s网络结构图

yolov8、yolov5网络结构图

Goodness2020的博客 9924

Java缓存技术(java内置缓存,redis,Ehcache,Caffeine的基本使用方法及其介绍)

此外,报告还介绍了几个广受欢迎的Java缓存框架,如Redis(高性能分布式内存缓存)、Ehcache(开源Java缓存框架,支持分布式缓存)以及Caffeine(高性能Java内存缓存库,专注于快速响应和高效内存利用)。简而言之,Java中的缓存技术是一种高效的数据处理策略,它利用内存的高速访问特性,为应用程序提供了快速的数据检索服务,从而提高了系统的响应速度和用户体验。在Java中,缓存的实现方式多样,包括利用本地数据结构实现的本地缓存、借助Java标准库提供的缓存功能。

m0_67725787的博客 3500

fanuc机器人I/O分配

FANUC机器人在和其他外部设备进行通讯时,需要对信号进行配置。 在机器人处于UOP自动分配状态时,系统会自动检索已配对设备,并分配相应的机架号。 当我们需要手动对信号进行分配时,可参考以下机架号进行配置。 不同的通讯协议对应的机架号不同,外部通讯协议常用的机架号参考下表: 序号 机架号 通讯类型 1 0 Process I/O 2 1-15

haier123888的博客 1万+

Ehcache缓存的使用

缓存应该是每个系统都要考虑的架构,缓存不仅可以加速系统的访问速度还可以提升系统的性能。如我们需要经常访问的高频热点数据,如果把它缓存起来就能有效减少数据库服务器的压力。手机验证码等有一定的失效时间,我们就可以考虑使用缓存,等失效时间过了,就删掉验证码。

laizhenghua的博客 6434

基于fme和python-docx第三方库批量更新不动产调查表

最近应朋友需要批量更新在不动产成果中提交的各种word报表中的指定数据,根据初步的了解,我做了一个基于fme软件和python-docx第三方库进行一个批量的更新方案。

weixin_43229258的博客 1240

【Python基础】FastAPI 从入门到项目实战操作详解

【Python基础】FastAPI从入门到使用实战操作详解

congge_study的博客 434

如何使用缓存提升SpringBoot性能(EhCache和Redis方式)

缓存是指将文件或数据的副本存储在缓存或临时存储位置中,以便未来对该数据的请求可以更快地提供服务。当从存储中检索数据时,会在缓存中创建该数据的副本。如果再次需要该数据,可以从缓存中比从主存储器中更快地检索到该数据,主存储器可能涉及复杂的计算或较慢的访问速度。如何使用缓存提升SpringBoot性能(EhCache和Redis方式)

三两肉的博客 2466

VB摄像头监控

该VB模块可对摄像头捕获的画面进行录像等,可在创建的窗口进行控制

Spring Boot缓存组件Ehcache、Caffeine、Redis、Hazelcast

本文分析了Spring Boot缓存架构的核心组件与主流缓存工具特性对比。通过表格和图表详细比较了Ehcache、Caffeine、Redis和Hazelcast在性能、存储方式、集群支持等关键维度的差异,并提供了本地缓存(Caffeine)和分布式缓存(Redis)的配置实现案例。针对不同应用场景,提出技术选型决策树:小数据量高性能场景推荐Caffeine,大数据量分布式场景选择Redis或Hazelcast。最后对比了各方案的高级特性,为开发者提供全面的缓存技术选型参考。

笔记 2835

复分析 阿尔福斯(Ahlfors) 第三版答案 英文

答案分为十章,有部分习题没有答案,全英文复分析阿尔福斯(Ahlfors) 第三版答案

Camera2Demo

在Camera2 的基础上进行封装,使得Camera2一堆初始化逻辑与Activity分离,降低耦合度,完成预览拍照并保存的操作

ehcache和redis实现二级缓存

二级缓存的作用 简要说明:ehcache是内存缓存,在本地jvm内存中,十分高效,但是如果缓存数据都存在jvm中,内存是不够用的,于是使用到了redis数据库缓存,redis是键值对数据库,也比较高效,如果仅用redis做缓存,则存在频繁的网络IO读写,因为一般的会将redis部署在一个单独的服务器上,或者是集群部署。所以我们结合两者的特性,优先使用ehcache缓存,当ehcac...

JinXYan的博客 1362

Devexpress16.2.6破解工具

Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具

SpringBoot缓存技术选型:Redis+Ehcache+Guava性能对比

在当今的软件开发中,缓存技术是提升系统性能的关键手段之一。在Spring Boot项目里,合理地使用缓存能够显著减少数据库的访问次数,降低系统响应时间,提高系统的吞吐量。常见的缓存技术有Redis、Ehcache和Guava,它们各自有着不同的特点和适用场景。本文将对这三种缓存技术在Spring Boot中的应用进行性能对比,帮助技术人员在实际项目中做出更合适的缓存技术选型。

梵心白莲的博客 1029

使用 Spring缓存抽象 支持 EhCache 和 Redis 混合部署

概述 在分布式 web 项目中,通常即需要本地缓存提高程序性能,也需要共享缓存在多机之间交换数据。本文介绍了使用Spring缓存抽象机制混合部署的方法。 Spring 3.1 引入了激动人心的基于注释(annotation)的缓存(cache)技术,使用Spring缓存抽象,程序员仅需要使用少量的注释就实现了对象的缓存,不必了解复杂的面向对象的编程(AOP)技术。 Spring 的缓存技术相

pmlpml的专栏 7369

【缓存】Ehcache与Redis比较

一、分布式与集群是什么 ? 区别是什么? 集群:多个人在一起作同样的事 。 分布式 :多个人在一起作不同的事 。 将一套系统拆分成不同子系统部署在不同服务器上(这叫分布式),然后部署多个相同的子系统在不同的服务器上(这叫集群),部署在不同服务器上的同一个子系统应做负载均衡。 分布式:一个业务拆分为多个子业务,部署在多个服务器上 。 集群:同一个业务,部署在多个服务器上 ...

静下心来吧,让自己变强大点! 1577

Ehcache和Redis的比较 总结

1.概念不同: Redis是一个基于内存的高性能key-value数据库,整个数据库统统加载在内存当中进行操作,定期通过异步操作把数据库数据flush到硬盘上进行保存 EhCache 是一个纯Java的进程内缓存框架,具有快速、精干等特点,是Hibernate中默认的CacheProvider。Ehcache是一种广泛使用的开源Java分布式缓存。主要面向通用缓存,Java EE和轻量级容器。...

weixin_43833993的博客 5950

网站缓存技术 ehcache memcache redis 的比较

合适的使用缓存可以使应用的访问速度得到质的提升,之前我们介绍过有关Ehcache和Memcache的知识,今天来总结一下在网站设计中有哪几类缓存,以及常用缓存系统之间的对比。 从数据流向的角度来看,缓存可以分为以下几类 客户端缓存客户端缓存又可分为:浏览器缓存、网关或代理服务器缓存网关或代理服务器缓存网关或代理服务器缓存是将网页缓存中网关服务器上,多用户访问同一个页面时,将直接从网关服务器把

张小琦的博客专栏 1784

快速掌握缓存技术:学习多个缓存供应商(ehcache,redis,memcached,jetcache,j2cache)

快速掌握缓存的学习

weixin_62513677的博客 1505
上一篇: 框架之spring (一)
下一篇: 使用IDEA创建maven+springCloud项目(一)
呱小飞
博客等级 码龄9年 26粉丝 23原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值