Redis 有 5 种基础数据结构,分别为:string (字符串)、list (列表)、set (集合)、hash (哈希) 和 zset (有序集合)。

一. string (字符串)

字符串 string 是 Redis 最简单的数据结构。Redis 所有的数据结构都是以唯一的 key 字符串作为名称,然后通过这个唯一 key 值来获取相应的 value 数据。不同类型的数据结构的差异就在于 value 的结构不一样。字符串结构使用非常广泛,一个常见的用途就是缓存用户信息。我们将用户信息结构体使用 JSON 序列化成字符串,然后将序列化后的字符串塞进 Redis 来缓存。同样,取用户信息会经过一次反序列化的过程。

1. string的常用操作

(1) 键值对

# 存入字符串键值对
set key value
# 获取一个字符串键值对
get key
# 删除
del key

(2) 批量操作键值对

可以批量对多个字符串进行读写,节省网络耗时开销

# 批量存储字符串键值对
mset ket value [key value .....]
# 批量获取字符串键值对
mget key [key ......]

(3) 过期和 set 命令扩展

# 设置一个键(key)的过期时间(seconds)
expire key seconds
# setex 等价于 set + expire
setex key seconds value
# 存入一个不存在的字符串键值对
setnx key value

(4) 原子操作

如果 value 值是一个整数,还可以对它进行自增操作。自增是有范围的,它的范围是 signed long 的最大最小值,超过了这个值,Redis 会报错

# 将 key 中存储的值加1
incr key
# 将 key 中存储的值减1
decr key
# 将 key 中存储的值加increment
incrby key increment
# 将 key 中存储的值减decrement
decrby key decrement

2. string的应用场景

Redis应用场景:常规key-value缓存应用、常规计数:微信公众号阅读次数,粉丝数等、分布式锁等

(1)单值缓存

 set key valueget key

(2)对象缓存

set user:1 value(json格式数据)
mset user:1:name zhuge user:1:balance 1888
mget user:1:name user:1:balance

(3)计数器

incr article:readcount:{文章id}
get article:readcount:{文章id}

(4)分布式锁

(5)web集群session共享

这里推荐王松大神的一篇文章:https://wangsong.blog.csdn.net/article/details/90762365

(6)分布式系统全局序列号

redis批量生成序列号提升性能

二. hash (哈希)

String类型 存储的困惑

  • 对象类数据的存储如果具有较为频繁的更新需求,操作会显得笨重,存容易,改麻烦。
  • 为了区别与Redis中的键值对的称呼,hash中的键成为field,而key特指Redis的键。

hash类型

  • 新的存储需求:对一系列存储的数据进行编组,方便管理,典型应用存储对象信息
  • 需要的内存结构:一个存储空间保存多少个键值对数据
  • hash类型:底层使用哈希表结构实现数据存储,相当于 Java 语言里面的 HashMap,它是无序字典。内部实现结构上同 Java 的HashMap 也是一致的,同样的数组 + 链表二维结构。第一维 hash 的数组位置碰撞时,就会将碰撞的元素使用链表串接起来。

1. hash的常用操作

(1)操作单个数据

# 添加修改数据
hset key field value
# 获取数据
hget key field
# 删除数据
hdel key field1 [field2 ...]

(2)操作多个数据

# 添加/修改多个数据
hmset key field1 value1 field2 calue2
#获取多个数据
hmget key field1 field2 …
# 获取哈希表key中field的数量
hlen key
# 获取哈希表key中所有的键值
hgetall key
# 获取哈希表中是否存在指定的字段
hexists key field

(3)原子操作

# 将 field 中存储的值加 increment
hincrby key field increment
# float 值
hincrbyfloat key field increment

2. hash的应用场景

(1)对象缓存

hmset user {userId}:name value {userId}:balance value
hmset user {1}:name zhuge {1}:balance 1888

