一、NoSQL简介:
NoSQL(NoSQL = Not Only SQL ),意即"不仅仅是SQL",意为反SQL运动。
在现代的计算系统上每天网络上都会产生庞大的数据量。这些数据有很大一部分是由关系数据库管理系统来处理。
但是传统的数据库在应付一些网站,特别是超大规模和高并发的SNS类型的动态网站(社交网),已经显得力不从心了。暴露了很多难以克服的困难,而非关系数据库由于其本身的特点得到了非常迅速的发展。
NoSQL 是一项全新的数据库革命性运动,早期就有人提出,发展至2009年趋势越发高涨。NoSQL的拥护者们提倡运用非关系型的数据存储,相对于铺天盖地的关系型数据库运用,这一概念无疑是一种全新的思维的注入。
NoSQL是以key-value的形式存储,和传统的关系型数据库不一样,不一定遵循传统数据库的一些基本要求,比如说遵循SQL标准、ACID(事务)属性、表结构等等,这些数据库主要有一下的特点:非关系型的、分布式的、开源的、水平可扩展的。
注:SNS,专指在帮助人们建立社会性网络的互联网应用服务,SNS的另一种常用解释:全称Social Network Site,即"社交网站"或"社交网"。
NoSQL特点
1、处理超大量的数据
2、运行在便宜的PC服务器集群上
3、击碎了性能瓶颈
NoSQL使用场景
1、对数据高并发读写
2、对海量数据的高效率存储和访问
3、对数据的高可扩展性和高可用性
二、Redis 简介
Redis 是完全开源免费的,是一个高性能的key-value数据库。
Redis 与其他 key - value 缓存产品有以下三个特点:
Redis支持数据的持久化,可以将内存中的数据保存在磁盘中,重启的时候可以再次加载进行使用。
Redis不仅仅支持简单的key-value类型的数据,同时还提供list,set,zset,hash等数据结构的存储。
Redis支持数据的备份,即master-slave模式的数据备份。
Redis 优势:
性能极高 – Redis能读的速度是110000次/s,写的速度是81000次/s 。
丰富的数据类型 – Redis支持二进制案例的 Strings, Lists, Hashes, Sets 及 Ordered Sets 数据类型操作。
原子 – Redis的所有操作都是原子性的,同时Redis还支持对几个操作全并后的原子性执行。
丰富的特性 – Redis还支持 publish/subscribe, 通知, key 过期等等特性。
Redis适用场合
目前全球最大的Redis用户是新浪微博,在新浪有200多台物理机,400多个端口正在运行着redis,有+4G的数据在Redis上来为微博用户提供服务。
使用Redis我们不用在面对功能单调的数据库时,把精力放在如何把大象放进冰箱这样的问题上,而是利用Redis灵活多变的数据结构和数据操作,为不同的大象构建不同的冰箱。
redis的安装
Windows下的安装
下载地址https://github.com/dmajkic/redis/downloads。下载到的Redis支持32bit和64bit。根据自己实际情况选择,我选择64bit。把64bit文件内容拷贝到需要安装的目录下,比如:E:\database\redis\redis-2.4.5-win32-win64\64bit。
打开一个cmd窗口,使用cd命令切换到指定目录(E:\database\redis\redis-2.4.5-win32-win64\64bit)运行 redis-server.exe redis.conf 。运行以后出现如下界面。
这就说明Redis服务端已经安装成功,server started。
重新打开一个cmd窗口,使用cd命令切换到指定目录(E:\database\redis\redis-2.4.5-win32-win64\64bit)运行 redis-cli.exe -h 127.0.0.1 -p 6379,其中 127.0.0.1是本地ip,6379是redis服务端的默认端口。运行成功如下图所示。
这样,Redis windows环境下搭建已经完成,是不是很简单。
环境已经搭建好,总得测试下吧。比如:存储一个key为test,value为helloword的字符串,然后获取key值。
注意: 为了避免每一次都进入到安装目录下,需要配置环境变量
在path里面添加:
E:\database\redis\redis-2.4.5-win32-win64\64bit
之后,启动服务便如下图:直接运行redis-server
但是这样会出现问题。这样做并没有在启动服务的时候加载配置文件redis.conf
所有不要采用这种方式
若是运行redis-server.exe redis.conf 会出错,如下图
三、Redis数据类型
string是redis最基本的类型,一个key对应一个value。
string类型是二进制安全的。意思是redis的string可以包含任何数据。比如jpg图片或者序列化的对象 。
string类型是Redis最基本的数据类型,一个键最大能存储512MB。
Set
设置key对应的值为string类型的value
Get
取得key对应的string值,如果key不存在返回nil.nil是空的意思,即不存在。
Setnx
设置key对应的值为string类型的value,如果key已经存在,返回0,nx是not exist的意思
Setex
设置key对应的值为string类型的value,并指定此键值对应得有效期
例如:添加一个haircolor=red的键值对并指定有效期为10秒
Setrange
设置指定key的value值的子字符串,返回的是字符串的长度
例如:我们希望将song3120411028@sina.com邮箱替换为gmail邮箱
mset
一次设置多个key的值,成功返回ok表示所有的值都设置了,失败返回0表示没有任何值被设置。
Msetnx
一次设置多个key的值,成功返回ok表示所有的值都设置了,失败返回0表示没有任何值被设置,但是不会覆盖已经存在的key。
Getset
设置key的值,并返回key的旧值
Getrange
获取key的value值得子字符串
Getrange key 0 5
Mget
一次获取多个key的值,如果对应key不存在,则对应返回nil
Incr
对key的值做加加操作,并返回新的值
Incrby
同incr类似,加指定值,key不存在的时候会设置key,并认为原来的value是0
Decr
对key的值做减减操作
Decrby
同decr类似,减指定值
Strlen
取指定key的value值得长度
Append
给指定key的字符串追加value,返回新字符串值的长度
Hashes类型及操作
Redis hash是一个string类型的field和value的映射表。Hash特别适合用于存储对象。相较于将对象的每个字段存成单个string类型。将一个对象存储在hash类型中会占用更少的内存。并且可以更方便的存取整个对象
Hset
设置hash field 为指定值,如果key不存在,则先创建
Hsetnx
设置hash field 为指定值,如果key不存在,则先创建。如果存在返回0
Hmset
同时设置hash的多个field
Hincrby
指定的hash field 加上给定值
Hexists
测试指定field是否存在
Hlen
返回指定hash的field数量
Hdel
删除指定hash的field
Hkeys
返回hash的所有field
Hvals
返回hash的所有value
Hgetall
获取某个hash中全部的field及value
lists类型及操作
List是一个列表结构,主要功能是push、pop、获取一个范围的所有值等等,操作中key理解为链表的名字。Redis的list类型其实就是一个每个子元素都是string类型的双向链表。我们可以通过push、pop操作从链表的头部或者尾部添加删除元素,这样list既可以作为栈,又可以作为队列。
Lpush
在key对应list的头部添加字符串元素
Lrange mylist 0 -1
0 指的是从栈顶的第一个元素
-1 指定是栈底的最后一个元素
Rpush
在key对应list的尾部添加字符串元素
Linsert
在key对应list的特定位置前或后添加字符串
Lset
设置list中指定下标的元素值
Lrem
从key中对应list中删除n个和value相同的元素。
(n<0从尾删除,n=0全部删除)
Ltrim
保留指定key的值范围内的数据
Lpop
从list的头部删除元素,并返回删除元素
Rpoplpush
从第一个list的尾部移除元素并添加到第二个list的头部
Lindex
返回名称为key的list中index位置的元素
Llen
返回key对应list的长度
Sets类型及操作
Set是集合,它是string类型的无序集合。Set是通过hash table实现的。对集合我们可以取并集、交集、差集。通过这些操作,我们可以实现sns中的好友推荐等功能
Sadd
向名称为key的set中添加元素
Srem
删除名称为key的set中的元素
Spop
随机返回并删除名称为key的set中一个元素
Sdiff
返回所有给定key与第一个key的差集
Sdiffstore
返回所有给定key与第一个key的差集,并将结果存为另一个key
Sinter
返回所有给定key的交集
Sinterstore
返回所有给定key的交集,并将结果存为另一个key
Sunion
返回所有给定key的并集
Sunionstore
返回所有给定key的并集,并将结果存为另一个key
Smove
从第一个key对应的set中移除member并添加到第二个对应的set中
Scard
返回名称为key的set元素个数
Sismember
测试member是否是名称为key的set的元素
Srandmember
随机返回名称为key的set的一个元素,但不删除元素
Sorted sets 类型及操作
Sorted sets类型及操作
Sorted set是set的一个升级版本,它在set的基础上增加了一个顺序属性,这一属性在天津修改元素的时候可以指定,每次指定后,zset会自动重新按新的值调整顺序。可以理解为有两列的MySQL表,一列存value,一列存顺序。操作中key理解为zset的名字
Zadd
向名称为key的zset中添加元素member,score用于排序。如果该元素存在,则更新其顺序
Zrem
删除名称为key的zset中的元素member
Zincrby
如果在名称为key的zset中已经存在元素member
则该元素的score增加increment。
否则向该集合中添加该元素,其score的值为increment
Zrank
返回名称为key的zset中member元素的排名(按score从小到大排序)即下标
Zrevrank
返回名称为key的zset中member元素的排名(按score从大到小排序)即下标
Zrevrange
返回名称为key的zset(按score从大到小排序)中的index从start到end的所有元素
Zrangebyscore
返回集合中score在给定区间的元素
Zcount
返回集合中score在给定区间的元素个数
返回集合中score的元素个数
Zremrangebyrank
删除集合中排名在给定区间的元素
Zremrangebyscore
删除集合中score在给定区间的元素
键值相关命令
Keys
返回满足给定pattern的所有key
用表达式*,代表取出所有的key
Exists
确认一个key是否存在
如下:name键存在,age键不存在
Del
删除一个key
Expire
设置一个key的过期时间
在本例中,我们设置key2这个key的过期时间是20秒,然后我们不断的用ttl来获取这个key的有效时长,直至为-1 说明此值已过期
Move
将当前数据库中的key转移到其它数据库中
Expire
移除给定key的过期时间
Randomkey
随机返回key空间的一个key
Type
返回值得类型
Ping
测试连接是否存活
第一个ping时,说明此连接正常
第二个ping之前,我们将redis服务器停止,那么ping是失败的
第三个ping之前,我们将redis服务器启动,那么ping是成功的
Echo
在命令行打印一些内容
Select
选择数据库。Redis数据库编号从0-15,我们可以选择任意一个数据库来进行数据的存取
当选择16时,报错,说明没有编号为16的这个数据库
Quit
退出连接
Dbsize
返回当前数据库中key的数目
此结果说明此数据库中有18个key
服务器相关命令
Info
获取服务器的信息和统计
Config get
实时传触收到的请求
本例中我们获取了dir这个参数配置的值,如果想获取全部数据的配置值也很简单,只需要执行“config get * ” 即可将全部的值都显示出来
Flushdb
删除当前选择数据库中的所有的key
Redis高级实用特性
1、安全性
2、主从复制
3、事务处理
4、持久化机制
5、发布订阅消息
6、虚拟内存的使用
安全性
设置客户端连接后进行任何其他指定前需要使用的密码
警告:因为redis速度相当快,所以在一台比较好的服务器下,一个外部的用户可以在一秒钟进行150K次的密码尝试,这意味着你需要指定非常非常强大的密码来防止暴力破解。
也可以在连接服务器期间就指定连接密码
主从复制
Redis主从复制配置和使用都非常简单。通过主从复制可以允许多个slave server拥有和master server 相同的数据库副本
Redis主从复制特点:
1、Master可以拥有多个slave
2、多个slave可以连接同一个master外,还可以连接到其他slave
3、主从复制不会阻塞master,在同步数据时,master可以继续处理client请求
4、提高系统的伸缩性
当一个master荡激了,会有一个client变为master
Redis主从复制过程
1、slave与master建立连接,发送sync同步命令
2、Master会启动一个后台进程,将数据库快照保存到文件中,同时master主进程会开始收集新的写命令并进行缓存
3、后台完成保存后,就将此文件发送给slave
4、Slave将此文件保存到硬盘上