redis value最大值_Redis value的5种类型及常见操作

Redis本身存储就是一个hash表,实际实࣫比hash表更复一些,后续讲存储结构时会细讲

Key只有String类型

Value包括String ,Set,List,Hash,Zset五中类型

STRING 可以是字符串,整数或者浮点数以及任何二进制格式的数据 对字符串或一部分进行操作,对整到和浮点数进行自增或自减操作

LIST 一个链表,链表上的每个字节都包含一个字符串 根据偏移量查找或移除某元素

SET 包含字符串的无序收集器,并且包含的每个字符串都不重复 添加,获取,移除单个元素,是否存在,计算交集,差集,并集,从集合中取元素

HASH 包含键值对的无序散列表 添加,获取,删除多个键值对,获取所有键值对

ZSET字符集成员member和浮点数分值score之间的有序映射,元素的排列顺序由分值的大小决定 添加获取删除单个元素,根据分值范围或成员来获取元素

数据基础结构

string

string SET key value [EX seconds] [PX milliseconds] [NX|XX]

EX代表设置超时时间,单位为秒

• PX代表设置超时时间,单位为毫秒

• NX代表只有key不存在才会执行

• XX代表只有key存在才会更新

• 如果成功,返回ok,失败返回空(nil)

Get key 返回key对应的值

[root@hongquan1 src]# /usr/local/redis/src/redis-cli -h 127.0.0.1 -p 6379

127.0.0.1:6379> set 123 liubx1122 EX 2 //值存在2秒

OK

127.0.0.1:6379> get 123

(nil)

127.0.0.1:6379> set 123 liubx1122 EX 20

OK

127.0.0.1:6379> get 123

"liubx1122"

127.0.0.1:6379> get 123

"liubx1122"

127.0.0.1:6379> get 123

(nil)

127.0.0.1:6379> set 123 liubx1122 EX 2000

OK

127.0.0.1:6379> set 123 liubx3344 NX //不存在就更新

(nil)

127.0.0.1:6379> set 999 liubx3344 NX

OK

127.0.0.1:6379> get 999

"liubx3344"

127.0.0.1:6379> get 123

"liubx1122"

127.0.0.1:6379> set 123 99878 XX //存在就更新

OK

127.0.0.1:6379> get 123

"99878"

MGET key [key ...]

返回指定的key的所有值,如果key不存在则返回这个key的值为nil

返回对应key的值列表

127.0.0.1:6379> mget tt kk fdata1

1) (nil)

2) (nil)

3) (nil)

127.0.0.1:6379> mget tt kk fdata1 nodata

1) (nil)

2) (nil)

3) (nil)

4) (nil)

MSET key value [key value ...]

设置多个key value,如果某个key以及存在,则用新值覆盖旧值

• 整个操作是原子操作,要么同时成功,要么同时失败

• 如果key存在不想覆盖的话,采用MSETNX命令

• 总是返回ok,此操作不会失败

MSETNX key value [key value ...]

与MSET类似,但是如果只要有一个key存在,则表示结果失败

返回值:1表示设置成功,0表示设置失败

--append

如果key已经存在,并且值是string类型,就把新的值追加到原来值的后面

如果key不存在,就类似set的功能

返回值的字符长度

INCR key

对值进行加一操作,但是只能是值是integer类型才能操作,如果不是就会出错

最大值为64位有符号值

返回值为加完的结果--适合做计数器(原子性)

127.0.0.1:6379> get 888

(nil)

127.0.0.1:6379> append 888 apendtest

(integer) 9

127.0.0.1:6379> get 888

"apendtest"

127.0.0.1:6379> set addt 9.9

OK

127.0.0.1:6379> incr addt

(error) ERR value is not an integer or out of range

127.0.0.1:6379> set addt1 kkk

OK

127.0.0.1:6379> incr addt

(error) ERR value is not an integer or out of range

127.0.0.1:6379> set h1 1

OK

127.0.0.1:6379> incr h1

(integer) 2

127.0.0.1:6379> incr h1

(integer) 3

127.0.0.1:6379> get h1

"3"

DECR key

对值进行减一操作,但是Ց能是值是integer类型才能操作,如果Љ是就会出错

• 如果key不存在,会对此key赋值为0,再做操作

• 操作能操作的数被限制为64位有符号值

