Redis配置使用及命令应用实例

Redis配置使用及命令应用实例

1、安装配置使用Redis

[root@test ~]# yum localinstalljemalloc-3.6.0-1.el6.art.x86_64.rpm

Installed:

 jemalloc.x86_64 0:3.6.0-1.el6.art                                                                                                                                   

[root@test ~]# yum localinstallredis-3.2.11-1.el6.x86_64.rpm

Installed:

 redis.x86_64 0:3.2.11-1.el6                                                                                                                                         

Redis安装后文件

[root@test ~]# rpm -ql redis

/etc/logrotate.d/redis

/etc/rc.d/init.d/redis

/etc/rc.d/init.d/redis-sentinel

/etc/redis-sentinel.conf

/etc/redis.conf

/etc/security/limits.d/95-redis.conf

/usr/bin/redis-benchmark

/usr/bin/redis-check-aof

/usr/bin/redis-check-rdb

/usr/bin/redis-cli

/usr/bin/redis-sentinel

/usr/bin/redis-server

/usr/libexec/redis-shutdown

/usr/share/doc/redis-3.2.11

/usr/share/doc/redis-3.2.11/00-RELEASENOTES

/usr/share/doc/redis-3.2.11/BUGS

/usr/share/doc/redis-3.2.11/CONTRIBUTING

/usr/share/doc/redis-3.2.11/COPYING

/usr/share/doc/redis-3.2.11/MANIFESTO

/usr/share/doc/redis-3.2.11/README.md

/usr/share/man/man1/redis-benchmark.1.gz

/usr/share/man/man1/redis-check-aof.1.gz

/usr/share/man/man1/redis-check-rdb.1.gz

/usr/share/man/man1/redis-cli.1.gz

/usr/share/man/man1/redis-sentinel.1.gz

/usr/share/man/man1/redis-server.1.gz

/usr/share/man/man5/redis-sentinel.conf.5.gz

/usr/share/man/man5/redis.conf.5.gz

/var/lib/redis

/var/log/redis

/var/run/redis

 

Redis守护进程:

         监听端口:6379/tcp

基础使用只需该绑定ip和守护进程:  

[root@test ~]# vi /etc/redis.conf

bind 127.0.0.1192.168.88.130

daemonize yes

[root@test ~]# service redis start

启动:[确定]

[root@test ~]# ss -tnl|grep 6379

0     128              192.168.88.130:6379                          *:*    

0     128                   127.0.0.1:6379                         *:*    

 

2、Redis客户端命令:redis-cli

[root@test ~]# redis-cli -h

redis-cli 3.2.11

Usage: redis-cli [OPTIONS] [cmd [arg [arg...]]]

  -h<hostname>      Server hostname(default: 127.0.0.1).

  -p <port>          Server port (default: 6379).

  -s <socket>        Server socket (overrides hostname andport).

  -a <password>      Password to use when connecting to theserver.

  -r <repeat>        Execute specified command N times.

  -i <interval>      When -r is used, waits <interval>seconds per command.

                     It is possible to specifysub-second times like -i 0.1.

  -n <db>            Database number.

  -x                 Read last argument from STDIN.

  -d <delimiter>     Multi-bulk delimiter in for raw formatting(default: \n).

  -c                 Enable cluster mode (follow-ASK and -MOVED redirections).

  --raw              Use raw formatting for replies(default when STDOUT is

                     not a tty).

  --no-raw           Force formatted output even whenSTDOUT is not a tty.

  --csv              Output in CSV format.

  --stat             Print rolling stats about server:mem, clients, ...

  --latency          Enter a special mode continuouslysampling latency.

  --latency-history  Like --latency but tracking latency changesover time.

                     Default time interval is15 sec. Change it using -i.

  --latency-dist     Shows latency as a spectrum, requiresxterm 256 colors.

                     Default time interval is 1sec. Change it using -i.

  --lru-test <keys>  Simulate a cache workload with an 80-20distribution.

  --slave            Simulate a slave showing commandsreceived from the master.

  --rdb <filename>   Transfer an RDB dump from remote server tolocal file.

  --pipe             Transfer raw Redis protocol fromstdin to server.

  --pipe-timeout <n> In --pipe mode,abort with error if after sending all data.

                     no reply is receivedwithin <n> seconds.

                     Default timeout: 30. Use 0to wait forever.

  --bigkeys         Sample Redis keys looking forbig keys.

  --scan             List all keys using the SCANcommand.

  --pattern <pat>    Useful with --scan to specify a SCANpattern.

  --intrinsic-latency <sec> Run a test tomeasure intrinsic system latency.

                     The test will run for thespecified amount of seconds.

  --eval <file>      Send an EVAL command using the Lua scriptat <file>.

  --ldb              Used with --eval enable the RedisLua debugger.

  --ldb-sync-mode    Like --ldb but uses the synchronous Luadebugger, in

                     this mode the server isblocked and script changes are

                     are not rolled back fromthe server memory.

  --help             Output this help and exit.

  --version          Output version and exit.

 

