redis入门01

数据库的发展

单机数据库时代:一个应用,一个数据库实例,

解释:数据的存储量比较小,一个应用对应的一个数据库(所有的表都在里面)

请添加图片描述

缓存、水平切分时代:中间出现了一层缓存数据将,经常访问的数据放在里面

请添加图片描述

读写分离时代: 读操作访问数据库1,写操作访问数据库2,但是它们可以通过中间件的形式通知更新数据

请添加图片描述

分表分库时代(集群):给每个表分配一个空间然后去访问每张表

请添加图片描述

Nosql数据模型:

关系型数据库:依赖于表的存储结构:oracle、mysql、DB2、sqlserver、…

非关系型数据库(noSql): 彻底改变底层存储机制。不再采用关系数据模型,而是采用聚合数据结构存储数据。
redis、mongoDB、HBase、…

存储结构 :

关系型:采用的表格的形式存储

student:

stuIdstuName
1001张三

非关系型:聚合模型—把一组相关联的数据作为一个整体进行存储和管理。

常见的一种

BSON:数据保存到键值对中、数据和数据之间用逗号隔开,{}表示对象,[]表示数组。

  {
        id:1001,
	name:zhangsan,
	age:20,
	clazz:{
	   id:111,
	   name:clazz1
	}
     }

K-V键值对、列簇、图表模型等。

Redis采用的是K-V模型存储数据的。

Redis简介

定义:是一个用C语言编写的、开源的、基于内存运行并支持持久化的、高性能的NoSQL数据库.也是当前热门的NoSQL数据库之一。

优点:1)Redis中的数据大部分时间都是存储内存中的,适合存储频繁访问、数据量比较小的数据。

2)可以定期持久化到磁盘里,备份数据

redis操作

启动redis

1)前台启动:在任何目录下执行 redis-server
2)后台启动:在任何目录下执行 redis-server &
3)启动redis服务时,指定配置文件:redis-server redis.conf &

如果修改了redis中的redis.conf那么就必须按照3)的方式启动,redis,这样才会每次都会读取,配置文件信息,默认是不读取的

关闭redis服务:

1)、通过kill命令:
ps -ef|grep redis查看pid
kill -9 pid
2)、通过redis-cli命令关闭:
redis-cli shutdown

redis的客户端:

定义::用来连接redis服务,向redis服务端发送命令,并且显示redis服务处理结果。

redis-cli:是redis自带客户端,使用命令redis-cli就可以启动redis的客户端程序。

连接客户端:

常见的使用:

redis-cli:默认连接127.0.0.1(本机)的6379端口上的redis服务。
redis-cli -p 端口号:连接127.0.0.1(本机)的指定端口上的redis服务。
redis-cli -h ip地址 -p 端口:连接指定ip主机上的指定端口的redis服务。

退出客户端:

在客户端执行命令:exit或者quit

语法

redis状态命令

1,沟通命令,查看连接状态的
redis >ping 返回 PONG
解释:输入 ping,redis 给我们返回 PONG,表示 redis 服务运行正常
**加粗样式
2)查看当前数据库的数目
语法:dbsize
作用:返回当前数据库的 key 的数量。
返回值:数字,key 的数量
在这里插入图片描述
(3) redis 默认使用 16 个库
Redis 默认使用 16 个库,从 0 到 15。 对数据库个数的修改,在 redis.conf 文件中
databases 16
在配置文件里面可以修改
在这里插入图片描述
(4) 切换库命令:select db
使用其他数据库,命令是 select index
在这里插入图片描述

(5) 删除当前库的数据:flushdb
在这里插入图片描述
(6) redis 自带的客户端退出当前 redis 连接: exit 或 quit
在这里插入图片描述