• 返回操作后的结果值

DECRBY key decrment

对值进行减法操作,减去decrement这个值,但是只能是值是integer类型才能操作,如果不是就会出错

INCRBY key increment

对值进行加法法操作,加上decrement这个值,但是只能是值是integer类型才能操作,如果不是就会出错

127.0.0.1:6379> get 111

(nil)

127.0.0.1:6379> decr 111

(integer) -1

127.0.0.1:6379> decr 111

(integer) -2

127.0.0.1:6379> get 111

"-2"

127.0.0.1:6379> decrby 111 1

(integer) -3

127.0.0.1:6379> decrby 111 -1

(integer) -2

127.0.0.1:6379> incrby 111 1

(integer) -1

127.0.0.1:6379> incrby 111 0

(integer) -1

127.0.0.1:6379> incrby 111 -2

(integer) -3

INCRBYFLOAT key increment

与INCRBY规则一样,但是操作的是浮点数,返回操作后的结果值

GETSET key value

原子操作,设置新值的时候,把旧值返回给调用者,如果key已经存在或者key不是String类型就会报错,此命令一般与INCR联合使用

STRLEN key

返回key对应的值的长度,如果值不是string类型,就会报错

127.0.0.1:6379> set fdata 1.5

OK

127.0.0.1:6379> incrbyfloat fdata 2.0

"3.5"

127.0.0.1:6379> incrbyfloat fdata 1.005

"4.505"

127.0.0.1:6379> incrbyfloat fdata 3

"7.505"

127.0.0.1:6379> set fdata1 3

OK

127.0.0.1:6379> incrbyfloat fdata 1.1

"8.605"

127.0.0.1:6379> incr mycounter

(integer) 1

127.0.0.1:6379> getset mycounter "0"

"1"

127.0.0.1:6379> get mycounter

"0"

127.0.0.1:6379> getset mycounter 1

"0"

127.0.0.1:6379> get mycounter

"1"

127.0.0.1:6379> getset mycounter 11

"1"

127.0.0.1:6379> get mycounter

"11"

127.0.0.1:6379> sadd sett 1111

(integer) 1

127.0.0.1:6379> strlen sett

(error) WRONGTYPE Operation against a key holding the wrong kind of value

127.0.0.1:6379> set sett abc

OK

127.0.0.1:6379> strlen sett

(integer) 3

GETRANGE key start end

2.0版本前叫做SUBSTR,返回字符串类型值的子串,Start和end的值可以取负数,表示倒数第几个,-1表示最后一个字符

返回区间字符串

GETBIT key offset

可以获得一个字符串类型键指定位置的二进制位的值(0或1),索引从0开始

SETBIT key offset value

设置字符串类型键指定位置的二进制位的值,返回值是该位置的旧值

Bitcount

可以获得字符串类型键中值是1的二进制位个数

127.0.0.1:6379> set k1 123456

OK

127.0.0.1:6379> get k1

"123456"

127.0.0.1:6379> getrange k1 0 3

"1234"

127.0.0.1:6379> getrange k1 -3 -1

"456"

127.0.0.1:6379> set k2 abcde

OK

127.0.0.1:6379> getrange k2 2 3

"cd"

127.0.0.1:6379> getbit k2 1

(integer) 1

127.0.0.1:6379> getbit k2 3

(integer) 0

127.0.0.1:6379> getbit k1 1

(integer) 0

127.0.0.1:6379> getbit k1 2

(integer) 1

127.0.0.1:6379> setbit k1 2 0

(integer) 1

127.0.0.1:6379> getbit k1 2

(integer) 0

127.0.0.1:6379> get k1

"\x1123456"

127.0.0.1:6379> bitcount k1 1

(error) ERR syntax error

127.0.0.1:6379> bitcount k1

(integer) 20

127.0.0.1:6379> bitcount k2

(integer) 17

Lists

----评论

LPUSH key value [value ...]

把所有的值从list的头部插入,如果key不存在就创建一个空的队列,如果key对值的value不是list类型,则会出现错误

元素从左到右依次插入,返回list的长度

LPUSHX key value

从list头部插入一个值,当key不存在时,不会产生插入动作,返回list的长度

LPOP key

移除list的第一个节点,并返回节点数据

127.0.0.1:6379> lpush list1 11 22 33 55 66 11