(2)购物车

  • 业务场景:电商网站购物车的设计与实现。

  • 解决方案:
  • 以客户id作为key,每位用户创建一个hash存储结构存储对应的购物车信息。
  • 将商品编号作为field,购买数量作为value进行存储。
  • 添加商品:追加全新的field与value。
    hset cart:101 1001 1
  • 浏览:遍历hash。
    hgetall cart:101
  • 更改数量:自增/自减,设置value值。
    hincrby cart:101 1001 1
  • 删除商品:删除field。
    hdel cart:101 1001
  • 清空:删除key。

3. hash的优缺点

  • 优点
  1. 同类数据归类整合储存,方便数据管理。
  2. 相比string操作消耗内存与cpu更小。
  3. 相比string储存更节省空间。
  • 缺点
  1. 过期功能不能使用在field上,只能用在key上。
  2. Redis集群架构下不适合大规模使用。

redis集群架构

三. List(列表)

  • 数据存储需求:存储多个数据,并对数据进入存储空间的顺序进行区分
  • 需要的存储数据:一个存储空间保存多个数据,且通过数据可以体现进入顺序
  • list类型:保存多个数据,底层使用双向链表存储结构实现

1. list的常用操作

(1)添加/修改数据

# 将一个或多个值value插入到key列表的表头(最左边)
lpush key value1 [value2 …]
# 将一个或多个值value插入到key列表的表尾(最右边)
rpush key value1 [value2 …]

(2)获取并移除数据

# 移除并返回key列表的头元素
lpop key
# 移除并返回key列表的尾元素
rpop key

(3)获取数据

# 获取列表key中指定区间内的元素,从左数第start到stop个元素,从0开始
lrange key start stop
# 查询第i个元素
lindex key index
# list的长度
llen key

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

# 从key列表表头弹出一个元素,若列表中没有元素,阻塞等待timeout秒,如果timeout=0,一直阻塞等待
blpop key1 [key2 ...] timeout
# 从key列表表尾弹出一个元素,若列表中没有元素,阻塞等待timeout秒,如果timeout=0,一直阻塞等待
brpop key1 [key2 ...] timeout

开两个客户端,一个设置15s内获取list1中的值,此时list1位空一直等待(阻塞),在15秒内另一个客户端存入到list1中数据,此时就被获取到。

(5)移除指定数据

# 根据参数count的值,移除列表中与参数value相等的元素。count为移除的数量,value为移除哪个值
lrem key count value

2. 常用数据结构

  • Stack(栈) = lpush + lpop → filo
  • Queue(队列) = lpush + rpop
  • Blocking MQ(阻塞队列) = lpush + brpop

3. list的应用场景

(1)最新消息的展示

业务场景

  • 新浪微博、twitter中个人用于的关注列表需要按照用户的关注顺序进行展示,粉丝列表需要将最近关注的粉丝列在前面。

  • 公众号、新闻、资讯类网站如何将最新的新闻或资讯按照发生的事件顺序展示。

  • 企业运营过程中,系统将产生出大量的运营数据,如何保障堕胎服务器操作日志的统一顺序输出?

解决方案

  • 依赖list的数据具有顺序的特征对信息进行管理。
  • 使用队列模型解决多路信息汇总合并的问题。
  • 使用栈模型解决最新消息的问题。
# 河北日报发了消息,消息id为1
lpush msg:user_id 1
# 央视网发了消息,消息id为2
lpush msg:user_id 2
# 查看最新公众号消息
lrange msg:user_id 0 5

四. set(集合)

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

1. set的常用操作

(1)添加数据

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

(2)获取数据

# 获取集合 key 中的所有成员
smembers key
# 获取集合key中元素的数量
scard key# 判断集合key中是否存在member元素
sismember key member# 获取集合key中的count个随机元素,并从集合key中移除
spop key [count]
# 获取集合key中的count个随机元素,不从集合key中移除
srandmember key [count]

(3)删除数据