Reids的key的操作

  1. keys
    语法:keys pattern
    作用:查找所有符合模式 pattern 的 key. pattern 可以使用通配符。
    通配符:
    ⚫ *:表示 0-多个字符,例如:keys * 查询所有的 key。
    ⚫ ?:表示单个字符,例如:wo?d , 匹配 word , wood
    1)显示所有的key
    在这里插入图片描述
    2):使用 *表示 0 或多个字符
    在这里插入图片描述
    3)使用?表示单个字符
    在这里插入图片描述
  2. exists
    语法:exists key [key…]
    作用:判断 key 是否存在
    返回值:整数,存在 key 返回 1,其他返回 0.使用多个 key,返回存在的 key 的数量。
    在这里插入图片描述
  3. expire
    语法:expire key seconds
    作用:设置 key 的生存时间,超过时间,key 自动删除。单位是秒。
    返回值:设置成功返回数字 1,其他情况是 0 。
    在这里插入图片描述
  4. ttl
    语法:ttl key
    作用:以秒为单位,返回 key 的剩余生存时间(ttl: time to live)
    返回值:
    ⚫ -1 :没有设置 key 的生存时间, key 永不过期。
    ⚫ -2:key 不存在
    ⚫ 数字:key 的剩余时间,秒为单位
    设置 redlight 的过期时间是 10,查看剩余时间

在这里插入图片描述
5. type
语法:type key
作用:查看 key 所存储值的数据类型
返回值:字符串表示的数据类型

⚫ none (key 不存在)
⚫ string (字符串)
⚫ list (列表)
⚫ set (集合)
⚫ zset (有序集)
⚫ hash (哈希表)
在这里插入图片描述
6. del
语法:del key [key…]
作用:删除存在的 key,不存在的 key 忽略。
返回值:数字,删除的 key 的数量。
删除指定key
在这里插入图片描述

Redis 数据类型操作命令

常见的数据类型

A、 字符串类型 string
字符串类型是Redis中最基本的数据结构,它能存储任何类型的数据,包括二进制数
据,序列化后的数据,JSON化的对象甚至是一张图片。最大512M。
在这里插入图片描述

B、 列表类型 list
Redis列表是简单的字符串列表,按照插入顺序排序,元素可以重复。你可以添加一个元素到列表的头部(左边)或者尾部(右边),底层是个链表结构。
在这里插入图片描述

C、 集合类型 set
Redis的Set是string类型的无序无重复集合。
在这里插入图片描述

D、 哈希类型 hash
Redis hash 是一个string类型的field和value的映射表,hash特别适合用于存储对象。

在这里插入图片描述

E、 有序集合类型 zset (sorted set)
Redis 有序集合zset和集合set一样也是string类型元素的集合,且不允许重复的成员。
不同的是zset的每个元素都会关联一个分数(分数可以重复),redis通过分数来为集合中的成员进行从小到大的排序。
在这里插入图片描述

字符串类型(string)

字符串类型是 Redis 中最基本的数据类型,它能存储任何形式的字符串,包括二进制数
据,序列化后的数据,JSON 格式数据。
在这里插入图片描述

  1. set

将字符串值 value 设置到 key 中
语法:set key value

在这里插入图片描述
查看已经插入的 key
在这里插入图片描述
向已经存在的 key 设置新的 value,会覆盖原来的值
2. get
获取 key 中设置的字符串值
语法:get key
例如:获取 name 这个 key 对应的 value
在这里插入图片描述
对应的key 不存在就返回 nil
在这里插入图片描述

  1. incr
    将 key 中储存的数字值加 1,如果 key 不存在,则 key 的值先被初始化为 0 再执行
    incr 操作(只能对数字类型的数据操作)
    语法:incr key
    例 1:操作key,值增加 1
    在这里插入图片描述
    对非数字的值操作是不行的
    将 key 中储存的数字值减1,如果 key 不存在,则么 key 的值先被初始化为 0 再执
    行 decr 操作(只能对数字类型的数据操作)

在这里插入图片描述
语法:decr key
例1:不存在的key,初值为0,再减 1 。
在这里插入图片描述
4. append
语法:append key value
说明:如果 key 存在,则将 value 追加到 key 原来旧值的末尾
如果 key 不存在,则将 key 设置值为 value
返回值:追加字符串之后的总长度
在这里插入图片描述
追加到不存在的 key,同 set key value
在这里插入图片描述