(integer) 6

127.0.0.1:6379> get list1

(error) WRONGTYPE Operation against a key holding the wrong kind of value

127.0.0.1:6379> lpop 3

(nil)

127.0.0.1:6379> lpop list1

"11"

127.0.0.1:6379> lpop list1

"66"

127.0.0.1:6379> lpop list1

"55"

127.0.0.1:6379> lpush list2 data1 data2

(integer) 2

127.0.0.1:6379> lpush list2 data3

(integer) 3

127.0.0.1:6379> lpop list3

(nil)

127.0.0.1:6379> lpushx list2 data4

(integer) 4

127.0.0.1:6379> lpushx list3 data2

(integer) 0

127.0.0.1:6379> lpop list3

(nil)

127.0.0.1:6379> lpushx list3 data1

(integer) 0

127.0.0.1:6379> lpushx list3 data2

(integer) 0

127.0.0.1:6379> lpushx list3 data3

(integer) 0

127.0.0.1:6379> lpop list3

(nil)

----

127.0.0.1:6379> lrange list1 0 10

1) "33"

2) "22"

3) "11"

127.0.0.1:6379> lpush list1 00

(integer) 4

127.0.0.1:6379> lrange list1 0 10

1) "00"

2) "33"

3) "22"

4) "11"

127.0.0.1:6379> lpop list1

"00"

127.0.0.1:6379> lrange list1 0 10

1) "33"

2) "22"

3) "11"

---

BLPOP key [key ...] timeout

以阻塞的方式从上key面移除并返回第一个值,只移除和返回第一个非空的key

Timeout的单位是秒,如果为0,则表示一直阻塞

只要list的长度为0或者key不存在就会阻塞

当key是多个时,比如blopo key1 key2,则只要有一个key对应的list不是非空,则不会阻塞

返回值依次包含key 弹出的值 阻塞的时长,超时时,如果还没有值可以返回,则返回nil

LLEN key

返回对应key的list中值的数量,如果key不存在或者list为空,则返回0

127.0.0.1:6379> lpop list3

(nil)

127.0.0.1:6379> blpop list3 10

(nil)

(10.09s)

127.0.0.1:6379> blpop list3 20

(nil)

(20.06s)

127.0.0.1:6379> blpop list1 10

1) "list1"

2) "33"

127.0.0.1:6379> blpop list1 list2 10

1) "list1"

2) "22"

127.0.0.1:6379> blpop list1 list3 10

1) "list1"

2) "11"

127.0.0.1:6379> llen list1

(integer) 0

127.0.0.1:6379> llen list2

(integer) 4

RPUSH key value [value ...]

把所有的值从list的尾部插入,如果key不存在就创建一个空的队列

如果key对应的value不是list类型,则会出现错误

元素从左到右依次插入,返回list的长度

RPUSHX key value

从list尾部插入一个值,当key不存在时,不会产生插入动作,返回list的长度

RPOP key

移除list的最后一个节点,并返回节点数据或者nil

127.0.0.1:6379> rpush l1 1 3 5 7 9

(integer) 5

127.0.0.1:6379> rpushx l2 1 2 3

(error) ERR wrong number of arguments for 'rpushx' command

127.0.0.1:6379> rpushx l2 1

(integer) 0

127.0.0.1:6379> rpop l1

"9"

127.0.0.1:6379> rpop l1

"7"

BRPOP key [key ...] timeout

类似于blpop

RPOPLPUSH source destination

此操作是一个原子操作

从source对应的key的list里面的尾部移除一个值,并且加入到destination指定的list的头部

如果source的list存在在,则返回nil,但是不会做任何操作

如果source和destination是一样的,则等于把list的尾部数据插入到头部

返回被弹出和插入的数据

BRPOPLPUSH source destination timeout

功能与rpoplpush相似,但是当source为空时,将会进行阻塞

127.0.0.1:6379> lpush source 11 22 33

(integer) 3

127.0.0.1:6379> rpoplpush source dest

"11"

127.0.0.1:6379> llen dest

(integer) 1

127.0.0.1:6379> lpop dest

"11"

127.0.0.1:6379> llen dest

(integer) 0

127.0.0.1:6379> rpoplpush dest source

(nil)

LINDEX key index

返回key指定的队列中位置为index的值