# 移除集合 key 中的一个或多个 member 元素,不存在的 member 元素会被忽略
srem key member [member ...]

2. set的运算操作

(1)交集

返回一个集合的全部成员,该集合是所有给定集合的交集。
sinter key

代码示例:

redis> smembers group_1
1) "LI LEI"
2) "TOM"
3) "JACK"redis> smembers group_2
1) "HAN MEIMEI"
2) "JACK"redis> sinter group_1 group_2
1) "JACK"

将交集结果保存到destination集合,如果destination集合已经存在,则将其覆盖。destination可以是key本身。
sinterstore destination key [key …]

代码示例:

redis> smembers songs
1) "good bye joe"
2) "hello,peter"redis> smembers my_songs
1) "good bye joe"
2) "falling"redis> sintrestore song_interset songs my_songs
(integer) 1redis> smembers song_interset
1) "good bye joe"

(2)并集

返回一个集合的全部成员,该集合是所有给定集合的并集。
sunion key [key …]

代码示例:

redis> smembers songs
1) "Billie Jean"redis> smembers my_songs
1) "Believe Me"redis> sunion songs my_songs
1) "Billie Jean"
2) "Believe Me"

将并集结果保存到destination集合,如果destination集合已经存在,则将其覆盖。destination可以是key本身。
sunionstore destination key [key …]

代码示例:

redis> smembers NoSQL
1) "MongoDB"
2) "Redis"redis> smembers SQL
1) "sqlite"
2) "MySQL"redis> sunionstore db NoSQL SQL
(integer) 4redis> smembers db
1) "MySQL"
2) "sqlite"
3) "MongoDB"
4) "Redis"

(3)差集

返回一个集合的全部成员,该集合是所有给定集合之间的差集。
sdiff key [key …]

代码示例:

redis> smembers peters_movies
1) "bet man"
2) "start war"
3) "2012"redis> smembers joes_movies
1) "hi, lady"
2) "Fast Five"
3) "2012"redis> sdiff peters_movies joes_movies
1) "bet man"
2) "start war"

将差集结果保存到destination集合,如果destination集合已经存在,则将其覆盖。destination可以是key本身。
sdiffstore destination key [key …]

代码示例:

redis> smembers joes_movies
1) "hi, lady"
2) "Fast Five"
3) "2012"redis> smembers peters_movies
1) "bet man"
2) "start war"
3) "2012"redis> sdiffstore joe_diff_peter joes_movies peters_movies
(integer) 2redis> smembers joe_diff_peter
1) "hi, lady"
2) "Fast Five"

3. set的应用场景

(1)微信抽奖小程序

  1. 点击参加抽奖加入set集合
sadd key {user_id}
  1. 查看参与抽奖所有用户
smembers key
  1. 抽取count名中奖者
srandmember key [count] / spop key [count]

(2)随机推荐

redis应用于随机推荐类信息检索,例如热点歌单推荐,热点新闻推荐,热点旅游线路,应用APP推荐,大V推荐等。

业务场景:

每位用户首次使用进入头条时候会设置3项爱好的内容,但是后期为了增加用户的活跃度,兴趣点,必须让用户对其他信息类别逐渐产生兴趣,增加客户留存度,如何实现?

业务分析:

  • 系统分析出各个分类的最新或最热点信息条目并组织成set集合
  • 随机挑选其中部分信息
  • 配合用户关注信息分类中的热点信息组织展示的全信息集合

解决方案:

  • 随机获取集合中指定数量的数据
srandmember key [count]
  • 随机获取集合中的某个数据并将该数据移出集合
spop key

