LOADING...

加载过慢请开启缓存(浏览器默认开启)

loading

P-luminary

四级单词-简易版

2022/3/27

 

一、动词和动词表达 20个

  reflect v. 反映,表现,显示

  demonstrate v. 证明,表明

  suggest v. 建议;暗示

  develop v. 发展,进步

  adjust v. 调整,适应

  prosper v. 繁荣,成功

  suppose v. 假设,推想

  strive for… 争取,奋斗

  remind sb. of sth. 使某人想起某事

  succeed in doing sth. 成功地做某事

  be divided into… 被划分为……

  It is common that… 某事是很常见的

  date back to… 追溯到……

  remain to be seen 拭目以待,仍有待观察

  believe / hold / be sure / think / acknowledge v. 认为,相信,承认

  end up with 以……告终,结束

  do harm to… 对……有害,损害

  benefit from… 从……中收益

  take… for example 以……为例

  emphasize the importance of… 强调……的重要性

  二、副词、介词表达 10个

  Nowadays, … adv. 现今,当今,时下

  Consequently, … adv. 结果是……

  As a result, … adv. 因此.。.

  As for me, … / In my opinion, … / As far as I am concerned, … / From my point of view, … 在我看来

  Firstly, … Secondly, … Moreover / Furthermore, … Finally, …

  首先,……。其次,……。另外,……。最后,……。

  On one hand, … On the other hand, …

  一方面 ……。另一方面 ……。

  As a saying / proverb goes,”…” 正如名人名言 / 正如谚语说:”……。“

  According to, … 根据……

  In conclusion, … 总而言之……

  For instance / example, … 举例

  三、形容词 10个

  popular adj. 流行的,受欢迎的

  excessive adj. 过多的,极度的

  renowned adj. 著名的 = well-known=famous

  impressive adj. 令人印象深刻的

  harmful adj. 有害的

  beneficial adj. 有益的

  positive adj. 积极的

  negative adj. 消极的

  convenient adj. 方便的

  convenient and efficient 既方便又高效



