NoSQL数据库之Redis数据库管理
NoSQL的介绍
NoSQL(NoSQL=Not Only SQL),意为反SQL运动,是一项全新的数据库革命性运动,它是指非关系型数据库。随着互联网web2.0网站的兴起,传统的关系数据库在应付web2.0纯动态网站已经显得力不从心,特别是超大规模和高并发的ANS类型的纯动态网站,暴漏了很多难以克服的困难,而非关系类型的数据库则由于其本身的特点得到了非常迅速的发展。
NoSQL是以Key-value形式存储,和传统的关系型数据库不一样,不一定遵循传统数据库的一些基本要求,比如说遵循SQL标准,ACID属性,表结构等等,这类数据库主要有以下特点:非关系型的、分布式、开源的、水平可扩展的。
Mysql里的select、inser、,update、delete语句在NoSQL中不适用。
ACID属性:事务处理。(整个的过程为事务,第一步完成第二部没完成,就回滚初始状态)
表结构:NoSQl不需要建立表结构
NoSQl的特点:
- 处理超大量的数据
- 运行在便宜的PC服务器集群上
3.击碎了性能瓶颈
NoSQL适用的场景:
- 对数据库高并发读写
- 对海量数据的高效率存储和访问
- 对数据的高可扩展性和高可用性
NoSQL做分布式
Redis的介绍
Redis是一个开源的,先进的Key-value存储。它通常被称为数据结构服务器,因为键可以包含字符串,哈希,链表,集合,和有序集合。
链表:做栈和队列,
队列先进先出,
栈是先进后出,
Redis是一个Key-Value存储系统。它支持存储的value类型很多,包括string(字符串)、list(链表)、set(集合)、zset(有序集合)。这些数据类型都支持push/pop、add/remove
及取交集和并集及更丰富的操作,redis支持各种不同方式的排序。为了保证效率,数据都是缓存在内存中,它也可以周期性的把更新的数据写入磁盘或者把修改操作写入追加的记录文件。
对数组加入一个元素array_push,array_pop弹出一个元素。
提供的API语言:C、C++、PHP
Redis适用场景
目前全球最大的Redis的用户是新浪微博,在新浪微博有200多台物理机,400多个端口正在运行着Redis上来为微博用户提供服务。
在新浪微博Redis的部署场景很多,大概分为如下两种:
应用程序直接访问Redis数据库
应用程序直接访问Redis,只有当Redis访问失败时才能访问Mysql
例如:把大象装冰箱的过程:
- 打开冰箱门
- 把大象装进冰箱
- 把冰箱门关上
大象很大,装进冰箱很费劲,怎么办?
而Redis数据库提供多种灵活数据结构和数据操作,为不同的大象构建不同的冰箱。
Redis适用的场景:
- 取最新N个数据的操作
- 排行榜应用,取TOP****N****操作
- 需要精确设定过期时间的应用(key设置过期时间)
- 计数器应用
- Uniq操作,获取某段时间所有数据排重值
- 实时系统,反垃圾系统
- Pub/Sub构建实时消息系统(发布与订阅)
- 构建队列系统(list构建栈和队列)
- 缓存
String
1.计数器应用
List- 取最新N个数据的操作
- 消息队列
3.删除与过滤 - 实时分析正在发生的情况,用于数据统计与防止垃圾邮件(结合Set)
Set
1.Uniqe操作,获取某段时间所有数据排重值
2.实时系统,反垃圾系统
3.共同好友、二度好友
4.利用唯一性,可以统计访问网站的所有独立 IP
5.好友推荐的时候,根据 tag 求交集,大于某个 threshold 就可以推荐
Hashes
1.存储、读取、修改用户属性
Sorted Set
1.排行榜应用,取TOP N操作
2.需要精准设定过期时间的应用(时间戳作为Score)
3.带有权重的元素,比如一个游戏的用户得分排行榜
4.过期项目处理,按照时间排序
NoSQL不存在表结构的概念
Redis的数据类型
string,hash ,list,set,zset
Strings类型及操作
String是最简单的类型,一个Key对应一个Value,String类型是二进制安全的。Redis的string可以包含任何数据,比如jpg图片或者序列化的对象
同一个键只能包含一个数据
serialize序列化函数 string serialize ( mixed $value )
set
设置key对应的值为string类型的value
例如:我们添加一个name=lijie的键值对redis 127.0.0.1:6379>set name lijie
例如:我们添加一个name=lijie的键值对redis 127.0.0.1:6379>set name lijie
setnx
设置key对应的值为string类型的value,如果key值已经存在,返回0,nx是not****exit的意思
例如:我们添加一个name=liejie_new的键值对
Name键已经存在返回0,并且不更新。
setex
设置key对应的值为string类型的value,并指定此键值对应的有效期。
例如:我们添加一个haricolor=red的键值对,并指定有效期为10秒
setrange
设置指定key的value值的子字符串
例如:我们希望将lijie的126邮箱替换为163邮箱
从第六个字符开始替换后面的所有字符,如果要替换的字符串没有原来的字符串长,那么后面接着跟上原来的字符串(后面的字符串不会覆盖)
mset
一次设置多个key的值,成功返回ok表示所有的值都设置,失败返回0表示没有任何值被设置。
msetnx
一次设置多个key的值,成功返回ok表示所有的值都被设置了,失败返回0表示没有任何值被设置,但是不会覆盖已经存在的key。
只要有一个设置不成功,这都不设置
get
获取key对应的string值,如果key不存在返回nil。
getset
设置key的值,并返回key的旧值。
Getrange
获取key的value值的子字符串
mget
一次获取多个key的值,如果对应key不存在则对应返回nil。
incr
对key的值做加加的操作,并返回新的值。
incrby
同incr类似,加指定值,key不存在时候会设置key,并认为原来的value是0.
正在加负值为减
decr
对key的值做减减的操作
decrby
同decr类似,减指定值。
传正数是自减,负数是自增
append
给指定字符串追加value,返回新字符串值的长度。
添加了一个.net的字符串
strlen
取指定的key的value值的长度。