Redis(一)


1、Redis 入门


1.1、问题引入

在传统的 Java Web 项目中,使用数据库进行存储数据,但是有 些致命的弊端,这些弊端主要来自于性能方面。由于数据库持久化数据主要是面向磁盘,而磁盘的读/写比较慢,般管理系统上,由于不存在高并发,因此往往没有瞬间需要读/写大量数据的要求,这个时候使用数据库进行读/写是没有太大的问题的,但是在互联网中,往往存在大数据量的需求 ,比如一些商品抢购的场景,或者是主页访问量瞬间较大的时候, 瞬间成千上万的请求就会到来 需要系统在极短的时间内完成成千上万次的读/写操作,这个时候往往不是数据库能够承受的,极其容易造成数据库系统瘫痪,最终导致服务岩机的严重生产问题。



1.2、NoSQL简介

为了克服这些问题, Java Web 项目往往就引入了 NoSQL 技术, NoSQL 工具也是简易的数据库,它主要是 种基于内存的数据库,并提供 定的持久化功能 RedisMongoDB 是当前使用最广泛的 NoSQL ,而本书主要介绍的是 Redis 技术,它的性能十分优越,可以支持每秒十几万次的读/写操作,其性能远超数据库,并且支持集群、 分布式、主从同步等配置,原则上可以无限扩展,让更多的数据存储在内存中,而更让我们感到欣喜的是它还能支持一定的事务能力,这在高并发访问的场景下保证数据安全和一致性特别有用。

什么是NoSQL呢?

NoSQL:即 Not-Only SQL( 泛指非关系型的数据库),作为关系型数据库的补充

作用:应对基于海量用户和海量数据前提下的数据处理问题。

特征:

  • 可扩容,可伸缩
  • 大数据量下高性能
  • 灵活的数据模型
  • 高可用

常见 Nosql 数据库:

  • Redis
  • memcache
  • HBase
  • MongoDB



1.3、NoSQL的四大分类

KV键值对

  • 新浪:Redis
  • 美团:Redis + Tair
  • 阿里、百度: Redis + memecache

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

  • MongoDB
    • MongoDB是一个基于分布式文件存储的数据库,C++编写,主要用于处理大量的文档
    • MongoDB是一个介于关系型数据库和非关系型数据库中间的产品!MongoDB是非关系型数据库中功能最丰富的,最想关系型数据库的
  • ConthDB

列存储数据库

  • HBase
  • 分布式文件系统

图关系数据库

  • 不是图形,存放的是关系。比如朋友圈的社交网络,广告推荐
  • Neo4j、InfoGrid
分类举例应用场景数据模型优点缺点
键值(key-value)Tokyo Cabinet/Tyrant, Redis, Voldemort, Oracle BDB内容缓存,主要用于处理大量数据的高访问负载,也用于一些日志系统等等。Key 指向 Value 的键值对,通常用hash table来实现查找速度快数据无结构化,通常只被当作字符串或者二进制数据
列存储数据库Cassandra, HBase, Riak分布式的文件系统以列簇式存储,将同一列数据存在一起查找速度快,可扩展性强,更容易进行分布式扩展功能相对局限
文档型数据库CouchDB, MongoDbWeb应用(与Key-Value类似,Value是结构化的,不同的是数据库能够了解Value的内容)Key-Value对应的键值对,Value为结构化数据数据结构要求不严格,表结构可变,不需要像关系型数据库一样需要预先定义表结构查询性能不高,而且缺乏统一的查询语法。
图形(Graph)数据库Neo4J, InfoGrid, Infinite Graph社交网络,推荐系统等。专注于构建关系图谱图结构利用图结构相关算法。比如最短路径寻址,N度关系查找等很多时候需要对整个图做计算才能得出需要的信息,而且这种结构不太好做分布式的集群方案。



1.4、现实电商的解决方案

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-ZxCRVcRb-1585457513121)(Redis%EF%BC%88%E4%B8%80%EF%BC%89.assets/image-20200327114754289.png)]

MySQL用来解决最终的底层存储,上层的存储采用NoSQL



1.5、Redis简介

Redis (REmote DIctionary Server) 是用 C 语言开发的一个开源的高性能键值对(key-value)数据库。

特征:

  1. 数据间没有必然的关联关系

  2. 内部采用单线程机制进行工作

  3. 高性能。官方提供测试数据,50个并发执行100000 个请求,读的速度是110000 次/s,写的速度是81000次/s。

  4. 多数据类型支持

    • 字符串类型 string
    • 列表类型 list
    • 散列类型 hash
    • 集合类型 set
    • 有序集合类型 sorted_set
  5. 持久化支持。可以进行数据灾难恢复