science n.科学,学科,技术,知识
scientific adj.科学的,有系统的
conscious adj.有意识的,神志清醒的
consciousness n.知觉,觉悟,意识
conscience n.良心,道德心
programmable 可设计的,可编程的
manual adj.手工的
manufacture vt.制造,加工 n.制成品
manufacturer n.制造商,制造厂
gentle adj.温和的
command n.命令 vt.指挥
commander n.指挥官
manage vt.vi.管理
manage on sth 应付…
management n.管理人 管理技巧
romantic adj.浪漫的 n.浪漫气息的人
contact n.接触 vi.联系 vt.使接触
community n.社区,社会团体
communist n.共产主义者
communism n.共产主义 ism=主义
mutual adj.相互的,彼此的
normal adj.正常的 n.标准
normally adv.正常地
ordinary adj.普通的,平凡的
extraordinary adj.卓越的
available adj.可获得的
idle adj.懒惰的 vi.虚度
faulty adj.错误的
commit vt.犯罪,承诺 commit sb to/to doing sth 向…承诺
inaccurate adj.不准确 //不能去治疗的
accuracy n.准确性
right adv.右面 adj.争取的 n.权力
entitle vt.使有资格 //头衔
logical adj.符合逻辑的
psychology n.心理学
investigate v.调查 //vest 背心 invest 投资 igate门
persevere v.坚持
setback n.挫折
dialog n.会话,对话
catalog n.目录
apologize vi.道歉
apology n.认错
regret vt.后悔
divide vi.vt.分离 n.分配
division n.部门,分开
individual adj.个人的
split vt.分裂 adj裂开的 n.划分(观点不同)
descend v.下来,下降,降临
inferior adj.低劣的 n.部下,次品
fellow n.同伴 adj.同类的
lifetime n.有生之年
innovate v.创新
lively adj.活泼的
liver n.肝脏 adj.深褐色的
deliver vt.交付,递送
delivery n.分娩,传送,投递
livelihood n.生计,生活
liveliness n.活泼
public adj.公开的 n.大众
republic n.共和国
publication n.出版,发表
release vt.释放 n.解除
print n.印刷字体 vt&vi 印刷
blueprint n.蓝图 vt.为…制蓝图
fingerprint n.指纹 vt.采指纹
issue n.问题,期,号 vt&vi. 发行,发布
air n.空气,气氛 vt.vi.发表
final adj.最后的 n.决赛,结局
ultimately adv.根本,最后
eventually adv.终究,最后
event 结果,大事件
incident 事变
event 历史上重大事件
last n.最后,末尾 vi.持续 lasting
fine adj.好的,上等的 n.罚款
define vt.规定,使明确 vi.下定义
definition n.定义,规定,明确
refine vt.提炼,改善
confine vt.限制,局限于 n.界限,范围
definite adj.明确的,肯定
definitely adj.明确地
finite adj.有限的 n.有限性 //fin结束 ite圈
infinite adj.无限的 n.无穷
terminal adj.末端的,期末的 n.终端,终点站
term n.术语,期限,学期,条款 vt.把…称为
terminate vt&vi.结束 adj.结束的
terminator n.终结者
In the event of 如果,万一
detect vt.查明,发现,洞察,侦查
detection n.侦查
detective n.侦探
indispensable adj.不可缺少的 //in不能 dis分开 pen笔
needle n.针
quire-seek 获得
require vt.需求,要求 vi.要求,规定
inquire vt&vi. 打听,询问 //in里面 quire=seek寻找
inquiry n.探究,调查,询问,质问,审查
acquire vt.学到,获得,取得 //ac去 quire寻找
requirement n.要求,必需品
request n.要求,需要 vt.请求得到,索取
call for 要求
letter n.信,字母,证书,许可证
literature n.文学,文献,著作
literary adj.文学的,精通文学的
illiterate adj.文盲的 n.无知
poetry n.诗,诗歌,诗意
poet n.诗人,空想家
overall adj.全部的 n.工装裤,罩衫
overseas adv.在海外
moreover adv.而且,此外,同时
overtake vt.压倒,追上,赶上
overcome vt&vi.战胜,克服,压倒
triumph n.胜利 vi.战胜,克服,打败
Unbeatable 不能被打败
patient adj.病人
patience n.耐心
perspiration adj.努力奋斗 n.汗,汗珠,排汗,出汗
conquest n.征服,击败,战利品
conquer vt.征服,克服 vi.得胜
overlook vt.忽视 n.忽略
neglect v.主观忽视
ignore v.客观忽视
overestimate vt.对(数量)估价过高
overrate vt.对(质量)估价过高
overstate vt.夸张,夸大(某事)//state国家
exaggerate vt&vi. 夸张(使)扩大
boast vt.自夸 n.自负
reluctant adj.不情愿的,勉强的 //驴拉他都不情愿
dread vt.害怕,担心 n.恐惧 adj.可怕的 vi.十分害怕 //r=人 d人ead
fearless adj.无畏的,大胆的
brave adj.勇敢的
terrible adj.可怕的 n.可怕的人
frighten vt.使惊恐 vi.害怕
terror n.恐怖
horror n.恐怖
distress n.悲痛,不幸,贫困 vt.使痛苦
misery n.痛苦,不幸,穷困,悲惨的境遇 //miss er-人 恋人
miserable adj.悲惨的,使人痛苦的
tragedy n.悲剧,惨剧
sorrow n.悲痛,悔恨
bitter adj.苦的,尖锐的 adv.激烈地 vt.使变苦
sadness n.悲哀,忧伤,悲哀
base n.基础,基地 vt.把…建立在 adj.低级的 base A on B 、 A be based on B
basis n.基础,根据
basic adj.基本的 n.基础
bottom n.底部 adj.底部的 v.装底
basically adv.基本上
basement n.地下室,底部
based adj.有根基的,有基地的 v.以…为基础
baseball n.棒球
rugby n.橄榄球
found vt.创立,创办,建立
foundation n.基础,基金
finding n.发现物,调查…的结果
explore vi.侦查,勘探 vt.探索,探究
make vt.做,使成为 vi.开始,尝试 n.制造,性格,形状 make sb/sth
produce vi&vt 产生,生产(bring about),制造 n.产品,结果
yield vt.生产 (bring about/lead to) vi.屈服 n.产量,产额
just adj.公正的 adv.仅仅
justice n.公正,正义
adjust vt&vi 适应,调整
coordinate vt.使协调,整合
justify vt.为…辩护 证明…有理
Appeal to sb for sth 呼吁某人做某事
famine n.饥民
fair adj.公平的,合理的,晴朗的 adv.清楚地 n.庙会,美人,市集 vt.衔接协调 vi.转晴
fairness n.公正,公平,(皮肤)洁白
fairly adv.相当地,公平地
affair n.事务 风流韵事,私事 (aff-加强程度)
consistency n.一惯性(con=all st=stand 全部站着(一直))
live up to 遵守,做到
judge vt&vi.评判,审判 vt.评价 n.法官,裁判员
judgement n.判断,评价,审判,看法
prejudice n.侵害,偏见,歧视 vt.损害,有偏见 having or showing prejudice 有偏见的
bias n.偏见,倾向 adj.斜的 (bicycle bi=双“车轮” as=作为 作为两种结果:我要么喜欢你 要么不喜欢你)
discrimination n.歧视,区别,判别力(dis=not否定 crim=crime犯罪 in里面 犯罪了不让他在里面=歧视)
crime n.犯罪,罪行 v.指控犯罪
criminal n.犯人,罪犯 adj.犯罪的,刑事的
guilty adj.有罪的,内疚的+of (gui=鬼)
jobless n.失业的
cause n.原因,事业,动机 vt.引起,导致
vocation n.职业,天命
carceer n.职业 adj.作为毕业职业的(car车)
calling n.职业,呼喊,邀请 v.通电话,认为
call v.打电话给,呼唤,喊叫 n.理由,要求 Call of duty 使命召唤
recall vt.叫回,召回 n.罢免
up-to-date adj.现代的
modern adj.现代的,近代的 n.现代人
modernization n.现代化
contemporary adj.当代的 n.同龄人
remporary adj.短暂的,临时的 n.临时工
tempo n.拍子
temper n.脾气 v.调和
date n.约会,日期 vt.过时 vt&vi.与人约会
late adj.迟到的 adv.最近地
function n.作用,功能
punctual adj.准时的
punch n.拳头 v.用拳猛击
prompt adj.迅速的 v.促使,提示,导致 n.激励 adv.准时地
renew vt.使更新,补充 vi.重申
novel n.小说 adj.新奇的 (nov-new ate-动词v)
innovate vi.改革,创新 vi.引入新事物
innovation n.改革,创新,新发明
renovate vt.翻新,修复,更新
prosperous adj.繁荣的,成功的(pro-前 sper-breath呼吸 ous形缀)
creative adj.有创造力的
creature n.人,生物,动物,工具
generation n.产生,一代人,时代
generator n.生产者,发电机
gene n.基因
genius n.天才,天赋
gene niu(基因 牛!!)
generate vt.形成,造成
general adj.普通的,大致的 n.一般,常规
generally adv.一般地,普遍地,广泛地
split on (在…上观点不同)
personal adj.个人的 n.人事栏
private 私人的
personnel n.全体员工,人事部
personality n.人格,个性,人物
character n.性格,角色,特点 vt.使具有特征
characteristic adj.特有的,独特的 n.特征
staff n.全体职员 adj.职员的
clerk n.书记员,职员 vi.当职员
panel n.仪表板,座谈小组 (盘 围着坐)
companion n.同伴 vt.陪伴,同行
company 陪伴,公司
colleague n.同事,同僚
league n.联盟,社团
federal adj.联邦的
relate vt.使…有联系
relation n.联系,关系
relationship n.关系,浪漫关系
relativity n.相对性
relative adj.相关的 n.亲属,相关物
relevant adj.有关的,确切的
graduate n.毕业生
undergraduate n.大学生
paper n.纸,论文,文章 vt&vi.贴钱
theory n.理论,原理,学说(the story去掉s)
theoretical adj.理论的,假设的
paragraph n.段落 vt.将…分段
essay n.散文,随笔,尝试
culture vt.培植,培养
cultivate vt.耕作,教养,栽培
nurture vt.培育,养育(Nurse护士+culture)
foster v.培养,鼓励 adj.寄养的
supercalifragilisticexpialidocious adj. 精彩的,非常棒的
movement n.运动,活动,乐章
touching adj.感人的,动人的
care facility 疗养院
remove vt.去除,脱逃 vi.移居,迁移
removal n.除去,免职,迁移(al-n/adj se/ve结尾的-sal,val surrive->surrival)
auto-self
automobile n.汽车 v.开汽车
vehicle n.车辆,媒介物,传播媒介
use A to do B(使用…去干…)
be used as(for sth/to do sth)(被用作…去干…)
automatic adj.自动的,无意识的
mobile adj.可移动的 n.手机,风铃
emotion n.情绪,情感,感动
emotional adj.情绪的
(support)promote vt.促进,推进,提升,促销
proposition n.命题
destiny n.命运
motivate vt.刺激(move av=看完av就动起来了)
remote adj.(时间上)遥远的 n.遥控器 vt.使…向远方延伸
motive n.动机,vt.促使
movable adj.可移动的 n.动产
loose adj.松的
loosen vt.放松,解开 vi.变松
unfasten v.松开,解开
swift adj.敏捷的,迅速的
rapid adj.快速的
popularity n.流行,名气,通俗性
boom v.提升
current adj.现在的,流行的 n.电流,趋势
currency n.货币,流通
section n.部分,部门
fract n.部分 vt.打破
second n.秒 adj.第二的 vt.支持 adv.第二的
secondary adj.第二的
insect n.虫,卑鄙的人
sexual adj.性的
proposed v.提倡(pro-前 pose-姿势 往前摆姿势)
knowledge n.了解,知识,理解
fame n.名声,名望 fame and fortune 名利
reputation n.名气,名声
prominent adj.著名的,突出的 (min-ming(名声) pro-在前 名声在前-出名)
eminent adj.显赫的(min-ming(名声) e-out在外 名声在外-出名)
monotonous adj.单调的,枯燥无味的(mo no ton ous ton-tone-语调 mon-one)
dull adj.迟钝的,呆滞的 v.缓和,减轻(堵…)
tedious adj.冗长乏味的 (“踢地面”)
bore v.令人厌烦
interest n.利息,爱好,兴趣,利益
benefit n.好处,利益,津贴 vt.有益于 on one’s behalf 为了…的利益
beneficial adj.有利的
welfare n.福利,繁荣,幸福 (well,fare n.费用)
profit n.利润 vt.有益的
profitable adj.有利可图,有益的
reserve n.储存 vt.储备 vi.预定
observe vt.vi 观察,研究
observation n.观察,评论
observer n.观察员,遵守者
perserve vt.vi 保护,保持 n.蜜饯
deserve vt.vi 值得,应得,应受
conserve vt.保护,保存,保藏(Con-全部 serve-keep)
conservative adj.保守的
conservation n.保护,保存
reservoir n.蓄水池,贮液器,(re-again serv-keep bir-n.)
used adj.二手的
useless adj.无用的
vain adj.徒劳的,无结果的,无用的
usage n.用法,使用,惯例
abuse n.滥用 vt.滥用
utilize vt.利用,使用
utility n.公用事业,效用,效果
exploit vt.开拓,剥削,开采 n.功绩(ex-out) 海关
customer n.顾客,主顾
custom n.习惯,海关
accustomed adj.习惯的,通常的,适应的
convention n.会议,惯例(com-all vent-go/come)
conventional adj.传统的
habit n.习惯,气质 给…穿衣服
habitual adj.习惯的
inhabitant n.居民,住户
distraction n.分心,扰乱
digestion n.消化
factor n.因素
determined n.决定,因素
contribute to=bring about=lead to导致
place n.地方,职位,座位 v.放置
displace vt.移动,移走,取代 (dis=not place-放)
displaced person=refugee n.难民
replace vt.代替
form n.形状 v.形成
inform v.通知,告发
former n.模型,样板 adj.以前的
form n.表格,方式,形状 v.形成
transform v.改变,变换
transformation n.变化
transformer n.变压器 促使变化的人/物
formula n.公式,准则=rude
prospects n.前景 (pro-forward spect-see 往前看)
wages n.工资
uniform n.制服 adj.形状一样的
formation n.形成,构成
perform vt&vi 执行,履行,表演
performance n.表现,表演,绩效
formal adj.正规的,方式上的
reform n.改革 改良
platform n.平台,站台
conform v.符合,遵照 adj.一致的 conform to—服从
campus n.校园,校区
civilize v.教化,使文明 civil-cultivate(文明)
civilization n.文明
tuition n.学费,讲授(交完了学费,整个人很颓废tui)
scholar n.学者
scholarship n.奖学金
tutor n.导师,家庭教师
economy n.经济,节约
economic adj.经济的 经济学的
economical adj.经济的 节约的
economically adv.经济地
economics n.经济学,经济
commerc n.商务,商业
commercial adj.商业的,贸易的
goodness n.仁慈,善良
trade n.贸易
firm n.公司 adj.坚定的
market n.交易,市集
marketing n.销售,经销,市场营销
mercy n.怜悯
mercifull adj.仁慈的,宽恕的
merchant n.商人,零售 (ant-人)
monetary adj.货币的 金钱的(mone-money)
fiscal adj.财政上的,会计的 n.财政年度
financial adj.金融的
finance n.金融,资金
Fiance n.未婚夫
given prep.考虑到
meltdown n.崩溃
finance v.投资
loan n.贷款 v.借
tip n.小费 v.倾斜
private adj.私有的,私人的,秘密的
privilege n.特权 vt.给与…特权(priv私有的 i lege法律)
privacy 隐私
legal n.合法的 法律的
legacy n.遗产,遗赠
legitimate adj.合法的,合理的,正规的 vt.使合法
satire n.讽刺(sa傻 tire疲惫 疲倦了你的傻)
inherit vt&vi. 继承(Her-继承 her女人肚子里有个it它)
heritage n.遗产,传统(cultural heritage)
legislate vt&vi. 立法,制定法律(leg-law)
legislation n.立法,制定法律
lawsuit n.诉讼 Sue v.控告
court n.法庭,院子
prison n.鉴于,入狱
prisoner n.囚犯,犯人,俘虏
jail n.监狱,拘留所
jury n.陪审团 adj.应急的
council n.委员会
counsel 顾问=counselor(se=色)
fully adv.充分地
occupied adj.已占用的,无空闲的
occupy vt.占领,使用,住在…
occupation n.职业,占有
complete adj.完整的,完成的
completely adv.完全地,完全
tidy adj.整洁的,整齐的
utter vt.说,讲 adj.彻底的
gross adj.总的,粗俗的 n.总额
absolutely adv.绝对地,完全地
absolute adj.绝对的 n.绝对
respond vt&vi. 回答,响应
response n.反应,回答,答复
responsibility n.责任,责任感,责任心
feedback n.反馈,反应(feed喂吃 back回来)
corresponding adj.相当的,对应的,通信的
correspond vi.相应的
responsible adj.负有责任的
liable adj.有责任的,有倾向的
liability n.责任,倾向
accountable adj.负有责任的
account n.账 vt&vi.解释,导致 account for=解释
roughly adj.粗略的
consideration n.考虑,关心,报酬
considerable adj.相当大/多的
considerate adj.体贴的,深思熟虑的
thoughtful adj.体贴的,沉思的
handsome adj.英俊的,美观的,大方的
counter n.计数器,柜台 adj.相反的(count数 er)
encounter vt.遭遇,不期而遇,对抗 n.相遇,碰见 (en-使 使你在柜台相遇)
counterbalance vt.使平衡,抵消
contrary adj.相反的,反对的
contradict vt&vi.反驳,否认(contra 相反的 dict=speak说)
By contrast相比(苹果和华为)compare对比(苹果和苹果)
quantity n.数量,数目(quan-全)
metropolis n.大都市,首府 metro-地铁(上海)
metropolitan adj.大都会的
county n.县,郡
state n.洲(省)
county n.县(地区)
city n.市
town n.小镇子
village n.村子
province n.省份
urban adj.都市的(urb=hrb=哈尔滨)
rural adj.乡下的,农村的,田园的
downtown n.市中心
company n.公司,陪伴
corporation n.公司,团体
accompany v.陪伴,陪同,附加,补充
incorporate v.包含,组成公司
firm n.公司 adj.坚固的
confirm vt.使巩固(con=all)
occasion n.场合,机会,理由 vt.惹起
occasional adj.偶尔的,不经常的
casual adj.随便的,偶然的 n.临时工人
casualty n.伤亡人数,事故,受害者
probable adj.可能的
probability n.可能性,几率
feasible adj.可行的,可用的(fras->fect->do能够做的)
numerous adj.很多的,数不清的
number n.数量,数字,号码 v.标号
existence v.存在
inherently adv.固有的
plenty n.充裕,adj.大量的
generous adj.慷慨的,大方的
abundant adj.充足的,大量的
abandon v.放弃 n.放纵
blanket n.毯子 adj.总括的
empty adj.空的
bare adj.光秃秃的
rare adj.罕见的,特殊的
hardly adv.几乎不
scarcely adv.几乎不,简直不
scarce adj.稀缺的
seldom adv.难得,很少,罕见
naked adj.裸体的
vacant adj.空缺的 (vac=empty)
vacuum n.真空,空白,空虚,清洁
vacation n.假期,休假 vi.度假
spare v.节省 adj.多余的
curb n.抑制,限制
block n.街区 vt.阻止
check v.检查,制止
guideline n.指导方针
敏辉
bill n.账单
menu n.菜单,菜肴
distrust vt&n.不信任,猜疑
undoubtavle adj.不容置疑的
doubtless adv.无疑地 adj.无疑的
change v.改变,替换
roll v.滚动 n.名册
enroll v.注册,招收,登记
register n.记录 v.登记,注册
shift vt&vi.改变,换挡 n.移动
switch n.开关,转换 vt&vi.转换,改变
alter vt&vi. 改变,更改,改造
vary vt&vi 变化,使不同 !=very
variation n.变化,变动,演变
varety n.多样,多样化,种类
variable adj.可变的,变化的 n.变量
various adj.各种各样的,多方面的
countless adj.数不胜数的,无数的
exchange n.交换 v.兑换,交换
bargain n.便宜货 v.讨价还价
beg vt&vi.乞讨
modify vy&vi.修改 (ify-v. mod-mid中间)
embrace v.拥抱
ingredient n.原料
choice adj.上等的
optional adj.可选择的
option n.选项
alternative adj.替代的
depression adj.沮丧的
conclude vt&vi.推断,结束,终止
exclude vt.排斥,排除
exclusively adv.唯一地,专门地
embrace vt&vi.拥抱
preclude vt.排除,妨碍,阻止(pre-前 clude-close关 向前关上)
survey v.n.调查
emergency n.突发情况
shortage n.缺少,不足,缺点
shortly adv.立刻,马上;简单地
dearth n.缺乏,稀少 death死
famine n.饥荒,饥饿
starve v.饿
starvation n.饥饿,饿死,绝食
flood n.洪水 vt&vi.涌出,淹没(flo=flu-流)
present n.礼物 v.赠送 adj.现在的,出席的
represent vt&vi.表现,象征,代表
representative n.代表
presently adv.目前的,不久,马上
consent n.同意,准许 v.同意,允许 consent to do sth=agree with sth=approve
fantastic adj.极好的
fantasy n.晴天
fancy v.喜欢
awesome adj.令人敬畏的 (awe=敬畏)
excellent adj.优秀的,卓越的,杰出的
brilliant adj.才华横溢,明亮的
master n.大师 vt.精通,熟练
doctor n.博士,医生
bachelor n.学士,单身汉(学士毕业后就 白扯了 ba che lor)
degree n.程度,学位
associate n.联合
programs n.程序,课程 v.make a plan
downward adj.向下的
upward adj.向上的
inward adj.向内的
outward adj.向外的
internal adj.内部的 n.内脏
interior n.内部 n.内部的
inner adj.内部的,内心的
external adj.外面的 n.外部
exterior adj.外面的 n.外部
proper adj.合适的
altitude n.高度
highway n.公路,途径,方法=manner means method
hierarchy n.分层,层次,等级制度
Archetype n.原型
Architecture n.建筑学
Architectural adj.建筑学的
huge adj.巨大的
gigantic adj.巨大的,庞大的
giant n.巨人
maximum n.最大的量
minimum n.最小量
wealth n.财产,财富,丰富
wealthy adj.富有的 n.富人
fit vt&vi.合适 adj.合适的 n.匹配
fitness n.健康,适当 (ness-抽名)
sound adj.健全的
reinforce v.加固,强化
military n.军队的
enforce vt.执行,加强
force n.武力,vt.强迫
oblige v.强制,强迫
asset n.资产,财产
virtue n.美德,德行
virtually adv.实际上
merit n.价值,优点
demerit n.缺点,短处
assess v.评估
take charge 负责
percent n.百分比
percentage n.利润,百分比
decade n.十年
dozen n.十二个
October n.十月
fortnight n.十四天,两星期
gap n.缺口 vt.有缺口
crack v.破裂,打开 n.裂缝 adj.训练有素
ditch n.沟渠 v.抛弃,摆脱
interval n.间隔
payment n.付款,支付,偿还
render v.给予,递交
surrender v.n.投降
provide vt&vi.提供
provision n.规定,供应
differ vi.不同,不同意
indifferent adj.漠不关心的
offering n.提议,课程,贡品
infer v.推断,猜想,推理
inference n.推理,推断
confer v.授予,比较(con=all=together)
authority n.权力,权威
conference n.会议,讨论(正式的)
reference n.参考,参考书
preference n.偏爱,优先权
preferable adj.更好的,更胜一筹
prefer A to B 相比b更喜欢a
perfer to do a rather than do b 要做a而不做b
permission v.许可使推迟
defer v.使推迟
transfer n.转移
convert v.转变 vert=turn转~~
interfere vi.干涉,干预
interference n.干涉,冲突
fertilizer n.肥料
fertile adj.肥沃的
circumference n.胸围,周围 (circum-圈)
bankrupt adj.破产的,倒闭的 (rupt=break)
interrupt vt&vi.打断,截断
rupture n.断裂
eruption n.喷发,爆发
corruption n.腐败,贪污(cor=all全 rupt=break 全都破了=腐败)
decay vt&vi.腐烂
academic adj.学院的
academy n.学院
leading adj.主要的
prime adj.最好的,最初的 n.精华
primary adj.主要的
primarily adv.首先,主要地
primitive adj.原始的,发展水平低的
elementary adj.初等,基本的
element n.元素,要素
preliminary adj.初步的,初级的(per=前 limir=limit限制)
chief adj.主要的 n.首领
principal adj.主要的 n.负责人
principle n.原理,原则,根源
mainland adj.大陆的 n.大陆
remain n.剩余的 vi.保持
remaining adj.剩下的
remains n.遗迹
maintain vt.保持,保养
maintenance n.维护,维修
obtain v.获得,得到
breed v.产生,导致 n.种类,类型
seed n.种子,子孙 v.播种
sow vt&vi.播种子 n.母猪
humane adj.仁爱的,慈善的
humanity n.人性,人道
humble adj.谦逊的,简陋的
humor n.幽默
transparent adj.透明的,清澈的
apparent adj.容易看见的,显然的
pardon v.原谅 (par对)
pair n.一副
despair n.绝望(de下)
isolate v.使隔离
stiff adj.僵硬的,严厉的(i人 ff栏杆 ==站岗)
still adj.寂静的
simplify vt.简化
simplicity n.简单,朴素,天真
leisure n.闲暇,空闲时间
hardware n.计算机硬件,五金器具
harden v.使硬化
membership n.会员资格,会员身份
memorial n.纪念碑 adj.纪念的
monument n.纪念碑,遗迹,遗址
momentous adj.重要的
hatred n.仇恨,憎恨
spite n.怨恨,恶意,恶事
envy n.羡慕,妒忌 vt.感到妒忌
jealous adj.妒忌的,吃醋的
envious adj.羡慕的,妒忌的
likewise adv.同样地
likelihood n.可能性
childhood n.童年
manhood n.男人味
womanhood n.女人味
Duct-lead
conduct vt&vi.传导,带领,引导 n.行为,举止
conductor n.售票员,导体,指挥
semiconductor n.半导体
negotiation n.谈判
recommend v.推荐,建议
discussion n.讨论
conversation n.交谈
tend to do 倾向于…
tendency n.趋势
intend to do 打算做…
monopolize v.插嘴(一个人要它mon=one)
conversion n.变换,转变
diverse adj.不同的,多种多样的(分开转~~)
random adj.随机的
conversely adv.反过来
reverse vt&vi.翻转 adj.颠倒的
universal adj.普遍的,一般的
universe n.宇宙
version n.版本,译文
adverse adj.不利的,有害的(ad-to verse=turn)
adversity n.逆境,不幸,灾难
inverse adj.相反的,逆向的
belief n.信任
convince vt.说服,使相信
convince sb of = make sb sure 使…确信
unconvince adj.可疑的
trustworthy adj.值得信赖的
reliability n.可靠
credible adj.可信的,可靠的 (cre-credit信誉)
credit n.学分,信用
concrete adj.具体的,有形的 n.混凝土
collective adj.集体的,共同的
collectivism n.集体主义
intellectual adj.智力的 n.知识分子
intelligent adj.聪明的,有智力的
intelligence n.智力
wit n.机智,智慧
witness n.目击者
smart adj.聪明的,敏捷的
clever adj.灵巧的,聪明的
bright adj.明亮的,聪明的
elector n.选举人
neglect v.忽视,忽略
neglectful adj.疏忽的
ignorant adj.无知的
lecture n.演讲,训斥
dialect n.方言,语调
pick up 接送
mean v.意味着 adj.吝啬的 n.平均数
nasty adj.肮脏的,下流的
disgust n.方案,嫌恶
pollution n.污染
contaminate v.弄脏,污染
soil n.泥土,土地,国土 v.弄脏,侮辱
cruelty n.残酷,残忍
cruel adj.残酷的
meantime=meanwhile 同时
direct adj.直接的
director n.导演,主任,董事
directly adv.直接地
guide v.指导,影响 n.导游
guidance n.导航,指导,引导
indirect adj.间接的
horizon n.地平线,范围,界限
horizontal adj.水平的,地平线
erect v.使直立 (e=out rect=straight)
rectify v.改正,矫正
rectification n.改正,矫正
manner n.方式,方法
remind sb of sth/doing sth提醒某人某事
remind sb to do sth
In response 作为回应
mood n.心情,语气
ideal adj.理想的 n.典范,理想
idol n.偶像
fetish n.迷信,崇拜物,偶像(f pet ish 宠物猫 爱吃鱼)
idealist n.理想主义
idealism n.唯心主义
spiritualism n.唯心论
material n.材料,素材 adj.物质的
materialism n.唯物主义
stuff n.材料,原料 v.塞满
part n.部分,零件 v.分开
particle n.微利,颗粒
partial adj.部分的,偏袒的
department n.部门,系
departure n.离开
bureau n.局,办事处
farewell n.告别
party n.当事人
partner n.伙伴
participate v.参加某事
partly adv.部分地
partner n.伙伴
port n.港口
passport n.护照,通行证
portion n.一部分
import n.输入
important adj.重要的
importance n.重要的
core n.中心,核心
nuclear adj.原子核的
report n.报告
reporter n.记者
export vt&vi.输出,出口
transport v.运送,运输
traffic n.交通 v.交易
portable adj.轻便的
proportion n.比例
undergo vt.经历,遭受
undertake vt.承诺,承担
tolerate vt.人手
tolerance n.宽容,限度
bear v.承担 n.熊
patience n.忍耐,耐心
patient adj.有耐性的 n.病人
endure v.忍耐,持续,持久
duration n.持续,期间
durable adj.持久的,耐用的(able=adj)
dome n.圆屋顶
domesti adj.国内的 n.佣人
domain n.范围,领土(do=家 main=全部)
dominate v.支配,影响,占有优势 (do=家 in里面 ate=v.动词)
kingdom n.王国,界
emperor n.皇帝,君主
salary n.薪水,薪金
earn one’s life 谋生
sum-to take(拿)
consume v.消耗,耗尽(con=全 sum=拿 全都去拿)
consumption n.消费
resume v.继续 n.简历(再次拿出来)
assume v.承担,假定,呈现 (ass=to 去把ta拿出来)
assumption n.承担,假定,假设
to sum up 去总结
summary n.概要
summarize v.总结,概述
priceless adj.无价的
fee n.费,小费
toll n.伤亡人数
price n.代价,价格
charge v.控诉,使充电 n.指控
bring a charge against sb 正式控告某人罪行
have/take charge of sth 对某事物负责
charge sb with sth = accuse sb of 指控
charge sth for sth 要价
charge sth up to sb 把…记在我账上
govern-rule 规则
govern v.治理
governor n.主管人员
administration n.管理,实行
administrative adj.管理的,行政的
congress n.国会
discharge v.放出
parliament n.议会,国会
ruler n.统治者,尺
ruling n.裁定
code n.法典,行为准则
oversee v.监督,俯瞰
gram-to write
program n.节目,程序
grammar n.语法,语法书
grammatical adj.语法上的
diagram n.图表
telegram n.电报
telephone n.电话
telescope n.望远镜
microphone n.话筒,扩音器,麦克风
compute v.计算,估算
figure n.人物,数字,身材 v.估计
figure it out 解决
calculate vt&vi.计算,估计
calculator n.计算器
depandent adj.依赖的
independence n.独立,自主
rely v.依靠
lean vt&vi. 倾斜 adj.瘦的(slim)
reliable adj.可靠的,可信赖的
reliability n.可靠性
spit-呼吸
breathe v.呼吸,活着,生存
conspiracy n.阴谋(com=all spir=breath acy=n. 一起呼吸,共谋)
plot v.密谋 n.地基
inspire v.激励,鼓舞
inspiration n.灵感,吸气
desperate adj.绝望的 (de下 sper=spir呼吸 向下呼吸adj)
make the most of 尽量利用
stimulus n.刺激物
stimulate v.刺激,激励,鼓舞
spur v.鞭策,鼓励
sting v.刺痛,刺激
instinct n.本能,天性,冲动
cover v.遮盖,涉及 n.封面,掩护
recover v.恢复,找回
recovery n.恢复,复原
discover v.发现,碰见
discovery n.发现,发觉
uncover v.揭露
unveil v.揭露
disclose v.揭露,公开(不 关闭)
reveal n.解释 vt.揭露
conceal v.隐藏,遮住(ceal=veil)
bury v.埋葬
liber-labor-free
liberate v.解放,释放
liberal n.自由主义者 adj.慷慨的
liberty n.自由
deliberate adj.故意的,深思熟虑的(de加强 liber-free自由 我故意的加强程度给你自由)
fact n.事实,真想
factor n.因素,代理人
factory n.工厂,制造厂
facility n.设备,容易
Infect vt.使受影响,感染,侵染
perfect nonsense,rubbish 纯粹胡说八道,一派胡言
affect vt.影响 n.情感
affection n.喜爱,情感
effect n. 效果,印象
effective adj.有效的
efficient adj.有效率的
efficiency n.功效,效率
fiction n.小说
artificial adj.人造的,人工的
certificate n.证明书,文凭
certify v.证实
certain adj.确实的,确信的
superficial adj.肤浅的
magnificant adj.壮丽的
officer n.军官,警官
official adj.正式的
authority n.权威,权力
sufficient adj.充足的,足够的
visibility adv.可视度,可见度
opulent adj.丰富的
operate vt&vi.操作,运营,运转
operation n.手术,操作,经营
operator n.操作员
operational adj.操作的
opera n.歌剧
cooperate v.合作,配合
collaboration n.合作,勾结,协作(co=together labor=劳作)
candle n.蜡烛,珠光
candidate n.候选人
candid adj.坦白的,公正的
kindle vt&vi.点燃
lamp n.灯,照射灯
lighten v.减轻,点亮
enlighten v.启发,开导,启蒙
delight n.快乐,高兴
lighting n.照明,点火
solar adj.太阳的
lunar adj.月球的(露娜)
calender n.日历
elaborate v.详细制定 adj.精心制作的(ate->v/adj)
careless adj.粗心的,漫不经心的
pressure n.压力(ure-抽象名词 nature自然)
stress n.压力,强调,重力
emphasize v.强调,着重
express v.表达,表示
expression n.表现,表情
depress v.使沮丧
depression n.沮丧,不景气
period n.时期,句号,学时
session n.开会,会议,集会
reasonable adj.合理的
sake n.缘故,理由
rational adj.理性的,合理的
sensible adj.明智的
sensitive adj.敏感的
sensitivity n.敏感
nonsense n.胡闹,废话
realize v.实现,了解
reality n.事实
actuality n.现实
genuine adj.真正的,坦率的
sincere adj.真诚的
ruth n.怜悯,悲哀
fake v.伪造 adj.假的
compassion n.同情
imita v.模仿,效仿
imitate v.模仿
imitation n.模仿
realm n.王国,领域
realty n.不动产
property n.特性
proper adj.适当的,相当的
improper adj.不合适的
suitable adj.合适的
suit n.诉讼 v.合适
quality n.质量,品质 adj.高品质的
qualify vt&vi. 使具有资格
qualification n.资格
equal adj.相等的
equation n.等式,相等
equality n.平等,相等,等式
equivalent adj.等效的,相等的
minute n.分钟,瞬间
minus adj.减少 prep.没有
multiply vt&vi.乘
multiple adj.多重的
rarely adv.很少的,稀少的
order n.秩序,命令,规则
disorder n.混乱,凌乱
orderly adj.整齐的,有秩序的
honest adj.诚实的,坦诚的
earnest adj.热心的,诚挚的,真挚的
loyal adj.忠贞的,忠诚的
loyalty n.忠诚
royal adj.王国的
commitment v.承诺
devotion v.奉献
confidence n.信心,信任
list n.清单,目录,斜边
ample adj.足够的,充足的
sample n.样品,榜样
exemplify vt.举例证明
instance n.情况,例子
particular adj.特别的,详细的
specify v.指定,详述
schedule n.时刻表 (s 死 che 车 dule 堵了)
timetable n.计划
trick n.恶作剧 v.哄骗
tricky adj.狡猾的
magic n.魔法
magical adj.魔术的
spell n.咒语
trap v.诱骗
strategy n.策略,战略
design vt&vi.设计,绘制
layout n.布局,安排 (躺 在外面)
sign n.迹象,符号,手势 vt&vi.签名
symbol n.符号,象征,标志
symbolize v.象征
symbolic adj.象征意义
label n.标签,符号
ruler n.统治者
brand n.牌子,商标
signal n.信号,暗号 v.发信
significance n.重要性
signature n.签名,署名
resign v.辞职,放弃,屈从
assign v.分派,选派,分配
assignment n.分配,任务
loc-place
local adj.局部的
location n.定位,位置
locate v.定位,定居
site n.遗址
sightseeing n.观光
allocate v.分配,分派
allocation n.分配,配置,安置
distribute v.分配,散发
distribution n.分布,分配
attribute v.认为…是 Attribute a to b 把a归因于b
contribute vt&vi.捐赠
devote vt.奉献 devote oneself to doing 致力于
sacrifice n.牺牲,献祭
vote v.投票
veto v.否决
ballot n.投票,投票权 (bal=球 lot=多)
ballet n.芭蕾舞
surroundings n.环境
situation n.情况,局面,形式
environment n.环境,外界
environmentalist n.环保人士
setting n.环境,镶嵌,装置
ground n.地面,基础
condition n.状态,环境 on condition that…条件是…
phenomenon n.现象,事件
phenomena n.现象
never永不
ever adv.永远,曾经
never adv.从不,一点也不
nevertheless adv.不过,然而
forever adv.永远
everlasting adj.永久的,永恒的(ever曾经 lasting持续)
permanent adj.永久性的,永恒的
perpetual adj.永久的,不断的,无期限的(per=always pet=宠物 ual=adj 你家宠物一直挠你)
eternal adj.永生的,永恒的,不朽的 (e=out ter=term=end期限 期限之外)
constant n.常量 adj.不断的,持续的,永恒的
promise v.许诺,承诺
evil adj.邪恶的
devil n.魔鬼
select the essence ward of the evil spirit 取其精华去其糟粕
ghost n.幽灵
dragon n.龙,龙船
zombie n.僵尸
vision n.视力,视觉
visible adj.看得见的,明显的
invisible adj.看不见的
revise v.修订,修正=change
visual adj.看得见的,光学的,视力的
visualize v.形象化,想象
devise v.设计,相处,发明,策划=invent=发明
advise v.通知,建议,报告
supervise vt&vi.监督,屏幕 v.监控
previous adj.先前的,以前的
prior adj.优先的,在…之前
preceding adj.在先的
precede v.领先,优先
anticipate v.遇见,预料,预感(anti-反对 cip-take)
await v.等待,等候
unexpected adj.意外的
expectation n.预期,期待
suspect v.猜疑,怀疑
suspicion n.怀疑,疑心
suspicious adj.可疑的
despise v.鄙视,看不起
perspective n.透镜,望远镜
aspect n.方面,方位,方向
prospect n.前景,期望
prosperous adj.繁荣的,富裕的(pro 向前 sper 呼吸 ous=adj.)
prosperity n.繁荣,成功
flourish v.繁荣,活跃
thrive v.茁壮成长,兴盛
harmony n.和谐,协调,一致 In harmony with 与…和谐
harmoniou adj.协调的,和谐的
inspect v.视察,检查,检验
respective adj.各自的
respectively adv.各自地
respect v.尊重
regard vt&vi. 认为,尊敬
regardless adj.adv. 不顾后果
worship v.崇拜,朝拜(wor哇 ship船)
dishonor n.侮辱,丢脸
honorable adj.可敬的
esteem vt.尊敬(e=out sr=stand ee=see 在外面站着的眼镜)
evidence n.证据,明显
evident adj.明显的
construction n.建造物
structural adj.结构上的,建筑的
destruction n.摧毁,破坏
instruc vt.通知,命令,指导
instruction n.教课
train n.火车 v.训练,培养
practive n.练习,实践 v.练习
energy n.活力,精力
energetic adj.精力充沛的
vigorous adj.有力的
vigor n.精力
dynamic adj.活力的
obstacle n.障碍物
steady adj.稳定的,镇定的
stage n.阶段,舞台
phase n.阶段,相
withstand v.经受,承受
substance n.物质,材料
substantial adj.大量的,牢固的
stable adj.稳定的(st=站 able-能 能站得住脚的)
stability n.稳定性,稳固
distant=remote adj.遥远的,冷漠的
distant n.远处,距离
insist vt&vi.坚持,坚决要求
persist v.坚持,存留(per=一直 sist=stand)
consist v.由…组成(con=all sist=stand)
consistent adj.一致的,连续的
assist/assistance n.帮助
assistant n.助手
resort v.求助于STH n.手段=(method means way manner)
resist v.抵抗,抗拒 (re=回 sist=stand站)
ancient adj.古代的,过时的
veteran n.经验丰富的人
aging n.老化,成熟化
ageing n.成熟,老化
ancestor n.祖先
infant=young adj.小屁孩
youth n.年轻,青年
innocent adj.清白的,无辜的(in里 no=not cent美分 里面一分钱都没有)
naive adj.天真的 (nai奶 未断奶)
childish adj.孩子气的,幼稚的
infant n.婴儿
item n.项目,条款
article n.物品,文章,论文
statement n.声明,陈述 state n.洲,状态 v.说
piece n.片,块,部分
element n.要素,原理
essential adj.必须的
fancy v.想象
restore v.归还,使恢复
restoration n.恢复,复位
cash n.现金
withdraw v.撤退,拿走
offset vt.抵消,补偿
cancel v.取消
mistress n.小三
delete vt&vi. 删除
grade n.等级,年级,职别
upgrade v.提升,升级
degrade v.降级,贬低
class n.等级,班 v,把…归入某等级
classify vt.分类,归类
hazard v.冒险 n.危险 (读音:【孩子】喜欢冒险)
hazardous adj.有危险的
threat n.威胁,凶兆
threaten vt&vi. 危及,恐吓
poison n.毒药(毒死破儿子)
source n.来源
terrorists n.恐怖主义者
refugees n.难民
disease n.疾病,不安,弊端
bacteria n.细菌
illness n.疾病
damage vt&vi. 损害,毁坏
injure v.损害
spoil v.变质,掠夺,腐败
point->点
outlook n.前景,观点
appoint v.任命,委派,指定
appointment n.约会,任命,职位
disappoint v.使失望
mark n.记号,成绩
remark n.话语,观察 vt&vi.评论
remarkable adj.显著的,卓越的
comment n.评论,意见,注释 (on sth)
noticeable adj.显而易见的,明显的
centre n.中心,中枢 adj.中央的
entrance n.进入,入口
entry n.进入,入场,门口
project v.计划 n.工程,项目
reject v.拒绝,抛弃,扔掉
injection n.注射,注射剂
objective adj.客观的,目标的
objection n.反对的,异议
rival n.对手,竞争者
opponent n.对手,敌手 adj.对立的
oppose v.反对
hostile adj.敌人的,有敌意的(host=主人 ile=adj形容词)
matter n.物质,事件 vi.要紧
flow-flu 流
flow v.流 n.流动
fluid n.液体
tide n.潮汐,趋势 tide sb over sth 帮助某人度过难关
liquid adj.液体的
liquor n.酒
solid n.固体
influence v.影响
impact n.影响,碰撞
influential adj.有影响的
fluent adj.流利的,流畅的
drift v.漂泊,流动
shift v.转移
level n.水平,水平线
elevator n.电梯
lift n.电梯 vt&vi.举起
lever n.杠杆,工具,操作杆
alleviate v.减轻,缓和
parallel adj.平行的,类似的
unparalleled adj.史无前例的
resemble v.与…相似
assemble vt&vi.集合,收集
assembly n.装配,集会
fault n.缺点,过错
defect n.瑕疵,毛病,缺点
vice n.恶习
(前缀)vice-副
game-
race n.民族,竞争
racial adj.种族的
competition n.竞争,比赛
score n.得分
match n.比赛,火柴,对手 vt&vi.使相配
proper/suitable 合适
act-
deed n.行为,行动
exact adj.准确的,精密的
contract n.合同,契约,协议
treaty n.条约,协议,协商
interaction n.互动,相互影响,合作
action n.行动,活动,作用
reaction n.反应
active adj.积极的,活跃的
trade n.贸易 vt&vi.交易
transact v.交易,谈判
Tra,tract吸引
trail v.跟踪 n.足迹,小径
track n.小路 v.跟踪
trace n.痕迹 v.跟踪
subtract v.减去,扣除
tractor n.拖拉机
abstract adj.抽象的,理论上的(ab-反 stract-拉)
attractive adj.迷人的,有魅力的
glamor n.魅力,魔法 vt.迷惑
glamorous adj.迷人的
charm n.魅力,妩媚 vi.迷人
charming adj.迷人的
eloquent adj.有口才的,动人的(e=out loq=speak uent=adj 往外说很多话)
fascinate vt.迷住 vi.迷人
magnetic adj.有吸引力的,磁性的
alluring 诱人的
beguiling 欺骗的,令人陶醉的 (be=是 gui鬼=贞子)
magnet n.磁铁
fossil n.化石 adj.化石的
emissions v.排放 (e-out miss-send ion-n)
consumption n.花费
burden n.负担
compel v.强迫,强制(com=一起 pel=推)
compelling adj.引人入胜
urge v.催促,推进,驱策
urgent adj.催促的,急迫的
hurry vt&vi. 急促的
accelerate v.加快,促进
acceleration n.加速
haste n.v.匆忙,急忙
impel v.推动(im往里推)
expel v.驱逐,赶走
repel v.击退,抵制
rebel n.反叛者,叛逆者
retreat v.撤退,后退
remedy n.补救办法
secure adj.安全的,牢固的
security n.安全
curious adj.好奇的,奇妙的
curiosity n.好奇心
accurate adj.准确的(ac 去 照顾)
excursion n.远足,短途旅行
occur v.发生,出现,闪现
encounter v.遭遇,不期而遇,对抗
conference n.大会
occurrence n.发生,出现
profess —-v.公开表示,当教授
professor n.教授,讲师
profession n.职业,同行,信念
occupation n.职业,工作,占有
function n.功能,作用,函数 v.起作用
confess v.承认,坦白,悔过(con=all fess=speak)
statistics n.统计数字,统计
million n.百万
billion n.十亿
quote vt&vi.引述
quotation n.引用
poverty n.贫穷
rich adj.富有的,油腻的
luxury n.奢侈
luxurious adj.豪华的
extravagant adj.过度的
dust 灰 industry工厂
industry n.工业,产业,勤勉
industrial adj.工业的
industriousness n.勤奋
diligent adj.勤奋的,勤勉的
diligence n.勤奋的
resident adj.定居的 n.居民
residence n.住处,住宅
civil adj.公民的,文明的
citizen n.公民,平民
folk n.民族 adj.民间的
president n.总统,校长,董事长
besides adv.而且,此外
hillside n.山腰,山坡
sideway n.小路,小巷
incident n.事件,事变
accidental adj.意外的
event n.事件,大事
campaign n.战役,运动
crisis n.危机
Merg–浸
emergency n.紧急情况
emerge v.出现,浮现,暴露
submerge vt&vi.淹没,沉没
emerging adj.新兴的
illustrates n.举例说明
Bar,bat-木头
barrier n.障碍,栅栏,屏障
obstacle n.障碍物
battery n.电池
debate n.辩论
dispute vt&vi. 辩论(dis=分开 put=放)
combat n.格斗,搏斗(com=all 一群人拿着bat棒子)
conflict n.冲突
quarrel n.争吵,口角
argue v,坚决主张
argument n.论据,争论
angry adj.生气的
row n.划船,行,排,吵闹
annoy v.打扰,干扰
insult v.辱骂,凌辱,损害(in,sult=salt往心脏里撒盐)
battle vt&vi.争斗,与…作战
barrel n.桶
embarrass vt&vi.尴尬,窘迫
awkward/clumsy adj.笨拙的
ashamed adj.惭愧的,羞耻的
shy adj.害羞的
Water
waterproot adj.不透水的
cement n.水泥
dam n.水库,水坝
juice n.果汁
drain v.排水,流干
measure n.措施,测量
ensure v.确保
treasure n.宝藏,珍宝
leisure n.闲暇,悠闲
insure v.确保,保证
assure v.向…保证
guarantee n.担保
grand adj.宏大的
mass n.大量,大多,块
tremendous adj.极大的,巨大的,可怕的
mostly adv.大部分,主要地
largely adv.主要地
vast adj.广阔的
expand v.扩张
expansion n.扩张,扩大
extend vt&vi.延伸,扩大
extension n.伸展,扩大,延期
extensive adj.广阔的
extent n.程度,长度
stretch v.伸展,延伸 n.张开
enlarge vt&vi.扩大
enormous adj.巨大的,庞大的
immense adj.极大的,巨大的,浩瀚的
supreme adj.最高的,至高无上的
hold v.容纳,保留,握住,拿住
reach v.到达,完成
get v.得到,抓住 ,说服
spread vt&vi.伸开,传播
grasp v.抓住
sieze vt&vi.抓住,逮捕,捉拿,俘获
scratch v.擦,刮,擦痛
catch v.赶上
possess v.拥有,掌握,懂得
possession n.财产,拥有
impossible adj.不可能的,做不到的
possible adj.可能的
household n.家庭
accommodation n.住处,适应
accommodate v.容纳,使适应
dwelling n.居住,住处,处所
dormitory dorm n.宿舍
retain v.保持,记住
attain vt&vi.达到,获得
self-achievement 自我实现
contain v.包含,牵制,容纳
container n.容器,箱,匣,集装箱
sustain v.维持,供养,支持
sustainable adj.可持续的
inability adv.无能
certain adj.某一
entertain v.考虑,热情款待(enter进入 tain=hold抓)
stain v.弄脏,污染
stainless adj.纯洁的=pure
spotless adj.一尘不染的
purchase v.购买,采购
chase v.n.追逐
deal n.交易,许多 v.处理
settle v.解决,安排,使定居
settlement n.解决,定居点
handle v.操作,操控
cope v.对抗,对付 cope with 处理
pursue v.追求,继续,追捕
sue v.控告
pursuit n.工作,追赶
hunt 寻找 look for
hunt vt&vi.打猎 Hunt for 搜寻
seek v.寻找
skim v.略读,撇去
glimpse n.v.一瞥,一看
glance v.一瞥
view n.看法,风景
interview n.采访,面试 vt&vi.面试
review n.v.回顾,复习,评论
opinion n.意见,主张,判定
assessment n.评估,评价
interpret v.解释,口译
interpretation n.解释,理解,说明
rang n.范围,类别,射程 v.延伸
range from A to B 从A(延伸)到B
strange adj.陌生的,古怪的
stranger n.外地人,陌生人
alien adj.外国的 n.外星人(alien attack)
Weird古怪的,奇怪的(奇葩)
odd adj.古怪的,剩余的
foreign adj.外国的
neighborhood n.地区
neighbor n.邻居
unconventional adj.非常规的
eccentric adj.古怪的,异常的(ac去 cent中心)
peculiar adj.古怪的,奇怪的
bizarre adj.离奇的,奇怪的(发音:bi za er)
marvelous adj.不可思议的(marve漫威)
miracle n.奇迹,圣迹