常用命令

  1. strlen
    语法:strlen key
    说明:返回 key 所储存的字符串值的长度
    返回值:
    ①:如果key存在,返回字符串值的长度
    ②:key不存在,返回0
    例 1:计算存在 key 的字符串长
    在这里插入图片描述
    getrange
    语法:getrange key start end
    作用:获取 key 中字符串值从 start 开始到 end 结束的子字符串,包括 start 和 end, 负数表
    示从字符串的末尾开始,-1 表示最后一个字符
    返回值:截取的子字符串。
    使用的字符串 key: school, value: bjpowernode
    截取从 2 到 5 的字符
    在这里插入图片描述
    从字符串尾部截取,start ,end 是负数,最后一位是-1

在这里插入图片描述
超出字符串范围的截取,获取合理的子串
在这里插入图片描述
3. setrange
语法:setrange key offset value
说明:用 value 覆盖(替换)key 的存储的值从 offset 开始,不存在的 key 做空白字符串。
返回值:修改后的字符串的长度

例 1:替换给定的字符串
在这里插入图片描述

设置不存在的 key
在这里插入图片描述

  1. mset
    语法:mset key value [key value…]
    说明:同时设置一个或多个 key-value 对
    返回值:OK
    例 1:一次设置多个 key,value
    在这里插入图片描述
  2. mget
    语法:mget key [key …]
    作用:获取所有(一个或多个)给定 key 的值
    返回值:包含所有 key 的列表

在这里插入图片描述
:返回不存在的 key
在这里插入图片描述

列表 list

Redis 列表是简单的字符串列表,按照插入顺序排序。你可以添加一个元素导列表的头部(左
边)或者尾部(右边)
例 1:将 a,b,c 插入到 mylist 列表类型

  1. lpush
    语法:lpush key value [value…]
    作用:将一个或多个值 value 插入到列表 key 的表头(最左边),从左边开始加入值,从左
    到右的顺序依次插入到表头
    返回值:数字,新列表的长度
    原理图

在这里插入图片描述
2. rpush
语法:rpush key value [value…]
作用:将一个或多个值 value 插入到列表 key 的表尾(最右边),各个 value 值按从左到右
的顺序依次插入到表尾
返回值:数字,新列表的长度
在这里插入图片描述
在 redis-desktop-manager 显示:
在这里插入图片描述

  1. lrange
    语法:lrange key start stop
    作用:获取列表 key 中指定区间内的元素,0 表示列表的第一个元素,以 1 表示列表的第
    二个元素;start , stop 是列表的下标值,也可以负数的下标, -1 表示列表的最后一
    个元素, -2 表示列表的倒数第二个元素,以此类推。start ,stop 超出列表的范围不
    会出现错误。
    返回值:指定区间的列表
    在这里插入图片描述
  2. lindex
    语法:lindex key index
    作用:获取列表 key 中下标为指定 index 的元素,列表元素不删除,只是查询。0 表示列
    表的第一个元素,以 1 表示列表的第二个元素;start , stop 是列表的下标值,也可
    以负数的下标, -1 表示列表的最后一个元素, -2 表示列表的倒数第二个元素,以
    此类推。
    返回值:指定下标的元素;index 不在列表范围,返回 nil
    返回下标是 1 的元素
    在这里插入图片描述
    不存在的下标
    在这里插入图片描述
  3. llen
    语法:llen key
    作用:获取列表 key 的长度
    返回值:数值,列表的长度;key 不存在返回 0
    在这里插入图片描述

常用命令

  1. lrem
    语法:lrem key count value
    作用:根据参数 count 的值,移除列表中与参数 value 相等的元素,count >0 ,从列表的
    左侧向右开始移除;count < 0 从列表的尾部开始移除;count = 0 移除表中所有
    与 value 相等的值。
    返回值:数值,移除的元素个数
    删除 2 个相同的列表元素
    在这里插入图片描述
    删除列表中所有的指定元素,删除所有的 java
    在这里插入图片描述
  2. lset
    语法:lset key index value
    作用:将列表 key 下标为 index 的元素的值设置为 value。
    返回值:设置成功返回 ok ; key 不存在或者 index 超出范围返回错误信息

