Redis知识点学习

Redis

NoSQL:Not Only SQL,不仅仅是数据库,即非关系型数据库。

一、NoSQL特点

1、 方便扩展:数据之间没有关系,很好扩展

2、 大数据量高性能:Redis一秒写8万次,读取11万次,NoSQL的缓存记录级是一种细粒度的缓存,性能会比较高。

3、 数据类型是多样型的:不需要事先设计数据库,随取随用,如果是数据量十分大的表,很多人就无法设计了。

4、 传统关系型数据库(RDBMS)和非关系型数据库(NoSQL)区别:

RDBMS NoSQL

结构化组织 不仅仅是数据库

SQL(结构化查询SQL) 没有固定的查询语言

数据和关系都存在单独的表中 键值对存储、列存储、文档存储

数据操作语言,数据定义语言 图形数据库(社交关系)

严格的一致性 最终一致性

基础的事务 CAP定理和BASE理论(异地多活)

5、高性能、高可用、高可扩

二、大数据时代的3V

主要是描述问题的

1、海量的(Volume)

2、多样的(Variety)

3、实时的(Velocity)

三、大数据时代的3高

主要是对程序的要求

1、高并发

2、高可扩

3、高性能

四、真正在公司中得实践

NoSQL+RDBMS一起使用才是最强的。

如果未来想当一个架构师,没有什么是加一层解决不了的。

五、信息存储用到的技术

1、商品的基础信息:用关系型数据库存储即可(MySQL/Oracle)

例如: 淘宝内部的MySQL不是大家用的MySQL,是根据自己的业务需求作了修改。王坚《阿里云的这群疯子》

2、商品的描述:评论(文字比较多):文档型数据库中,MongoDB

3、图片:分布式文件系统FastDFS、淘宝的TFS、Google的GFS、Hadoop的HDFS、阿里云的OSS。

4、商品的关键字(搜索):搜索引擎(solr、elasticsearch)、ISerach:多隆

5、商品的热间波段信息:内存数据库、Redis、Tair、Memecache

六、NoSQL的四大分类

1、KV键值对:

新浪:Redis(用C语言编写);美团:Redis+Tair;阿里、百度:Redis+Memecache。

2、文档型数据库(bson格式和json一样):

MongoDB是一个基于分布式文件存储的数据库,用C++编写,主要用来处理大量的文档。

MongoDB是一个介于关系型数据库和非关系型数据库中的中间产品。

MongoDB是非关系型数据库中功能最丰富,最像关系型数据库的。

3、列存储数据库:

HBase、分布式文件系统

4、图关系数据库(Neo4j):

不是存图形,放的是关系,比如:朋友圈社交网络,广告推荐。

七、Redis能成为当前主要的NoSQL工具的原因

1、响应快速:每秒110000个读操作,或者810000个写入操作。

2、支持6种数据类型:字符串、哈希结构、列表、集合、可排序集合和基数。

3、操作都是原子的:确保当两个客户同时访问Redis服务器时,得到的是更新后的值(最新值)。在需要高并发的场合可以考虑使用Redis的事务。

4、MultiUtility工具:Redis可以在如缓存、消息传递队列中使用(Redis支持”发布+订阅”的消息模式)。

5、一方面,缓存,减缓数据库压力;另一方面,满足互联网高并发需高速处理数据的场合,如抢红包、商品秒杀,保证并发数据安全和一致性。

八、Redis在Java Web中的应用

1、两个主要场景,一个是缓存常用的数据,另一个是在需要高速读/写的场合使用它快速读/写,如商品抢购和抢红包的场合。(数据一致性和访问控制)

2、缓存:

(1)、使用内存代价较高。

(2)、一般缓存常用数据,比如用户登录信息,一些主要的业务西信息,比如银行会存储一些客户基础信息,银行卡信息,最近交易信息。

(3)、读逻辑:

image-20231207123150746

(4)、写逻辑:

image-20231207133212612

(5)、高数读/写场合:

九、Redis的作用

1、内存存储,持久化,内存中是断电即失,所以说持久化很重要(RDB、AOF)

2、效率高、可以用于高速缓存

3、发布订阅系统

4、地图信息分析

5、计时器、计数器(浏览量)

十、Redis定义

