「Redis」五种基础数据结构及应用场景
wptr33 2024-12-31 15:02 39 浏览
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 value
get 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共享
这里推荐王松大神的一篇文章: wangsong.blog.csdn.net/article/det…
(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的优缺点
- 优点
- 同类数据归类整合储存,方便数据管理。
- 相比string操作消耗内存与cpu更小。
- 相比string储存更节省空间。
- 缺点
- 过期功能不能使用在field上,只能用在key上。
- 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) 1
redis> 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) 4
redis> 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) 2
redis> smembers joe_diff_peter
1) "hi, lady"
2) "Fast Five"
复制代码3. set的应用场景
(1)微信抽奖小程序
- 点击参加抽奖加入set集合
sadd key {user_id}
复制代码- 查看参与抽奖所有用户
smembers key
复制代码- 抽取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) 1
redis> ZREMRANGEBYRANK salary 0 1 # 移除下标 0 至 1 区间内的成员
(integer) 2
redis> 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) 2
redis> 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) 6
redis> 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) 1
redis > 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) 1
redis > ZINTERSTORE sum_point 2 mid_test fin_test
(integer) 3
redis > 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命令获取当前系统时间
- 上一篇:一文彻底搞定Redis与MySQL的数据同步
- 下一篇:阿里官方Redis开发规范
相关推荐
- oracle数据导入导出_oracle数据导入导出工具
-
关于oracle的数据导入导出,这个功能的使用场景,一般是换服务环境,把原先的oracle数据导入到另外一台oracle数据库,或者导出备份使用。只不过oracle的导入导出命令不好记忆,稍稍有点复杂...
- 继续学习Python中的while true/break语句
-
上次讲到if语句的用法,大家在微信公众号问了小编很多问题,那么小编在这几种解决一下,1.else和elif是子模块,不能单独使用2.一个if语句中可以包括很多个elif语句,但结尾只能有一个...
- python continue和break的区别_python中break语句和continue语句的区别
-
python中循环语句经常会使用continue和break,那么这2者的区别是?continue是跳出本次循环,进行下一次循环;break是跳出整个循环;例如:...
- 简单学Python——关键字6——break和continue
-
Python退出循环,有break语句和continue语句两种实现方式。break语句和continue语句的区别:break语句作用是终止循环。continue语句作用是跳出本轮循环,继续下一次循...
- 2-1,0基础学Python之 break退出循环、 continue继续循环 多重循
-
用for循环或者while循环时,如果要在循环体内直接退出循环,可以使用break语句。比如计算1至100的整数和,我们用while来实现:sum=0x=1whileTrue...
- Python 中 break 和 continue 傻傻分不清
-
大家好啊,我是大田。...
- python中的流程控制语句:continue、break 和 return使用方法
-
Python中,continue、break和return是控制流程的关键语句,用于在循环或函数中提前退出或跳过某些操作。它们的用途和区别如下:1.continue(跳过当前循环的剩余部分,进...
- L017:continue和break - 教程文案
-
continue和break在Python中,continue和break是用于控制循环(如for和while)执行流程的关键字,它们的作用如下:1.continue:跳过当前迭代,...
- 作为前端开发者,你都经历过怎样的面试?
-
已经裸辞1个月了,最近开始投简历找工作,遇到各种各样的面试,今天分享一下。其实在职的时候也做过面试官,面试官时,感觉自己问的问题很难区分候选人的能力,最好的办法就是看看候选人的github上的代码仓库...
- 面试被问 const 是否不可变?这样回答才显功底
-
作为前端开发者,我在学习ES6特性时,总被const的"善变"搞得一头雾水——为什么用const声明的数组还能push元素?为什么基本类型赋值就会报错?直到翻遍MDN文档、对着内存图反...
- 2023金九银十必看前端面试题!2w字精品!
-
导文2023金九银十必看前端面试题!金九银十黄金期来了想要跳槽的小伙伴快来看啊CSS1.请解释CSS的盒模型是什么,并描述其组成部分。...
- 前端面试总结_前端面试题整理
-
记得当时大二的时候,看到实验室的学长学姐忙于各种春招,有些收获了大厂offer,有些还在苦苦面试,其实那时候的心里还蛮忐忑的,不知道自己大三的时候会是什么样的一个水平,所以从19年的寒假放完,大二下学...
- 由浅入深,66条JavaScript面试知识点(七)
-
作者:JakeZhang转发链接:https://juejin.im/post/5ef8377f6fb9a07e693a6061目录...
- 2024前端面试真题之—VUE篇_前端面试题vue2020及答案
-
添加图片注释,不超过140字(可选)...
- 今年最常见的前端面试题,你会做几道?
-
在面试或招聘前端开发人员时,期望、现实和需求之间总是存在着巨大差距。面试其实是一个交流想法的地方,挑战人们的思考方式,并客观地分析给定的问题。可以通过面试了解人们如何做出决策,了解一个人对技术和解决问...
- 一周热门
- 最近发表
-
- oracle数据导入导出_oracle数据导入导出工具
- 继续学习Python中的while true/break语句
- python continue和break的区别_python中break语句和continue语句的区别
- 简单学Python——关键字6——break和continue
- 2-1,0基础学Python之 break退出循环、 continue继续循环 多重循
- Python 中 break 和 continue 傻傻分不清
- python中的流程控制语句:continue、break 和 return使用方法
- L017:continue和break - 教程文案
- 作为前端开发者,你都经历过怎样的面试?
- 面试被问 const 是否不可变?这样回答才显功底
- 标签列表
-
- git pull (33)
- git fetch (35)
- mysql insert (35)
- mysql distinct (37)
- concat_ws (36)
- java continue (36)
- jenkins官网 (37)
- mysql 子查询 (37)
- python元组 (33)
- mybatis 分页 (35)
- vba split (37)
- redis watch (34)
- python list sort (37)
- nvarchar2 (34)
- mysql not null (36)
- hmset (35)
- python telnet (35)
- python readlines() 方法 (36)
- munmap (35)
- docker network create (35)
- redis 集合 (37)
- python sftp (37)
- setpriority (34)
- c语言 switch (34)
- git commit (34)