设置下标 2 的 value 为“c”。
在这里插入图片描述
3. linsert
语法:linsert key BEFORE|AFTER pivot value
作用:将值 value 插入到列表 key 当中位于值 pivot 之前或之后的位置。key 不存在,pivot
不在列表中,不执行任何操作。
返回值:命令执行成功,返回新列表的长度。没有找到 pivot 返回 -1, key 不存在返回 0。
例 1:修改列表 arch,在值 dao 之前加入 service
在这里插入图片描述

集合类型 set

redis 的 Set 是 string 类型的无序集合,集合成员是唯一的,即集合中不能出现重复的数据

基本命令

  1. sadd
    语法:sadd key member [member…]
    作用:将一个或多个 member 元素加入到集合 key 当中,已经存在于集合的 member 元
    素将被忽略,不会再加入。
    返回值:加入到集合的新元素的个数。不包括被忽略的元素
    例 1:添加单个元素
    在这里插入图片描述

添加多个元素

在这里插入图片描述
2. smembers
语法:smembers key
作用:获取集合 key 中的所有成员元素,不存在的 key 视为空集合
例 1:查看集合的所有元素
在这里插入图片描述
查看不存在的集合
在这里插入图片描述
3. sismember
语法:sismember key member
作用:判断 member 元素是否是集合 key 的成员
返回值:member 是集合成员返回 1,其他返回 0 。
例 1:检查元素是否存在集合中
在这里插入图片描述

  1. scard
    语法:scard key
    作用:获取集合里面的元素个数
    返回值:数字,key 的元素个数。其他情况返回 0
    统计集合的大小
    在这里插入图片描述

  2. srem
    语法:srem key member [member…]
    作用:删除集合 key 中的一个或多个 member 元素,不存在的元素被忽略。
    返回值:数字,成功删除的元素个数,不包括被忽略的元素。
    :删除存在的一个元素,返回数字 1
    在这里插入图片描述## 常用命令

  3. srandmember
    语法:srandmember key [count]
    作用:只提供 key,随机返回集合中一个元素,元素不删除,依然在集合中;提供了 count
    时,count 正数, 返回包含 count 个数元素的集合,集合元素各不相同。count 是负数,
    返回一个 count 绝对值的长度的集合,集合中元素可能会重复多次。
    返回值:一个元素;多个元素的集合
    例 1:随机显示集合的一个元素
    在这里插入图片描述
    使用 count 参数, count 是正数
    在这里插入图片描述

  4. spop
    语法:spop key [count]
    作用:随机从集合中删除一个元素, count 是删除的元素个数。
    返回值:被删除的元素,key 不存在或空集合返回 nil
    例如 1:随机从集合删除一个元素

在这里插入图片描述
随机删除指定个数的元素

在这里插入图片描述

有序集合类型 zset (sorted set)

redis 有序集合zset和集合set一样也是string类型元素的集合,且不允许重复的成员。
不同的是 zset 的每个元素都会关联一个分数(分数可以重复),redis 通过分数来为集合中的
成员进行从小到大的排序。

基本命令

  1. zadd
    语法:zadd key score member [score member…]
    作用:将一个或多个 member 元素及其 score 值加入到有序集合 key 中,如果 member 存
    在集合中,则更新值;score 可以是整数或浮点数,按照score从小到大进行排序
    返回值:数字,新添加的元素个数
    创建保存学生成绩的集合
    在这里插入图片描述2. zrange
    语法:zrange key start stop [WITHSCORES]
    作用:查询有序集合,指定区间的内的元素。集合成员按 score 值从小到大来排序。start,
    stop 都是从 0 开始。0 是第一个元素,1 是第二个元素,依次类推。以 -1 表示最后一
    个成员,-2 表示倒数第二个成员。WITHSCORES 选项让 score 和 value 一同返回。
    返回值:自定区间的成员集合
    例 1:显示集合的全部元素,不显示 score,不使用 WITHSCORES
    在这里插入图片描述
    显示集合全部元素,并使用 WITHSCORES
    在这里插入图片描述
  2. zrevrange
    语法:zrevrange key start stop [WITHSCORES]
    作用:返回有序集 key 中,指定区间内的成员。其中成员的位置按 score 值递减(从大到小)来
    排列。其它同 zrange 命令。
    返回值:自定区间的成员集
    成绩榜
    在这里插入图片描述4. zrem
    语法:zrem key member [member…]
    作用:删除有序集合 key 中的一个或多个成员,不存在的成员被忽略
    返回值:被成功删除的成员数量,不包括被忽略的成员
    在这里插入图片描述
  3. zcard
    语法:zcard key
    作用:获取有序集 key 的元素成员的个数
    返回值:key 存在返回集合元素的个数, key 不存在,返回 0
    在这里插入图片描述