阅读全文

奋斗的开始——词形+词性+介词

2022/3/27

主谓表

主谓表的谓语一定是系动词

  • 表状态:be动词(连接主语和表语,无意义,用于构成句子)
  • 表感官:look,sound,taste,smell,feel (感官动词后只能加形容词)
  • 表变化:get,become,turn,grow,fall
  • 表保持:keep,stay,remain,stand
  • 表现象:seem,appear
  • 表终止或结果:prove

谓语

谓语只能有一个,要么是实义动词(词组),要么是系动词,谓语的本质就是具有时态的实义动词或者系动词

谓语就是具有时态(是表示动作发生的时间)和语态(表明主语和谓语的关系)的动词{实义动词(词组)、系动词}>,有时候主语自己不能发出动作,此时就需要使用被动语态

一个句子中一般只有一个谓语,我们需要把所有不作谓语的动词(词组)变成非谓语结构(V.-ing、V.-ed、V.-todo)

当需要动词(词组),而又没有动词(词组)时,永远可以加be动词,并且be动词一般不译出意思

主语

动词不定式短语做主语时,常用it做形式主语,而把真正的主语不定式后置,动词不定式放在句末

能做主语的成分有:代词名词(短语)非谓语结构从句(引导词+句子)

尽量多想该用什么句型或其他结构代替人称代词做主语