1、Redis(Remote Dictionary Server),即远程字典服务,是一个开源的使用ANSI C语言编写,支持网络,可基于内存亦可持久化的日志型,Key-Value数据库并提供多种语言的API。

2、Redis会周期性的更新的数据写入磁盘或把修改操作写入追加的记录文件,并且在此基础上实现了master-slave(主从)同步。免费和开源,是当下最热门的NoSQL技术之一,也被人们称之为结构化数据库。

十一、Redis特性

1、 多样的数据类型

2、 持久化

3、 集群

4、 事务

十二、学习需用到的知识点:

1、 狂神公众号:狂神说

2、 官网:http://redis.io/

3、 中文网:CRUG网站

4、 下载地址:官网下载即可

5、 Redis默认端口:6379

十三、Redis命令

1、 ping:测试连接,返回pong表示连接成功。

2、 set name liqing:set基础值key value

3、 get name:get key 获取值

4、 测试性能:redis-benchmark是一个压力测试工具,例如:redis-benchmark 命令参数。

十四、Redis的基本操作

1、 一共有16个数据库,默认使用数据库0。

2、 select 3:切换数据库。

3、 DBSIZE:查看DB大小。

4、 Keys *:查看当前数据库所有的key。

5、 清除当前数据库:flushdb。

6、 清除全部数据库的内容:flushall。

十五、Redis理解

Redis是单线程的,是很快的,是基于内存操作,CPU不是Redis性能瓶颈,Redis的瓶颈是根据机器的内存和网络带宽。Redis是C++语言编写,100000+的QPS,不比Memecache差。高性能的服务器不一定都是多线程的,多线程不一定都比单线程效率高。速度:CPU>内存>硬盘(CPU上下文切换)。

十六、Redis为什么单线程还这么快

Redis是将所有的数据全部放在内存中,所以说使用单线程去操作效率就是最高的,多线程(CPU上下文切换,会耗时),对于内存系统来说,如果没有上下文切换效率就是最高的,多次读写都是在一个CPU上的。

十七、Redis

1、 用途:可以用作数据库,缓存和消息中间件MQ。

2、 支持数据结构类型:字符串(strings)、散列(hashes)、列表(lists)、集合(sets)、有序集合(sorted sets)与范围查询、bitmaps、hyperloglogs和地理空间(geospatial),索引半径查询。

3、 内置复制(replication):LUA脚本(Luascripting)、LRU驱动事件(LRU eviction)、事务(transactions)和不同级别的磁盘持久化(persistence) 并通过Redis哨兵(Sentinel)和自动分区(cluster)提供高可用性(high availability)。

十八、关于Redis-Key的基本命令

1、 EXISTS key:判断该key是否存在。

2、 move key数据库序号:将key移除,并移入其他数据库中。

3、 expire key 过期秒数:设置该key的过期时间,单位:秒。

4、 ttl key:显示该key过期剩余时间,单位:秒

5、 type key:查看该key的类型。

十九、String字符串类型

1、 APPEND key value:追加字符串,如果该key不存在,就相当于set key。

2、 STRLEN key:获取该key的value长度。

3、 incr key:自增1;incrby key 步长:可以设置步长,指定增量。

4、 decr key:自减1;decrby key 步长:指定减量。

5、 getrange key start end:截取字符[start,end]

getrange key 0 -1:获取全部字符串和get key是一样的。

6、 setrange key 字符索引 替换字符:替换指定位置开始的字符串。

7、 setex key 30 “hell”:设置key的值为hello,30秒后过期。

8、 setnx key value:如果key存在,创建失败,不存在,设置成功(0代表失败)

9、 mset k1 v1 k2 v2 k3 v3:同时设置多个值。

10、mget k1 k2 k3:同时获取多个值。

11、msetnx k1 v1 k4 v4:msetnx是一个原子性的操作,要么一起成功,要么一起失败。(redis的事务不一定是原子性)

12、set user:1 {name:zhangsan,age:3}

mset user:1:name zhangsan user:1:age 3

mget user:1:name user:1:age

13、getset:先get后set,如果不存在,则返回nil;如果存在值,获取原来的值,并设置新的值。

14、String的使用场景:计数器,统计多单位的数量、粉丝量,对象缓存存储。