1.6、Redis的应用

  • 为热点数据加速查询(主要场景),如热点商品、热点新闻、热点资讯、推广类等高访问量信息等
  • 任务队列,如秒杀、抢购、购票排队等
  • 即时信息查询,如各位排行榜、各类网站访问统计、公交到站信息、在线人数信息(聊天室、网站)、设备信号等
  • 时效性信息控制,如验证码控制、投票控制等
  • 分布式数据共享,如分布式集群架构中的 session 分离
  • 消息队列
  • 分布式锁



1.7、Redis的下载与安装

由于作者希望使用redis的场景是在linux下,所以win版本很早就停跟了。且Redis基础部分我也会基于win进行实验测试

win版本:https://github.com/microsoftarchive/redis/releases/tag/win-3.2.100

不过下载的速度堪忧



下载后解压即可使用

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-sfnjtpkc-1585457513126)(Redis%EF%BC%88%E4%B8%80%EF%BC%89.assets/image-20200327181938649.png)]



使用时先启动服务端,再启动客户端

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-PvjCcwxL-1585457513130)(Redis%EF%BC%88%E4%B8%80%EF%BC%89.assets/image-20200327182227953.png)]



下图为启动成功后的图示

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-3PmRDSzq-1585457513133)(Redis%EF%BC%88%E4%B8%80%EF%BC%89.assets/image-20200327182340279.png)]



1.8、Redis的基本基本操作

我们可以将Redis的命令分为四种类型

1、功能性命令

信息的添加:

  • 添加信息:set key value
  • 查询信息:get key

当访问的信息不存在时,返回nil

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-idHVlmbT-1585457513137)(Redis%EF%BC%88%E4%B8%80%EF%BC%89.assets/image-20200327183146954.png)]

2、清楚屏幕信息

  • 清除屏幕信息:clear

3、帮助信息查阅

  • 查看帮助文档:help 命令名称、help @组名

4、退出命令

  • 退出客户端:quti、exit、esc

对于set和mset的比较

  • set为发送单指令,mset为发送多指令
  • 对于使用set发送三条数据,假设发送时间和返回的时间相同,则消耗时间为:3*2*发送时间+3*执行时间
  • 对于使用mset发送三填数据,假设发送时间和返回的时间相同,则消耗时间为:1*2*发送时间+3*执行时间
  • 对于两个指令的具体使用,没有明确的限定,需要具体情况具体分析(因为如果mset一次性数据太多,由于处理时间太长,容易造成网络阻塞)





2、Redis数据类型

我们要明确Redis的出现,是为了高并发,秒杀等业务场景而生,所以在类似的业务场景下都可以的使用Redis

redis 自身是一个 Map,其中所有的数据都是采用 key : value 的形式存储。数据类型指的是存储的数据的类型,也就是 value 部分的类型,key 部分永远都是字符串

Redis种的常用的数据类型可以分成五类

  • sting
  • hash
  • list
  • set
  • sorted_set

我们可以把这五种类型,简单的类比为java种的String、HashMap、LinkedList、HashSet、TreeSet



2.1、string

1、string类型的数据的基本操作

1)添加/修改数据

set key value

2)获取数据

get key

3)删除数据

del key

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-yiQZ3mfd-1585457513139)(Redis%EF%BC%88%E4%B8%80%EF%BC%89.assets/image-20200327185240786.png)]

4)添加/修改多个数据

mset key1 value1 key2 value2

5)获取多个数据

mget key1 key2

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-lx1B76YM-1585457513141)(Redis%EF%BC%88%E4%B8%80%EF%BC%89.assets/image-20200327185538601.png)]

6)获取数据字符串的个数(字符串的长度)

strlen key

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-wQAieK9O-1585457513143)(Redis%EF%BC%88%E4%B8%80%EF%BC%89.assets/image-20200327185841695.png)]

7)追加信息到院士数据候补(如果原始信息存在就追加,不存在就新建)

append key value

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-kLDhKGG7-1585457513145)(Redis%EF%BC%88%E4%B8%80%EF%BC%89.assets/image-20200327190122704.png)]

2、string类型的数据的扩展操作

由于在大型的企业级应用中,一次性操作一整张的表格服务器的压力会很大。所以我们就需要进行分表。由于Redis中全部是以key value的形式存储,所以就无法出现像关系型数据库一样的自带主键属性。那怎么办呢?

于是Redis中便给出了关于主键得关键字。