主语缺失(如何填补)
  • 用it做形式主语 => 和”天气温度时间“有关
  • Three be句型(只有一个谓语动词,多余的动词变为非谓语) => 需要句子带”“的含义
  • 主动语态变被动语态
  • 加人称代词
被动语态
  • 原主动句中的宾语变为被动句中的主语

  • 把动词变为被动形式,即”be + 动词过去分词”,并注意其随主语的人称和单复数变化,而动词的时态则保持不变

  • 原主动句中的主语,如需要,则放在by后面,以宾语形式出现,不需要可省略

    (主动) 主语 + 谓语 + 宾语······

    ​ 我 停 车

    (被动) 主语 + be done(+ by + 宾语)

    ​ 车 被停了

  • 无被动

    1. 系动词无被动(主系表)
    2. have,own,possess含义为“拥有” 无被动
    3. 表示“发生”或“爆发”的动词无被动(take place,happen,occur)
    4. 不及物动词无被动(主谓)

时态

时态 一般 进行 完成 完成进行
现在 do/does be doing have/has done have/has been doing
过去 did was/were doing had done had been doing
将来 will do will be doing will have done will have been doing
过去将来 would do would be doing would have done would have been doing

一般现在时(动词原形,第三人称单数)

一般过去时(过去式)

进行时(现在分词)

完成时(过去分词)

长难句分析

没有引导词(that,which,who,where)就是主句的谓语!!!

  1. 找动词(词组)
  2. 词汇解释
  3. 只翻译句子主干

词性的用法

名词

可数个体名词(指可以单独存在的人或物)、集体名词(指某类人或物的总称)

不可数物质名词(指物质和材料)、抽象名词(指看不见摸不着的东西)

可数名词[C]复数
  1. s,x,ch,sh ==> es
  2. **f,fe **==> ves
  3. 辅音结尾 + y ==> y改i + es
不可数名词[U]复数

数词 + 量词 + of + 不可数名词

​ a sense of sadness

​ 一 种 失落感

若无法确定名词是否可数,就在名词前加定冠词 the

冠词
  1. 表示特指
  2. 用于上文中提到的事物
  3. 世上独一无二的事物、方位名词
  4. 用在序数词、形容词最高级以及only前面
代词在句中能指代什么?
  1. 指代人
  2. 指代物
  3. 指代上文整句话的内容

形容词

  1. 形容词的三个级别:原级、比较级、最高级

  2. 与······一样(as + 形容词原级 + as)或(as + 形容词原级 + 名词 + as)

  3. 形容词的比较级前可以用表示程度的词短语来进行修饰(a bit,a little,very much)

  4. 比较级 + and + 比较级 ==> 越来越…

  5. the + 比较级 + 主谓

  6. more than 不仅仅是

  7. more···than···比···多;与其···不如说

  8. better than 比···更好

  9. rather than而不是

  10. less than 少于

副词

分类 举例
时间 just,recently,before,already,finally,today
地点 here,there,nearby
方式 fast,hard,carefully,slowly
程度 much,little,very,enough,particularly
频率 usually,often,sometimes,never,alw ays,hardly,constantly,frequency,seldom
  1. 修饰形容词,放在形容词前
  2. 修饰动词,可以放动词前后,也可以放句末
  3. 时间、地点副词可以放在句 首句末

