分类 Technology 下的文章

访问量较大的站点中,关键数据的展示有时候不是实时更新的,用户在访问这些数据的时候如果每次都从数据库中调取,则会浪费很多不必要的资源!
加上缓存的话,则会让数据的读取更快,同时大大减少了资源的浪费!缓存就这么因运而生了。

首先我们先来看下如何正确的使用缓存!

缓存更新的套路

大多人的思路是在有新数据加入的时候,删除原有缓存,更新数据库,在将新数据放入缓存中去!
然而!这个逻辑是有漏洞的。试想如果两个并发操作同时进来,一个更新操作,一个查询操作,更新操作删除缓存之后,查询操作没有命中缓存,将原有数据查询放入缓存中去,然后更新操作更新了数据库!
这就导致缓存数据是原来的老数据,并且一直会这样下去!

更新缓存

四种Design Pattern:

  1. Cache aside
  2. Read through
  3. Write through
  4. Write behind caching

最常用是是第一种 Cache aside .具体逻辑如下:

  • 失效 先从cache中去数据,没取到则去DB中取出来,在放入cache中去
  • 命中 从cache中取到数据返回
  • 更新 更新DB,更新成功之后再让cache失效

这种pattern其实也是有极小的概率会出现脏数据的。不过外部设置缓存过期时间则会减少这种情况的出现!

其余几种pattern这里不介绍了,详细请看参考链接

laravel 中使用缓存

框架自带了缓存配置,可以在config/cache.php中配置具体的缓存功能

常用的方法

创建缓存

Cache::put('key', 'value', 10);//键名、值、过期时间(分钟)

此外,我们也可以用 remember() 方法自动获取和更新一个缓存值。该方法首先检查 键名 是否存在,如果已经创建则返回结果。否则它会创建新的 键名 ,并用闭包返回结果进行赋值,就象下面:

Cache::remember('articles', 15, function() {
    return Article::all();
});

参数 15 是要缓存的分钟数。这样的话,我们甚至根本不必检查缓存是否过期。Laravel 不仅会替我们打理,而且会获取或重新生成该缓存,不需要我们显式地告诉它如何操作。

检索缓存

在更新或者取回缓存值之前判断这个缓存的key是否存在是很有必要的,使用 has() 方法就可以实现:

if (Cache::has('key')){
    Cache::get('key');
} else {
    Cache::put('key', $values, 10);
}

删除缓存

Cache::forget('key');

#我们也可以检索缓存值并删除它。我喜欢把这个称为一次性缓存:
$articles = Cache::pull('key');

#使用以下命令在缓存过期前就把所有缓存清楚掉:
$ php artisan cache:clear

Controller 中使用缓存

public function index() {
    $articles = Cache::remember('articles', 22*60, function() {
        return Article::all();
    });
    return response()->json($articles);
}

<span id=reference-link>参考链接</span>

  1. 知乎
  2. 酷壳

今天收到客户那边发过的一个函...

客户一个项目被上级查到有安全漏洞,源码都能被人家拉下来!!!
函中明确写明了是通过.git这个文件夹,使用脚本将源码拉下来了...

第一反应是这是什么操作,细想之后确实是可以的,每次commit都会在.git这个文件夹中记录,对这些提交进行解析
那轻轻松松得到源码了.

不过解决这个问题还是有很多办法的

  • 将这个文件夹删除,不建议,代码维护起来艰难.
  • 给这个文件夹减权,使web软件如Nginx无法访问,给个600这类的权限.
  • 将web入口文件放到里层目录中去(Laravel就是如此).

最近写代码的状态真是不得了,两周时间做出一个项目出来了,并且在这之间使用的都是新技术
Vue,Laravel。这两周时间对个人能力的提升相当于半年的积累了。哈哈

有一个段子吐槽程序员的加班

程序员去面试
HR问他:简历上显示毕业到现在才2年,为何工作经验写的是三年?

程序员说:多出来的一年是加班加出来的...

今天看了下WakaTime的统计,上周五居然写了10个小时的代码!!!我自己都佩服我自己了!

放几张图Mark一下

由于使用CDN域名没有HTTPS连接,导致站点变成混合模式。暂先去掉图片链接!

picture
picture
picture

一般会自动更新,但是有时会失败,这时候就需要手动运行命令进行更新

sudo /usr/local/python/bin/certbot renew --force-renewal #强制更新