设置数值数据增加指定范围的值

incr key //key对应的value只能是数字型的,每次增加1,如果是字符串型则会报错
incrby key increment //increment为key对应value的增加量,但是最大不能超过java中long的范围,且只能增加整数,增加小数会报错
incrbyfloat key increment //与上例类似,只不过增加的形式为小数。当然它也可以增加整数量

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-FKBBshiB-1585457513147)(Redis%EF%BC%88%E4%B8%80%EF%BC%89.assets/image-20200327202844942.png)]

设置数值数据减少指定范围的值

decr key //与增加类似。每次减少1
decrby key increment //每次减少对应的范围值,且减少量为整数

虽然我们这里看似增加减少的是一个数值,但是其实对应的value值,依然是string类型

设置数据具有指定的生命周期

setex key seconds value //设置时间的有效期,单位为秒
psetex key milliseconds value  //设置时间的有效期,单位为毫秒

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-zLuIZD2v-1585457513149)(Redis%EF%BC%88%E4%B8%80%EF%BC%89.assets/image-20200327205226899.png)]

3、string数据类型操作的注意事项

1)数据操作不成功的反馈与数据正常操作之间的差异

① 表示运行结果是否成功

  • (integer) 0 → false 失败

  • (integer) 1 → true 成功

② 表示运行结果值

  • (integer) 3 → 3 3个

  • (integer) 1 → 1 1个

2)数据未获取到

(nil)等同于null

3)数据最大存储量

512MB

4)数值计算最大范围(java中的long的最大值)

9223372036854775807

在实际的应用场景中,我们的key一般格式为

表名:主键名:主键值:字段名 value

tb:id:1:name mobian

tb:id:2:name:2mobian2

对于其字段名和value值也可以使用JSON字符串的形式存储

tb:id:1 {“name”:“mobian”,“age”:21}



2.2、hash

key value => key field+value

  • 新的存储需求:对一系列存储的数据进行编组,方便管理,典型应用存储对象信息
  • 需要的存储结构:一个存储空间保存多个键值对数据
  • hash类型:底层使用哈希表结构实现数据存储

hash存储结构优化

  • 如果field数量较少,存储结构优化为类数组结构
  • 如果field数量较多,存储结构使用HashMap结构
1、hash 类型数据基本操作

1)添加/修改数据

hset key field value

2)获取数据

hget key field
hgetall key

3)删除数据

hdel key field1 [field2]

4)添加/修改多个数据

hmset key field1 value1 field2 value2

5)获取多个数据

hmget key field1 field2

6)获取哈希表中字段的数量

hlen key

7)获取哈希表中是否存在指定的字段

hexists key field
2、hash 类型数据扩展操作

1)获取哈希表中所有的字段名或字段值

hkeys key //获取value的前半部分
hvals key //获取value的后半部分

2)设置指定字段的数值数据增加指定范围的值

hincrby key field increment
hincrbyfloat key field increment

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-niCAzSq2-1585457513152)(Redis%EF%BC%88%E4%B8%80%EF%BC%89.assets/image-20200327213228014.png)]

仅仅用hash就可以完成部分购物车、抢购,限购类、限量发放优惠卷、激活码等业务的数据存储设计

3、hash数据类型操作的注意事项
  • hash类型下的value只能存储字符串,不允许存储其他数据类型,不存在嵌套现象。如果数据未获取到,对应的值为(nil)

  • 每个 hash 可以存储 2的32次方 - 1 个键值对

  • hash类型十分贴近对象的数据存储形式,并且可以灵活添加删除对象属性。但hash设计初衷不是为了存储大量对象而设计的,切记不可滥用,更不可以将hash作为对象列表使用

  • hgetall 操作可以获取全部属性,如果内部field过多,遍历整体数据效率就很会低,有可能成为数据访问瓶颈



2.3、list

  • 数据存储需求:存储多个数据,并对数据进入存储空间的顺序进行区分
  • 需要的存储结构:一个存储空间保存多个数据,且通过数据可以体现进入顺序
  • list类型:保存多个数据,底层使用双向链表存储结构实现(两边都可以进,两边都可以出)
1、list 类型数据基本操作

将list想象成一根水管,左边添加数据,就往水管左边放数据,右边添加数据,就往水管右边放数据,记住一次只能放一个

1)添加/修改数据

lpush key value1 [value2] //left进行插入数据
rpush key value1 [value2] //right进行插入数据

2)获取数据

lrange key start stop //根据对应的索引进行查询数据(0 -1可以组合使用查看所有索引数据)
lindex key index //获取指定的
llen key //获取key的长度