介词

  • in(地点,指时间,在···的里面,语言;工具,在…方面)
  • on(具体日期,电子类,在…上 )
  • at(小地点,具体时刻[正午、黄昏],在···的里面)
  • for(接时间段[完成时],对于,表去向;目的,由于,作为)
  • by(by + 将来/过去时间:到···为止,被,在···旁边,表程度;数量,通过···的方式,by + 交通工具)
  • with(用,和···一起,随着,伴有···,由于,with + n. + adj./V.-ing/V.ed[独立主格])
  • of(···的)
  • from(从···)
  • about(大约,关于)
  • beyond(超出)
  • against(与···相对/相反)
  • as(作为)
  • before(在···之前[可以指时间;距离])
  • after(在···之后[可以指时间;跟随])
  • since(接过去时间点[用完成时]副词表示“从此以后”)
  • over(在···上面,超过,多于)
  • across(穿过[表面])
  • through(穿过[内部])
  • under(在···下面)
  • above(在···上面)
  • below(在···下面)
  • beside(在···旁边)
  • behind(在···后面)
  • between(在两者之间)
  • among(在三者或三者以上之中)
  • without(没有)
  • concerning(关于)

have,has表拥有,一个口诀全搞定

你有(you),我有(I),大家有(多人以上) → have

他(he),她(she),它(it),个人有(Jack,Lily…) → has


时间大于1天 用in、时间等于1天 用on、时间小于1天 用at

in年in月in四季 (in summer)

上午下午和晚上(in the morning)

on加周末和星期(On Monday)

还有具体某一天(On June 1st)

at要加时间点(at 5o’clock)

中午夜里和黎明(at night)


名词前用what形容词副词前用how形名相连就用what形名不连就用how


一般现在时 I do my homework.
一般过去时 I did my homework.
一般将来时 I will do my homework.
现在进行时 I am doing my homework.
过去进行时 I was doing my homework.
现在完成时 I have done my homework.
过去完成时 I had done my homework.
过去将来时 I would do my homework.

小朋友的可以用:lovely / cute / adorable 可爱的 pretty 漂亮的 sweet 甜美的

女生漂亮可以用:gorgeous 动人的 stunning 惊艳的 elegant 优雅的

男生帅气可以用:handsome 英俊的 good-looking 好看的 charming 有魅力的

风景漂亮可以用:breathtaking 令人惊叹的 ground 雄伟的 spectacular 壮丽的 magnificent 壮观的


0 zero 1 one 2 two 3 three 4 four 5 five 6 six 7 seven 8 eight
9 nine 10 ten 11 eleven 12 twelve 13 thirteen 14 fourteen 15 fifteen 16 sixteen 17 seventeen
18 eighteen 19 nineteen 20 twenty 30 thirty 40 forty 50 fifty 60 sixty 70 seventy 80 eighty
90 ninety 100 one hundred 1000 one thousand 100万 one million 10亿 one billion

有the 表示地点,无the 表示动作;

in hospital 住院, in the hospital 在医院

go to bed 去睡觉, go to the bed 在床边上


去某地 (go + 副词)、(go to + 名词)


一月:January 二月:February 三月:March 四月:April 五月:May 六月:June

七月:July 八月:August 九月:September 十月:October 十一月:November 十二月:December


在公交车上是in the bus 还是on the bus呢? 看腿!!

腿能站起来在上面走路的用on on the bus , on the train , on the plane

腿坐不直只能坐在里面的用**in ** in the taxi , in the car


在墙上是用in the wall 还是 on the wall 呢?

in “i”像钉子 在里面用 in the wall

on “o”像时钟 在墙上用 on the wall


英语中的几个

eat → 需要咀嚼的事物 eat an apple

take → 服用(药物) take some medicine

have → 一日三餐 have breakfast / lunch /dinner have an apple / some medicine


yesterday 昨天 the day before yesterday 前天 three days ago 大前天

tomorrow 明天 the day after tomorrow 后天 in three days 大后天


我要上厕所:I need to go to the bathroom / restroom / washroom

小朋友可以用: I need to pee(尿尿) / poop(便便)

朋友之间可以用:No.1(大号) / No.2(小号)


分开一段时间some time Do you have some time? 你有一些时间

相聚某个时候sometime Let’s do this sometime. 我们某个时候做这件事吧

分开s是几次some times I’ ve been here some times. 我来过这里几次

相聚s是有时sometimes I sometimes go there. 我有时会去那里


Mr. → 先生

Mrs. → 太太(已婚女性)

Miss →未婚女性(最爱美 身材最好 两个S曲线)

Ms. → 女士(未知是否结婚)


open 是把原来关上的东西打开了

turn on 是把原来的电路接通了 turn on the light

turn off 是把原来接通的电路断开了 turn off the light


阅读全文

破解百度网盘限速

2022/3/26

闲话少说,直接开始正题!!!

