redis 基础数据类型及应用 1

  • redis简介
  • 一、 string 数据类型与结构(字符串)
    • 1 string类型简介
    • 2 常用命令
      • 1、set 命令
      • 2、get 命令
      • 3、getset 命令
      • 4、mget 命令
      • 5、decr 命令
      • 6、incr 命令
    • 2、string 数据类型的应用
      • 1 session共享
      • 2 计数器
      • 3 Redis限速
  • 二、list 数据类型与结构(列表)
    • 1、list数据类型简介
    • 2、常用命令
      • Lpush 命令
      • RPUSH命令
      • Blpop 命令
      • Brpop 命令
      • Linsert 命令
      • Lindex 命令
      • Llen 命令
      • Lrange命令
    • 3、list类型应用场景
      • 队列-秒杀抢购
  • 三、hash 数据类型与结构(哈希)
    • 1、hash类型介绍
    • 2、常用命令
      • hmset 命令
      • Hmget 命令
      • Hset 命令
      • Hvals 命令
      • Hdel 命令
      • Hgetall 命令
    • 3、hash类型应用场景
      • 1 购物车
      • 2 存储对象
  • 四、zset 类型与结构(有序集合)
    • 1、 zset 类型介绍
    • 2、常用命令
      • zadd 命令
      • Zcard 命令
      • Zcount 命令
      • Zrange 命令
      • Zrevrange 命令
      • Zrangebyscore 命令
      • Zrank命令
      • Zrem 命令
      • Zremrangebyrank 命令
      • Zscore 命令
      • Zscan 命令
    • 2、zset类型应用场景
      • 排行榜
  • 五、Set数据类型与结构(集合)
    • 1、set类型介绍
    • 2、常用命令
      • Sadd
      • Scard
      • Sdiff

redis简介

REmote DIctionary Server(Redis) 是一个由Salvatore Sanfilippo写的key-value存储系统。

Redis是一个开源的使用ANSI C语言编写、遵守BSD协议、支持网络、可基于内存亦可持久化的日志型、Key-Value数据库,并提供多种语言的API。

它通常被称为数据结构服务器,因为值(value)可以是 字符串(String), 哈希(Hash), 列表(list), 集合(sets) 和 有序集合(sorted sets)等类型。

特点

Redis 与其他 key - value 缓存产品有以下三个特点:

1、Redis支持数据的持久化,可以将内存中的数据保存在磁盘中,重启的时候可以再次加载进行使用。
2、Redis不仅仅支持简单的key-value类型的数据,同时还提供list,set,zset,hash等数据结构的存储。
3、Redis支持数据的备份,即master-slave模式的数据备份。

与其他key-values相比

Redis有着更为复杂的数据结构并且提供对他们的原子性操作,这是一个不同于其他数据库的进化路径。Redis的数据类型都是基于基本数据结构的同时对程序员透明,无需进行额外的抽象。

Redis运行在内存中但是可以持久化到磁盘,所以在对不同数据集进行高速读写时需要权衡内存,因为数据量不能大于硬件内存。在内存数据库方面的另一个优点是,相比在磁盘上相同的复杂的数据结构,在内存中操作起来非常简单,这样Redis可以做很多内部复杂性很强的事情。同时,在磁盘格式方面他们是紧凑的以追加的方式产生的,因为他们并不需要进行随机访问。

一、 string 数据类型与结构(字符串)

1 string类型简介

String类型是redis的最基础的数据结构,也是最经常使用到的类型。而且其他的四种类型多多少少都是在字符串类型的基础上构建的,所以String类型是redis的基础。

string 类型的值最大能存储 512MB,这里的String类型可以是简单字符串、复杂的xml/json的字符串、二进制图像或者音频的字符串、以及可以是数字的字符串。

2 常用命令

1、set 命令

描述:该命令用于设置给定 key 的值。如果 key 已经存储其他值, SET 就覆写旧值,且无视类型

127.0.0.1:6379> set name starsky
OK
127.0.0.1:6379>

通过set命令给restkey这个key值绑定value,当SET在设置操作成功完成时,才返回 OK

2、get 命令

描述:该命令用于获取指定 key 的值。如果 key不存在,返回 nil 。如果key对应储存的值不是字符串类型,返回一个错误。

127.0.0.1:6379> get name
"starsky"
127.0.0.1:6379>

3、getset 命令