(3)共同好友

  • 脉脉为了促进用户间的交流,保障业务成单率的提升,需要让每位用户拥有大量的好友,事实上职场新人不具有更多的职场好友,如何快速为用户积累更多的好友?
  • 新浪微博为了增加用户热度,提高用户留存性,需要微博用户在关注更多的人,以此获得更多的信息或热门话题,如何提高用户关注他人的总量?
  • QQ新用户入网年龄越来越低,这些用户的朋友圈交际圈非常小,往往集中在一所学校甚至一个班级中,如何帮助用户快速积累好友用户带来更多的活跃度?
  • 微信公众号是微信信息流通的渠道之一,增加用户关注的公众号成为提高用户活跃度的一种方式,如何帮助用户积累更多关注的公众号?
  • 美团外卖为了提升成单量,必须帮助用户挖掘美食需求,如何推荐给用户最适合自己的美食?


    解决方案:
# 我关注的人
redis> smembers mySet
1) "zhuge"
2) "yangguo"
3) "sima"# 杨过关注的人
redis> smembers yangguoSet
1) "zhuge"
2) "sima"
3) "luban"
4) "guojia"# 司马关注的人
redis> smembers simaSet
1) "zhuge"
2) "yangguo"
3) "guojia"
4) "luban"
5) "xunyu"
  • 共同关注
# 我和杨过共同关注
redis> sinter yangguoSet mySet
1) "zhuge"
2) "sima"
  • 我关注的人也关注他
# 我关注的人也关注杨过
redis> sismember simaSet yangguo
(integer) 1
  • 我可能认识的人
redis> sdiff mySet yangguoSet
1) "luban"
2) "guojia"

(4)访问量统计去重

公司对旗下新的网站做推广,统计网站的PV (访问量),UV (独立访客),IP (独立IP)。

  • PV:网站被访问次数,可通过刷新页面提高访问量。
  • UV:网站被不同用户访问的次数,可通过cookie统计访问量,相同用户切换IP地址,UV不变。
  • IP:网站被不同IP地址访问的总次数,可通过IP地址统计访问量,相同IP不同用户访问,IP不变。

解决方案:

针对不同的统计类型有不同的数据存储方式:

  • 利用set集合的数据去重特征,记录各种访问数据
  • 建立string类型数据,利用incr统计日访问量(PV)
  • 建立set模型,记录不同cookie数量(UV)
  • 建立set模型,记录不用IP数量(IP)

(5)黑白名单

黑名单:

资讯类信息类网站追求高访问量,但是由于其信息的价值,往往容易被不法分子利用,通过爬虫技术,快速获取信息,个别特种行业网站信息通过爬虫获取分析后,可以转换成商业机密进行出售。例如第三方火车票、机票、酒店刷票代购软件、电商刷评论、刷好评。
同时爬虫带来的伪流量也会给经营者带来错觉,产生错误的决策,有效避免网站被爬虫反复爬取成为每个网站都要考虑的基本问题。在基于技术层面区分出爬虫用户后,需要将此类用户进行有效的屏蔽,这就是黑名单的典型应用。
ps:不是说爬虫一定做摧毁性的工作,有些小型网站需要爬虫为其带来一些流量。

白名单:

对于安全性更高的应用访问,仅仅靠黑名单是不能解决安全问题的,此时需要设定可访问的用户群体,依赖白名单做更为苛刻的访问验证。

解决方案:

  • 基于经营战略设定问题用户发现、鉴别规则
  • 周期性更新满足规则的用户黑名单,加入set集合
  • 用户行为信息达到后与黑名单进行比对,确认行为去向
  • 黑名单过滤IP地址:应用于开放游客访问权限的信息源
  • 黑名单过滤设备信息:应用于限定访问设备的信息源
  • 黑名单过滤用户:应用于基于访问权限的信息源

五. sorted_set(有序集合)

  • 新的存储需求:根据排序有利于数据的有效显示,需要提供一种可以根据自身特征进行排序的方式。
  • 需要的存储结构:新的存储模型,可以保存可排序的数据。
  • zset类型:在set的存储结构基础上添加可排序字段。

1. sorted_set的常用操作

(1)添加数据