Examples:

  cat/etc/passwd | redis-cli -x set mypasswd

 redis-cli get mypasswd

 redis-cli -r 100 lpush mylist x

 redis-cli -r 100 -i 1 info | grep used_memory_human:

 redis-cli --eval myscript.lua key1 key2 , arg1 arg2 arg3

 redis-cli --scan --pattern '*:12345*'

 

 (Note: when using --eval the comma separates KEYS[] from ARGV[] items)

 

When no command is given, redis-cli startsin interactive mode.

Type "help" in interactive modefor information on available commands

and settings.

[root@test ~]# redis-cli

127.0.0.1:6379> exit

[root@test ~]# redis-cli -h 192.168.88.130

192.168.88.130:6379> exit

 

[root@test ~]# redis-cli -h 192.168.88.130

192.168.88.130:6379> help

redis-cli 3.2.11

To get help about Redis commands type:

     "help @<group>" to get a list of commands in<group>

     "help <command>" for help on <command>

     "help <tab>" to get a list of possible help topics

     "quit" to exit

 

To set redis-cli perferences:

     ":set hints" enable online hints

      ":set nohints" disable online hints

Set your preferences in ~/.redisclirc

 

192.168.88.130:6379> help @server

192.168.88.130:6379> CLIENT LIST

id=6 addr=192.168.88.130:45313 fd=6 name=age=86 idle=0 flags=N db=0 sub=0 psub=0 multi=-1 qbuf=0 qbuf-free=32768 obl=0oll=0 omem=0 events=r cmd=client

192.168.88.130:6379>

 

SELECT:打开多个数据库,即多个名称空间。

在同一个名称空间内键不能重复,键是可以实现自动过期的

192.168.88.130:6379> select  1     

OK

192.168.88.130:6379[1]> select  2

OK

192.168.88.130:6379[2]> select  0

OK

192.168.88.130:6379>

 

3、Redis数据类型及其命令使用

(1).String(字符串)

192.168.88.130:6379> help @string

         SET: 将字符串值 value 关联到 key 。如果 key 已经持有其他值, SET 就覆写旧值,无视类型。

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

                   [EX seconds] 过期时间等价SETEX 

                   [NX|XX]    EX:键不存在才创建并设置值,否则不创建。XX:健存在才设定       SET:

         GET:返回 key 所关联的字符串值。如果 key 不存在那么返回特殊值 nil 。假如 key 储存的值不是字符串类型,返回一个错误,因为 GET 只能用于处理字符串值。

         APPEND:如果 key 已经存在并且是一个字符串, APPEND 命令将 value 追加到 key 原来的值的末尾。如果 key 不存在, APPEND 就简单地将给定 key 设为 value ,就像执行 SET key value 一样。   

         INCR:将 key 中储存的数字值增一。如果 key 不存在,那么 key 的值会先被初始化为 0 ,然后再执行 INCR 操作。        

         DECR:将 key 中储存的数字值减一。如果 key 不存在,那么 key 的值会先被初始化为 0 ,然后再执行 DECR 操作。

192.168.88.130:6379> set disco federa

OK

192.168.88.130:6379> get disco

"federa"

192.168.88.130:6379> set disco centos

OK

192.168.88.130:6379> get disco

"centos"

192.168.88.130:6379> append discoslackware

(integer) 15

192.168.88.130:6379> get disco

"centosslackware"

192.168.88.130:6379> SET disco gentoo NX

(nil)

192.168.88.130:6379> GET disco

"centosslackware"

192.168.88.130:6379> SET foo bar XX