描述:该命令用于获取指定的key的旧值,然后按照新值对key进行赋值。当key中没有旧值的时候返回nil。

127.0.0.1:6379> getset name will
"starsky"
127.0.0.1:6379> get name
"will"
127.0.0.1:6379>

4、mget 命令

描述:该命令用于返回多个key的值,当其中某一个KEY的值不存在,返回nil

127.0.0.1:6379> set age 10
OK
127.0.0.1:6379> set sex 1
OK
127.0.0.1:6379> mget name age sex
1) "will"
2) "10"
3) "1"
127.0.0.1:6379>

5、decr 命令

描述:对key对应的数字做减1操作。如果key不存在,那么在操作之前,这个key对应的值会被置为0。如果key有一个错误类型的value或者是一个不能表示成数字的字符串,就返回错误

127.0.0.1:6379> decr age
(integer) 9
127.0.0.1:6379> get age
"9"
127.0.0.1:6379>

6、incr 命令

描述:对存储在指定key的数值执行原子的加1操作,如果指定的key不存在,那么在执行incr操作之前,会先将它的值设定为0。如果指定的key中存储的值不是字符串类型(fix:)或者存储的字符串类型不能表示为一个整数,那么执行这个命令时服务器会返回一个错误(eq:(error) ERR value is not an integer or out of range)。

127.0.0.1:6379> get age
"9"
127.0.0.1:6379> incr age
(integer) 10
127.0.0.1:6379>

2、string 数据类型的应用

1 session共享


一个分布式web服务将用户的Session信息(比如:登录信息)记录到各自服务器中,这样会出现一个问题,在负载均衡的情况下,服务器会将用户的访问均衡到不同的服务器上,用户刷新一次访问可能就会发现需要重新登录,这个问题对于用户体验来说是无法容忍的。

为了解决这个问题我们会是使用Redis将用户的Session进行集中管理,这样就只需要保证redis的高可用以及扩展性,每次用户的登录或者查询登录都从Redis中获取Session信息。

如下如图:

2 计数器

商品浏览记录

<?php
$config = include "../config/database.php";
$Redis = new Redis();
$Redis->connect($config['redis']['host'],$config['redis']['port']);
$Redis->auth($config['redis']['password']);
$key = "product:".$_GET['product_id'];
if (!$Redis->exists($key)){ //判断你是否存在key$Redis->set($key,1);
//    header("Location:http://blog-login.com/public/product_key.php?id=".$_GET['product_id']);header("Location:http://blog-login.com/view/SteelSeries_zxr.php?id=".$_GET['id']."&product_id=1");
}else{$Redis->incr($key);
//    header("Location:http://blog-login.com/public/product_key.php?id=".$_GET['product_id']);header("Location:http://blog-login.com/view/SteelSeries_zxr.php?id=".$_GET['id']."&product_id=1");
}
?>

3 Redis限速

在一些项目中为了保证安全会要求用户在登录的时候输入手机号进行验证码验证,但是为了保证短信接口不被频繁访问,会进行一定的限制。

<?php
$Redis = new Redis("192.168.29.108",6379);
$Redis->auth("root");
$phonename="176xxxx0888";
$id = 1;
$key = "user:$id:info:".$phonename;$restful = $Redis->exists($key);
if ($restful != null || $Redis->incr($key)<=5) {return "OK";
}else {echo "1分钟不能请求5次";
}
?>

上面的代码就是使用Redis实现了限速的功能,例如一些网站限制一个IP地址不能在1秒内访问超过n次也可以使用类似的思路。

二、list 数据类型与结构(列表)

1、list数据类型简介

list类型是用来存储多个有序的字符串的,列表当中的每一个字符看做一个元素,一个列表当中可以存储有一个或者多个元素,redis的list支持存储2^32次方-1个元素。redis可以从列表的两端进行插入(pubsh)和弹出(pop)元素,支持读取指定范围的元素集,或者读取指定下标的元素等操作。redis列表是一种比较灵活的链表数据结构,它可以充当队列或者栈的角色。

redis列表是链表型的数据结构,所以它的元素是有序的,而且列表内的元素是可以重复的。意味着它可以根据链表的下标获取指定的元素和某个范围内的元素集。

2、常用命令

Lpush 命令

描述:将一个或多个值插入到列表头部。 如果 key 不存在,则创建list,然后再插入数据操作。 当 key 存在但不是列表类型时,返回一个错误。