必备工具:

  1. Google Chrome 浏览器
  2. 游猴插件:(https://greasyfork.org/zh-CN)
  3. IDM:(https://wwx.lanzoux.com/b01nqc7yj)

操作步骤:

  1. 下载好游猴插件并安装到Google Chrome 浏览器

  2. 进入游猴页面,点击GreasyFork,搜索下载百度网盘简易下载助手(作者:软件小妹)

  3. 打开下载好的IDM(同时开启带有游猴插件的Google Chrome 浏览器)

    依次点击并 设置 —->选项 —-> 连接(修改默认最大连接数为: 4) —-> 文件类型(在自动开始下载下列类型的文件下修改下载类型<复制粘贴即可>):3GP 7Z AAC ACE AI AIF ALZ APK APP ARC ARJ ASF AVI BH BIN BR BUNDLE BZ BZ2 CDA CSV DIF DLL DMG DOC DOCX EGG EPS EXE FLV GZ GZIP IMG IPA ISO ISZ JAR KEXT LHA LZ LZH LZMA M4A M4V MDB MID MKV MOV MP3 MP4 MPA MPE MPEG MPG MSI MSU MUI OGG OGV PDF PKG PPT PPTX PSD PST PUB QT R0* R1* RA RAR RM RMVB RTF SEA SIT SITX SLDM SLDX TAR TBZ TBZ2 TGZ TIF TIFF TLZ TXZ UDF VOB VSD VSDM VSDX VSS VSSM VST VSTM VSTX WAR WAV WBK WIM WKS WMA WMD WMS WMV WMZ WP5 WPD WPS XLS XLSX XPS XZ Z ZIP ZIPX ZPAQ ZSTD) —->下载(将下方手动添加用户代理(UA)修改为:netdisk;7.0.3.2;PC;PC-Windows;10.0.17763),点击确定

  4. 打开Google Chrome 浏览器登录百度网盘网页版 登录账号 随后即可看见简易下载助手

  5. 选择想下载的文件点击简易下载助手(仅限单个文件) —->点击获取直链地址(失败就多试几次) —-> 扫公众号获得验证码 —-> 复制直链地址 —-> 返回IDM(新建任务 —-> 复制链接到地址) 即可成功破解百度网盘限速功能!!!!

阅读全文

PTA知识点精讲

2022/3/26

带空格的字符串输入(C++)

cin.get(str, len) 函数可以接收空格,遇回车结束输入,将换行符保留。

str用来存储输入行的数组名称

len是要读取的字符数

#include <iostream>
using namespace std;
int main(){
    char a[50];
    cin.get(a,50);
    cout << a <, endl;
    return 0;
}
输入:I love China回车结束输入,输出结果为I love China。


cin.getline(str, len) 函数可以接收空格,遇回车结束输入,将换行符丢弃。

#include <iostream>
using namespace std;
int main(){
    char a[50];
    cin.getline(a,50);
    cout << a << endl;
    return 0;
}
输入:I love China回车结束输入,输出结果为I love China。


gets() 函数以无限读取,以回车结束读取(在c++中运行会产生bug)

#inlcude <iostream>
#inlcude <cstdio>
using namespace std;
int main(){
    char a[50];
    cin >> a;
    gets(a);
    cout << a << endl;
    return 0;
}
输入:I love China回车结束输入,输出结果为love China。首字符自动丢弃。


④ getline() 函数若定义变量为string类型,则要考虑此函数

#include <iostream>
#include <cstring>
using namespace std;
int main(){
    string a;
    getline(cin,a);
    cout << a << endl;
    return 0;
}
输入:I love China回车并未结束输入,需回车两次才能结束输入,输出结果为:I love China.


cin 是C++中最常用的输入语句,当遇到空格或者回车键即停止

#include <iostream>
#include <cstring>
using namespace std;
int main(){
    char a[50];
    cin >> a;
    cout << a << endl;
    return 0;
}
输入:abcd遇回车输出abcd
缺点:只能输入没有空格的字符串,当输入中含有空格,则只能输出空格之前的字符
输入:I love China输入空格时输入并未停止,遇回车输入停止,输出I,空格后面的均未输出。


⑥ 用得到的函数

#include <isotream>
#include <string>
#include <cstring>
#include <cstdio>
#include <cmath>
#include <map>
#include <set>
#include <algorithm>
#include <sstream>
using namespace std;

⑦ 常用的知识点

  • string

    1. erase函数删掉指定位置的字符

      (1)erase(pos,n); 删除从pos开始的n个字符,比如erase(0,1)就是删除第一个字符
      (2)erase(position);删除position处的一个字符(position是个string类型的迭代器)
      (3)erase(first,last);删除从first到last之间的字符(first和last都是迭代器)

    2. 截取子串

      s.substr(pos, n) 截取s中从pos开始(包括0)的n个字符的子串,并返回

    3. replace(int i, int num, string s)从第i个位置以后的num个字符替换为s

    4. find

      (1)s.find(string s1) 返回s1在s中第一次出现的下一个位置

      (2)s.find(string s1,int num) 从下标num开始查找s1返回在s中的下标位置

    5. char转string
      char str[10];
      string s(str);//或者是s = str;

    6. string转char

      const char *str;
      string s;
      str = s.c_str();

  • 四舍五入

    double a = 11/2.0;
    int b = (int)(a+0.5);

sort 头文件 #include

默认是从小到大
#include <iostream>
#include <algorithm>
using namespace std;
int main(){
    int arr[] = {3,4,7,2,1};
    
    sort(arr,arr+5);
    for(int i = 0; i < 5; i++){
    cout << arr[i];
    }
    return 0;
}

从大到小仅需把第八行改为:
    sort(arr,arr+5,greater<int>());

也可以自造比较函数
    bool cmp(int x, int y){
    return x > y;
}
    sort(arr,arr+5,cmp);
  • 保留两位小数 -> %.2f

  • 比如要将‘8’转换为数字8,在语句中这样写就可以了,“ 8+‘0’ “

  • 字符到数字的转化可以利用s[i] - ‘0’

  • 字符串长度 -> int len = (int)strlen(str); 字符串记得结束符 ‘0’

  • “%”是取尾,“/”是留头 ==> a=1234567 ( a%10 = 7 ,a/10 = 123456)

  •     int a = 123456789;
        for(int i = 0; i < 1; i++)
            printf("%d\n",a/1%10);    =>9
             printf("%d\n",a/10%10);    =>8
            printf("%d\n",a/100%10); =>7
            printf("%d\n",a/1000%10); =>6
        输出每个数字:cout << a %= 10; a /= 10;
    
  • 字符串连接strcat() 字符串复制strcpy()

  • 循环输入终止模板:while(scanf(“%s”, s) != EOF)

PTA空格输出模板

for(int i = 0; i < N; i++){
    if(i != N - 1){
        printf("%lf", num[i]);
    }else{
        printf("%lf\n", num[i]);
    }
}
return 0;
阅读全文

MarkDown语法

2022/3/25

Markdown快速入门(typora)

1、代码块:

//代码块语法:
```java
```c++
①. java代码
package com.pcy.po;

import javax.persistence.*;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;

@Entity
@Table(name = "t_user")
public class User{
    
}
②. c++代码
#include <cstdio>
#include <cstring>
char s[1005];
int main(){
    while(scanf("%s",s) != EOF);
    cout << (int)strlen(s);
    return 0;
}

2、标题:

//标题语法
 # 一级标签
 ## 二级标签
 ### 三级标签
 #### 四级标签
 ##### 五级标签
 ###### 六级标签

一级标签

二级标签

三级标签

四级标签

五级标签
六级标签

3、字体:

//斜体
*第一次写博客*
//加粗
**第一次写博客**
//代码高亮显示
==第一次写博客==
//删除线
~~第一次写博客~~
//下划线
<u>第一次写博客</u>
//脚注
第一次写博客[^Asuna]

第一次写博客
第一次写博客
==第一次写博客==
第一次写博客
第一次写博客

第一次写博客[^Asuna]

4、引用

//引用语法
>作者:Kirito
>>作者:Kirito
>>>作者:Kirito
+
-

作者:Kirito

作者:Kirito

作者:Kirito

5、分割线:

//分割线
---
//分割线2
***


6、图片插入

//在线图片 || 本地图片
![我的照片](/image/XXX.png 或 用图床上传至GitHub 然后右键复制图片链接 再从浏览器中打开 再右键复制图像链接) --图片路径
[敲重点]Markdown可以通过普通的<img>标签来指定图片的 高度 和 宽度
<img src = "https://raw.githubusercontent.com/P-luminary/image/master/data/avatar.png" width = "50%">

我的照片

7、超链接

//超链接语法
[P-luminary GitHub](https://github.com/Luminarness)

8、列表

//无序列表 ("-"是实心圈  "+"是空心圈)
- 目录1
- 目录2
- 目录3
//有序列表
数字键 + "." + 名称
//列表嵌套(需要在子列表中的选项前面添加四个空格)
1. 第一项
    - 第一项嵌套的第一个元素
2. 第二项
    - 第二项嵌套的第二个元素
  • 目录1

  • 目录2

  • 目录3

    1. 首页

    2. 分类

    3. 标签

    4. 第一项

      • 第一项嵌套的第一个元素
    5. 第二项

      • 第二项嵌套的第二个元素

9、表格

在Typora中右键 -> 插入 -> 表格
日期 心情 饱和度
2022-03-25 1:27 非常好
阅读全文

PTA技巧

2022/3/25

时间优化:(写好的代码有测试点运行超时, 可以暂时放下, 不要浪费时间)

  1. 如果出现运行超时考虑是否因为非法输入导致死循环

  2. 尽量创建全局变量(创建一次,后面赋值),不要重复创建临时变量

  3. 尽量使用scanf,printf,而不使用cin,cout (C++的IO存在缓存(可取消))

#include <bits/stdc++.h> //万能头
using namespace std;
→→→    ios::sync_with_stdio(false); ←←←
→→→    cin.tie(0);cout.tie(0);    ←←←
  1. 使用引用访问容器中的元素(遍历,排序==>增强型for循环)
vector<int> vc{0,1,2,3};
for(int& i : vc)
    cout << i;
  1. 使用unordered_map,unordered_set替换map,set可以提升效率(注意改头文件)

  2. 为了实现排序功能,尽量使用sort对数组排序,而不要依赖与map和set的自动排序(map,set结构庞大)

  3. 一般递归算法都比较慢,深搜(DFS)可以通过剪枝优化,并查集可以进行路径压缩提升效率。


时间优化:

  1. 为了方便函数调用,可以都用全局变量(但这是个坏习惯)

  2. 不确定数据多少的情况,不一定非要用动态数组,可以直接根据题目给的数据范围定义一个较大的数组(大小应大于题目所给的范围),一般情况下不会出现内存超限 [数组大小别超过10^8,二维数组不能超过array(10000)(10000)]

  3. 答案错误很有可能是漏了题目的关键信息

  4. 格式错误是因为排版跟题目要求不同,可能多空格或空行

  5. 段错误是因为非法访问才会导致,一般情况下是因为数组访问越界

  6. 涉及到除法的要考虑除数不能为0,一般会有一个测试点

  7. 图论问题用深搜可以得到大部分的分

  8. 选取适当的结构(容器)可以让思路更清晰

  9. 熟悉编译器的调试功能(Debug)可以更快找出bug


必备知识:

​ 数据结构与算法:

  1. 树:二叉树的遍历方式,平衡二叉树的建树过程,根据两种遍历来建树

  2. 图:深搜,广(层)搜,并查集(推荐博客)

  3. 堆:堆结构,建堆过程(堆排序)。

  4. 链表:根据结点连接链表(一般通过结构体进行模拟)。

  5. 排序:熟悉快排和归并排序的排序过程

常用库、函数(黑科技)

容器、字符串处理、lambda表达式、自定义排序、类型转换、数值边界、数学函数、auto关键字、堆、常用功能函数(查找 计数 倒序)
知识点 说明 推荐博客
string容器 封装了一些对字符串的常用操作 C++ String详解
regex正则表达式 使用正则表达式来替换、查找字符串 C++ 正则表达式
stirngstream字符串IO类 使用字符串来进行IO操作 C++ stringstream
常用字符处理函数 isdigit(char ch)
  1. sort函数排序,自定义结构体比较方式

  2. STL标准库list,vector,queue,stack,map,set

  3. 数组(容器)倒序

    1. 倒序函数: void reverse(typename begin, typename end);
    2. 利用反向迭代器倒序(构造new string)
  4. auto关键字

  5. find函数

string str; // string类函数:未找到返回string::npos
if(str.find("substr") != string::npos);
    //......
set<int> st;
if(st.find(0) != st.end()); //set、map成员函数: 未找到返回尾迭代器
    //......
vector<int> vc;
if(find(vc.begin(),vc.end(),0) != vc.end()); //序列式容器可以通过algorithm库中的find
    //......
阅读全文

Redis实战

2022/1/15

黑马点评Redis

实现短信的登录和注册

com/hmdp/controller/UserController.java
package com.hmdp.controller;


import cn.hutool.core.util.ObjectUtil;
import cn.hutool.core.util.RandomUtil;
import com.hmdp.dto.LoginFormDTO;
import com.hmdp.dto.Result;
import com.hmdp.dto.UserDTO;
import com.hmdp.entity.User;
import com.hmdp.entity.UserInfo;
import com.hmdp.service.IUserInfoService;
import com.hmdp.service.IUserService;
import com.hmdp.utils.RegexUtils;
import com.hmdp.utils.SystemConstants;
import com.hmdp.utils.UserHolder;
import lombok.extern.slf4j.Slf4j;
import org.springframework.web.bind.annotation.*;

import javax.annotation.Resource;
import javax.servlet.http.HttpSession;

import static com.baomidou.mybatisplus.core.toolkit.Wrappers.lambdaQuery;
import static com.baomidou.mybatisplus.core.toolkit.Wrappers.query;


/**
 * <p>
 * 前端控制器
 * </p>
 *
 * @author 虎哥
 * @since 2021-12-22
 */
@Slf4j
@RestController
@RequestMapping("/user")
public class UserController {

    @Resource
    private IUserService userService;

    @Resource
    private IUserInfoService userInfoService;

    /**
     * 发送手机验证码
     */
    @PostMapping("code")
    public Result sendCode(@RequestParam("phone") String phone, HttpSession session) {
        return userService.sendCode(phone, session);
    }

    /**
     * 登录功能
     * @param loginForm 登录参数,包含手机号、验证码;或者手机号、密码
     */
    @PostMapping("/login")
    public Result login(@RequestBody LoginFormDTO loginForm, HttpSession session){
        String phone = loginForm.getPhone();
        // 校验手机号
        if (RegexUtils.isPhoneInvalid(phone)) {
            return Result.fail("手机号格式错误!");
        }
        // 校验验证码
        Object cacheCode = session.getAttribute("code");
        String code = loginForm.getCode();

        // 不一致 报错
        if (cacheCode == null || !code.equals(cacheCode)) {
            return Result.fail("验证码错误");
        }

        // 一致 根据手机号查询用户 用mybatisplus
        User user = userService.getOne(lambdaQuery(User.class).eq(User::getPhone, phone));
        // 判断用户是否存在
        if (ObjectUtil.isEmpty(user)) {
            // 不存在 创建新用户保存
            user = new User();
            user.setPhone(phone);
            user.setNickName(SystemConstants.USER_NICK_NAME_PREFIX + RandomUtil.randomString(10));
            userService.save(user);
        }
        // 存在 保存用户信息到session当中
        UserDTO userDTO = new UserDTO();
        userDTO.setId(user.getId());
        userDTO.setNickName(user.getNickName());
        userDTO.setPhone(user.getPhone());
        session.setAttribute("user", userDTO); // 确保保存的是 UserDTO 对象
        return Result.ok();
    }

    /**
     * 登出功能
     * @return 无
     */
    @PostMapping("/logout")
    public Result logout(){
        // TODO 实现登出功能
        return Result.fail("功能未完成");
    }

    @GetMapping("/me")
    public Result me(){
        // TODO 获取当前登录的用户并返回
        UserDTO user = UserHolder.getUser();
        return Result.ok(user);
    }

    @GetMapping("/info/{id}")
    public Result info(@PathVariable("id") Long userId){
        // 查询详情
        UserInfo info = userInfoService.getById(userId);
        if (info == null) {
            // 没有详情,应该是第一次查看详情
            return Result.ok();
        }
        info.setCreateTime(null);
        info.setUpdateTime(null);
        // 返回
        return Result.ok(info);
    }
}
com/hmdp/service/impl/UserServiceImpl.java
package com.hmdp.service.impl;

import cn.hutool.core.util.RandomUtil;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.hmdp.dto.LoginFormDTO;
import com.hmdp.dto.Result;
import com.hmdp.entity.User;
import com.hmdp.mapper.UserMapper;
import com.hmdp.service.IUserService;
import com.hmdp.utils.RegexUtils;
import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Service;

import javax.servlet.http.HttpSession;

/**
 * <p>
 * 服务实现类
 * </p>
 *
 * @author 虎哥
 * @since 2021-12-22
 */
@Service
@Slf4j
public class UserServiceImpl extends ServiceImpl<UserMapper, User> implements IUserService {

    @Override
    public Result sendCode(String phone, HttpSession session) {
        // 校验手机号
        if (RegexUtils.isPhoneInvalid(phone)) {
            // 不符合 返回错误信息
            return Result.fail("手机号格式错误!");
        }
        // 符合 生成验证码
        String code = RandomUtil.randomNumbers(6);
        // 保存验证码到session
        session.setAttribute("code", code);
        // 发送验证码
        log.debug("发送短信验证码成功,验证码:{}", code);
        // 返回ok
        return Result.ok();
    }

    @Override
    public Result login(LoginFormDTO loginForm, HttpSession session) {
        return null;
    }
}

实现登录校验拦截器

package com.hmdp.config;

import com.hmdp.utils.LoginInterceptor;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.servlet.config.annotation.InterceptorRegistry;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;

@Configuration
public class MvcConfig implements WebMvcConfigurer {
    @Override
    public void addInterceptors(InterceptorRegistry registry) {
        registry.addInterceptor(new LoginInterceptor())
                .excludePathPatterns(
                        "/user/code",
                        "/user/login"
                );
    }
}
package com.hmdp.utils;

import com.hmdp.dto.UserDTO;

public class UserHolder {
    private static final ThreadLocal<UserDTO> tl = new ThreadLocal<>();

    public static void saveUser(UserDTO user){
        tl.set(user);
    }

    public static UserDTO getUser(){
        return tl.get();
    }

    public static void removeUser(){
        tl.remove();
    }
}
package com.hmdp.utils;

import cn.hutool.core.util.ObjectUtil;
import com.hmdp.dto.UserDTO;
import org.springframework.web.servlet.HandlerInterceptor;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;

public class LoginInterceptor implements HandlerInterceptor {
    @Override
    public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
        // 获取session
        HttpSession session = request.getSession();
        // 获取session中的用户
        Object user = session.getAttribute("user");
        // 判断用户是否存在
        if (ObjectUtil.isEmpty(user)) {
            // 不存在,拦截
            response.setStatus(401);
            return false;
        }
        // 存在,保存用户信息到ThreadLocal
        UserDTO userDTO = (UserDTO) user; // 确保 user 已经是 UserDTO 类型
        UserHolder.saveUser(userDTO);
        // 放行
        return true;
    }

    @Override
    public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception {
        // 移除用户
        UserHolder.removeUser();
    }
}

集群的Session共享问题

session共享问题:多台Tomcat并不共享session存储空间,当请求切换到不同tomcat服务时导致数据丢失的问题。

session的替代方案应该满足:数据共享、内存存储、key、value结构

发送短信验证码后生成的验证码 保存验证码到Redis → 以手机号作为Key存储验证码 → 发送验证码

com/hmdp/controller/UserController.java
package com.hmdp.controller;


import cn.hutool.core.bean.BeanUtil;
import cn.hutool.core.bean.copier.CopyOptions;
import cn.hutool.core.lang.UUID;
import cn.hutool.core.util.ObjectUtil;
import cn.hutool.core.util.RandomUtil;
import com.hmdp.dto.LoginFormDTO;
import com.hmdp.dto.Result;
import com.hmdp.dto.UserDTO;
import com.hmdp.entity.User;
import com.hmdp.entity.UserInfo;
import com.hmdp.service.IUserInfoService;
import com.hmdp.service.IUserService;
import com.hmdp.utils.RegexUtils;
import com.hmdp.utils.SystemConstants;
import com.hmdp.utils.UserHolder;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.redis.core.StringRedisTemplate;
import org.springframework.web.bind.annotation.*;

import javax.annotation.Resource;
import javax.servlet.http.HttpSession;

import java.util.HashMap;
import java.util.Map;
import java.util.concurrent.TimeUnit;

import static com.baomidou.mybatisplus.core.toolkit.Wrappers.lambdaQuery;
import static com.baomidou.mybatisplus.core.toolkit.Wrappers.query;


/**
 * <p>
 * 前端控制器
 * </p>
 *
 * @author 虎哥
 * @since 2021-12-22
 */
@Slf4j
@RestController
@RequestMapping("/user")
public class UserController {

    @Resource
    private IUserService userService;

    @Resource
    private IUserInfoService userInfoService;

    @Autowired
    private StringRedisTemplate stringRedisTemplate;


    /**
     * 发送手机验证码
     */
    @PostMapping("code")
    public Result sendCode(@RequestParam("phone") String phone, HttpSession session) {
        return userService.sendCode(phone, session);
    }

    /**
     * 登录功能
     * @param loginForm 登录参数,包含手机号、验证码;或者手机号、密码
     */
    @PostMapping("/login")
    public Result login(@RequestBody LoginFormDTO loginForm, HttpSession session){
        String phone = loginForm.getPhone();
        // 校验手机号
        if (RegexUtils.isPhoneInvalid(phone)) {
            return Result.fail("手机号格式错误!");
        }
        // 校验验证码
//        Object cacheCode = session.getAttribute("code");
        // 从Redis中获取验证码并校验
        String cacheCode = stringRedisTemplate.opsForValue().get(SystemConstants.LOGIN_CODE_KEY + phone);
        String code = loginForm.getCode();

        // 不一致 报错
        if (cacheCode == null || !code.equals(cacheCode)) {
            return Result.fail("验证码错误");
        }

        // 存储

        // 一致 根据手机号查询用户 用mybatisplus
        User user = userService.getOne(lambdaQuery(User.class).eq(User::getPhone, phone));
        // 判断用户是否存在
        if (ObjectUtil.isEmpty(user)) {
            // 不存在 创建新用户保存
            user = new User();
            user.setPhone(phone);
            user.setNickName(SystemConstants.USER_NICK_NAME_PREFIX + RandomUtil.randomString(10));
            userService.save(user);
        }
        // 保存用户信息到redis中
        // 随机生成token,作为登录令牌
        String token = UUID.randomUUID().toString(true);
        // 将User对象转换为Hash存储
        UserDTO userDTO = BeanUtil.copyProperties(user, UserDTO.class);
        // 存储  用了putall 要把userDto转map
        Map<String, Object> userMap = BeanUtil.beanToMap(userDTO, new HashMap<>(),
                CopyOptions.create()
                        .setIgnoreNullValue(true)
                        .setFieldValueEditor((fieldName, fieldValue) -> fieldValue.toString()));
        // 存储   因为存的时候不能设置有效期 要存完以后再去设置有效期
        String tokenKey = SystemConstants.LOGIN_CODE_TOKEN + token;
        stringRedisTemplate.opsForHash().putAll(tokenKey, userMap);
        // 设置token有效期 30min
        stringRedisTemplate.expire(tokenKey, SystemConstants.REDIS_TIMEOUT, TimeUnit.MINUTES);
        // 但是我要如果状态在 就不断更新token的有效期 【更新token有效期】



        // 存在 保存用户信息到session当中
//        UserDTO userDTO = new UserDTO();
//        userDTO.setId(user.getId());
//        userDTO.setNickName(user.getNickName());
//        userDTO.setPhone(user.getPhone());
        // 确保保存的是 UserDTO 对象
        session.setAttribute("user", BeanUtil.copyProperties(user, UserDTO.class));
        return Result.ok();
    }

    /**
     * 登出功能
     * @return 无
     */
    @PostMapping("/logout")
    public Result logout(){
        // TODO 实现登出功能
        return Result.fail("功能未完成");
    }

    @GetMapping("/me")
    public Result me(){
        // TODO 获取当前登录的用户并返回
        // userService.login(loginForm, session)
        UserDTO user = UserHolder.getUser();
        return Result.ok(user);
    }

    @GetMapping("/info/{id}")
    public Result info(@PathVariable("id") Long userId){
        // 查询详情
        UserInfo info = userInfoService.getById(userId);
        if (info == null) {
            // 没有详情,应该是第一次查看详情
            return Result.ok();
        }
        info.setCreateTime(null);
        info.setUpdateTime(null);
        // 返回
        return Result.ok(info);
    }
}

解决状态登录刷新的问题【双重拦截器】

请求 → 拦截器①(拦截一切路径)[流程:获取token、查询Redis用户、保存到ThreadLocal、刷新Token有效期、放行] → 拦截器②(拦截需要登录的路径)[查询ThreadLocal的用户, 不存在则拦截、存在则继续]

com/hmdp/utils/LoginInterceptor.java
package com.hmdp.utils;

import cn.hutool.core.bean.BeanUtil;
import cn.hutool.core.util.ObjectUtil;
import cn.hutool.core.util.StrUtil;
import com.hmdp.dto.UserDTO;
import org.springframework.data.redis.core.StringRedisTemplate;
import org.springframework.web.servlet.HandlerInterceptor;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;
import java.util.Map;
import java.util.concurrent.TimeUnit;

public class LoginInterceptor implements HandlerInterceptor {
    // 这个类的对象是手动new出来的 没有通过Spring容器 所以需要通过构造方法去引用
    // 拦截器不能给spring容器因为每次都会经过它去访问

    @Override
    public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
        // 判断是否需要拦截(ThreadLocal中是否有用户)
        if (UserHolder.getUser() == null) {
            // 没有,需要拦截,设置状态码
            response.setStatus(401);
            // 拦截
            return false;
        }
        // 有用户 放行
        return true;
    }
}
com/hmdp/utils/RefreshTokenInterceptor.java
package com.hmdp.utils;