3)获取并移除数据

lpop key //从左边弹出数据
rpop key //从右边弹出数据

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-hJXiCpay-1585457513156)(Redis%EF%BC%88%E4%B8%80%EF%BC%89.assets/image-20200328172836037.png)]

2、list 类型数据扩展操作

1)规定时间内获取并移除数据

blpop key1 [key2] timeout //在一定时间内,获取key中的数据
brpop key1 [key2] timeout //在一定时间内,移除key中的数据

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-5kNJ3s18-1585457513159)(Redis%EF%BC%88%E4%B8%80%EF%BC%89.assets/image-20200328175115020.png)]

2)移除指定数据

lrem key count value //移除对应key的一定数量的value

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-5kOydYt8-1585457513160)(Redis%EF%BC%88%E4%B8%80%EF%BC%89.assets/image-20200328175729344.png)]

3、list 类型数据操作注意事项
  • list中保存的数据都是string类型的,数据总容量是有限的,最多2的三十二次方 - 1 个元素 (4294967295)。
  • list具有索引的概念,但是操作数据时通常以队列的形式进行入队出队操作,或以栈的形式进行入栈出栈操作
  • 获取全部数据操作结束索引设置为-1
  • list可以对数据进行分页操作,通常第一页的信息来自于list,第2页及更多的信息通过数据库的形式加载

list可以让redis用于服务器日志的顺序输出、热点新闻,以及关注好友的顺序的实际应用中

模拟三台不同的服务器将日志进行集中输出的场景:

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-EodxzB6D-1585457513163)(Redis%EF%BC%88%E4%B8%80%EF%BC%89.assets/image-20200328181255595.png)]



2.4、set

  • 新的存储需求:存储大量的数据,在查询方面提供更高的效率
  • 需要的存储结构:能够保存大量的数据,高效的内部存储机制,便于查询
  • set类型:与hash存储结构完全相同,仅存储键,不存储值(nil),并且值是不允许重复的
1、set 类型数据的基本操作

1)添加数据

sadd key member1 [member2]

2)获取全部的数据

smembers key

3)删除数据

srem key member1 [member2]

4)获取集合数据总量

scard key

5)判断集合中是否包含指定的元素

sismember key member

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-aTJJZgEo-1585457513164)(Redis%EF%BC%88%E4%B8%80%EF%BC%89.assets/image-20200328182809761.png)]

2、set 类型数据的扩展操作

1)随机获取集合中指定数量的数据

srandmember key [count]

2)随机获取集合中的某个数据并将该数据移出集合

spop key [count]

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-8aSTgWjc-1585457513166)(Redis%EF%BC%88%E4%B8%80%EF%BC%89.assets/image-20200328184157960.png)]

3)求两个集合的交、并、差集

sinter key1 [key2] 
sunion key1 [key2] 
sdiff key1 [key2]

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-Sp5nfEAf-1585457513168)(Redis%EF%BC%88%E4%B8%80%EF%BC%89.assets/image-20200328185531410.png)]

4)求两个集合的交、并、差集并存储到指定集合中

sinterstore destination key1 [key2] 
sunionstore destination key1 [key2] 
sdiffstore destination key1 [key2]

5)将指定数据从原始集合中移动到目标集合中

smove source destination member 

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-Rbmnvbw6-1585457513169)(Redis%EF%BC%88%E4%B8%80%EF%BC%89.assets/image-20200328190654116.png)]

3、set 类型数据操作的注意事项
  • set 类型不允许数据重复,如果添加的数据在 set 中已经存在,将只保留一份
  • set 虽然与hash的存储结构相同,但是无法启用hash中存储值的空间

redis对比于提供基础数据还是校验结果,前者耦合度更低,推荐使用



2.5、sorted_set

1、sorted_set 类型数据的基本操作

1)添加数据

zadd key scorel member1 [score2 member2]

2)获取全部数据

zrange key start stop [withcores]
zrevrange key start stop [withcores]

3)删除数据

zrem key member [member ...]

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-OnJPYFKy-1585457513171)(Redis%EF%BC%88%E4%B8%80%EF%BC%89.assets/image-20200328210046168.png)]

4)按条件获取数据

zrangebyscore key min max [withcores] [LIMIT] //用于查询指定范围的score,再按照分页显示
zrevrangebyscore key max min [withcores] 

5)条件删除数据

zremrangebyrank key start stop //按照指定的索引删除数据
zremrangebyscore key min max