(nil)

192.168.88.130:6379> STRLEN disco

(integer) 15

192.168.88.130:6379> set count 0

OK

192.168.88.130:6379> incr count

(integer) 1

192.168.88.130:6379> incr count

(integer) 2

192.168.88.130:6379> decr count

(integer) 1

192.168.88.130:6379> decr count

(integer) 0

192.168.88.130:6379> set foo bar

OK

192.168.88.130:6379> incr foo

(error) ERR value is not an integer or outof range

 

(2).List(列表)

192.168.88.130:6379> HELP @LIST

         LSET:         LSET keyindex value 将列表 key 下标为 index 的元素的值设置为 value 。当 index 参数超出范围,或对一个空列表( key 不存在)进行 LSET 时,返回一个错误

         LPUSH:LPUSH key value [value ...] 将一个或多个值 value 插入到列表 key 的表头

                                     如果有多个 value 值,那么各个 value 值按从左到右的顺序依次插入到表头:比如说,对空列表 mylist 执行命令 LPUSH mylist a b c ,列表的值将是 c b a ,这等同于原子性地执行 LPUSH mylist a、 LPUSH mylist b 和 LPUSH mylist c 三个命令。

         RPUSH:RPUSH key value [value ...] 将一个或多个值 value 插入到列表 key 的表尾(最右边)。

                                     如果有多个 value 值,那么各个 value 值按从左到右的顺序依次插入到表尾:比如对一个空列表 mylist 执行 RPUSH mylist a b c ,得出的结果列表为 a b c ,等同于执行命令 RPUSH mylist a 、 RPUSH mylist b 、 RPUSH mylist c 。

         LPOP:移除并返回列表 key 的头元素。     

         RPOP:移除并返回列表 key 的尾元素。    

         LINDEX:LINDEX key index 返回列表 key 中,下标为 index 的元素。   

         LLEN:返回列表 key 的长度。如果 key 不存在,则 key 被解释为一个空列表,返回 0。如果 key 不是列表类型,返回一个错误。

192.168.88.130:6379> lpush l1 mon

(integer) 1

192.168.88.130:6379> lindex l1 0

"mon"

192.168.88.130:6379> lpush l1 sun

(integer) 2

192.168.88.130:6379> lindex l1 0

"sun"

192.168.88.130:6379> lindex l1 1

"mon"

192.168.88.130:6379> rpush l1 tue

(integer) 3

192.168.88.130:6379> lindex l1 2

"tue"

192.168.88.130:6379> lset l1 fri

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

192.168.88.130:6379> lset l1 1 fri

OK

192.168.88.130:6379> lindex l1 1

"fri"

192.168.88.130:6379> rpop l1

"tue"

192.168.88.130:6379> rpop l1

"fri"

192.168.88.130:6379> rpop l1

"sun"

192.168.88.130:6379> rpop l1

(nil)

 

(3).集合(Sets):

192.168.88.130:6379> HELP @SET        

         SADD:SADD key member [member ...] 将一个或多个 member 元素加入到集合 key 当中,已经存在于集合的 member 元素将被忽略。假如 key 不存在,则创建一个只包含 member 元素作成员的集合。

         SISMEMBER:SISMEMBER key member 判断 member 元素是否集合 key 的成员。

         SINTER:SINTER key [key ...] 返回一个集合的全部成员,该集合是所有给定集合的交集。不存在的 key 被视为空集。

         SINTERSTORE:SINTERSTORE destination key [key ...] 这个命令类似于 SINTER 命令,但它将结果保存到 destination 集合,而不是简单地返回结果集。如果destination 集合已经存在,则将其覆盖。 

         SUNION:SUNION key [key ...] 返回一个集合的全部成员,该集合是所有给定集合的并集。不存在的 key 被视为空集。

         SUNIONSTORE:SUNIONSTORE destination key [key ...] 这个命令类似于 SUNION 命令,但它将结果保存到 destination 集合,而不是简单地返回结果集。如果destination 已经存在,则将其覆盖。

         SDIFF:SDIFF key [key ...] 返回一个集合的全部成员,该集合是所有给定集合之间的差集。不存在的 key 被视为空集。

         SDIFFSTORE:SDIFFSTORE destination key [key ...]吧这个命令的作用和 SDIFF 类似,但它将结果保存到 destination 集合,而不是简单地返回结果集。如果destination 集合已经存在,则将其覆盖。

         SPOP:移除并返回集合中的一个随机元素。如果只想获取一个随机元素,但不想该元素从集合中被移除的话,可以使用 SRANDMEMBER 命令。

        

