分类 nosql 下的文章

2016
01-08

memcache和memcached的区别

前两天,大家在群里讨论memcache缓存时,有群友提到了在memcache中如何存储数组,并如何直接通过数组索引取值的问题?当时,大家的回答基本一致是memcache是key-value形式的内存缓存系统。对于缓存key,只能是string类型,而无法存储array类型的key。虽然大家的理解基本保持一致,但是本着求证的态度,我还是查阅了php官方文档。官方示例代码如下:

<?php
$m = new Memcached();
$m->addServer('localhost', 11211);

$items = array(
    'key1' => 'value1',
    'key2' => 'value2',
    'key3' => 'value3'
);
$m->setMulti($items);
$result = $m->getMulti(array('key1', 'key3', 'badkey'), $cas);
var_dump($result, $cas);
?>

以上代码的输出如下:

array(2) {
  ["key1"]=>
  string(6) "value1"
  ["key3"]=>
  string(6) "value3"
}
array(2) {
  ["key1"]=>
  float(2360)
  ["key3"]=>
  float(2362)
}

Memcached::setMulti()类似于Memcached::set(),它是一次存储多个key/value元素,以便于对多个元素的操作。之前我理解为key可以是array数组,但实际上并不是。setMulti()方法相当于是多次调用set()方法存储数据。在这里谢谢@乌大湿的指点。群友的问题暂时无解,那代码中的memcached和我们平常认知的memcache有何不同?

查看全文 >
2015
09-18

数据插入失败引发的主键auto_increment问题

昨天在调试一个业务代码中,无意间发现了一个问题。数据入库后的主键不是连续自增的,主键键值没过几秒就从两千多直接跳到了五千上下。这是为什么?瞬间引起我的注意。

先简单说明下环境。Mysql版本:5.6.23。为了防止某些数据重复,数据库中对某些字段设置了唯一索引,即unique key。经确认此表也只有一个业务程序在操作。那么,问题就定位到主键的auto_increment属性上了。

问题重现

下面来还原问题,以便能准确查找出原因。
表结构如下:

CREATE TABLE `test_innodb` (
   `id` int(11) NOT NULL AUTO_INCREMENT COMMENT '自增ID',
   `username` varchar(100) NOT NULL COMMENT '用户名',
   PRIMARY KEY (`id`),
   UNIQUE KEY `UNIQUE_USERNAME` (`username`)
 ) ENGINE=InnoDB DEFAULT CHARSET=utf8

username字段设置了唯一索引(unique key)。先插入一条数据:

INSERT INTO test_innodb (`username`) VALUES('admin');

执行成功,主键ID为“1”。再次执行此SQL,因username重复,数据入库失败,提示:

Duplicate entry 'admin' for key 'UNIQUE_USERNAME'
查看全文 >
2015
05-29

剖析Redis持久化之AOF方式

上一篇对redis持久化之RDB方式进行了剖析。除了RDB持久化功能之外,Redis还提供了AOF(Append Only File)持久化功能。下面就来介绍一下AOF持久化功能。


1、AOF持久化原理

与RDB持久化通过保存数据库中的键值对来记录数据库状态不同,AOF持久化是通过保存Redis服务器所执行的写命令来记录数据库状态的。并在服务器启动时,通过重新执行这些命令来还原数据库。如下图:
aof.png

顺便提一句,被写入AOF文件的所有命令都是以Redis的命令请求协议格式保存的。因为Redis的命令请求协议是纯文本格式,所以我们是可以直接打开一个AOF文件,观察里面的内容的。


2、AOF持久化配置

首先在redis.conf文件开启aof持久化(默认没开启)

appendonly yes

然后对redis.conf文件中的“appendfsync”选项进行规则配置。不同的appendfsync值产生的持久化行为也不相同。

appendfsync=always

appendfsync设置为always时,服务器在每个事件循环中将aof_buf缓冲区中的所有内容写入并同步到AOF文件。从效率来说,是三个选项值当中最慢的一个,但从安全性来说,always是最安全的,因为即使出现故障停机,AOF持久化也只会丢失一个事件循环中所产生的命令数据。

查看全文 >
2015
05-19

centos安装mongodb扩展

PHP程序要正常操作mongodb库,必须要先安装好mongodb扩展。下面就来介绍mongodb扩展的安装方法。

基础环境

  • centos7.2+
  • php7+
  • mongodb3.4+

1、下载mongo扩展包