二十、List列表类型

1、 在redis里面,我们可以把list玩成栈、队列、阻塞队列。

2、 所有的list命令都是以l开头,Redis命令不区分大小。

3、 LPUSH list one:将一个值或多个值,插入列表头部(左边)。

4、 LRANGE list 0 -1:获取list中所有的值。

LRANGE list 1 1:获取0到1区间的list的值。

5、 Rpush list right:将一个值或多个值,插入列表尾部(右边)。

6、 Lpop:移除列表第一个元素。(LPOP list)

7、 RPOP:移除列表最后一个元素。(RPOP right)

8、 lindex list 0:通过下标获得list中的某一个值,index从0开始。

9、 llen list:返回列表长度。

10、 lrem list 1 one:移除list集合中指定个数的value,精确匹配。

11、ltrim mylist 1 2:通过截取指定范围1-2的列表。

12、rpoplpush mylist(源列表) myotherlist(目标列表):移除列表的最后一个元素,将其移动到新的列表中。

13、lset list 0 item:将列表中指定下标的值替换为另外一个值,更新操作,如果值存在,则更新当前下标的值,如果不存在,则会报错。、

14、EXISTS list:判断列表是否存在。

15、linsert:将某个具体的value值插入到列表中某个元素的前面或后面。

linsert list before world other:将other插入到world前面。

linsert list after world new:将new插入到world后面。

16、使用场景:消息排队、消息列队(Lpush、Rpop)、栈(Lpush、Lpop)

二十一、Set集合类型详解

1、 set中的值是不能重复的,无序不重复集合。

2、 sadd myset “hello”:set集合中添加值。

3、 smembers myset:查看指定set的所有值。

4、 sismembers myset “hello”:判断某一个值是不是在set集合中。

5、 scard myset:获取set集合中的内容元素个数。

6、 srem myset “hello”:移除set集合中的指定元素。

7、 srandmember myset:随机抽选出一个元素。

Srandmember myset 2:随机抽选出指定个数的元素。

8、 spop myset:随机删除一些set集合中的元素。

9、 smore myset myset2 kuangshen:将一个指定的值,移动到另一个set集合。

10、 sdiff key1 key2:差集

sinter key1 key2:交集

sunion key1 key2:并集

二十二、Hash哈希类型详解

1、 hset myhash field1 kuangshen:set一个具体key-value

2、 hget myhash field1:获取一个字段值

3、 hmset myhash field1 hello field2 world:set多个key-value,当map中的key已存在,则会将新值覆盖旧值。

4、 hmget myhash field1 field2:获取多个字段值

5、 hgetall myhash:获取全部的数据。

6、 hdel myhash field1:删除hash指定key字段,对应的value值也没了。

7、 hlen myhash:获取hash内容长度。

8、 hexists myhash field1:判断hash中指定字段是否存在。

9、 hkeys myhash:只获得所有得key。

10、 hvals myhash:只获得所有得value。

11、 hincrby myhash field3 1:自增1。

12、 hdecrby myhash field3 1:自减1。

13、 hsetnx myhash field4 hello:如果不存在则可以设置,如果存在则不能设置。(常用于分布式锁)

使用场景:存储用户信息、经常变动的信息,hash更合适于对象的存储,String更加合适字符串存储。

二十三、Zset有序集合的详解

1、 zadd myset 1 one:添加一个值。

zadd myset 2 two 3 three:添加多个值。

2、 zrange myset 0 -1:获取所有的值。

3、 排序实现:zrangebyscore salary -inf(负无穷) +inf(正无穷):显示全部的用户,从小到大。

Zrangebyscore salary -inf 2500 withscores:显示工资小于2500员工的升序排列(带工资信息)。

4、 zrem salary zhangsa:移除有序集合中的指定元素。

5、 zcard salary:获取有序集合的个数。

6、 zrevrange salary 0 -1:从大到小进行排序。

7、 zcount salary 1 3:获取指定区间的成员数量。

使用场景:存储班级成绩表;工资表排序;排行榜应用实现;取Top N测试;消息重要程度分类。

二十四、Geospatial地理位置详解

1、 使用场景:朋友的定位、附近的人、打车距离计算。

2、 geoadd 命令:添加地理位置