# 将一个或多个 member 元素及其 score 值加入到有序集 key 当中。
zadd key score member [[score member] [score member] …]
  • 如果某个 member 已经是有序集的成员,那么更新这个 member 的 score 值,并通过重新插入这个 member元素,来保证该 member 在正确的位置上。
  • score 值可以是整数值或双精度浮点数。
  • 如果 key 不存在,则创建一个空的有序集并执行 ZADD 操作。
  • 当 key 存在但不是有序集类型时,返回一个错误。

(2)获取数据

# 获取有序集 key 中,成员 member 的 score 值
zscore key member# 获取有序集 key 的成员的数量。
zcard key# 获取有序集 key 中, score 值在 min 和 max 之间(默认包括 score 值等于 min 或 max )的成员的数量。
zcount key min max
# 正序(从小到大)获取有序集 key 中,指定区间内[start到stop]的成员。
zrange key start stop [WITHSCORES]
# 倒序(从大到小)获取有序集 key 中,指定区间内[start到stop]的成员。
zrevrange key start stop [WITHSCORES]
  • 下标参数 start 和 stop 都以 0 为底,也就是说,以 0 表示有序集第一个成员,以 1 表示有序集第二个成员,以此类推。你也可以使用负数下标,以 -1 表示最后一个成员, -2 表示倒数第二个成员,以此类推。
  • 超出范围的下标并不会引起错误。 比如说,当 start 的值比有序集的最大下标还要大,或是 start > stop 时, zrange命令只是简单地返回一个空列表。 另一方面,假如 stop 参数的值比有序集的最大下标还要大,那么 Redis 将 stop 当作最大下标来处理。

(3)删除数据

# 移除有序集 key 中的一个或多个成员,不存在的成员将被忽略。
zrem key member [member …]
  • 条件删除
# 移除有序集 key 中,指定排名(rank)区间内的所有成员。
zremrangebyrank key start stop
# 移除有序集 key 中,所有 score 值介于 min 和 max 之间(包括等于 min 或 max )的成员。
zremrangebyscore key min max

示例:

redis> ZADD salary 2000 jack
(integer) 1
redis> ZADD salary 5000 tom
(integer) 1
redis> ZADD salary 3500 peter
(integer) 1redis> ZREMRANGEBYRANK salary 0 1       # 移除下标 0 至 1 区间内的成员
(integer) 2redis> ZRANGE salary 0 -1 WITHSCORES    # 有序集只剩下一个成员
1) "tom"
2) "5000"
redis> ZRANGE salary 0 -1 WITHSCORES          # 显示有序集内所有成员及其 score 值
1) "tom"
2) "2000"
3) "peter"
4) "3500"
5) "jack"
6) "5000"redis> ZREMRANGEBYSCORE salary 1500 3500      # 移除所有薪水在 1500 到 3500 内的员工
(integer) 2redis> ZRANGE salary 0 -1 WITHSCORES          # 剩下的有序集成员
1) "jack"
2) "5000"

(4)原子操作

# 为有序集 key 的成员 member 的 score 值加上增量 increment 。
zincrby key increment member

示例:

redis> ZSCORE salary tom
"2000"redis> ZINCRBY salary 2000 tom   # tom 加薪啦!
"4000"

2. sorted_set集合操作

(1)并集

# 计算给定的一个或多个有序集的并集,其中给定 key 的数量必须以 numkeys 参数指定,并将该并集(结果集)储存到 destination 。
zunionstore destination numkeys key [key …]

示例:

redis> ZRANGE programmer 0 -1 WITHSCORES
1) "peter"
2) "2000"
3) "jack"
4) "3500"
5) "tom"
6) "5000"redis> ZRANGE manager 0 -1 WITHSCORES
1) "herry"
2) "2000"
3) "mary"
4) "3500"
5) "bob"
6) "4000"redis> ZUNIONSTORE salary 2 programmer manager WEIGHTS 1 3   # 公司决定加薪。。。除了程序员。。。
(integer) 6redis> ZRANGE salary 0 -1 WITHSCORES
1) "peter"
2) "2000"
3) "jack"
4) "3500"
5) "tom"
6) "5000"
7) "herry"
8) "6000"
9) "mary"
10) "10500"
11) "bob"
12) "12000"

