Redis单线程架构

1 单线程模型

Redis客户端对服务端的每次调用都经历了发送命令,执行命令,返回结果三个过程。其中执行命令阶段,由于Redis是单线程来处理命令的,所有每一条到达服务端的命令不会立刻执行,所有的命令都会进入一个队列中,然后逐个被执行。并且多个客户端发送的命令的执行顺序是不确定的。但是可以确定的是不会有两条命令被同时执行,不会产生并发问题,这就是Redis的单线程基本模型。

2 单线程模型每秒万级别处理能力的原因

(1)纯内存访问。数据存放在内存中,内存的响应时间大约是100纳秒,这是Redis每秒万亿级别访问的重要基础。

(2)非阻塞I/O,Redis采用epoll做为I/O多路复用技术的实现,再加上Redis自身的事件处理模型将epoll中的连接,读写,关闭都转换为了时间,不在I/O上浪费过多的时间。

(3)单线程避免了线程切换和竞态产生的消耗。

(4)Redis采用单线程模型,每条命令执行如果占用大量时间,会造成其他线程阻塞,对于Redis这种高性能服务是致命的,所以Redis是面向高速执行的数据库。

redis为什么要设计成单线程:https://hacpai.com/article/1470967571415

MongoDB中字段的添加与删除

mongoDB添加和删除表中一个字段

使用update命令

update命令格式:

db.collection.update(criteria,objNew,upsert,multi)

参数说明:

criteria:查询条件

objNew:update对象和一些更新操作符

upsert:如果不存在update的记录,是否插入objNew这个新的文档,true为插入,默认为false,不插入。

multi:默认是false,只更新找到的第一条记录。如果为true,把按条件查询出来的记录全部更新。

//例如要把User表中address字段删除
db.User.update({},{$unset:{‘address’:”}},false, true)

参考:https://docs.mongodb.com/manual/reference/method/db.collection.update/#update-parameter

==================

添加一列 $set

//字符类型
db.User.update({},{$set:{‘app_id’:’1′}}, false, true)
//数字类型(double)
db.User.update({},{$set:{‘app_id’:1}}, false, true)

//删除字段 $unset
db.User.update({},{$unset:{‘app_id’:”}}, false, true)

这里使用了mongodb中的修改器 $set 和 $unset, 对于更多的操作符请参考:http://blog.csdn.net/mcpang/article/details/7752736

windows下php的redis扩展安装

windows下开发用的xampp集成的环境,想装个php-redis扩展,扩展的github地址:https://github.com/nicolasff/phpredis

注意下面redis压缩包命名规则 ”redis版本号 + php版本号 + 线程安全类型
windows下安装php5.5的redis扩展 - 范范snow - 我的小屋
看下自己phpinfo的信息
windows下安装php5.5的redis扩展 - 范范snow - 我的小屋
windows下安装php5.5的redis扩展 - 范范snow - 我的小屋
 就选择   ts-x86 的包下载,将下载解压后的 php_igbinary.dll和php_redis.dll放入php的ext目录下
然后修改php.ini,加入
  1. ; phpredis
  2. extension=php_igbinary.dll
  3. extension=php_redis.dll

重启apache,查看phpinfo就有redis扩展的信息了
windows下安装php5.5的redis扩展 - 范范snow - 我的小屋

从PHP客户端看MongoDB通信协议

MongoDB的 PHP 客户端有一个 MongoCursor 类,它是用于获取一次查询结果集的句柄(或者叫游标),这个简单的取数据操作,内部实现其实不是那么简单。本文就通过对 MongoCursor 类一些操作进行分析,向大家揭开 MongoDB 客户端服务器通信的一些内部细节。

getNext与网络请求

通常来说,每一次find操作都会返回一个MongoCursor对象,在这个对象上调用getNext方法,就能够获得一条结果数据。循环调用getNext方法就能获取多条数据。下面我们就来看看其内部取数据的具体逻辑。 Continue reading

MongoDB 客户端 MongoVue

今天在同事那里看到了一个很不错的MongoDB的客户端工具MongoVue,地址是http://www.mongovue.com/。做的不错,1.0版本的开始收费了,费用也不贵才35$。真正需要的同学可以掏点钱买个吧,也算是支持这个工具,如果只是学习研究用的话我这里还有一个0.9.7版本,虽然比起1.0版来说有些bug,平常使用也够了,需要的同学可以单独联系我。

1.0版之后超过15天后功能受限。可以通过删除以下注册表项来解除限制:

[HKEY_CURRENT_USER\Software\Classes\CLSID\{B1159E65-821C3-21C5-CE21-34A484D54444}\4FF78130]

把这个项下的值全删掉就可以了。

Continue reading

Mongodb 与mysql 语法比较

mongodb与mysql命令对比

传统的关系数据库一般由数据库(database)、表(table)、记录(record)三个层次概念组成,MongoDB是由数据库(database)、集合(collection)、文档对象(document)三个层次组成。MongoDB对于关系型数据库里的表,但是集合中没有列、行和关系概念,这体现了模式自由的特点。  Continue reading

MongoDB数据库优化:Mongo Database Profiler

在MySQL中,慢查询日志是经常作为我们优化数据库的依据,那在MongoDB中是否有类似的功能呢?答案是肯定的,那就是Mongo Database Profiler.不仅有,而且还有一些比MySQL的Slow Query Log更详细的信息。它就是我们这篇文章的主题。

  开启 Profiling 功能

有两种方式可以控制 Profiling 的开关和级别,第一种是直接在启动参数里直接进行设置。

启动MongoDB时加上–profile=级别 即可。

也可以在客户端调用db.setProfilingLevel(级别) 命令来实时配置。可以通过db.getProfilingLevel()命令来获取当前的Profile级别。 Continue reading