sudo /usr/local/python/bin/certbot renew #自动更新脚本

有很大的原因是因为当初创建证书的时候: DNS problem: NXDOMAIN looking up A for xxx.com 导致的

服务器上的DNS缓存未更新.

使用 nscd工具更新服务器DNS缓存

安装:

sudo apt-get install nscd

更新DNS缓存

sudo nscd -i hosts

#还可以更新passwd、group
sudo nscd -i passwd
sudo nscd -i group

如果以上两种方法都失效的话,将nginx配置文件备份,使用脚本重新生成

sudo cp /usr/local/nginx/conf/vhost/blog.happyhack.cn.conf{,_`date +%m%d`}

 注意重启nginx!

参考http://www.ptbird.cn/let-s-encrypt-ssl-dns-probles.html

  #scp下载远程服务器的文件
    scp root@chance_dev:/root/bak.sql ~/

    #sed 命令
    sed -i '2s/\#//g' ~/.zshrc &&\
    sed -i 's/plugins=(git)/plugins=(git zsh-autosuggestions z zsh-syntax-highlighting)/g' ~/.zshrc &&\

    # 将本地分支推送至远程
    gp origin price:amount/dong
    git push origin HEAD:new/branch
    #删除远程分支
    git push origin :remote/branch
    git push origin --delete <branchName> 删除远程分支, git branch -d <branchName> 删除远程分支
    git push origin --delete tag <tagname> 删除远程**tag**
    git stash 将当前分支中未提交的commit暂存起来(暂存工作现场,去别的分支coding),可以多次**stash**
    git stash list 列出当前分支存储的工作现场(未提交的代码),
    git stash apply stash@{0} 指定恢复某一个**stash**
    git stash apply 恢复分支中暂存的工作现场(未提交的代码), git stash drop 删除暂存的工作现场
    git stash pop 恢复分支中暂存的commit,同事暂存的commit也删除了
    git status -s 命令打印出来的信息前面 AM 意思是文件在我们添加到缓存之后又有改动(不是最新的) D 表示文件目前被删除了 ...等等 (这些以后再添加)
    git config --global core.autocrlf input *git add*  的时候出现warning :LF will be replaced by CRLF 警告。是在两个系统中空格和换行不一样
    git reset HEAD  取消缓存已缓存的内容,取消之前git add添加但不包含在下一提交快照中的缓存
    git log 查看Git 操作命令记录(提交记录)
    git reglog 查看命令历史
    git reset --hard 撤销一次提交(commit)
    git reset --hard 2345d 指向2345d版本(回滚到2345d那次提交)
    git revert 2345d 撤销2345d的提交,将这次回滚写入提交记录,以便推送到远程仓库(多人合作)
    git branch 命令没有参数的时候,列出本地的分支,所在的分支行首会有一个*号
    git branch <分支名> 创建一个新的分支 git checkout <分支名> 切换到指定分支。
    git checkout -b <分支名> 如果分支存在则切过去,不存在则创建切过去。
    git branch -d <分知名> 删除一个分支。
    git push origin --delete <branchName> 删除远程分支。
    git merge 将一个分支并入当前的分支中去
    git tag xxx 给历史记录中的某个重要时刻打上一个标签,git tag -a < ooxx>  给这个标签注释
    git diff --shortstat "@{0 day ago}"  查看今天写了多少代码
    ssh-keygen -t rsa -b 4096 -C "hi.wudong#gmail.com" 创建sshkey
    .gitignore 文件用于忽略文件的进行提交。前提是该文件没有写入快照中!( .gitignore只适用于尚未添加到git库的文件。如果已经添加了,则需用 git rm --cached移除后再重新commit)
    git push origin --delete branchname4 删除本地或者远程一个分支
    git remote set-url origin [url] Git修改远程仓库地址 OR 先删后加 git remote rm origin
    git remote add origin [url]

Git 同步Fork过来的分支

  1. 添加Fork过来的仓库地址

     `git remote add (fork_address) git@github.com/....`
  2. 拉取Fork仓库的

     `git fetch fork_address`
  3. 切换到本地分支

     `git checkout master`
  4. 将fork_address 分支合并到本地分支 本地的 master 分支便跟上游仓库保持同步了,并且没有丢失你本地的修改。

     `git merge fork_address/master`
  5. 本地分支已经跟Fork过来的分支同步了,同时要推送到远程仓库中去

     `git pull origin master`