(2)交集

# 计算给定的一个或多个有序集的交集,其中给定 key 的数量必须以 numkeys 参数指定,并将该交集(结果集)储存到 destination 。
zinterstore destination numkeys key [key …]

示例:

redis > ZADD mid_test 70 "Li Lei"
(integer) 1
redis > ZADD mid_test 70 "Han Meimei"
(integer) 1
redis > ZADD mid_test 99.5 "Tom"
(integer) 1redis > ZADD fin_test 88 "Li Lei"
(integer) 1
redis > ZADD fin_test 75 "Han Meimei"
(integer) 1
redis > ZADD fin_test 99.5 "Tom"
(integer) 1redis > ZINTERSTORE sum_point 2 mid_test fin_test
(integer) 3redis > ZRANGE sum_point 0 -1 WITHSCORES     # 显示有序集内所有成员及其 score 值
1) "Han Meimei"
2) "145"
3) "Li Lei"
4) "158"
5) "Tom"
6) "199"

3. sorted_set应用场景

(1)排行榜

解决方案:

  • 点击新闻,点击量 +1
zincrby hotNews:20210104  1  特朗普通话语音曝光
  • 展示当日排行前十
zrevrange hotNews:20210104 0 9 WITHSCORES
  • 七日搜索榜单计算
zunionstore  hotNews:20210104-2021010110  7  hotNews:20210104 hotNews:20210105 ... hotNews:20210110
  • 展示七日排行前十
zrevrange hotNews:20210104-2021010110 0 9 WITHSCORES

(2)会员短期体验之过期失效

基础服务+增值服务类网站会设定各位会员的试用,让用户充分体验会员优势。例如观影试用VIP、游戏VIP体验、云盘下载体验VIP、数据查看体验VIP,当VIP体验到期后,如何有效管理此类信息。即便对于正式VIP用户也存在对应的管理方式。
网站会定期开启投票、讨论,限时进行,逾期作废。如何有效管理此类过期信息。

解决方案:

  • 对于基于时间线限定的任务处理,将处理时间记录为score值,利用排序功能区分处理的先后顺序
  • 记录下一个要处理的事件,当对比系统时间发现当然仍后到期后移除redis中的记录,并记录下一个要处理的时间
  • 当新任务加入时,判定并更新当前下一个要处理的任务时间
  • 为提升sorted_set的性能,通常将任务根据特征存储成若干个sorted_set.例如1小时内,1天内,年度等,操作时逐渐提升,将即将操作的若干个任务纳入到1小时内处理队列中
  • time命令获取当前系统时间

如有问题或技术交流➕微:JavaBoy_1024