注意:

  • min与max用于限定搜索查询的条件
  • start与stop用于限定查询范围,作用于索引,表示开始和结束索引
  • offset与count用于限定查询范围,作用于查询结果,表示开始位置和数据总量

6)获取集合数据总量

zcard key //获取集合数据总量
zcount key min max //获取指定范围内的数量

7)集合交、并操作

zinterstore destination numkeys key [key ...] //该指定操作可以获取最大值、合并相同set集合的数据....可以使用help命令查看全部使用
zunionstore destination numkeys key [key ...]
2、sorted_set 类型数据的扩展操作

1)获取数据对应的索引(排名)

zrank key member //根据key查询出对应的索引值(从小到大)
zrevrank key member

2)score值获取与修改

zscore key member //根据key查询其对应的值
zincrby key increment member //给指定的key终得member修改对应的increment量

3)获取当前系统时间

time
3、sorted_set 类型数据操作的注意事项
  • score保存的数据存储空间是64位,如果是整数范围是-9007199254740992~9007199254740992
  • score保存的数据也可以是一个双精度的double值,基于双精度浮点数的特征,可能会丢失精度,使用时候要慎重
  • sorted_set 底层存储还是基于set结构的,因此数据不能重复,如果重复添加相同的数据,score值将被反复覆盖,保留最后一次修改的结果




3、通用指令

3.1、key通用指令

key是一个字符串,通过key获取redis中保存的数据

1、key 基本操作

1)删除指定key

del key

2)获取key是否存在

exists key

3)获取key的类型

type key

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-9dkv0CMl-1585457513174)(Redis%EF%BC%88%E4%B8%80%EF%BC%89.assets/image-20200329104144051.png)]

2、key 扩展操作(时效性控制)

1)为指定key设置有效期

expire key seconds //设置key的有效时间秒数
pexpire key milliseconds
expireat key timestamp
pexpireat key milliseconds-timestamp

2)获取key的有效时间

ttl key //打印剩余的有效时间秒数(会有三种返回值。-2:打印的key是一个过期的;-1:未设置有效时间;具体数字:剩余的有效时间)
pttl key //打印剩余的有效时间毫秒数

3)切换key从时效性转换为永久性

persist key //只能对具有时效性的key进行设置

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-eY2UBzNu-1585457513175)(Redis%EF%BC%88%E4%B8%80%EF%BC%89.assets/image-20200329105011459.png)]

3、key 扩展操作(查询模式)

1)查询key

key pattern

查询模式规则

* 匹配任意数量的任意符号 ? 配合一个任意符号 [] 匹配一个指定符号

keys * 				查询所有
keys it* 			查询所有以it开头
keys *heima 		查询所有以heima结尾
keys ??heima 		查询所有前面两个字符任意,后面以heima结尾
keys user:? 		查询所有以user:开头,最后一个字符任意
keys u[st]er:1 		查询所有以u开头,以er:1结尾,中间包含一个字母,s或t
4、key 其他操作

1)为key改名

rename key newkey //如果newkey是一个已经存在的key,那么新的key就会覆盖之前的key
renamenx key newkey //如果newkey是一个已经存在的key,那么就会报错

2)对多有key排序

sort //排序方式多种多样,可以根据指令的提示进行设置,默认是数字的从小到大排列

3)其他key通用操作

help @generic



3.2、数据库通用指令

1、db基本操作

1)切换数据库

select index //redis数据库划分为0-15个,我们默认的位置是在0

2)其他 操作

quit //退出
ping //测试是否和服务器连通
echo message //打印输出自己输入的信息

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-F6qMwHaJ-1585457513177)(Redis%EF%BC%88%E4%B8%80%EF%BC%89.assets/image-20200329111043708.png)]

2、db相关操作

1)数据移动

move key db //将key移动到对应的db中,只有对应的db中没有时才能移动成功

2)数据清除

dbsize //获取当前db中的key总量
flushdb //删除当前db中的数据
flushall //删除所有数据库中的数据




3、演示案例

Redis默认含有16个数据库,我们可以使用命令行进行切换。

我们默认使用的是0号数据库。除了dbsize,你也可以使用keys * 查看你当前数据库下的所有key

  1. 0号数据库添加值
  2. 3号数据库获取值
  3. 0号数据库清楚当前数据库值
  4. 0号数据库添加值
  5. 4号数据库清楚所有数据库值
  6. 0号数据库获取值
    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-Ta2SQQBu-1621651100056)(Redis(一).assets/image-20210522102446759.png)]

以下截图来源redis配置文件
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-dGdaTaMz-1621651100060)(Redis(一).assets/image-20210522101315050.png)]

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

默辨

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值