从0开始,负数表示从后面开始算

LINSERT key BEFORE|AFTER pivot value

把value的值插入key对应的list中去,位置在pivot这个值的前面(before)或者后面(after)

如果key不存在,则不会产生任何操作

如果pivot对应的值不存在则返回-1,否则就返回插入后list的长度

LRANGE key start stop

返回一个区间的值,从list的头(左)到尾(右)

如果start大于list的长度,就会返回空

如果stop大于list的长度,则以list最后一个值尾准

127.0.0.1:6379> llen dest

(integer) 0

127.0.0.1:6379> lpush dest 11

(integer) 1

127.0.0.1:6379> lpush dest 22 33

(integer) 3

127.0.0.1:6379> linsert dest before 11 44

(integer) 4

127.0.0.1:6379> lrange dest 0 4

1) "33"

2) "22"

3) "44"

4) "11"

127.0.0.1:6379> linsert dest before 55 66

(integer) -1

127.0.0.1:6379> lrange dest 0 6

1) "33"

2) "22"

3) "44"

4) "11"

LREM key count value

删除值等于value的count个元素

• 如果count大于0,则从头到尾数

• 如果count小于0,则从尾到头数

• 如果count等于0,则删除所有的值等于value的元素

LTRIM key start stop

对key指定的list进行裁剪,即取子集

• 如果start>list的长度或者start>end,将会返回一个空列表,然后导致key被删除

• 如果end大于list的长度,则取list的长度

• 执行完成返回ok

127.0.0.1:6379> rpush mylist "hello"

(integer) 1

127.0.0.1:6379> rpush mylist "hello"

(integer) 2

127.0.0.1:6379> rpush mylist "foo"

(integer) 3

127.0.0.1:6379> rpush mylist "hello"

(integer) 4

127.0.0.1:6379> lrem mylist -2 "hello"

(integer) 2

127.0.0.1:6379> lrange mylist 0 -1

1) "hello"

2) "foo"

127.0.0.1:6379> lpush dest 11 22 33 44

(integer) 8

127.0.0.1:6379> ltrim dest 0 2

OK

127.0.0.1:6379> exists dest

(integer) 1

127.0.0.1:6379> lrange dest 0 10

1) "44"

2) "33"

3) "22"

127.0.0.1:6379> llen dest

(integer) 3

127.0.0.1:6379> ltrim dest 5 10

OK

127.0.0.1:6379> exists dest

(integer) 0

127.0.0.1:6379> llen dest

(integer) 0

LSET key index value

修改key对应的list中,位置为index的元素的值为value,当index超过list的返回,将会出现错误

127.0.0.1:6379> rpush my "one"

(integer) 1

127.0.0.1:6379> rpush my "two"

(integer) 2

127.0.0.1:6379> rpush my "three"

(integer) 3

127.0.0.1:6379> lset my 0 "four"

OK

127.0.0.1:6379> lset my -2 "five"

OK

127.0.0.1:6379> lrange my 0 -1

1) "four"

2) "five"

3) "three"

Keys

DEL key [key ...]

删除指定的key,如果key不存在,对此key的操作将会忽略,返回被删除的key

DUMP key

按照rdb的؂储格式把指定的key的值,序列化并返回给客户端,此序列化值里面不包括ttl信息

序列化的值中包含校验码,不同版本的rdb实࣫可能؂在差异,所以此处序列化的数据可能不对

Key不存在就返回nil

RESTORE key ttl serialized-value [REPLACE]

把通过dump命令序列化的值再存进去,如果没有带replace,且key已经存在,会出现错误

会检查校验值ͧchecksumͨ,如果不满足会返回错误,成功返回ok

EXISTS key [key ...]

判断key是否存在,如果存在,则返回值加1

从3.03版本开始支持多个key,以前的版本只支持一个

如果key重复,则返回值会重复判断和加1

127.0.0.1:6379> get 123

"99878"

127.0.0.1:6379> get 456

(nil)

127.0.0.1:6379> exists 123 456

(integer) 1

127.0.0.1:6379> exists 123

(integer) 1

127.0.0.1:6379> exists 123 123 456

(integer) 2

EXPIRE key seconds

设置key的超时时间,单位是秒ͺ当达到超时时间后,key会被删除