规则:两级(南极、北极)无法直接添加,一般是下载城市数据,直接通过java程序一次性导入。

有效的经度从-180度到180度;有效的纬度从-85.05112878度到85.05112878度,当坐标位置超出上述指定范围时,该命令将会返回一个错误。

geoadd china:city 116.40 39.90 beijing

3、 geopos命令:获取当前定位,一定是一个坐标值

geopos china:city beijing:获取指定城市的经度和纬度。

4、 geodist命令:两地之间的直线距离,单位:m(米)、km(千米)、mi(英里)、ft(英尺)

geodist china:city beijing shanghai km

5、 georadius命令:以给定的经纬度为中心,找出某一半径内的元素(获得所有附近人的地址定位)通过半径来查询。

所有数据应该都录入到china:city中。

(1) georadius china:city 110 30 1000km:以110,30这个经纬度为中心,寻找方圆1000km内的城市。

(2) georadius china:city 110 30 500km withdist:显示到中心距离

(3) georadius china:city 110 30 500km withcoord:显示到中心的经纬度

(4) georadius china:city 110 30 500km withdist withcoord count2:显示2个地点。

6、 georadiusbymember命令:找出位于指定元素周围的其他元素。

Georadiusbymember china:city beijing 1000km

7、 geohash命令:返回一个或多个位置的元素的geohash表示该命令将返回11个字符的geohash字符串。将二维的经纬度转换为一维的字符串,如果两个字符串越接近,那么距离越近。

geohash china:city beijing shanghai

“wx4fbxxfkeo”

“wm5x2rybtyo”

8、 geo底层的实现原理其实就是zset,可以使zset命令操作geo。

zrange china:city 0 -1:查看地图中全部的元素。

zrem china:city beijing:移除指定元素。

二十五、Hyperloglog基数统计

1、基数:不重复的元素,可以接受误差

2、优点:占用的内存是固定,2的64次方不同的元素技术,只需要废12KB内存,如果从内存角度来比较的话,Hyperloglog首选。

0.81%错误率,统计UV任务,可以忽略不计的。(UV:独立访客)

3、pfadd命令:创建元素 pfadd mykey a b c d e f g h I j

4、pfcount命令:统计mykey元素的基数数量 pfcount mykey

5、pfmerge命令:pfmerge mykey3 mykey mykey2:合并两组 mykey mykey2→mykey3(并集);如果允许容错,那么一定可以使用Hyperloglog。

二十六、bitmap位图场景详解

1、 位存储:统计用户信息:活跃、不活跃;登录、未登录;打卡、未打卡;

两个状态的都可以使用bitmap;bitmap位图数据结构。

2、 setbit sign 1 0:星期一打卡

setbit sign 2 1:星期二打卡

3、 getbit sign 2:查看星期二打卡情况

4、 bitcount sign 1 2:统计从星期一到星期二的打卡次数

二十七、Redis基本的事务操作

1、Redis单条命令是保证原子性的,但是事务不保证原子性

2、mysql的事务要么全部成功,要么全部失败,即原子性。

3、Redis事务本质:一组命令的集合,一个事务中的所有命令都会被序列化,在事务执行过程中,会按照顺序执行。

特点:一次性,顺序性,排它性。

队列 set set set 执行。

4、 Redis事务没有隔离级别的概念,所有的命令在事务中,并没有直接被执行,只有发起执行命令才会执行(exec)。

5、 Redis的事务过程:

(1)、开启事务(multi)

(2)、命令入队(…)

(3)、执行事务(exec)

放弃事务(取消事务):discard:事务队列中命令都不会被执行。

6、 编译时异常(代码有问题,命令有错),事务中所有的命令都不会被执行。

运行时异常(I/O),如果事务队列中存在语法错误,那么执行命令时,其他命令正常执行,错误命令抛出异常。

二十八、Redis实现乐观锁

1、 悲观锁:认为什么时候都会出问题,无论做什么都会加锁(效率低)

2、 乐观锁:很乐观,认为什么时候都不会出问题,所有不会上锁;更新数据的时候去判断一下,在此期间是否有人修改过这个数据。获取version,更新的时候比较version。

(1) 测试多线程修改值,使用watch可以当做redis的乐观锁操作:

watch money :监视 money

multi