127.0.0.1:6379> lpush ranking mysql
(integer) 1
127.0.0.1:6379> lpush ranking redis
(integer) 2
127.0.0.1:6379>

RPUSH命令

同理,将一个或者多个元素从list的尾部插入。

Blpop 命令

描述:redis的list是链表结构所以BLPOP命令正是取出列表的第一个元素,如果list当中没有没有元素,会一直等待到超时,或者发现有数据为止。

127.0.0.1:6379> blpop ranking 10
1) "ranking"
2) "redis"
127.0.0.1:6379> blpop ranking 10
1) "ranking"
2) "mysql"
127.0.0.1:6379> blpop ranking 10
(nil)
(10.08s)
127.0.0.1:6379>

10是指定10秒内返回,假如10秒没有可返回的数据,就返回nil

Brpop 命令

同理,Brpop是移出list列表的最后一个元素。

Linsert 命令

描述:指的是在list列表的某一个元素前或者后插入另外一个元素。当指的的元素不存在时,不执行任何动作。如果列表不存在时,视为空列表,不执行任何动作。

127.0.0.1:6379> lpush ranking mysql
(integer) 1
127.0.0.1:6379> lpush ranking redis
(integer) 2
127.0.0.1:6379> linsert ranking before redis php
(integer) 3
127.0.0.1:6379> lrange ranking 0 10
1) "php"
2) "redis"
3) "mysql"
127.0.0.1:6379>

Lindex 命令

描述:用于通过链表的下标索引获取列表中的元素。这里的下标也可以是负数表示list的最后一个元素,-2表示倒数第二个元素。

127.0.0.1:6379> lrange ranking 0 10
1) "php"
2) "redis"
3) "mysql"
127.0.0.1:6379> lindex ranking 1
"redis"
127.0.0.1:6379> lindex ranking 2
"mysql"
127.0.0.1:6379> lindex ranking 0
"php"
127.0.0.1:6379>

Llen 命令

描述:用于返回list列表的长度。 假如list不存在,则 list 被解释为一个空列表,返回 0 。

127.0.0.1:6379> llen ranking
(integer) 3
127.0.0.1:6379>

Lrange命令

描述:于返回指定list区间内的元素。区间以偏移量 START 和 END 指定。 其中 0 表示列表的第一个元素, 1 表示列表的第二个元素,以此类推。 你也可以使用负数下标,以 -1 表示列表的最后一个元素, -2 表示列表的倒数第二个元素,以此类推。

127.0.0.1:6379> lrange ranking 0 3
1) "php"
2) "redis"
3) "mysql"
127.0.0.1:6379>

3、list类型应用场景

队列-秒杀抢购

list类型的lpop和rpush(或者反过来,lpush和rpop)能实现队列的功能,故而可以用Redis的list类型实现简单的点对点的消息队列。不过我不推荐在实战中这么使用,因为现在已经有Kafka、NSQ、RabbitMQ等成熟的消息队列了,它们的功能已经很完善了,除非是为了更深入地理解消息队列,不然我觉得没必要去重复造轮子。

三、hash 数据类型与结构(哈希)

1、hash类型介绍

Redis hash数据结构 是一个键值对(key-value)集合,它是一个 string 类型的 field 和 value 的映射表,redis本身就是一个key-value型数据库,因此hash数据结构相当于在value中又套了一层key-value型数据。所以redis中hash数据结构特别适合存储关系型对象。比如用来存储学生基本信息,或者用户信息等。

2、常用命令

hmset 命令

描述:用于同时将多个field-value (字段-值)对设置到哈希表中。假如hash表中已经存在field,则会对其进行覆盖。如果哈希表不存在,会创建一个空哈希表,并执行 HMSET 操作。

127.0.0.1:6379> hmset users id 1 username starsky age 18 sex 1
OK
127.0.0.1:6379>

Hmget 命令

描述:用于返回hash表中field字段对应的值,如果field不存在,那么返回nil值。

127.0.0.1:6379> hmget users id username age
1) "1"
2) "starsky"
3) "18"
127.0.0.1:6379>

Hset 命令

描述:对hash表中field对应的value进行赋值,如果哈希表不存在,一个新的哈希表被创建并进行 HSET 操作。

127.0.0.1:6379> hset users age 30
(integer) 0
127.0.0.1:6379> hset users sex 0
(integer) 0
127.0.0.1:6379> hmget users id username age sex
1) "1"
2) "starsky"
3) "30"
4) "0"
127.0.0.1:6379>