import cn.hutool.core.bean.BeanUtil;
import cn.hutool.core.util.StrUtil;
import com.hmdp.dto.UserDTO;
import org.springframework.data.redis.core.StringRedisTemplate;
import org.springframework.web.servlet.HandlerInterceptor;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.util.Map;
import java.util.concurrent.TimeUnit;

public class RefreshTokenInterceptor implements HandlerInterceptor {
    // 这个类的对象是手动new出来的 没有通过Spring容器 所以需要通过构造方法去引用
    // 拦截器不能给spring容器因为每次都会经过它去访问
    private StringRedisTemplate stringRedisTemplate;

    public RefreshTokenInterceptor(StringRedisTemplate stringRedisTemplate) {
        this.stringRedisTemplate = stringRedisTemplate;
    }

    @Override
    public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {

        String token = request.getHeader("authorization");
        if (StrUtil.isBlank(token)) {
            // 不存在:拦截,返回401状态码
//            response.setStatus(401);
            return true;
        }
        String key = SystemConstants.LOGIN_CODE_TOKEN + token;
        Map<Object, Object> userMap = stringRedisTemplate.opsForHash().entries(key);
        // 判断用户是否存在
//        if (ObjectUtil.isEmpty(user)) {
        if (userMap.isEmpty()){
            // 不存在,拦截
//            response.setStatus(401);
            return true;
        }
        // 将查询到的Hash数据转为UserDTO对象
        UserDTO userDTO = BeanUtil.fillBeanWithMap(userMap, new UserDTO(), false);

        // 存在,保存用户信息到ThreadLocal
//        UserDTO userDTO = (UserDTO) user; // 确保 user 已经是 UserDTO 类型
        UserHolder.saveUser(userDTO);
        // 刷新token有效期
        stringRedisTemplate.expire(key, SystemConstants.REDIS_TIMEOUT, TimeUnit.MINUTES);
        // 放行
        return true;
    }

    @Override
    public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception {
        // 移除用户
        UserHolder.removeUser();
    }
}
com/hmdp/config/MvcConfig.java
package com.hmdp.config;

import com.hmdp.utils.LoginInterceptor;
import com.hmdp.utils.RefreshTokenInterceptor;
import org.springframework.context.annotation.Configuration;
import org.springframework.data.redis.core.StringRedisTemplate;
import org.springframework.web.servlet.config.annotation.InterceptorRegistry;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;

import javax.annotation.Resource;

@Configuration
public class MvcConfig implements WebMvcConfigurer {
    @Resource
    private StringRedisTemplate stringRedisTemplate;
    @Override
    public void addInterceptors(InterceptorRegistry registry) {
        // 登录拦截器
        registry.addInterceptor(new LoginInterceptor())
                .excludePathPatterns(
                        "/shop/**",
                        "/voucher/**",
                        "/shop-type/**",
                        "/upload/**",
                        "/blog/hot",
                        "/user/code",
                        "/user/login"
                ).order(1);
        // token刷新拦截器
        registry.addInterceptor(new RefreshTokenInterceptor(stringRedisTemplate)).addPathPatterns("/**").order(0);
    }
}

商户查询缓存—练习题

com/hmdp/controller/ShopTypeController.java
/**
 * <p>
 * 前端控制器
 * </p>
 *
 * @author 虎哥
 * @since 2021-12-22
 */
@RestController
@RequestMapping("/shop-type")
public class ShopTypeController {
    @Resource
    private IShopTypeService typeService;

    @GetMapping("list")
    public Result queryTypeList() {
//        List<ShopType> typeList = typeService
//                .query().orderByAsc("sort").list();
//        return Result.ok(typeList);
        return typeService.listShop();
    }
com/hmdp/service/impl/ShopTypeServiceImpl.java
/**
 * <p>
 *  服务实现类
 * </p>
 * @since 2021-12-22
 */
@Service
public class ShopTypeServiceImpl extends ServiceImpl<ShopTypeMapper, ShopType> implements IShopTypeService {

    @Resource
    private StringRedisTemplate stringRedisTemplate;
    @Override
    public Result listShop() {
        String shopTypeCache = stringRedisTemplate.opsForValue().get(SystemConstants.CACHE_SHOP_TYPE_KEY);

        if (ObjectUtil.isNotEmpty(shopTypeCache)) {
            Long ttl = stringRedisTemplate.getExpire(SystemConstants.CACHE_SHOP_TYPE_KEY, TimeUnit.MINUTES);
            System.out.println("TTL for CACHE_SHOP_TYPE_KEY: " + ttl + " minutes");
            List<ShopType> shopTypeList = JSONUtil.toList(shopTypeCache, ShopType.class);
            return Result.ok(shopTypeList);
        }



        List<ShopType> queryShopTypeList = query().orderByAsc("sort").list();
        if (ObjectUtil.isEmpty(queryShopTypeList)) {
            return Result.fail("查询失败");
        }
        stringRedisTemplate.opsForValue().set(SystemConstants.CACHE_SHOP_TYPE_KEY, JSONUtil.toJsonStr(queryShopTypeList), SystemConstants.SHOP_TYPE_TTL, TimeUnit.MINUTES);
        return Result.ok(queryShopTypeList);
    }
}

添加商铺缓存

com/hmdp/service/impl/ShopServiceImpl.java
package com.hmdp.service.impl;

import cn.hutool.core.util.ObjectUtil;
import cn.hutool.json.JSONUtil;
import com.hmdp.dto.Result;
import com.hmdp.entity.Shop;
import com.hmdp.mapper.ShopMapper;
import com.hmdp.service.IShopService;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.hmdp.utils.SystemConstants;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.redis.core.StringRedisTemplate;
import org.springframework.stereotype.Service;

import javax.annotation.Resource;

/**
 * <p>
 *  服务实现类
 * </p>
 *
 * @author 虎哥
 * @since 2021-12-22
 */
@Service
public class ShopServiceImpl extends ServiceImpl<ShopMapper, Shop> implements IShopService {

    @Resource
    private StringRedisTemplate stringRedisTemplate;

    @Override
    public Result queryById(Long id) {
        // 从redis中查询商铺缓存
        String shopJson = stringRedisTemplate.opsForValue().get(SystemConstants.CACHE_SHOP_KEY + id);
        // 判断是否存在
        if (ObjectUtil.isNotEmpty(shopJson)) {
            // 存在,直接返回
            Shop shop = JSONUtil.toBean(shopJson, Shop.class);
            return Result.ok(shop);
        }
        // 不存在,根据id查询数据库
        Shop shop = getById(id);
        // 不存在,返回错误
        if (ObjectUtil.isEmpty(shop)) {
            return Result.fail("店铺不存在");
        }
        // 存在,写入redis
        stringRedisTemplate.opsForValue().set(SystemConstants.CACHE_SHOP_KEY + id, JSONUtil.toJsonStr(shop));
        // 返回
        return Result.ok(shop);
    }
}

实现商铺缓存与数据库的双写一致性

先更新后删除
com/hmdp/controller/ShopController.java
 /**
     * 更新商铺信息
     * @param shop 商铺数据
     * @return 无
     */
    @PutMapping
    public Result updateShop(@RequestBody Shop shop) {
//        shopService.updateById(shop);
        return shopService.update(shop);

    }
com/hmdp/service/impl/ShopServiceImpl.java
@Override
    public Result update(Shop shop) {
        Long id = shop.getId();
        if (ObjectUtil.isEmpty(id)) {
            return Result.fail("店铺id不能为空");
        }
        // 更新数据库
        updateById(shop);
        // 删除缓存
        stringRedisTemplate.delete(SystemConstants.CACHE_SHOP_KEY + id);
        return Result.ok();
    }

缓存穿透的解决思路

  • 缓存空对象
    • 优点:实现简单,维护方便
    • 缺点
      • 额外的内存消耗
      • 可能造成短期的不一致

    缓存null的时候加一个TTL

  • 布隆过滤器算法[bitMap数组用Hash值去判断]
    • 优点:内存占用较少,没有多余key
    • 缺点
      • 实现复杂
      • 存在误判可能

缓存击穿的解决思路

  • 互斥锁
  • 逻辑过期

缓存雪崩的解决思路

  • 给不同的key的TTL添加随机值
  • 利用Redis集群提高服务的可用性

  • 给缓存业务添加降级限流策略

  • 给业务添加多级缓存

利用互斥锁解决缓存击穿问题setnx设置一把锁

setnx当key不存在的时候才会写入赋值
del lock释放锁
setnx lock 获取锁赋值

在linux中如果用的docker那么就用它
docker连接redis
首先先找到redis的镜像编码
docker ps
找到以后
docker exec -it 5832be55766e redis-cli

[root@localhost ~]# docker exec -it 5832be55766e redis-cli
127.0.0.1:6379> AUTH pass
OK
127.0.0.1:6379> setnx lock 1
(integer) 1
127.0.0.1:6379> get lock
"1"
127.0.0.1:6379> setnx lock 2
(integer) 0
127.0.0.1:6379> setnx lock 3
(integer) 0
127.0.0.1:6379> setnx lock 2
(integer) 0
127.0.0.1:6379> get lock
"1"
127.0.0.1:6379> del lock
(integer) 1
127.0.0.1:6379> setnx lock 3
(integer) 1
    
--------------------------------------------------------------------------
// 加个有效期TTL 避免锁得不到释放 产生死锁
 private boolean tryLock(String key) {
        Boolean flag = stringRedisTemplate.opsForValue().setIfAbsent(key, "1", 10, TimeUnit.SECONDS);
    // 防止自动拆箱产生空值
        return BooleanUtil.isTrue(flag);
    }

// 释放锁
private void unlock(String key) {
        stringRedisTemplate.delete(key);
    }

SETNX 是 Redis 的一个命令,它是 “SET if Not eXists” 的缩写,用于在键不存在时设置键的值。如果键已经存在,SETNX 命令不会执行任何操作,并返回 0;如果键不存在,它会设置键的值,并返回 1

在分布式锁的实现中,SETNX 命令经常被用来尝试获取锁。如果某个键(通常用作锁的标识)不存在,则设置该键并获取锁;如果键已经存在,表示锁已经被其他客户端持有,因此当前客户端无法获取锁。

以下是 SETNX 命令的基本用法:

SETNX key value
  • key:你想要设置的键名。
  • value:你想要设置的值。

从 Redis 2.6.12 版本开始,SETNX 命令被 SET 命令的一个选项所取代,该选项允许你执行类似于 SETNX 的操作,同时还能设置键的超时时间(过期时间),这在实现分布式锁时非常有用。以下是使用 SET 命令的示例:

SET key value [EX seconds] [PX milliseconds] [NX|XX]
  • EX seconds:设置键的过期时间为 seconds 秒。
  • PX milliseconds:设置键的过期时间为 milliseconds 毫秒。
  • NX:只在键不存在时执行设置操作。
  • XX:只在键已经存在时执行设置操作。

因此,现代的分布式锁实现通常会使用如下命令:

SET lock_key unique_value EX 30 NX

这里,lock_key 是锁的键名,unique_value 是一个确保释放锁时安全的唯一值(通常是当前时间戳加上一个随机数或者客户端ID),EX 30 设置了键的超时时间为30秒,NX 确保只有在键不存在时才设置键。

互斥锁的实现

互斥锁通常用于单机应用,确保同一时刻只有一个线程可以执行某个操作。以下是一个简单的示例:

java

复制

import org.springframework.data.redis.core.StringRedisTemplate;
import org.springframework.data.redis.core.ValueOperations;

public class MutexLock {
    private final StringRedisTemplate redisTemplate;
    private final String lockKey = "mutex_lock_key";

    public MutexLock(StringRedisTemplate redisTemplate) {
        this.redisTemplate = redisTemplate;
    }

    public boolean tryLock() {
        ValueOperations<String, String> ops = redisTemplate.opsForValue();
        // 尝试设置锁,如果设置成功返回true,否则返回false
        return ops.setIfAbsent(lockKey, "locked");
    }

    public void unlock() {
        // 删除锁
        redisTemplate.delete(lockKey);
    }
}

分布式锁的实现

分布式锁用于分布式系统,确保在多个不同的机器或服务中只有一个可以执行某个操作。以下是一个简单的示例:

java

复制

import org.springframework.data.redis.core.StringRedisTemplate;
import org.springframework.data.redis.core.ValueOperations;

public class DistributedLock {
    private final StringRedisTemplate redisTemplate;
    private final String lockKey = "distributed_lock_key";
    private final long lockTimeout = 30000; // 锁超时时间,例如30秒