192.168.88.130:6379> sadd w1 mon tue wedthu fri sat sun

(integer) 7

192.168.88.130:6379> sadd w2 tue thu day

(integer) 3

192.168.88.130:6379> sinter w1 w2  取交集

1) "thu"

2) "tue"

192.168.88.130:6379> sunion w1 w2  取并集

1) "mon"

2) "day"

3) "sat"

4) "fri"

5) "thu"

6) "tue"

7) "sun"

8) "wed"

192.168.88.130:6379> spop w1               弹出元素,随机    

"sat"

192.168.88.130:6379> spop w1

"sun"

192.168.88.130:6379> SDIFF w1 w2       取差集

1) "wed"

2) "fri"

3) "mon"

192.168.88.130:6379> SDIFF w2 w1

1) "day"

192.168.88.130:6379> sismember w1mon  元素在不在集合中

(integer) 1

192.168.88.130:6379> sismember w1 xx

(integer) 0

192.168.88.130:6379>

 

(4).SortedSet(有序集合)

192.168.88.130:6379> help @SORTED_SET

         ZADD:ZADD key [NX|XX] [CH] [INCR] score member [score member...] 将一个或多个 member 元素及其 score 值加入到有序集 key 当中。

         ZRANGE:ZRANGE key start stop [WITHSCORES] 返回有序集 key 中,指定区间内的成员。其中成员的位置按 score 值递增(从小到大)来排序

         ZCARD:返回有序集 key 的基数。

         ZRANK:返回有序集 key 中成员 member 的排名。其中有序集成员按 score 值递增(从小到大)顺序排列。排名以 0 为底,也就是说, score 值最小的成员排名为 0

 

192.168.88.130:6379> zadd weekday1 1 mon2 tue 3 wed

(integer) 3

192.168.88.130:6379> zcard weekday1

(integer) 3

192.168.88.130:6379> zrank weekday1 tue

(integer) 1

192.168.88.130:6379> zrank weekday1 wed

(integer) 2

192.168.88.130:6379> zscore weekday1 wed

"3"

192.168.88.130:6379> zscore weekday1 tue

"2"

192.168.88.130:6379> zrange weekday1 0 2

1) "mon"

2) "tue"

3) "wed"

192.168.88.130:6379> zrange weekday1 0 1

1) "mon"

2) "tue"

 

(5).Hash(哈希表)

192.168.88.130:6379> help @hash

         HSET:HSET key field value将哈希表 key 中的域 field 的值设为 value 。如果 key 不存在,一个新的哈希表被创建并进行 HSET 操作。如果域 field 已经存在于哈希表中,旧值将被覆盖。

         HSETNX:HSETNX key field value 将哈希表 key 中的域 field 的值设置为 value ,当且仅当域 field 不存在。若域 field 已经存在,该操作无效。

         HGET:返回哈希表 key 中给定域 field 的值。

         HKEYS:返回哈希表 key 中的所有键。

         HVALS:返回哈希表 key 中所有键的值。

         HDEL:删除哈希表 key 中的一个或多个指定域,不存在的域将被忽略。

 

192.168.88.130:6379> HSET h1 a mon

(integer) 1

192.168.88.130:6379> hget h1 a

"mon"

192.168.88.130:6379> hset h1 b tue

(integer) 1

192.168.88.130:6379> hget h1 b

"tue"

192.168.88.130:6379> hkeys h1

1) "a"

2) "b"

192.168.88.130:6379> HVALS h1

1) "mon"

2) "tue"

192.168.88.130:6379> hlen h1

(integer) 2

192.168.88.130:6379> HDEL h1 a

(integer) 1

192.168.88.130:6379> hget h1 a

(nil)

192.168.88.130:6379>

 

4、其他常用命令

(1)、事务:将多个命令打包而后一次性执行,执行期间其他事务命令会阻塞。

将多个命令、请求打包成一个操作然后一次性按顺序执行多个命令的机制,

并且在事务执行期间服务器不会中断事务而改变去执行其他客户端事务命令的请求,