Hvals 命令

描述:用于返回哈希表所有field对应的值。

127.0.0.1:6379> hvals users
1) "1"
2) "starsky"
3) "30"
4) "0"
127.0.0.1:6379>

Hdel 命令

描述:用于删除指定哈希表中的一个或多个field,不存在的field将被忽略。

127.0.0.1:6379> hdel users sex
(integer) 1
127.0.0.1:6379> hvals users
1) "1"
2) "starsky"
3) "30"
127.0.0.1:6379>

Hgetall 命令

描述:用于返回哈希表中,所有的字段和值。

127.0.0.1:6379> hgetall users
1) "id"
2) "1"
3) "username"
4) "starsky"
5) "age"
6) "30"
127.0.0.1:6379>

3、hash类型应用场景

1 购物车

购物车功能主要是通过用户点击商品添加到购物车,前端会传递商品id以及用于需要购买的数据到后端,php通过前端传递的参数进而完成购物车的添加,增加或者减少购物车购买数量,删除或者清空购物车等功能。

如果说是使用redis来做我们可以以用户id为key,商品id为field,商品数量为value,恰好构成了购物车的3个要素。

2 存储对象

hash类型的(key, field, value)的结构与对象的(对象id, 属性, 值)的结构相似,也可以用来存储对象。

在介绍string类型的应用场景时有所介绍,string + json也是存储对象的一种方式,那么存储对象时,到底用string + json还是用hash呢?

两种存储方式的对比如下表所示:

string+json hash
效率 很高
容量
灵活性
序列化 简单 复杂

当对象的某个属性需要频繁修改时,不适合用string+json,因为它不够灵活,每次修改都需要重新将整个对象序列化并赋值,如果使用hash类型,则可以针对某个属性单独修改,没有序列化,也不需要修改整个对象。比如,商品的价格、销量、关注数、评价数等可能经常发生变化的属性,就适合存储在hash类型里。

当然,不常变化的属性存储在hash类型里也没有问题,比如商品名称、商品描述、上市日期等。但是,当对象的某个属性不是基本类型或字符串时,使用hash类型就必须手动进行复杂序列化,比如,商品的标签是一个标签对象的列表,商品可领取的优惠券是一个优惠券对象的列表(如下图所示)等,即使以coupons(优惠券)作为field,value想存储优惠券对象列表也还是要使用json来序列化,这样的话序列化工作就太繁琐了,不如直接用string + json的方式存储商品信息来的简单。

四、zset 类型与结构(有序集合)

1、 zset 类型介绍

redis有序集合也是集合类型的一部分,所以它保留了集合中元素不能重复的特性,但是不同的是,有序集合给每个元素多设置了一个分数,利用该分数作为排序的依据。

有序集合可以利用分数进行从小到大的排序。虽然有序集合的成员是唯一的,但是分数(score)却可以重复。就比如在一个班中,学生的学号是唯一的,但是每科成绩却是可以一样的,redis可以利用有序集合存储学生成绩快速做成绩排名功能。

2、常用命令

zadd 命令

描述:向一个有序集合中加入一个或者多个元素及其分数。假如加入的元素已经存在,那么更新这个成员的分数值,然后进行重新插入,来定位自己的位置。如果key不存在,那么创建一个新的有序集合并进行插入操作。

127.0.0.1:6379> zadd score  will 80  starsky 90  harry 100
(error) ERR value is not a valid float
127.0.0.1:6379> zadd score 80 will 90 starsky 100 harry
(integer) 3

注意语法错误:(error) ERR value is not a valid float

Zcard 命令

描述:用于计算有序集合中元素的数量。

127.0.0.1:6379> zcard score
(integer) 3
127.0.0.1:6379>

Zcount 命令

描述:用于计算有序集合中指定分数区间的成员数量。

127.0.0.1:6379> zcount score 80 90
(integer) 2
127.0.0.1:6379>

Zrange 命令

描述: 用于返回指定区间内的成员。其中成员的位置按分数值递增(从小到大)来排序。这里的下标参数都是从0开始的,负数代表是从最后一个成员算起,-1表示最后一个成员。

127.0.0.1:6379> zrange score 0 -1
1) "will"
2) "starsky"
3) "harry"
127.0.0.1:6379>

Zrevrange 命令

描述:用于返回指定分数区间内的成员。其中成员的位置按分数值递减(从大到小)来排序。