decrby money 10

incrby out 10

exec:执行之前,另外一个线程,修改了money的值,这个时候,就会导致事务执行失败。

(2)如果修改失败,获取最新的值即可

unwatch:如果发现事务执行失败,就先解锁。

watch money:获取最新的值,再次监视。

multi

decrby money 1

incrby out 1

exec:对比监视的值是否发生变化,如果没有变化,那么执行成功,如果有变化就执行失败。

二十九、通过Jedis操作Redis

1、 Jedis的概念:是Redis官方推荐的java连接开发工具,使用Java操作Redis中间件。

三十、SpringBoot集成Redis

1、 SpringBoot操作数据用到的配置:spring-data、jpa、jdbc、mongodb、redis。

SpringData也是和SpringBoot齐名的项目。

2、 说明:SpringBoot2.X之后,原来使用的jedis被替换为lettuce。

jedis:采用的直连,多个线程操作的话,是不安全的,如果要避免不安全的,使用jedispool连接池,BIO模式。

lettuce:采用netty,实例可以在多个线程中进行共享,不存在线程不安全的情况,可以减少线程数量,NIO模式。

3、扩展:

3.1、BIO通信模型:因为BIO是同步阻塞的,基本通信过程是每次client请求过来时server会启动一个线程进行通信,缺点:一连接一线程的模型导致服务异常无法承受大量客户端的并发连接。

3.2、 NIO通信模型:因为NIO是同步非阻塞的,所以在事件处理模型上与BIO有所不同,为了达到非阻塞目的,这样能够确保在连接过程中不会被阻塞,再将建立好的连接分配给对应的处理线程。

三十一、自定义RedisTemplate

三十二、Redis配置文件详解(Redis.conf)

1、 配置文件units单位对大小不敏感。

2、 可以包含其他配置文件。

3、 Network网络配置:bind 127.0.0.1(绑定ip)、port 6379(端口设置)、protected-mode yes(保护模式)。

4、 通用general配置内容:

(1) daemonize yes:以守护进程的方式运行,默认是no,需自己开启为yes。

(2) pidfile /var/run/redis_6379.pid:如果以后台方式运行,就需要指定一个pid文件。

(3) loglevel notice:日志级别:debug:用于开发、测试环境

verbose:比较全的日志

notice:用于生产环境

warning:重要日志。

(4)logfile “”:日志文件位置名。

(5)database 16:数据库的数量,默认是16个数据库。

(6)always-show-logo yes:是否总是显示logo

(7) 快照:持久化:在规定时间内,执行了多少次操作,则会持久化到.rdb

、.aof文件中。

a、 redis是内存数据库,如果没有持久化,那么断电及失。

b、 save 900 1:如果900秒内,至少有一个key进行了修改,则进行持久化操作。

sava 300 10:如果300秒内,至少有10个key进行了修改,则进行持久化操作。

sava 60 10000:如果60秒内,至少有10000个key进行了修改,则进行持久化操作。

c、 stop-writes-on-bgsave-error yes:持久化如果出错,是否还需继续工作。

d、 rdbcompression yes:是否压缩rdb持久化文件,需消耗一些cpu资源。

e、 rdbchecksum yes:保存rdb文件的时候,进行错误的检查校验。

f、 dir ./:rdb文件保存的目录。

(8)、replication复制:主从复制。

(9)、security安全:redis默认没有密码。

config get requirepass:获取redis密码

config set requirepass:设置redis密码

auth 123456:使用密码进行登录

(10)、clients客户端限制:

maxclients 10000:设置能连接上redis的最大客户端的数量。

Maxmemory <bytes>:redis配置最大的内存容量。

maxmemory-policy noeviction:内存到达上限的处理策略

六种处理策略:volatile-lru:只对设置了过期时间的key进行LRU(默认值)

allkeys-lru:删除lru算法的key

volatile-random:随机删除即将过期key

allkeys-random:随机删除

volatile-ttl:删除即将过期的

noeviction:永不过期,返回错误

LRU全称是Least Recently Used,即最近最久未使用,LRU算法的设计原则:如果一个数据在最近一段时间没有被访问到,那么在将来它被访问的可能性很小,也就是说,当限定的空间已存满数据时,应当把最久没有被访问到的数据淘汰。