Redis--五种基础数据结构及应用场景相关推荐

  1. 【《Redis深度历险》读书笔记(1)】基础:万丈高楼平地起 ——Redis 5种基础数据结构

    [时间]2021.11.16 [题目][<Redis深度历险>读书笔记(1)]基础:万丈高楼平地起 --Redis 基础数据结构 本栏目是<Redis深度历险:核心原理和应用实践&g ...

  2. Redis的五种基础数据结构和三种高级数据结构

    基础数据结构包含:String, list, hash, set, zset(SortedSet) 高级数据结构包含:Bitmapsm, HyperLogLogs, GEO 1.可变的字节数组 - S ...

  3. 【数据库Redis】Redis五种基本数据结构以及三种配置方式——默认配置、运行配置、配置文件启动

    文章目录 一.初识Redis 1.1 了解Redis 1.2 Redis特性 1.3 Redis使用场景 Redis不适合场景 1.4 用好Redis的建议 1.5 正确安装并启动Redis 在Lin ...

  4. redis五种类型的经典使用场景

    highlight: androidstudio 说明: 对于redis命令这里不在赘述 直接戳这里 redis命令手册 或者 这个也是命令手册 都可以 另外其原生命令和 RedisTemplate中 ...

  5. 万字长文的Redis五种数据结构详解(理论+实战),建议收藏。

    本文脑图 前言 Redis是基于c语言编写的开源非关系型内存数据库,可以用作数据库.缓存.消息中间件,这么优秀的东西一定要一点一点的吃透它. 关于Redis的文章之前也写过三篇,阅读量和读者的反映都还 ...

  6. Redis五种数据结构详解

    Redis是基于c语言编写的开源非关系型内存数据库,可以用作数据库.缓存.消息中间件,这么优秀的东西一定要一点一点的吃透它. Redis的五种数据结构包括以下五种: String:字符串类型 List ...

  7. Redis五种数据结构应用场景

    文章目录 前言 二.字符串String 2.1.常用操作 2.2.应用场景 2.2.1.单值缓存(最常用) 2.2.2.对象缓存 2.2.3.分布式锁 2.2.4.计数器 三.哈希hash 3.1.常 ...

  8. Redis五种数据结构及其使用场景

    Redis五种数据结构及其使用场景 先有个概念,redis 数据库其实就是一个大的 map,它容纳了所有的 key, key 都是 string 类型,而 value 则有 string, list, ...

  9. 真正说透Redis五种数据结构

    系列文章目录 真正说透Redis五种数据结构 Redis持久化之RDB+AOF+混合持久化实战演练 Redis高可用之主从架构 文章目录 系列文章目录 前言 一.5种基本数据结构 二.字符串Strin ...

最新文章

  1. 对面向对象基本原则的总结
  2. echarts定时加载动画数据
  3. Linux下SQLPlus中文乱码处理
  4. 电脑屏保海底世界_水下栖息地:人类能否在海洋中居住?真的有人住在海底吗?...
  5. html如何设置鼠标选中状态,怎么用CSS 设置 当鼠标移动到菜单时,该按钮变色,鼠标点击后,页面停留在鼠标滑过时的状态!!很急!...
  6. 01-Windows下安装Node.js及环境配置
  7. 03.Web大前端时代之:HTML5+CSS3入门系列~H5功能元素
  8. java计算交点高程_卡西欧9860CG20图形计算程序(直线相交求交点坐标程序、距离后方交会带高程程序)...
  9. 【定制开发】【M3】基于Python+pygame实现的人机AI对战五子棋游戏(保姆级入门讲解)
  10. 如何把握银行信息科技风险管理的“度”?
  11. java基础热门侠客养成_侠客养成手册攻略大全 新手攻略开局任务流程汇总[多图]...
  12. 快速确定dll 是x86还是x64
  13. R语言 判别分析:线性判别、K最邻近、有权重的K最邻近、朴素贝叶斯
  14. 数学用计算机开方,开方(数学术语)_百度百科
  15. 常用邮箱的 IMAP/POP3/SMTP 设置
  16. Kettle本机编译
  17. 深入理解GO语言:map结构原理和源码分析
  18. 豆瓣电影数据可视化大屏
  19. DDL语言(数据定义语言)
  20. 13.1-自己开发一个“单片机烧写工具”!不是开玩笑吧?原来如此^~^(OTA升级)

热门文章

  1. Cortex M3/M4 学习摘要(二)
  2. [DB2]DB2中的数值类型
  3. Delphi在代码编辑栏按回车无法换行
  4. 成功在MP4封装的H264视频中提取能播放的裸流
  5. [Linux网络编程学习笔记]索引
  6. UVA12279 LA4853 Emoogle Balance【水题】
  7. UVA11942 Lumberjack Sequencing【Ad Hoc】
  8. Bailian2952 循环数【数学】
  9. 51NOD-1027 大数乘法【大数】
  10. 51Nod-1091 线段的重叠【排序】