Cache Aside

Question & Answer 1. 什么是 cache aside 模式 Cache aside 可能是最常用的缓存方法。此策略规定缓存必须位于一侧,并且应用程序将直接与缓存和数据库通信。 Cache aside通常是通用的,最适合读取密集型工作负载。 缓存流程 查询策略 +---------------------+ | 查询缓存数据 | +---------------------+ | v +---------------------+ | 缓存命中?(是/否) | +---------------------+ | | |是 |否 v v +---------+ +---------------------+ | 返回数据 | | 查询数据库 | +---------+ +---------------------+ | v +---------------------+ | 将数据写入缓存 | +---------------------+ | v +---------------------+ | 返回数据 | +---------------------+ 更新策略 +---------------------+ | 数据更新请求 | +---------------------+ | v +---------------------+ | 更新数据库 | +---------------------+ | v +---------------------+ | 删除缓存或使之失效 | +---------------------+ 2....

November 29, 2024 · 1 min · LwQ

Efficient AI Practice

Question 针对prompt engineering 的特点,描述在使用 gemini 时应该怎么做从而获取更加准确的答案 Answer 明确且具体的问题 避免模糊不清的提问:尽量使用明确的动词和名词,避免使用“大概”、“可能”等模糊词语。 提供背景信息:如果问题涉及到特定的领域或知识,提供相关的背景信息能帮助模型更好地理解你的需求。 限定回答范围:如果希望得到特定类型的答案(例如:总结、比较、分析),明确提出你的要求。 多次尝试,微调Prompt 不断迭代:如果第一次得到的答案不理想,可以尝试修改Prompt,例如调整关键词、改变提问方式等。 拆分问题:如果问题过于复杂,可以尝试将其拆分成几个小问题,逐一解决。 提供反馈:如果模型的回答与你的预期不符,可以提供具体的反馈,帮助模型改进。 充分利用Gemini的优势 上下文理解:Gemini具有强大的上下文理解能力,你可以将相关信息(例如:文章、对话记录)作为Prompt的一部分,帮助模型更好地理解你的问题。 多模态能力:如果有图片、视频等多模态信息,可以尝试将它们融入到Prompt中,获取更全面的答案。 推理能力:Gemini具备一定的推理能力,你可以提出一些需要推理的问题,例如“根据以下信息,你认为……?” 注意Prompt的技巧 使用引导词:使用“请”、“告诉我”、“解释一下”等引导词,可以帮助模型更好地理解你的意图。 使用限定词:使用“简要”、“详细”、“举例说明”等限定词,可以控制答案的长度和风格。 使用开放式问题:如果希望得到更深入的答案,可以尝试使用开放式问题,例如“你认为……的原因是什么?” 参考 what is prompt-engineering

September 25, 2024 · 1 min · LwQ

Database Normalization

目标 试图搞清楚1NF、2NF、3NF的规范含义 试图找到一种范式与非范式之间的平衡应用与日常开发 题目 给定以下数据表,参考数据库设计范式进行结构优化,可以输出ER图或者表定义 表结构 CREATE TABLE Orders ( order_id INT PRIMARY KEY, -- 订单ID customer_name VARCHAR(255), -- 客户名称 customer_address VARCHAR(255), -- 客户地址 order_date DATETIME, -- 订单日期 product_id INT, -- 产品ID product_name VARCHAR(255), -- 产品名称 quantity INT, -- 数量 unit_price DECIMAL(10, 2), -- 单价 total_price DECIMAL(10, 2), -- 总价 sales_rep_id INT, -- 销售代表ID sales_rep_name VARCHAR(255), -- 销售代表名称 sales_rep_phone VARCHAR(20), -- 销售代表电话 delivery_date DATETIME, -- 交货日期 payment_method VARCHAR(50), -- 支付方式 payment_status VARCHAR(50) -- 支付状态 ); 表数据例子 order_id customer_name customer_address order_date product_id product_name quantity unit_price total_price sales_rep_id sales_rep_name sales_rep_phone delivery_date payment_method payment_status 1 A 华盛顿特区宾夕法尼亚大道1600号 2023-08-01 14:00:00 101 笔记本电脑 2 800....

August 29, 2024 · 2 min · LwQ

Docker Storage

Q1:docker 数据管理有哪几种方式,各有什么特点 volume 由docker管理,不应被其他进程更改 持久化的 可由多个容器复用 支持卷驱动(可远程存储) bind mount 可在宿主机任意位置 可被其他进程更改 持久化的 可由多个容器复用 tmpfs mount 存储在宿主机内存中,可快速读写,不会写入持久存储设备 容器停止或重启时,tmpfs的数据可以自动清除 Q2:每种数据管理方式使用场景举一个例子 volume 挂载数据库数据文件 bind mount 挂载配置文件 tmpfs mount 用做缓存目录,如nginx的proxy_cache_path 参考 https://docs.docker.com/storage/