这个超时时间只能被DEL SET GETSET和*STORE命令修改或者改变,其它命令并不会改变超时设置或者超时时长

可以通过命令PERSIST把超时设置取消

当key被RENAME命令修改后,超时设置的特性还是不会改变

设置成功返回1,key不存在或者超时时间设置失败返回0

127.0.0.1:6379> set tt data1

OK

127.0.0.1:6379> get tt

"data1"

127.0.0.1:6379> expire tt 10

(integer) 1

127.0.0.1:6379> get tt

"data1"

127.0.0.1:6379> get tt

"data1"

127.0.0.1:6379> get tt

(nil)

127.0.0.1:6379> set tt data1

OK

127.0.0.1:6379> expire tt 10

(integer) 1

127.0.0.1:6379> set tt data2

OK

127.0.0.1:6379> get tt

"data2"

127.0.0.1:6379> get tt

"data2"

EXPIREAT key timestamp

设置key的超时时间,与EXPIRE相似,但是设置的是精确时间

设置成功返回1,key不存在或者超时时间设置失败返回0

Keys pattern

返回符合pattern的所有的key,在生产环境尽量少用,除非数据比较少,因为此操作会影响性能

可以用scan或者sets来达到查找key的业务需求

• *代表任意؁符,?代表单个؁符,[ae]代码a或者e

• [^e]代表不等于e,[a-d]代表a,b,c,d

127.0.0.1:6379> keys [a-d]

(empty list or set)

127.0.0.1:6379> keys [d-k]

(empty list or set)

127.0.0.1:6379> set a 11

OK

127.0.0.1:6379> set b 22

OK

127.0.0.1:6379> keys [a-d]

1) "b"

2) "a"

127.0.0.1:6379> set c 33

OK

127.0.0.1:6379> set d 44

OK

127.0.0.1:6379> keys [a-d]

1) "b"

2) "a"

3) "d"

4) "c"

127.0.0.1:6379> keys *

1) "b"

2) "h1"

3) "a"

4) "d"

5) "111"

ttl key

返回key对应的超时时间,还剩余多少时间

如果key不存在,返回-2,如果key还没有设置超时时间,返回-1

pttl key

与ttl能一致,但是返回的是毫秒

127.0.0.1:6379> set dd 111 ex 100

OK

127.0.0.1:6379> ttl dd

(integer) 97

127.0.0.1:6379> pttl dd

(integer) 90940

127.0.0.1:6379> ttl dd

(integer) -2

127.0.0.1:6379> ttl d

(integer) -1

SCAN

cursor [MATCH pattern] [COUNT count]--类似rdbms的分页查询

基于游标的方式返回当前数据库的key,因为每次返回的数据不多,不会阻塞服务器,所以可以在生产环境中使用

Cursor表示的是游标的位置,一般从0开始,返回的数据中第一行代表的就是下一次游标的位置,当返回的下一行游标是

0时,代表本次迭代全部完成ͺ此游标值不是一个连续标准值,比如5,10,15是连续标准

MATCH pattern类似keys中模式一样,返回指定模式的迭代游标

Count代表每次迭ї返回的数据条数,默认是10,但是它只是一个提示,实现时并没有严格保证,实际返回的值可能会

比这个值多一些,但是不会多太多

与keys或者SMEMBERS命令相比,scan返回的结果不稳定,在执行迭代的过程中,如果key发生变化,比如删除或者新

增,则返回的结果可能؂在一下几个问题:

– 可能会返回重复的key,所以,使用此命令时,业务系统需要判断重复

– 如果在迭代过程中,有key被删除了,但是在迭ї完成前没有被添加进来,则此key并不会出现在迭代中

127.0.0.1:6379> scan 0

1) "22"

2) 1) "b"

2) "h1"

3) "c"

4) "addt"

5) "111"

6) "a"

7) "dest"

8) "sett"

9) "fdata1"

10) "fdata"

127.0.0.1:6379> scan 20

1) "21"

2) 1) "a"

2) "dest"

3) "sett"

4) "fdata1"

5) "fdata"

6) "mycounter"

7) "list2"

8) "source"

9) "my"

10) "999"

127.0.0.1:6379> scan 0 match 1*

1) "22"

2) 1) "111"

127.0.0.1:6379> scan 20 match 1*

1) "21"

2) (empty list or set)

hashes