会将事务中所有命令执行完毕再去执行其他服务器事务请求。

         通过MULTI,EXEC,WATCH等命令实现事务功能;将一个或多个命令归并为一个操作提请服务按顺序执行的机制;不支持回滚。

         MULTI:启动一个事物

         EXEC:执行事务

                            一次性将事务中的所有操作执行完成后返回给客户端

         WATCH:乐观锁;在EXEC命令执行之前,用于监视指定数量键;如果监视中的某任意键数据被修改,则服务器拒绝执行事务;

执行事务

192.168.88.130:6379> MULTI

OK

192.168.88.130:6379> set ip 192.168.88.2

QUEUED

192.168.88.130:6379> get ip

QUEUED

192.168.88.130:6379> set port 80

QUEUED

192.168.88.130:6379> get ip

QUEUED

192.168.88.130:6379> EXEC

1) OK

2) "192.168.88.2"

3) OK

4) "192.168.88.2"

192.168.88.130:6379>

监视某键值

192.168.88.130:6379> WATCH ip

OK

192.168.88.130:6379> MULTI

OK

         此期间打开其他客户端,设置ip值

         [root@test~]# redis-cli -h 192.168.88.130

         192.168.88.130:6379>SET ip 172.16.100.1

         OK

         192.168.88.130:6379>GET ip

         "172.16.100.1"

         192.168.88.130:6379>

192.168.88.130:6379> SET ip 192.168.88.1

QUEUED

192.168.88.130:6379> GET IP

QUEUED

192.168.88.130:6379> GET ip

QUEUED

192.168.88.130:6379> EXEC

(nil)

192.168.88.130:6379>

不支持回滚:

192.168.88.130:6379> MULTI

OK

192.168.88.130:6379> get ip

QUEUED

192.168.88.130:6379> set port 6379

QUEUED

192.168.88.130:6379> setttt

(error) ERR unknown command 'setttt'

192.168.88.130:6379> exec

(error) EXECABORT Transaction discardedbecause of previous errors.

192.168.88.130:6379>

 

(2).connection相关的命令

192.168.88.130:6379> HELP @connection

192.168.88.130:6379> ping 192.168.88.130

"192.168.88.130"

192.168.88.130:6379> echo "helloworld!"

"hello world!"

 

(3).Server相关的命令:

192.168.88.130:6379> help @server

  BGREWRITEAOF - 执行一个 AOF文件重写操作。重写会创建一个当前 AOF 文件的体积优化版本。

         BGSAVE - 在后台异步(Asynchronously)保存当前数据库的数据到磁盘。、

  CLIENT GETNAME - 获取当前客户端名字

192.168.88.130:6379>CLIENT GETNAME

"fieldconn" 

  CLIENT KILL [ip:port] [ID client-id] [TYPEnormal|master|slave|pubsub] [ADDR ip:port] [SKIPME yes/no]

       指明IP+端口直接关闭对应的客户端连接信息

  CLIENT LIST - 以人类可读的格式,返回所有连接到服务器的客户端信息和统计数据。

192.168.88.130:6379> client list

id=4 addr=192.168.88.130:45351 fd=7 name=age=2279 idle=0 flags=N db=0 sub=0 psub=0 multi=-1 qbuf=0 qbuf-free=32768 obl=0oll=0 omem=0 events=r cmd=client

id=5 addr=192.168.88.130:45353 fd=6 name=age=588 idle=361 flags=O db=0 sub=0 psub=0 multi=-1 qbuf=0 qbuf-free=0 obl=0oll=0 omem=0 events=r cmd=monitor

192.168.88.130:6379>

  CLIENT SETNAMEconnection-name 设置客户当前客户端连接名

192.168.88.130:6379> CLIENT SETNAMEfieldconn 

 COMMAND -

       summary: Get array of Redis command details

  CONFIG GET parameter  命令用于取得运行中的 Redis 服务器的配置参数(configuration parameters)

  CONFIG RESETSTAT - 重置info中统计的信息

  CONFIG REWRITE - 内存中修改的参数新值同步到配置文件中

  CONFIG SET parameter value 运行时修改指定参数值,只会保存到内存中,不会保存在配置文件中

  DBSIZE - 显示当前数据库中所有键的数量