July 25, 2024 · 1 min · LwQ

Go Trace

Q1:请使用 runtime/trace 包,写一个使用trace的例子 启动两个goroutine,记录trace func main() { f, err := os.Create("trace.out") if err != nil { log.Fatalf("failed to create trace file: %v", err) } defer f.Close() if err := trace.Start(f); err != nil { log.Fatalf("failed to start trace: %v", err) } defer trace.Stop() var wg sync.WaitGroup wg.Add(2) go wait(&wg) go sum(&wg) wg.Wait() } func wait(wg *sync.WaitGroup) { defer wg.Done() time.Sleep(2 * time.Second) } func sum(wg *sync.WaitGroup) { defer wg.Done() i, s := 0, 0 ch := time....

May 29, 2024 · 1 min · LwQ

Go插件的使用

Q1:说明 go plugin 使用场景,并编写一个使用 plugin 的 demo Go plugin支持将Go包编译为共享库(.so)的形式单独发布,主程序可以在运行时动态加载这些编译为动态共享库文件的go plugin,从中提取导出(exported)变量或函数的符号并在主程序的包中使用。Go plugin的这种特性为Go开发人员提供更多的灵活性,我们可以用之实现支持热插拔的插件系统。 demo 通过不同插件实现io.StringWriter,可将输出保存到不同地方 plugin/plugin.go package main import ( "fmt" "log" "os" ) func init() { log.Println("stdoutStringWriter init") } type stdoutStringWriter struct{} func (w *stdoutStringWriter) WriteString(s string) (n int, err error) { return fmt.Fprint(os.Stdout, s) } var StringWriter stdoutStringWriter main.go package main import ( "io" "log" "plugin" ) func main() { log.SetFlags(log.Lshortfile | log.LstdFlags) p, err := plugin.Open("./plugin/plugin.so") if err != nil { panic(err) } w, err := p....

May 29, 2024 · 1 min · LwQ

SSH隧道和HTTP代理

使用 ncat 创建HTTP代理 # 无法代理DEL等特殊Method ncat -l --proxy-type http localhost 8888 本地端口转发 (访问本地端口 = 访问远程可以访问的端口) ssh -L [local_addr:]local_port:remote_addr:remote_port [user@]sshd_addr 远程端口转发 (访问远程端口 = 访问本地可以访问的端口) ssh -R [remote_addr:]remote_port:local_addr:local_port [user@]gateway_addr ssh命令端口转发相关参数 -N 不执行远程命令. 用于转发端口. (仅限协议第二版) -g 允许远端主机连接本地转发的端口 -f 在执行命令前退至后台 运用 # 在A服务器(172.20.144.200)开启HTTP代理,外网需VPN登录 ncat -l --proxy-type http localhost 8888 # PC挂VPN,本地8888端口转发至服务器A代理服务 # 执行后可以通过Top等命令保活 ssh -gL 8888:172.20.144.200:8888 user_name1@172.20.144.200 # 再将PC的8888端口转发至192.168.0.50:55555 ssh -NfgR 55555:localhost:8888 user_name2@192.168.0.50 # 至此,所有可以访问192.168.0.50:55555的机器都可以在浏览器插件或者系统代理配置HTTP代理 # 然后访问A服务器所在网络的网站等HTTP服务了

March 22, 2024 · 1 min · LwQ

Git命令

换行符 CRLF CR LF merge时忽略行尾对比 git config --global merge.renormalize true 提交混合LF、CRLF时产生警告 # false允许 true禁止 git config --global core.safecrlf warn 自动把\r\n换为\n # false 不做处理 # true 自动更换crlf,win下checkout时\n自动换为\r\n,在提交时在自动换回\n git config --global core.autocrlf input 删除分支 直接删除远程lwq分支 git push origin -d lwq 删除本地的分支(远程已经删除的) git remote prune origin 删除 readme.md 的跟踪 并保留在本地 git rm --cached readme.md 并且删除本地文件 git rm --f readme.md Git 文件还原 追踪的文件更改未提交: git checkout . 清除未追踪追踪的文件(夹) git clean -dff 还原文件至上上次提交 git reset --hard HEAD^^ 还原commit(文件不动)至上上次提交 git reset --soft HEAD^^

March 21, 2024 · 1 min · LwQ

How to build the blog

搭建流程 # Install hugo, build from source(go): go install -tags extended github.com/gohugoio/hugo@latest hugo version # Create a new site hugo new site MyFreshWebsite --format yaml # replace MyFreshWebsite with name of your website # Install theme: PaperMod # Inside the folder of your Hugo site `MyFreshWebsite`, run: git submodule add --depth=1 https://github.com/adityatelange/hugo-PaperMod.git themes/PaperMod git submodule update --init --recursive # needed when you reclone your repo (submodules may not get cloned automatically) # In `config....

March 20, 2024 · 1 min · LwQ