127.0.0.1:6379> ZREVRANGE score 0 -1
1) "harry"
2) "starsky"
3) "will"
127.0.0.1:6379>

Zrangebyscore 命令

描述:回有序集合中指定分数区间的成员列表。其中集成员按分数值递增(从小到大)来排序。

127.0.0.1:6379> zrangebyscore score 80 90
1) "will"
2) "starsky"
127.0.0.1:6379>

Zrank命令

描述:用于返回有序集中指定成员的排名。

127.0.0.1:6379> zrank score harry
(integer) 2
127.0.0.1:6379> zrank score starsky
(integer) 1
127.0.0.1:6379> zrank score will
(integer) 0
127.0.0.1:6379>

Zrem 命令

描述:用于移除有序集中的一个或多个成员,不存在的成员将被忽略。

127.0.0.1:6379> zrem score starsky
(integer) 1
127.0.0.1:6379> zrange score 0 -1
1) "will"
2) "harry"
127.0.0.1:6379>

Zremrangebyrank 命令

描述:用于移除有序集中,指定排名(rank)区间内的所有成员。

127.0.0.1:6379> zremrangebyrank score 0 0
(integer) 1
127.0.0.1:6379> zrange score 0 -1
1) "harry"
127.0.0.1:6379>

Zscore 命令

描述:返回有序集中,成员的分数值。 如果成员元素不是有序集 key 的成员,或 key 不存在,返回 nil 。

127.0.0.1:6379> zadd score 95 tony
(integer) 1
127.0.0.1:6379> zscore score  tony
"95"
127.0.0.1:6379>

Zscan 命令

描述:用于迭代有序集合中的元素(包括元素成员和元素分值)。

127.0.0.1:6379> zscan score 0 match t*
1) "0"
2) 1) "tony"2) "95"
127.0.0.1:6379>

2、zset类型应用场景

排行榜

有序集合经典使用场景。例如视频网站需要对用户上传的视频做排行榜,榜单维护可能是多方面:按照时间、按照播放量、按照获得的赞数等。

下面是实现代码:

<?php
public function show(Product $product,Request $request)
{if (!$product->status){throw new \Exception("商品未上架");}if (!Redis::exists("product:".$product->id.":count")){Redis::set("product:".$product->id.":count",1);}else{Redis::incr("product:".$product->id.":count",1);}Redis::zadd("product:Ranking",Redis::get("product:".$product->id.":count"),$product->id);return view("product.productShow",["product" => $product]);
}
?>

为了更好的突出效果,商品每被浏览一次,redis就使用string进行一次记录,同时zset类型会根据string的记录对相关商品的分数进行修改,保证商品排行的实时更新。

在用户查看排行榜时:

127.0.0.1:6379> ZREVRANGE laravel_database_product:Ranking 0 -1
1) "2"
2) "1"

五、Set数据类型与结构(集合)

1、set类型介绍

redis集合(set)类型和list列表类型类似,都可以用来存储多个字符串元素的集合。但是和list不同的是set集合当中不允许重复的元素。而且set集合当中元素是没有顺序的,不存在元素下标。
redis的set类型是使用哈希表构造的,因此复杂度是O(1),它支持集合内的增删改查,并且支持多个集合间的交集、并集、差集操作。可以利用这些集合操作,解决程序开发过程当中很多数据集合间的问题。

2、常用命令

Sadd

向集合添加一个或多个成员

127.0.0.1:6379> sadd saka sa sk sd
<integer> 3

Scard

获取集合的成员数

127.0.0.1:6379> scard saka
<integer> 3

Sdiff

返回第一个集合与其他集合之间的差异。

127.0.0.1:6379> sadd sakas sa sk sd ss sx
<integer> 5
127.0.0.1:6379> sdiff sakas saka
1> ss
2> sx