(11)、append only模式:aof配置

a、appendonly no:默认是不开启aof模式,默认是使用rdb方式持久化的,在大部分情况下,rdb完全够用。

b、appendfilename “appendonly.aof”:持久化文件的名字。

c、appendfsync always:每次修改都会同步(sync),消耗性能。

appendfsync everysec:每秒执行一次sync,可能会丢失这一秒数据。

appendfsync no:不执行sync,这个时候操作系统自己同步数据,速度最快。

三十三、持久化之RDB操作

1、 Redis是内存数据库,如果不将内存中的数据库状态保存到磁盘,那么一旦服务器进程退出,服务器中的数据状态也会消失。所以Redis提供了持久化功能。

2、 RDB(Redis DataBase):在指定的时间间隔内将内存中的数据集快照写入磁盘,也就是行话讲的Snapshot快照,它恢复时是将快照文件直接读到内存里。

3、 触发RDB机制:

a、save的规则满足的情况下,会自动触发rdb规则。

b、执行flushall命令,也会触发rdb规则。

c、退出redis,也会产生rdb文件。

4、恢复rdb文件:默认文件名:dump.rdb。

a、只需要将rdb文件放在我们redis启动目录就可以,redis启动的时候会自动检查dump.rdb恢复其中的数据。

b、查看需要存放的位置:config get dir

/usr/local/bin:如果在这个目录下存在dump.rdb,启动就会自动恢复其中的数据。

5、优点:

a、适合大规模的数据恢复。

b、对数据的完整性要求不高。

6、缺点:

a、需要一定的时间间隔进程操作,如果Redis意外宕机了,最后一次修改数据就没有了。

b、 fork进程的时候,会占用一定的内存空间。

7、RDB工作原理:

image-20231207135954391

Redis会单独创建(fork)一个子进程持久化,会先将数据写入到一个临时文件中,待持久化过程都结束了,再用这个临时文件替换上次持久化好的文件,生成正式RDB文件。整个过程中,主进程是不进行任何IO操作,这就确保了极高的性能。

三十四、持久化之AOF操作

1、 AOF(Append Only File):将我们的所有命令都记录下来,恢复的时候就把这个文件全部在执行一遍。

2、 AOF持久化,默认是不开启的,需要手动进行配置,将appendonly改为yes就开启了aof。

3、 重启redis,aof持久化就生效了。

4、 如果aof文件有错误,redis是启动不起来的,需要修复aof文件

使用 redis-check-aof –fix appendonly.aof进行修复。

5、 优点:

(1)、每一次修改都同步,文件的完整性会更加好。

(2)、每秒同步一次,可能会丢失一秒的数据(默认)

(3)、从不同步,效率最高的

6、缺点:

(1)、相对于数据文件来说,aof远远大于rdb,修复的速度也比rdb慢。

(2)、aof运行效率也要比rdb慢,所以redis默认的配置是rdb持久化。

7、重写规则说明:

(1)、no-appendfsyne-on-rewrite no:aof文件重写配置

(2)、auto-aof-rewrite-percentage 100

(3)、auto-aof-rewrite-min-size 64mb:如果文件超时64m,则重写一个文件

aof默认就是文件的无线追加,文件会越来越大。

8、AOF工作原理:

image-20231207140158214

以日志的形式来记录每个写操作,将Redis执行过的所有指令记录下来(读操作不记录),只许追加文件但不可以改写文件,redis启动时会读取该文件重新构建数据,即将写指令从前到后执行一次。

三十五、Redis订阅发布

1、 订阅端:

subscribe kuangshenshuo:订阅一个频道kuangshenshuo

等待读取推送的消息

“message”:消息

“kuangshenshuo”:哪个频道的消息

“hello,kuangshen”:消息的具体内容

2、 发送端:

publish kuangshenshuo “hello,kuangshen”:发布者发布消息到频道。

三十六、Redis主从复制

1、 概念:主从复制,是指将一台Redis服务器的数据,复制到其他的Redis服务器。前者称为主节点,后者成为从节点;数据的复制是单向的,只能由主节点到从节点。Master(主节点)以写为主,slave(从节点)以读为主。主从复制,读写分离至少得一主二从。

image-20231207140258684

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值