技术文章

  • 乐观锁和悲观锁

    2014-10-06 11:34:00 25581 0 技术文章

    乐观锁和悲观锁是两种并发控制策略,用于解决多线程或多进程访问同一资源时的数据一致性问题。

    乐观锁

    • 概念:假设数据很少被修改,因此不会在数据访问前加锁。
    • 机制:读取数据时不加锁,更新时检查数据是否被修改(通常通过版本号或时间戳)。如果数据没有变化,则提交修改;否则,操作失败,需要重试。
    • 适用场景:适合读多写少的场景,避免因频繁加锁导致的性能问题。

    悲观锁

    • 概念:假设数据会被频繁修改,因此在访问前加锁。
    • 机制:读取或修改数据时加锁,确保同一时间只有一个事务可以操作数据。其他尝试获取锁的事务会被阻塞,直到锁被释放。
    • 适用场景:适合写多读少的场景,需要严格控制数据一致性。

    例子

    • 乐观锁:电商网站的库存管理系统,用户读取商品信息时不加锁,提交订单时检查库存是否改变。
    • 悲观锁:银行转账系统,在进行账户余额更新时加锁,以确保数据一致性。

    选择使用哪种锁策略取决于系统的读写比例和对并发的要求。

    • 共享锁和排它锁

      2014-10-01 10:23:40 25625 0 技术文章

      两种锁的概念

      共享锁(Shared Lock,S锁)

      • 允许多个事务同时读取数据,但不允许修改数据。
      • 其他事务可以获取共享锁,但不能获取排它锁。

      排它锁(Exclusive Lock,X锁):

      • 独占数据的访问权,禁止其他事务读取或修改。
      • 在事务持有排它锁期间,其他事务不能获取共享锁或排它锁。

      这两种锁机制确保了数据的一致性和完整性。

      两种锁的使用场景

      共享锁(Shared Lock, S锁)

      假设有两个用户,用户A和用户B,他们都想读取同一条记录。用户A获取了该记录的共享锁,因此可以读取数据。同时,用户B也可以获取共享锁来读取相同的数据,因为共享锁允许多个读操作并发进行。

      排它锁(Exclusive Lock, X锁)

      现在,用户A想要修改这条记录,他需要获取排它锁。此时,用户B不能获取任何锁(包括共享锁和排它锁)来访问该记录,直到用户A完成修改并释放排它锁。这样保证了数据的一致性和防止并发写入冲突。

      • Ubuntu 下快速启用 Apache2 的 rewrite 方法

        2014-09-02 10:14:50 23390 0 技术文章
        a2enmod rewrite
        service apache2 restart
        

        sudo vim /etc/apache2/sites-enabled/000-default

        AllowOverride None
        

        全部改成

        AllowOverride All
        
        • 解决 GitHub 无法更新的问题

          2014-08-23 15:26:00 25147 0 技术文章

          前提是安装了 shadowsocks

          git config --global https.proxy 'socks5://127.0.0.1:1080'
          
          • MySQL 5.7.9 报错 “this is incompatible with sql_mode=only_full_group_by”

            2014-08-15 12:59:00 28147 0 技术文章
            mysql> set global sql_mode='STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION';
            mysql> set session sql_mode='STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION';
            
          • Linux 命令行输入的命令的操作技巧

            2014-08-03 15:26:00 26424 0 技术文章
            ctrl + r //可以在历史的命令中搜索
            ctrl + a //光标移到命令行的开始位置
            ctrl + e //光标移到命令行的结束位置
            
            ctrl + f //光标向前移动
            ctrl + b //光标向后移动
            
            ctrl + u //清除当前命令行
            ctrl + c //直接转到下一行
            
          • CentOS 报错:yum-config-manager: 未找到命令

            2014-07-15 20:01:05 29672 0 技术文章

            这是因为系统默认没有安装这个命令,这个命令在 yum-utils 包里,可以通过命令 yum -y install yum-utils 安装就可以了。

          • FastCGI sent in stderr: "Primary script unknown" while reading response header from upstream

            2014-06-26 10:15:00 25921 0 技术文章

            错误原因及解决方法:

            fastcgi_param  SCRIPT_FILENAME  /scripts$fastcgi_script_name;
            

            而 Nginx 识别不到 /scripts 路径,所以 phpinfo 验证信息就无法正常通过,需要修改如下:

            fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
            

            注意:$document_root 代表当前请求在 root 指令中指定的值。

            • CentOS 服务器搭建 Shadowsockets 教程

              2014-06-20 15:25:00 29050 0 技术文章
              yum install python-setuptools m2crypto supervisor
              easy_install pip
              pip install shadowsocks
              
              /usr/bin/python /usr/bin/ssserver -p 443 -k yourpassword -m aes-256-cfb --user nobody -d start
              
            • 解决错误:nginx: [emerg] unknown log format "main"

              2014-06-14 21:10:00 26935 0 技术文章

              重启 nginx 出现了如下错误:

              nginx: [emerg] unknown log format "main" in /usr/local/nginx/conf/nginx.conf:34
              

              解决办法:

              打开 nginx.conf,"main" 错误是因为丢失了 log_format 选项,把 log_format 所在行的注释去掉就 OK 了。

              • Windows 修改 Caps Lock 为 Control 键

                2014-05-25 15:36:00 26452 0 技术文章

                保存以下内容到 ChangeCapsToControl.reg

                Windows Registry Editor Version 5.00
                
                [HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Keyboard Layout]
                "Scancode Map"=hex:00,00,00,00,00,00,00,00,02,00,00,00,1d,00,3a,00,00,00,00,00
                

                双击替换成功!

                • 关于 phpMyAdmin 免输入用户名和密码,直接进入管理界面

                  2014-02-21 19:52:15 24066 1 技术文章

                  下载最新版的phpMyAdmin包,解压到网站根目录,进入phpMyAdmin的目录找到libraries下面的config.default.php文件,打开,可以看见大大的[DO NOT EDIT]字样,哈哈,我就是要DO IT!!!!

                  • 图片延迟加载技术(ImageLazyLoad)

                    2014-02-08 15:59:35 24783 0 技术文章

                    ImageLazyLoad 技术,就是在下拉滚动条的时候加载图片,这种比较适合一个网页上有很多图片的情况,例如某个页面都是图片,那么如果用户访问的时候,会在加载完整个页面等待很长时间,而用第一眼看到的只是第一屏的内容,所以第二屏、第三屏等的内容加载时间其实是在浪费时间!

                    • .gitignore 添加后无效的解决办法

                      2014-01-18 20:30:00 26299 0 技术文章

                      我们在项目中经常会出现 .gitignore 修改后并没有忽略掉我们已经添加的文件,那是因为 .gitignore 对已经追踪 (track) 的文件是无效的,需要清除缓存,清除缓存后文件将以未追踪的形式出现,这时重新添加 (add) 并提交 (commit) 就可以了。

                      // 不要忘了后面的 . 
                      git rm -r --cached .
                      git add .
                      git commit -m "comment"
                      
                    • composer 版本号 ~ 与 ^ 符号的区别

                      2013-12-26 12:25:00 25950 0 技术文章

                      ~1.2.31.2.3 <= version < 1.3.0 ^1.2.31.2.3 <= version < 2.0.0

                    • Linux 的 chattr 与 lsattr 命令详解

                      2013-11-24 15:26:00 25481 0 技术文章

                      chattr命令的用法:chattr [ -RVf ] [ -v version ] [ mode ] files… 最关键的是在[mode]部分,[mode]部分是由+-=和[ASacDdIijsTtu]这些字符组合的,这部分是用来控制文件的 属性。

                      + :在原有参数设定基础上,追加参数。
                      - :在原有参数设定基础上,移除参数。
                      = :更新为指定参数设定。
                      A:文件或目录的 atime (access time)不可被修改(modified), 可以有效预防例如手提电脑磁盘I/O错误的发生。
                      S:硬盘I/O同步选项,功能类似sync。
                      a:即append,设定该参数后,只能向文件中添加数据,而不能删除,多用于服务器日志文件安全,只有root才能设定这个属性。
                      c:即compresse,设定文件是否经压缩后再存储。读取时需要经过自动解压操作。
                      d:即no dump,设定文件不能成为dump程序的备份目标。
                      i:设定文件不能被删除、改名、设定链接关系,同时不能写入或新增内容。i参数对于文件 系统的安全设置有很大帮助。
                      j:即journal,设定此参数使得当通过mount参数:data=ordered 或者 data=writeback 挂 载的文件系统,文件在写入时会先被记录(在journal中)。如果filesystem被设定参数为 data=journal,则该参数自动失效。
                      s:保密性地删除文件或目录,即硬盘空间被全部收回。
                      u:与s相反,当设定为u时,数据内容其实还存在磁盘中,可以用于undeletion。
                      

                      各参数选项中常用到的是a和i。a选项强制只可添加不可删除,多用于日志系统的安全设定。而i是更为严格的安全设定,只有superuser (root) 或具有CAP_LINUX_IMMUTABLE处理能力(标识)的进程能够施加该选项。

                    • Linux 中命令执行控制 && 与 || 的区别

                      2013-09-14 10:25:00 25440 0 技术文章

                      1、&& 方式:command1 && command2 如果command1执行成功,则执行command2

                      2、|| 方式:command1 || command2 如果command1执行失败,则执行command2

                    • PHP 5.4 的新特性

                      2013-07-02 10:56:53 23728 3 技术文章
                      • 命名空间 (Namespace)
                      • 匿名函数
                      • 数组短语法形式:[1,2,3] 取代 array(1,2,3)。这在多维数组、嵌套数组中,代码更清晰、简短。
                      • 在视图文件中使用 PHP 的 <?= 标签,取代 echo 语句。
                      • 标准PHP库 (SPL) 类和接口,具体可以查看 SPL Class and Interface
                      • 延迟静态绑定, 具体可以查看 Late Static Bindings
                      • PHP 标准日期时间
                      • 特质 (Traits)
                      • 使用 PHP intl 扩展实现国际化支持
                    • 网页禁止右键和复制

                      2013-01-16 17:00:14 39637 0 技术文章
                      <SCRIPT LANGUAGE=javascript>
                      function click() {
                      alert('Forbidden') }
                      function mdown() {
                      if (event.button==2) {alert('Forbidden') }}
                      function CtrlKeyDown(){
                      if (event.ctrlKey) {alert('Forbidden') }}
                      document.onkeydown=CtrlKeyDown;
                      document.onselectstart=click;
                      document.onmousedown=mdown;
                      </SCRIPT>
                      
                      • Nginx 使用 htpasswd 生成密码认证

                        2012-10-08 10:26:58 28570 0 技术文章

                        安装 httpd-tools

                        yum install -y httpd-tools
                        

                        htpasswd 命令需要先安装 httpd-tools

                        修改 nginx.conf

                        # xxx.cuiliang.com
                        server {
                            listen       80;
                            server_name  xxx.cuiliang.com;
                            auth_basic "密码提示语";
                            auth_basic_user_file /usr/local/nginx/conf/htpasswd.users;
                        
                            location / {
                                //...
                            }
                        }
                        

                        使用 htpasswd 生成密码

                        htpasswd -b /usr/local/nginx/conf/htpasswd.users
                        

                        输入密码,再次确认密码,提示成功,OK!

                        重启 nginx

                        /usr/local/nginx/sbin/nginx -s reload
                        

                        重启生效