    public DistributedLock(StringRedisTemplate redisTemplate) {
        this.redisTemplate = redisTemplate;
    }

    public boolean tryLock() {
        ValueOperations<String, String> ops = redisTemplate.opsForValue();
        // 尝试设置锁,并设置超时时间
        Boolean success = ops.setIfAbsent(lockKey, "locked", lockTimeout, TimeUnit.MILLISECONDS);
        return Boolean.TRUE.equals(success);
    }

    public void unlock() {
        // 删除锁
        redisTemplate.delete(lockKey);
    }
}

基于逻辑过期方式解决缓存击穿的问题

不要直接在类中添加逻辑过期的字段,这样对代码不好
① 搞一个RedisData.java 设置一个逻辑过期 然后再去实现继承
② RedisData中搞一个private Object data;
热点数据需要提前导入

封装Redis工具类

基于StringRedisTemplate封装一个缓存工具类,满足下列需求:

方法1:将任意Java对象序列化为json并存储在string类型的key中,并且可以设置TTL过期时间
方法2:将任意Java对象序列化为json并存储在string类型的key中,并且可以设置逻辑过期时间,用于处理缓存击
穿问题
方法3:根据指定的key查询缓存,并反序列化为指定类型,利用缓存空值的方式解决缓存穿透问题
方法4:根据指定的key查询缓存,并反序列化为指定类型,需要利用逻辑过期解决缓存击穿问题

Redis总结

优惠券秒杀—全局唯一ID

全局唯一ID生成策略:

  • UUID
  • Redis自增
  • snowflake算法
  • 数据库自增

Redis自增ID策略:

  • 每天一个Key,方便统计订单量
  • ID构造是 时间戳 + 计数器

添加优惠券秒杀针对特价券

每个店铺都可以发布优惠券,分为平价券特价券

平价券可以任意购买,而特价券需要秒杀抢购:

  • tb_voucher:优惠券的基本信息,优惠金额、使用规则等
  • tb_seckill_voucher优惠券的库存开始抢购时间结束抢购时间。特价优惠券才需要填写这些信息
[root@localhost ~]# docker ps
CONTAINER ID   IMAGE                         COMMAND                  CREATED         STATUS             PORTS                                                                                                                                NAMES
03154afad287   seataio/seata-server:1.4.2    "java -Djava.securit…"   11 months ago   Up About an hour   8091/tcp, 0.0.0.0:9200->9200/tcp, :::9200->9200/tcp                                                                                  seata-server
c34a590a5649   xuxueli/xxl-job-admin:2.1.2   "sh -c 'java -jar /a…"   11 months ago   Up About an hour   0.0.0.0:8280->8080/tcp, :::8280->8080/tcp                                                                                            xxl-job-admin
3574b316b5d2   nacos/nacos-server:1.4.0      "bin/docker-startup.…"   11 months ago   Up About an hour   0.0.0.0:8848->8848/tcp, :::8848->8848/tcp                                                                                            nacos
951e83eb8120   rabbitmq:3.8.3-management     "docker-entrypoint.s…"   11 months ago   Up About an hour   4369/tcp, 5671/tcp, 0.0.0.0:5672->5672/tcp, :::5672->5672/tcp, 15671/tcp, 25672/tcp, 0.0.0.0:15672->15672/tcp, :::15672->15672/tcp   rabbitmq
6561e8458fa2   influxdb:1.8.0                "/entrypoint.sh infl…"   11 months ago   Up About an hour   0.0.0.0:8086->8086/tcp, :::8086->8086/tcp, 0.0.0.0:8088->8088/tcp, :::8088->8088/tcp, 0.0.0.0:9083->8083/tcp, :::9083->8083/tcp      influxdb
5832be55766e   redis:5.0.0                   "docker-entrypoint.s…"   11 months ago   Up About an hour   0.0.0.0:6379->6379/tcp, :::6379->6379/tcp                                                                                            redis
07ecd8b04853   mysql:5.7                     "docker-entrypoint.s…"   11 months ago   Up About an hour   0.0.0.0:3306->3306/tcp, :::3306->3306/tcp, 33060/tcp                                                                                 mysql
[root@localhost ~]# docker exec -it 5832be55766e redis-cli
127.0.0.1:6379> AUTH pass

库存超卖问题分析每秒上百上千的并发

超卖问题是经典的多线程安全问题,针对这一问题的常见解决方案就是加锁:

秒杀 → 一人一单拒绝黄牛

要求:修改秒杀业务,要求同一个优惠券,一个用户只能下一单

集群下线程的并发安全问题

分布式锁 — 基本原理

分布式锁:满足分布式系统或集群模式下多进程可见并且互斥的锁

MySQL Redis Zookeeper
互斥 利用mysql本身的互斥锁机制 利用setnx这样的互斥命令 利用节点的唯一性和有序性实现互斥
高可用
高性能 一般 一般
安全性 断开连接,自动释放锁 利用锁超时时间,到期释放 临时节点,断开连接自动释放

基于Redis的分布式锁

实现分布式锁时需要实现的两个基本方法:获取锁、释放锁

改进Redis的分布式锁

Redis的事务:可以使用看门狗

Redis的Lua脚本利用Lua去调用Redis(确保原子的一致性)

Redis提供了Lua脚本功能,在一个脚本中编写多条Redis命令,确保多条命令执行时的原子性。Lua是一种编程语言,它的基本语法大家可以参考网站:https://www.runoob.com/lua/lua-tutorial.html

redis.call('命令名称', 'key', '其他参数', ...)

例如我们要执行set name jack,则脚本是这样:
redis.call('set', 'name', 'jack')

例如我们要先执行set name Rose,再执行get name,则脚本如下:

# 先执行 set name jack
redis.call('set', 'name', 'jack')

# 再执行 get name
local name = redis.call('get', 'name')

# 返回
return name
执行Lua脚本

写好脚本后,需要用Redis命令来调用脚本,调用脚本的常见命令如下:

127.0.0.1:6379> help @scripting
EVAL script numkeys key [key ...] arg [arg ...]

要执行redis.call('set', 'name', 'jack')这个脚本,语法如下:

# 调用脚本 [0是脚本需要的key类型的参数个数 => 传参的变量]
EVAL "return redis.call('set', 'name', 'jack')"  0
# 不带变量
127.0.0.1:6379> EVAL "return redis.call('set', 'name', 'Jack')" 0
OK
127.0.0.1:6379> keys *
1) "name"
127.0.0.1:6379> get name
"Jack"

如果脚本中的key、value不想写死,可以作为参数传递。key类型参数会放入KEYS数组,其它参数会放入ARGV数组,在脚本中可以从KEYS和ARGV数组获取这些参数:【lua语言数组脚标是从1开始的

# 调用脚本【初始版】
127.0.0.1:6379> EVAL "return redis.call('set', 'name', 'Jack')" 0
# 调用脚本【进阶版】
127.0.0.1:6379> EVAL "return redis.call('set', KEYS[1], ARGV[1])" 1 name Rose
OK
127.0.0.1:6379> get name
"Rose"
127.0.0.1:6379> EVAL "return redis.call('set', KEYS[1], ARGV[1])" 1 name heihei
OK
127.0.0.1:6379> get name
"heihei"

基于Redis的分布式锁

释放锁的业务流程是这样的:

1.获取锁中的线程标示
2.判断是否与指定的标示 (当前线程标示) 一致
3.如果一致则释放锁 (删除)
4.如果不一致则什么都不做

-- 锁的key
-- local key = "lock:order:5"
-- 不能写死就传参
local threadId = KEYS[1]

-- 当前线程标示
-- local threadId = "fagsidajkldw-33"
-- 不能写死就传参
local threadId = ARGV[1]

-- 获取锁中的线程标识 get key
local id = redis.call('get', key)
-- 比较线程标示与锁中的标示是否一致
if(id == threadId) then
   -- 释放锁 del key
   return redis.call('del', key)
end
return 0

----------------------------- 进阶版 -------------------------------
-- 获取锁中的线程标识 get key
local id = redis.call('get', KEYS[1])
-- 比较线程标示与锁中的标示是否一致
if(id == ARGV[1]) then
   -- 释放锁 del key
   return redis.call('del', KEYS[1])
end
return 0
----------------------------- 进阶简化版 -------------------------------
-- 这里KEYS[1]就是锁的Key, 这里的ARGV[1],就是当前线程标示
-- 获取锁中的标示,判断是否与当前线程标示一致
if(redis.call('GET', KEYS[1]) == ARGV[1]) then
    -- 一致,则删除锁
    return redis.call('DEL', KEYS[1])
end
-- 不一致 直接返回
return 0

再次改进Redis的分布式锁经典白雪

基于Redis的分布式锁实现思路
利用setnx ex获取锁,并设置过期时间,保存线程标示
释放锁时先判断线程标示是否与自己一致,一致则删除锁

特性:
利用set nx满足互斥性
利用set ex保证故障时锁依然能释放,避免死锁,提高安全性
利用Redis集群保证高可用和高并发特性

需求:基于**Lua脚本**实现分布式锁的释放锁逻辑
提示:RedisTemplate调用Lua脚本的API如下:

com/hmdp/utils/SimpleRedisLock.java
package com.hmdp.utils;

import cn.hutool.core.lang.UUID;
import org.springframework.core.io.ClassPathResource;
import org.springframework.data.redis.core.StringRedisTemplate;
import org.springframework.data.redis.core.script.DefaultRedisScript;

import java.util.Collections;
import java.util.concurrent.TimeUnit;

public class SimpleRedisLock implements ILock {

    // 不同业务不同锁
    private String name;
    private StringRedisTemplate stringRedisTemplate;
    private static final String KEY_PREFIX = "lock:";
    private static final String ID_PREFIX = UUID.randomUUID().toString(true) + "-";
    private static final DefaultRedisScript<Long> UNLOCK_SCRIPT;

    // 是静态的要在静态代码块里面做初始化 这个类一加载 这个代码块就初始化完成了 不用每次释放锁再加载
    static {
        UNLOCK_SCRIPT = new DefaultRedisScript<>();
        UNLOCK_SCRIPT.setLocation(new ClassPathResource("unlock.lua"));
        UNLOCK_SCRIPT.setResultType(Long.class);
    }

    public SimpleRedisLock(String name,
                           StringRedisTemplate stringRedisTemplate) {
        this.name = name;
        this.stringRedisTemplate = stringRedisTemplate;
    }

    @Override
    public boolean tryLock(long timeoutSec) {
        // 获取线程标识
        String threadId = ID_PREFIX + Thread.currentThread().getId();
        // 获取锁
        Boolean success = stringRedisTemplate.opsForValue()
                .setIfAbsent(KEY_PREFIX + name,
                        threadId,
                        timeoutSec,
                        TimeUnit.SECONDS);
        // 自动拆箱避免空指针风险
        return Boolean.TRUE.equals(success);
    }

    @Override
    public void unLock() {
        // 调用lua脚本
        stringRedisTemplate.execute(
                UNLOCK_SCRIPT,
                // 制造单集合
                Collections.singletonList(KEY_PREFIX + name),
                ID_PREFIX + Thread.currentThread().getId());
    }

    //    public void unLock() {
//        // 获取线程标识
//        String threadId = ID_PREFIX + Thread.currentThread().getId();
//        // 获取锁
//        String id = stringRedisTemplate.opsForValue().get(KEY_PREFIX + name);
//        // 判断锁是否ours
//        if (threadId.equals(id)) {
//            // 解锁
//            stringRedisTemplate.delete(KEY_PREFIX + name);
//        }
//    }
}

基于Redis的分布式锁优化

基于setnx实现的分布式锁存在下面的问题:
  • 不可重入:同一个线程无法多次获取同一把锁
  • 不可重试:获取锁只尝试一次就返回false,没有重试机制
  • 超时释放:锁超时释放虽然可以避免死锁,但如果是业务执行耗时较长,也会导致锁释放,存在安全隐患
  • 主从一致性:如果Redis提供了主从集群 [写操作访问主节点,读操作访问从节点],主从同步存在延迟,当主宕机时,如果从并同步主中的锁数据,则会出现锁实现

Redisson

Redisson是一个在Redis的基础上实现的]ava驻内存数据网格(In-MemoryData Grid)。它不仅提供了一系列的分布式的Java常用对象,还提供了许多分布式服务,其中就包含了各种分布式锁的实现。

Redisson—官方网站
Redisson—GitHub地址

Redisson可重入锁原理

package com.hmdp;

import lombok.extern.slf4j.Slf4j;
import org.junit.jupiter.api.BeforeEach;
import org.junit.jupiter.api.Test;
import org.redisson.api.RLock;
import org.redisson.api.RedissonClient;
import org.springframework.boot.test.context.SpringBootTest;

import javax.annotation.Resource;
import java.util.concurrent.TimeUnit;

@Slf4j
@SpringBootTest
class RedissonTest {

    @Resource
    private RedissonClient redissonClient;

    private RLock lock;

    @BeforeEach
    void setUp() {
        lock = redissonClient.getLock("order");
    }

    @Test
    void method1() throws InterruptedException {
        // 尝试获取锁
        boolean isLock = lock.tryLock(1L, TimeUnit.SECONDS);
        if (!isLock) {
            log.error("获取锁失败 .... 1");
            return;
        }
        try {
            log.info("获取锁成功 .... 1");
            method2();
            log.info("开始执行业务 ... 1");
        } finally {
            log.warn("准备释放锁 .... 1");
            lock.unlock();
        }
    }
    void method2() {
        // 尝试获取锁
        boolean isLock = lock.tryLock();
        if (!isLock) {
            log.error("获取锁失败 .... 2");
            return;
        }
        try {
            log.info("获取锁成功 .... 2");
            log.info("开始执行业务 ... 2");
        } finally {
            log.warn("准备释放锁 .... 2");
            lock.unlock();
        }
    }
}

Redisson的锁重试和WatchDog机制

基于Redis的分布式锁优化
基于setnx实现的分布式锁存在下面的问题:

不可重入:同一个线程无法多次获得同一把锁
不可重试:获取锁只尝试一次就返回false,没有重试机制
超时释放:锁超时释放虽然可以避免死锁,但如果是业务执行耗时较长,也会导致锁释放,存在安全隐患
主从一致性:如果Redis提供了主从集群主从同步存在延迟,当主宕机时,如果从并同步主中的锁数据,则会出现锁实现

阅读全文
头像
Asuna
You are the one who can always get to me even with screen between us.