wget http://pecl.php.net/get/mongodb-1.2.9.tgz

2、重命名并解压

下载成功后,执行如下命令:

# 解压
tar -zxvf mongodb-1.2.9.tgz
cd mongodb-1.2.9

3、编译安装

通过phpize来动态添加mongo扩展,

/usr/local/php/bin/phpize
./configure --with-php-config=/usr/local/php/bin/php-config
make && make install

4、编辑php.ini

编译成功之后,需要将编译好的mongodb.so添加到php.ini配置文件当中。在php.ini的文件末尾添加如下配置:

extension=mongodb.so

重启nginx和php-fpm后,通过如下命令,

php -m

看到“mongodb”字样存在,即表示扩展安装成功。在PHP程序中就能正常mongodb了。

查看全文 >
2015
05-13

剖析Redis持久化之RDB方式

最近在阅读《Redis设计与实现》这本书,书中关于Redis的实现原理,做了相对详细的介绍与说明。
Marser整理了Redis持久化之RDB方式的原理、redis.conf配置方式、数据还原操作及RDB方式的特点。下面Marser就来做详细的介绍。

1、RDB持久化原理

RDB持久化既可以通过命令行手动执行,也可以通过redis.conf配置选项定期执行,该功能可以将某个时间点上的数据库中的键值对保存到一个rdb文件中,默认为dump.rdb。

2、RDB持久化命令

Redis中有两个命令可以用于生成RDB文件,一个是save,另一个是bgsave。这两个命令都可以通过命令行来手动执行。下面分别来介绍下这两个命令。

  save命令

执行save命令时,Redis服务器主进程会执行保存工作,所以save命令会阻塞Redis服务器进程。在Redis服务器进程阻塞期间,服务器不能处理任何从客户端发送过来的命令请求,直至RDB文件创建完毕。即save命令是做同步操作
此种方式

  bgsave命令

bgsave命令和save命令不同,在执行bgsave命令时,Redis服务器会派生出一个子进程,由这个子进程来负责执行数据保存工作,并创建RDB文件,而Redis服务器进程(父进程)则继续处理从客户端发送过来的命令请求。即bgsave命令是做异步操作

查看全文 >
2015
05-12

剖析Redis过期key的删除策略

最近在阅读《Redis设计与实现》这本书,书中关于Redis的实现原理,做了相对详细的介绍与说明。
Marser整理了Redis中对于过期key的几种删除策略。下面Marser来带你装逼带你飞,带你熬翔到天黑。

Redis中过期key的删除策略,分为三种:定时删除、定期删除、惰性删除。
其中,定时删除和定期删除是主动删除策略,惰性删除是被动删除策略。
下面就来逐一介绍这三种删除策略的原理及其优缺点。

1、定时删除

定时删除是在设置key的过期时间的同时,会创建一个定时器(timer)。定时器在key的过期时间来临时,立即执行对key的删除操作。
此种删除策略可以保证过期key会尽可能快的被删除,并释放过期key所占用的内存。
但是此种策略对CPU时间是最不友好的。在过期key比较多的情况下,删除过期key这一行为可能会占用相当一部分CPU时间,在内存不紧张但是CPU时间非常紧张的情况下,将CPU时间用在删除和当前任务无关的过期key上,无疑会对服务器的响应时间和吞吐量造成影响。
例如,正有大量的命令请求在等待服务器处理,并且服务器当前不缺少内存的情况下,服务器应当优先将CPU时间用在处理客户端的命令请求上面,而不是用在删除过期key上面。
并且创建一个定时器(timer)需要用到Redis服务器中的时间事件,而当前时间事件是用无序链表实现的,查找一个事件的时间复杂度为O(N),并不能高效地处理大量时间事件。要让服务器创建大量的定时器,从而实现定时删除,在现阶段来说并不现实。

查看全文 >
2013
09-17

centos安装mongodb

在mongodb官网( http://www.mongodb.org/downloads)下载合适版本的安装包,并上传到centos服务器里面。
也可以直接在centos服务器的命令行,通过wget方式来获取安装包:

wget http://fastdl.mongodb.org/linux/mongodb-linux-x86_64-2.2.3.tgz

然后解压:

tar zxvf mongodb-linux-i686-2.4.5.tgz

切到 mongodb-linux-i686-2.4.5 目录:

cd mongodb-linux-i686-2.4.5

新建数据存储目录:

mkdir -p ./data/db/

新建日志目录:

mkdir logs
查看全文 >
微信扫一扫