什么是NoSQL
NoSQL(NoSQL = Not Only SQL ),意即“不仅仅是SQL”,是一项全新的数据库革命性运动,早期就有人提出,发展至2009年趋势越发高涨。它指的是非关系型的数据库。随着互联网2003年之后web2.0网站的兴起,传统的关系数据库在应付web2.0网站,特别是超大规模和高并发的交友类型的web2.0纯动态网站已经显得力不从心,暴露了很多难以克服的问题,而非关系型的数据库则由于其本身的特点得到了非常迅速的发展。
NoSQL的特点
Nosql 是以key-value形式存储,和传统的关系型数据库不一样。不一定遵循传统数据库的一些基本要求,比如说,不遵循sql标准,事务,表结构等等,非关系型数据库严格上不是一种数据库,应该是一种数据结构化存储方法的集合。
关系型数据库的特点
关系型数据库,是指采用了关系模型来组织数据的数据库。简单来说,关系模型指的就是二维表格模型,而一个关系型数据库就是由二维表及其之间的联系所组成的一个数据组织。如mysql,sql server, oracle等
关系型数据库瓶颈
高并发读写需求
网站的用户并发性非常高,往往达到每秒上万次读写请求,对于传统关系型数据库来说,硬盘I/O是一个很大的瓶颈
海量数据的高效率读写
网站每天产生的数据量是巨大的,对于关系型数据库来说,在一张包含海量数据的表中查询,效率是非常低的
高扩展性和可用性
在基于web的结构(即浏览器/服务器)当中,数据库是最难进行横向扩展的,当一个应用系统的用户量和访问量与日俱增的时候,数据库却没有办法简单的通过添加更多的硬件和服务节点来扩展性能和负载能力。对于很多需要提供24小时不间断服务的网站来说,对数据库系统进行升级和扩展 是非常痛苦的事情,往往需要停机维护和数据迁移。
mysql 和redis 的对比
Redis是什么
Redis 是一款依据BSD开源协议发行的高性能Key-Value存储系统(cache and store)。它通常被称为数据结构服务器,因为值(value)可以是 字符串(String), 哈希(Map), 列表(list), 集合(sets) 和 有序集合(sorted sets)等类型。
Redis是一个开源的使用ANSI C语言编写、支持网络、可基于内存亦可持久化的日志型、Key-Value数据库,并提供多种语言的API。从2010年3月15日起,Redis的开发工作由VMware主持。
作者
Redis的作者,他叫Salvatore Sanfilippo,来自意大利的西西里岛,他使用的网名是antirez,现在居住在卡塔尼亚。目前供职于Pivotal公司。
性能
下面是官方的bench-mark数据:
测试完成了50个并发执行100000个请求。
设置和获取的值是一个256字节字符串。
Linuxbox是运行Linux2.6,这是X3320Xeon2.5ghz。
文本执行使用loopback接口(127.0.0.1)。
结果:读的速度是110000次/s,写的速度是81000次/s。
优势
- Redis不仅仅支持简单的k/v类型的数据,同时还提供list,set,zset,hash等数据结构的存储。
- Redis支持数据的备份,即master-slave(主—从)模式的数据备份。
- Redis支持数据的持久化,可以将内存中的数据保持在磁盘中,重启的时候可以再次加载进行使用。
Memcache NoSQL数据库 存放在内存中
Memcache和Redis的区别
Redis使用场景
缓存
缓存 这个不必说了,性能优于 Memcached,数据结构更多样化。
计数器应用
计数器应用 Redis 的命令都是原子性的,你可以轻松地利用 INCR,DECR 命令来构建计数器系统。
实时防攻击系统
实现一个 防攻击系统。用一个set 存储所有异常IP,当下一个请求到达,取出ip 看是否在这个集合里,做出相应的操作。
排行榜
排行榜应用. 采用 sorted set 排序的集合,将新闻评论的赞同数作为集合元素的权重,取出某个新闻最热的前10条评论。同样的 新浪微博 今日热点排行榜,也可以用redis的排序集合来实现。
设定有效期的应用
需要精准设定过期时间的应用 比如你可以把上面说到的 sorted set 的 score 值设置成过期时间的时间戳,那么就可以简单 地通过过期时间排序,定时清除过期数据了,不仅是清除 Redis 中的过期数据,你完全可以 把 Redis 里这个过期时间当成是对数据库中数据的索引,用 Redis 来找出哪些数据需要过期 删除,然后再精准地从数据库中删除相应的记录。
自动去重应用
Uniq 操作,获取某段时间所有数据排重值 这个使用 Redis 的 set 数据结构最合适了,只需要不断地将数据往 set 中扔就行了,set 意为 集合,所以会自动排重。
队列
构建队列系统 使用 list 可以构建队列系统,使用 sorted set 甚至可以构建有优先级的队列系统。
消息订阅系统
Pub/Sub 构建实时消息系统 Redis 的 Pub/Sub 系统可以构建实时的消息系统,比如很多用 Pub/Sub 构建的实时聊天系统 的例子。
谁在使用redis
可以在官网上查看:
http://redis.io/
中文网站:
http://www.redis.cn/
比较著名的公司有:
github
blizzard
stackoverflow
flickr
国内
新浪微博(全球最大的redis集群)
2200+亿 commands/day 5000亿Read/day 500亿Write/day
18TB+ Memory
500+ Servers in 6 IDC 2000+instances
淘宝
腾讯微博
掌中浩阅iReader
聚美优品
腾讯-微影时代
等
Redis安装
下载
Redis 的官方下载站是 http://redis.io/download,可以去上面下载最新的安装程序下来
安装
linux
解压
tar xzf redis-{version}.tar.gz
切换目录
cd redis-{version}
安装
make
拷贝可执行文件
到src目录下将 redis-benchmark(压力测试工具)、redis-check-aof(检查.aof文件完整性的工具)、redis-check-dump(检查数据文件完整性的工具)、redis-sentinel(监控集群运行状态)、redis-server(服务端)、redis-cli(客户端)这几个文件 移动到工作目录下。
拷贝配置文件
接着,复制redis.conf到<REDIS_HOME>/conf/下,修改配置文件,来配置Redis服务器。
启动服务
<REDIS_HOME>/redis-server redis.conf
连接服务
<REDIS_HOME>/redis-cli -h 127.0.0.1 -p 6379
windows
windows下安装redis仅做了解,此软件由微软负责维护,更新并不及时,官方强烈建议不要在生产环境使用
启动服务器: redis-server.exe redis.conf
连接服务器: redis-cli.exe -h 127.0.0.1 -p 6379,其中 127.0.0.1是本地ip,6379是redis服务端的默认端口
可执行程序
Redis-benchmark 压力测试
Redis-check-aof 检查redis持久化命令文件的完整性
Redis-check-dump 检查redis持久化数据文件的完整性
Redis-cli redis在linux上的客户端
Redis-sentinel 做集群用的
Redis-server linux上的服务端
Redis配置
配置文件详解
见pdf
Redis性能测试
redis-benchmark -h 192.168.0.199 -p 6379 -c 100 -n 100000
并发100,每个客户端发送10w个请求
如何学习Redis
redis在线入门 : http://try.redis.io/
redis 中文资料站: http://www.redis.cn/
redis 命令手册: http://www.redisdoc.com/en/latest/index.html
Redis数据存储
两种数据持久化方式 是由配置文件 redis.conf决定的。
Save 参数配置 以数据文件的形式持久化内存中的数据到磁盘上
Appendonly 参数配置 记录所有对内存数据有修改的命令 到磁盘上
数据结构
作者称redis是一种数据结构服务器,因为它支持丰富的数据结构 string list set sorted set hash。 另外,还支持消息订阅与发布 pub/sub
Redis里面所有的数据都是 key – value 键值对
key操作
Key 基本操作:DEL EXISTS P/EXPIRE P/EXPIREAT KEYS RENAME SORT TYPE TTL PTTL OBJECT MOVE
DEL key [key ...]
set name “zhangsan” expire name 30
Keys *a* keys n??? Keys *
SORT 列表、集合、有序集合 根据key对应的值进行排序 SORT key DESC(降序)
TTL 返回给定 key 的剩余生存时间,单位秒
OBJECT REFCOUNT(引用次数)/ ENCODING(内部编码)/ IDLETIME(空置时间 秒) key
MOVE name 1 将当前数据库 key为name的数据移动到 1号数据库
STRING最基本的数据类型
基本操作:GET SET INCR DECR MSET MGET STRLEN APPEND GETSET SETEX(设置key的存活时间) SETNX(不存在才设置)
set name “zhang san” EX/PX 100
mset date "2012.3.30" time "11:00 a.m." weather "sunny“
查看剩余时间: TTL (秒) PTTL(毫秒)
append name “ is a man”
GETSET 类似 return num ++;
LIST
可以把list当做索引数组。
LIST 基本操作: L/RPUSH L/RPOP LSET LLEN LRANGE RPOPLPUSH
实质是一个 每个元素都是string类型的双向链表
双向链表的每个元素,都有自己的地址、头指针、尾指针
SET
一组不同类型元素组成的集合,集合最多可放 2的32次方 减1 个元素
集合基本操作
SADD SDIFF SDIFFSTORE SINTER SMEMBERS SISMEMBERS
SRANDMEMBER SREM
集合使用广泛,比如微博共同好友,只要将两个集合求交集即可。
Sorted set: 要加一个权重
HASH
类似于php中的关联数组。
要存一个同学信息,学号201311 姓名niusipeng 性别man 年龄25
不用hash,存多条数据
采用hash 存一条数据即可
消息订阅与发布
Pub/sub
订阅消息:
subscribe channel1
发布消息:
publish channel1 hello
事务
redis的事务处理,多条命令中有失败,也无法将所有指令回滚

redis对事务的支持目前还比较简单。redis只能保证一个client发起的事务中的命令可以连续的执行,而中间不会插入其他client的命令。
php操作Redis
安装扩展
下载
https://github.com/phpredis/phpredis
正式版本:
https://github.com/phpredis/phpredis/tree/master
安装
生成./configure文件
使用phpize生成./configure文件
使用php-config配置
./configure --with-php-config=/usrl/local/lamp/php/bin/php-config
编译生成so文件
make && make install
开启扩展
在php.ini中添加:
[redis]
extension=”redis.so”
测试安装结果
phpinfo()
参考资料
http://www.cnblogs.com/ikodota/archive/2012/03/05/php_redis_cn.html