常用命令

  1. zrangebyscore
    语法:zrangebyscore key min max [WITHSCORES ] [LIMIT offset count]
    作用:获取有序集 key 中,所有 score 值介于 min 和 max 之间(包括 min 和 max)的成
    员,有序成员是按递增(从小到大)排序。
    min ,max 是包括在内,使用符号( 表示不包括。 min, max 可以使用 -inf ,+inf 表示最小
    和最大
    limit 用来限制返回结果的数量和区间。
    withscores 显示 score 和 value
    返回值:指定区间的集合数据
    使用的准备数据
    在这里插入图片描述
    显示指定具体区间的数据
    在这里插入图片描述
    显示指定具体区间的集合数据,开区间(不包括 min,max)
    在这里插入图片描述
    显示整个集合的所有数据
    在这里插入图片描述
    使用 limit

在这里插入图片描述
2. zrevrangebyscore
语法:zrevrangebyscore key max min [WITHSCORES ] [LIMIT offset count]
作用:返回有序集 key 中, score 值介于 max 和 min 之间(默认包括等于 max 或 min )的所有
的成员。有序集成员按 score 值递减(从大到小)的次序排列。其他同 zrangebyscore
例 1:查询工资最高到 3000 之间的员工

在这里插入图片描述
3. zcount
语法:zcount key min max
作用:返回有序集 key 中,score 值在 min 和 max 之间(默认包括 score 值等于 min 或 max )的
成员的数量

例 1:求工资在 3000-5000 的员工数量

在这里插入图片描述

哈希类型 hash

redis hash 是一个 string 类型的 field 和 value 的映射表,hash 特别适合用于存储对象。
基本命令

  1. hset
    语法:hset hash 表的 key field value
    作用:将哈希表 key 中的域 field 的值设为 value,如果 key 不存在,则新建 hash 表,执行
    赋值,如果有 field ,则覆盖值。
    返回值:
    ①如果 field 是 hash 表中新 field,且设置值成功,返回 1
    ②如果 field 已经存在,旧值覆盖新值,返回 0
    新的 field
    在这里插入图片描述
    在这里插入图片描述2. hget
    语法:hget key field
    作用:获取哈希表 key 中给定域 field 的值
    返回值:field 域的值,如果 key 不存在或者 field 不存在返回 nil
    获取存在 key 值的某个域的值
    在这里插入图片描述获取不存在的 field
    在这里插入图片描述
  2. hmset
    语法:hmset key field value [field value…]
    说明:同时将多个 field-value (域-值)设置到哈希表 key 中,此命令会覆盖已经存在的 field,
    hash 表 key 不存在,创建空的 hash 表,执行 hmset.
    返回值:设置成功返回 ok,如果失败返回一个错误
    例 1:同时设置多个 field-value
    在这里插入图片描述使用 redis-desktop-manager 工具查看 hash 表 website 的数据结构

在这里插入图片描述
4. hmget
语法:hmget key field [field…]
作用:获取哈希表 key 中一个或多个给定域的值
返回值:返回和 field 顺序对应的值,如果 field 不存在,返回 nil
例 1:获取多个 field 的值
在这里插入图片描述5. hgetall
语法:hgetall key
作用:获取哈希表 key 中所有的域和值
返回值:以列表形式返回 hash 中域和域的值,key 不存在,返回空 hash
例 1:返回 key 对应的所有域和值
在这里插入图片描述
6. hdel
语法:hdel key field [field…]
作用:删除哈希表 key 中的一个或多个指定域 field,不存在 field 直接忽略
返回值:成功删除的 field 的数量
例 1:删除指定的 field
在这里插入图片描述
3.2.2 常用命令

  1. hkeys
    语法:hkeys key
    作用:查看哈希表 key 中的所有 field 域
    返回值:包含所有 field 的列表,key 不存在返回空列表
    例 1:查看 website 所有的域名称

在这里插入图片描述
2. hvals
语法:hvals key
作用:返回哈希表 中所有域的值
返回值:包含哈希表所有域值的列表,key 不存在返回空列表
例 1:显示 website 哈希表所有域的值
在这里插入图片描述
3. hexists
语法:hexists key field
作用:查看哈希表 key 中,给定域 field 是否存在
返回值:如果 field 存在,返回 1,其他返回 0
例 1:查看存在 key 中 field 域是否存在
在这里插入图片描述

Redis的事务

开启事务
语法:multi
功能:用于标记事务块的开始。Redis会将后续的命令逐个放入队列中,然后才能使用EXEC命令原子化地执行这个命令序列。
返回值:开启成功返回OK
在这里插入图片描述
执行事务

语法:exec
功能:在一个事务中执行所有先前放入队列的命令,然后恢复正常的连接状态。
如果在把命令压入队列的过程中报错,则整个队列中的命令都不会执行,执行结果报错;
如果在压队列的过程中正常,在执行队列中某一个命令报错,则只会影响本条命令的执行结果,其它命令正常运行;
当使用WATCH命令时,只有当受监控的键没有被修改时,EXEC命令才会执行事务中的命令;而一旦执行了exec命令,之前加的所有watch监控全部取消。
返回值:这个命令的返回值是一个数组,其中的每个元素分别是原子化事务中的每个命令的返回值。 当使用WATCH命令时,如果事务执行中止,那么EXEC命令就会返回一个Null值

在这里插入图片描述清空之前的事务存在的队列的命令。
语法:discard
功能:清除所有先前在一个事务中放入队列的命令,并且结束事务。
如果使用了WATCH命令,那么DISCARD命令就会将当前连接监控的所有键取消监控。
返回值:清除成功,返回OK
在这里插入图片描述监控事务
开启监控事务

语法:watch key [key …]
功能:当某个事务需要按条件执行时,就要使用这个命令将给定的键设置为受监控的。如果被监控的key值在本事务外有修改时,则本事务所有指令都不会被执行。Watch命令相当于关系型数据库中的乐观锁。
返回值:监控成功,返回OK。

在这里插入图片描述
关闭监控
语法:unwatch
功能:清除所有先前为一个事务监控的键。
如果在watch命令之后你调用了EXEC或DISCARD命令,那么就不需要手动调用UNWATCH命令。
返回值:清除成功,返回OK。
在这里插入图片描述事务的总结
1、单独的隔离操作:事务中的所有命令都会序列化、顺序地执行。事务在执行过程中,不会被其它客户端发来的命令请求所打断,除非使用watch命令监控某些键。
2、不保证事务的原子性:redis同一个事务中如果一条命令执行失败,其后的命令仍然可能会被执行,redis的事务没有回滚。Redis已经在系统内部进行功能简化,这样可以确保更快的运行速度,因为Redis不需要事务回滚的能力。

Jedis操作Redis (java 连接redis)

定义:
使用 Redis 官方推荐的 Jedis,在 java 应用中操作 Redis。Jedis 几乎涵盖了 Redis 的所有
命令。操作 Redis 的命令在 Jedis 中以方法的形式出现。jedis 完全兼容 redis 2.8.x and 3.x.x
使用步助
第一步导包
项目中加入 jar:
⚫ jedis-2.9.3.jar
⚫ commons-pool2-2.6.0.jar
使用案例
字符串(string)
在这里插入图片描述哈希(hash)

使用 Jedis 连接实例池。
在这里插入图片描述2. 使用连接池操作 hash 数据类型
在这里插入图片描述
在这里插入图片描述列表 list

在这里插入图片描述集合 Set
在这里插入图片描述有序集合 Sorted Set
在这里插入图片描述
事务:
在这里插入图片描述

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

奋斗中的代码猿--刘同学

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

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

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

打赏作者

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

抵扣说明:

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

余额充值