192.168.88.130:6379> dbsize

(integer) 2 

  DEBUG OBJECT key 一个调试命令,它不应被客户端所使用。

  DEBUG SEGFAULT - 执行一个不合法的内存访问从而让 Redis 崩溃,仅在开发时用于 BUG 模拟。

FLUSHALL - 清空所有数据库

  FLUSHDB - 清空当前数据库

  INFO [section] 查看服务去状态信息

192.168.88.130:6379> INFO Memory

# Memory

used_memory:832856

used_memory_human:813.34K

used_memory_rss:2351104

used_memory_rss_human:2.24M

used_memory_peak:833608

used_memory_peak_human:814.07K

total_system_memory:340770816

total_system_memory_human:324.98M

used_memory_lua:37888

used_memory_lua_human:37.00K

maxmemory:0

maxmemory_human:0B

maxmemory_policy:noeviction

mem_fragmentation_ratio:2.82

mem_allocator:jemalloc-3.6.0 

  LASTSAVE - 返回最近一次 Redis 成功将数据保存到磁盘上的时间,以 UNIX 时间戳格式表示。

  MONITOR - 实时打印出 Redis 服务器接收到的命令,调试用。

192.168.88.130:6379> monitor

OK

另起客户端执行如下操作    

         192.168.88.130:6379>GET ip

         "172.16.100.1"

         192.168.88.130:6379>SET ip 172.16.100.2

         OK

         192.168.88.130:6379>set port 8080

         OK

1524668084.143270 [0 192.168.88.130:45351]"GET" "ip"

1524668093.083372 [0 192.168.88.130:45351]"SET" "ip" "172.16.100.2"

1524668107.121608 [0 192.168.88.130:45351]"set" "port" "8080"   

  SAVE - SAVE 命令执行一个同步保存操作,将当前 Redis 实例的所有数据快照(snapshot)以 RDB 文件的形式保存到硬盘。

  SHUTDOWN[NOSAVE|SAVE]  把所有数据同步到磁盘后安全的关闭

       SHUTDOWN命令执行以下操作:

    停止所有客户端

    如果有至少一个保存点在等待,执行 SAVE 命令

    如果 AOF 选项被打开,更新 AOF 文件

    关闭 redis 服务器(server)

  SLAVEOF host port 通过执行 SLAVEOF host port 命令,可以将当前服务器转变为指定服务器的从属服务器(slave server)。

  SLAVEOF 命令用于在 Redis 运行时动态地修改复制(replication)功能的行为。

         SLOWLOG subcommand [argument] 显示Redis的慢查询日志

  SYNC - 用于复制功能(replication)的內建命令。

  TIME - 返回当前服务器时间

192.168.88.130:6379> time

1) "1524668303"

2) "814349" 

192.168.88.130:6379>

 

(4).发布和订阅(publish/subscribe)

         频道:消息队列

         SUBSCRIBE:订阅一个或多个队列

         PUBLISH:像频道发布消息     

         UNSUBSCRIBE:退订此前订阅的频道

         PSUBSCRIBE:模式订阅

SUBSCRIBE和PUBLISH:发布和订阅

192.168.88.130:6379> SUBSCRIBE news

Reading messages... (press Ctrl-C to quit)

1) "subscribe"

2) "news"

3) (integer) 1

其它连接客户端

         192.168.88.130:6379>PUBLISH news hello

         (integer)1

         192.168.88.130:6379>PUBLISH news reida

         (integer)1

1) "message"

2) "news"

3) "hello"

1) "message"

2) "news"

3) "reida"

模式订阅:PSUBSCRIBE

192.168.88.130:6379> PSUBSCRIBEnew.i[to]

Reading messages... (press Ctrl-C to quit)

1) "psubscribe"

2) "new.i[to]"

3) (integer) 1

其它连接客户端

         192.168.88.130:6379>PUBLISH new.io hello

         (integer)1

         192.168.88.130:6379>PUBLISH new.it world

         (integer)1

1) "pmessage"

2) "new.i[to]"

3) "new.io"

4) "hello"

1) "pmessage"

2) "new.i[to]"

3) "new.it"

4) "world"

UNSUBSCRIBE:退订

192.168.88.130:6379> UNSUBSCRIBE new

1) "unsubscribe"

2) "new"

3) (integer) 0

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值