HSET key field value

Key带表的是一个hash表,field为hash表的key,value为hash表中key对应的value

如果key不存在,则创建一个key及对应的hash表

如果field存在,则把value覆盖原来的值

如果field是新加入,并且设置成功,则返回1ͺ如果field已经存在,成功更新旧值,则返回0

HMSET key field value [field value ...]

与hset类似,但是一次设置多个值,成功返回ok

127.0.0.1:6379> hmset map1 name libux age 33

OK

127.0.0.1:6379> get map1

(error) WRONGTYPE Operation against a key holding the wrong kind of value

127.0.0.1:6379> hkeys map1

1) "name"

2) "age"

127.0.0.1:6379> hlen map1

(integer) 2

127.0.0.1:6379> hsetnx map1 name libux123

(integer) 0

127.0.0.1:6379> hsetnx map1 other nxtest

(integer) 1

127.0.0.1:6379> hkeys map1

1) "name"

2) "age"

3) "other"

HSETNX key field value

Key代表的是一个hash表,field为hash表的key,value为hash表中key对应的value

• 当field不存在时才设置

• 如果field不存在,则设置值,返回1ͺ如果field存在,则返回0,不做任何操作

HKEYS key

获取key对应的map的所有key,返回key的列表

HLEN key

获取key对应的map的field的数量

HGET key field

获取某个field的值,Key代表的是一个hash表,field为hash表的keyͺ如果key不存在或者field不存在,返回nil,否则返回值

HMGET key field [field ...]

获取key对应的map的多个值,如果key不存在或者field不存在,返回nil,否则返回值列表

HVALS key

返回key对应的map的所有值列表

HSTRLEN key field

返回field对应的值的长度,当key不存在或者field不存在,则返回0

127.0.0.1:6379> hget map1 name

"libux"

127.0.0.1:6379> hmget map1 name age

1) "libux"

2) "33"

127.0.0.1:6379> hvals map1

1) "libux"

2) "33"

3) "nxtest"

127.0.0.1:6379> hlen map1

(integer) 3

HDEL key field [field ...]

删除key对应的map的field,可以原子性操作删除多个field,返回删除的值的数量

HEXISTS key field

判断key指定的map中是否存在field属性,如果key不存在或者field不存在则返回0,否则返回1

HGETALL key

返回key对应的map的所有key-value对,按照key然后下一行是value的形式展示

127.0.0.1:6379> hmset map1 del1 del1data del2 deldata2

OK

127.0.0.1:6379> hexits map1 del1

(error) ERR unknown command 'hexits'

127.0.0.1:6379> hexists map1 del1

(integer) 1

127.0.0.1:6379> hexists map1 del3

(integer) 0

127.0.0.1:6379> hgetall map1

1) "name"

2) "libux"

3) "age"

4) "33"

5) "other"

6) "nxtest"

7) "del1"

8) "del1data"

9) "del2"

10) "deldata2"

127.0.0.1:6379> hdel map1 del2

(integer) 1

127.0.0.1:6379> hgetall map1

1) "name"

2) "libux"

3) "age"

4) "33"

5) "other"

6) "nxtest"

7) "del1"

8) "del1data"

HINCRBY key field increment

对field指定的值加上increment,但是值必只是integer类型,范围在64位有符号的数,返回增加后的结果

HINCRBYFLOAT key field increment

对field指定的值加上increment,但是值必只是float类型,范围在64位有符号的数,如果key不存在或者field不存在则返回0,否则返回1

HSCAN key cursor [MATCH pattern] [COUNT count]

与scan类似,但是迭代的是key对应的map里面的值

127.0.0.1:6379> hscan map1 0 count 5

1) "0"

2) 1) "name"

2) "libux"

3) "age"

4) "33"

5) "other"

6) "nxtest"

7) "del1"

8) "del1data"

127.0.0.1:6379> hincrby map1 age 2

(integer) 35

127.0.0.1:6379> hget map1 age

"35"

127.0.0.1:6379> hset map1 money 100.1

(integer) 1

127.0.0.1:6379> hincrbyfloat map1 money 18.3

"118.39999999999999999"

127.0.0.1:6379> hget map1 money

"118.39999999999999999"

127.0.0.1:6379> hincrbyfloat map1 money -2.5

"115.89999999999999999"

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值