redis 基础数据类型及应用 1相关推荐

  1. redis基础数据类型set(无序不重复集合)

    redis基础数据类型set(无需不重复集合) 常用命令 命令 说明 Sadd setName element 往set集合中添加1个元素 Smembers setName 查看指定set集合的所有元 ...

  2. 【Java从0到架构师】Redis 基础 - 数据类型

    Redis 原理与实战 Redis 基础 为什么 Redis 这么快? Redis 安装.启动 Redis 常用配置 Redis 数据类型 通用命令 String - value 可以是字符串.数值. ...

  3. Redis基础——数据类型详解

    命令参考:http://doc.redisfans.com/ 简介 Redis 是完全开源的,遵守 BSD 协议,是一个高性能的 key-value 数据库. Redis 与其他 key - valu ...

  4. Redis 基础 -- 数据类型实践案例(限制每个用户每分钟最多发起10次调用、微信接收消息顺序)

    文章目录 1. 数据类型实践案例 1.1 实践案例1:限制每个用户每分钟最多发起10次调用 1.2 实践案例2:微信接收消息顺序 1. 数据类型实践案例 1.1 实践案例1:限制每个用户每分钟最多发起 ...

  5. Redis基础类型ZSet增删改查(带Java库源码)

    1 缘起 继续系统补充Redis基础数据类型操作知识. 为帮助读者更加系统地学习Redis基础数据操作, 分享其他数据类型操作文章: 序号 文章 1 String操作详解 2 Hash操作详解 3 L ...

  6. redis学习(1)之redis基础和配置主从

    redis介绍 redis介绍 为什么会出现redis呢? redis特性 速度快 基于key-value 丰富的功能 简单稳定 支持的语言多 持久化 主从复制 redis应用场景 缓存 排行榜系统 ...

  7. 数据类型_分享redis中除5种基础数据类型以外的高级数据类型

    众所周知,在redis中的数据类型有String(字符串).hash(哈希).list(列表).set(集合).zset(有序集合)五种.但在这5种之外还有高级数据类型. 今天和大家介绍下常用的高级数 ...

  8. Redis基础-下载安装、配置、数据类型、指令、Jedis、持久化

    Redis基础 学习计划 1. Redis入门 (了解) (操作) 2. 数据类型 (重点) (操作) (理解) 3. 常用指令 (操作) 4. Jedis (重点) (操作) 5. 持久化 (重点) ...

  9. (一)Redis——五大数据类型及基础知识

    一位爱好技术的橘右京的哥哥橘左京 Redis--五大数据类型及基础知识(一) Redis 1.Redis命令 1.1 常用String命令 1.2 常用List命令 1.3 常用Hash命令 1.4 ...

最新文章

  1. ubuntu12.04 alternate win7 双系统安装
  2. A. Boredom【DP】
  3. Java线程池ThreadPoolExecutor使用和分析
  4. 中毒,重装,杀毒……最近一段时间,很烦的一件事,不断重复……
  5. SQL Server 2005更改当前数据库的所有者
  6. python程序实例讲解_python入门编程实例 python入门编程实例解析
  7. Python实现常见算法[1]——冒泡排序
  8. Cesium开发环境搭建的几种方法总结
  9. win10u盘被写保护怎么解除_win10怎么取消u盘写保护|win10关闭u盘写保护方法
  10. 关于微信公众号,无法接受服务器消息的原因
  11. php ui设计_什么是ui设计
  12. 求直角边的斜边c语言,使用多种程序语言编程:已知斜边与一直角边,通过勾股定理求另外一直角边,50分起价,多一个正确回答加100分(并非刷分,请不要误解)...
  13. 弦截法求方程根例题c语言,弦截法求方程根.ppt
  14. js match的()和g的幺蛾子
  15. OS模块--批量修改文件名字(二)
  16. QT制作软件---窗口跟随鼠标进行移动
  17. Linux系统的常见命令记忆【Ubuntu】
  18. c语言程序中只能给指针赋,在c程序中,只能给指针变量赋NULL值和_____值. 答案:地址;指针...
  19. 【论文泛读】Easing Embedding Learning by Comprehensive Transcription of Heterogeneous Information Networks
  20. javascript教程系列20: 前端必读,浏览器内部工作原理(转)

热门文章

  1. Gitea 的简单介绍
  2. Autodesk Flame Education 2020 特别版 Mac 交互设计终极视觉特效制作软件
  3. 武汉科技大学计算机学院温文,第五届华中地区计算机类院校学生领袖峰会成功举行...
  4. 【统计年鉴下载】夏泽网
  5. VC++:菜单的使用总结
  6. YOLO3-WIN10-GPU版配置详细教程
  7. python不显示边框_python设置表格边框的具体方法
  8. java反射的优缺点_Java反射机制的优缺点
  9. mvp关联activity生命周期_极简SaaS创业手册一文读懂SaaS全生命周期阶段
  10. 腾讯云配置密钥使用putty登录 PuTTY实现Windows向Linux上传文件