认识非关系型数据库
什么是NoSQL?
NoSQL(NoSQL = Not Only SQL ),意为反SQL运动,是一项全新的数据库革命性运动,2000年前就有人提出,发展至2009年趋势越发高涨。它是指运用非关系型的数据存储,相对于铺天盖地的关系型数据库运用,这一概念无疑是一种全新的思维的注入。
随着互联网web2.0网站的兴起,传统的关系数据库在应付web2.0网站,特别是超大规模和高并发的SNS类型的web2.0纯动态网站已经显得力不从心,暴露了很多难以克服的问题,而非关系型的数据库则由于其本身的特点得到了非常迅速的发展。NoSQL数据库的产生就是为了解决大规模数据集合多重数据种类带来的挑战,尤其是大数据应用难题。
分类 | Examples****举例 | 典型应用场景 | 数据模型 | 优点 |
键值(key-value) | Tokyo Cabinet/TyrantRedis Voldemort Oracle BDB | 内容缓存,主要用于处理大量数据的高访问负载,也用于一些日志系统等等。 | Key 指向 Value 的键值对,通常用hash table来实现 | 查找速度快 |
列存储数据库 | CassandraHBaseRiak | 分布式的文件系统 | 以列簇式存储,将同一列数据存在一起 | 查找速度快,可扩展性强,更容易进行分布式扩展 |
文档型数据库 | CouchDBMongoDB | Web应用(与Key-Value类似,Value是结构化的,不同的是数据库能够了解Value的内容) | Key-Value对应的键值对,Value为结构化数据 | 数据结构要求不严格,表结构可变,不需要像关系型数据库一样需要预先定义表结构 |
图形(Graph)数据库 | Neo4J InfoGridnfinite Graph | 社交网络,推荐系统等。专注于构建关系图谱 | 图结构 | 利用图结构相关算法。比如最短路径寻址,N度关系查找等 |
NoSQL的特性?
NoSQL是key-value形式存储,和传统的关系型数据库不一样,不一定遵循传统数据库的一些基本要求,比如说遵循SQL标准、ACID属性、表结构等等。
这类数据库主要有以下特点:
1)非关系型的、分布式、开源的、水平可扩展的
2)处理超大量数据
3)击碎了性能瓶颈
4)对数据高并发读写
5)对海量数据的高效率存储和访问
6)对数据的高扩展性和高可用性
什么是Redis
Redis是一个开源的,先进的key-value存储。它通常被称为数据结构服务器,因为键可以包含string(字符串)、hash(哈希)、list(链表)、set(集合)和zset(sorted-set--有序集合)。这些数据类型都支持push/pop、add/remove及取交集并集和差集及更丰富的操作。(写入、删除或取出操作)
Redis和Memcached类似,它支持存储的value类型相对更多,与memcached一样,为了保证效率,数据都是缓存在内存中,区别是Redis会周期性的把更新的数据写入磁盘或者把修改操作写入追加的记录文件,并且在此基础上实现了master-slave(主从)同步。
# redis 持久化:
将内存中的数据另存为一份到硬盘上。(服务器出现断电等问题时)所有请求优先找Redis请求,如果没有在找mysql请求,mysql查询到后加载到Redis服务器上一份,保证当下次再有查询时,Redis能够直接查询到
Redis安装部署
Redis的官方网站是:http://redis.io
1)下载安装包:
$ wget http://download.redis.io/releases/redis-2.8.6.tar.gz
2)编译安装:
$ yum -y install gcc* lrzsz tar –zxvf redis-2.8.6.tar.gz cd redis-2.8.6 make make PREFIX=/usr/local/redis install
指定安装位置,如果没有指定安装位置PREFIX=/usr/local/redis,则make install会把redis安装到/usr/local/bin/目录下
3)创建配置文件etc目录,将配置文件复制进去。
$ mkdir /usr/local/redis/etc cp -a ./redis.conf /usr/local/redis/etc/
复制Redis的配置文件到/usr/local/redis/etc/下,便于管理。
4)修改配置文件:
$ mkdir /usr/local/redis/data #创建Redis数据库文件保存位置 vim /usr/local/redis/etc/redis.conf daemonize no 修改为yes #后台启动 dir ./ 修改为具体的绝对路径 #将redis数据库文件保存在哪个位置
5)启动服务:
$ /usr/local/redis/bin/redis-server 配置文件 #必须指定配置文件位置,否则会提示警告
6)客户端连接:
$ /usr/local/redis/bin/redis-cli -h IP: 连接指定的redis服务器 -p 6379: 指定redis服务器的端口 -a 密码: 使用密码登录 -n 数据库号: 指定连接哪个数据库(只有16个,默认是0) --raw: redis支持存储中文
7)停止Redis
$ /usr/local/redis/bin/redis-cli shutdown 或 pkill -9 redis
Redis常用命令
1) string类型及操作
string是最简单的类型,一个key对应一个value,string类型是二进制安全的。redis的string可以包含任何数据。
①set:设置key对应的值为string类型
例如:我们添加一个name=kernel的键值对应
127.0.0.1:6379>set name kernel
② setnx:设置key对应的值为string类型,如果 key已经存在,返回0,nx是not exist的意思(最好作为我们默认设置键值对的方式,防止覆盖原有的内容)
127.0.0.1:6379>setnx name lisi
③get:获取key对应的string值,如果key不存在返回nil
127.0.0.1:6379>gat name
④ mset & mget 同时设置和获取多个键值对
⑤ incrby:对key的值做加加(指定值)操作,并返回新的值
⑥del:删除一个已创建的key
2) hash类型及操作
Redis hash是一个string类型的field(字段)和value的映射表,它的添加、删除操作都是0(1)平均;hash特别适合用于存储对象,相较于将对象的每个字段存成单个string类型,将一个对象存储在hash类型中会占用更少的内存,并且可以更方便的存取整个对象。
①hset:设置hash field 为指定值,如果key不存在,则先创建表。
例如:为num1表创建一个叫name字段(key),键值是liuchuan
127.0.0.1:6379>hse
② hget、hmset、hmget意义同上近似
③hdel:删除指定表中的某一个键值对
④hgetall:列出表中的所有键值对(可用tab键补齐,自动变大写)
3) list类型及操作
list是一个链表结构,主要功能是push、pop、获取一个范围内的所有值等等,操作中key理解为链表的名字。Redis的list类型其实就是一个每个子元素都是string类型的双向链表。我们可以通过push、pop操作从链表的头部或尾部添加删除元素。
① lpush:在key对应list的头部添加字符串元素。
127.0.0.1:6379>lpush zhangs zhangsan 127.0.0.1:6379>lpush zhangs 18 127.0.0.1:6379>lpush zhangs man
② lrange:从指定链表中获取指定范围的元素(查看)
127.0.0.1:6379>lrange zhangsan 0 -1
0 -1:此范围代表全部元素,意为从头到尾
③ lpush、rpush、lpop、rpop、lrange详见图示
4) Set类型及操作(无序集合)
set是集合,他是string类型的无序集合。Set是通过hash table实现的,合/并集 、交集、差集。通过这些操作我们可以实现社交网站中的好友推荐和blog的tag功能。集合不允许有重复值。
①sadd:添加一个或多个元素到集合中
redis127.0.0.1:6379>sadd mset 1 2 3 4
② smembers:获取集合里面所有的元素
redis127.0.0.1:6379> smembers mset
③srem:从集合中删除指定的一个或多个元素
④ spop:随机从集合中删除一个元素,并返回
⑤scard:获取集合里面的元素个数
⑥ sdiff:返回集合1与集合2的差集。以集合1为主
redis127.0.0.1:6379>sdiff mset1 mset2
⑦sinter:获得两个集合的交集
⑧ sunion:获得指定集合的并集
5) zset类型及操作(有序集合)
zset是set的一个升级版本,它在set的基础上增加了一个顺序属性,这一属性在添加修改元素的时候可以指定,每次指定后,zset会自动重新按新的值调整顺序。可以理解为有两列的mysql表,一列存的value,一列存的顺序。操作中key理解为zset的名字。
① zadd:向一个指定的有序集合中添加元素,每一个元素会对应的有一个分数。你可以指定多个分数/成员组合。如果一个指定的成员已经在对应的有序集合中了,那么其分数就会被更新成最新的,并且该成员会重新调整到正确的位置,以确保集合有序。分数的值必须是一个表示数字的字符串。
redis127.0.0.1:6379>zadd zset 2 zhangsan 1 lisi 1 wangwu
② zrange:返回有序集合中,指定区间内的成员。其中成员按照score(分数)值从小到大排序。具有相同score值的成员按照字典顺序来排列。
redis127.0.0.1:6379>zrange zset 0 -1 withscores
注: withscores返回集合中元素的同时,返回其分数(score)
③ zrem:删除有序集合中指定的值
redis127.0.0.1:6379>zrem zset zhangsan
④ zcard:返回有序集合元素的个数
6)其他相关命令
① keys:按照键名查找指定的键。支持通配符(* ?等)
redis127.0.0.1:6379>keys h*llo
②exists:确认一个键是否存在(1表示存在)
③ del:删除一个键(通用)
④ expire:设置一个键(已存在)的过期时间,如果键已经过期,将会被自动删除
⑤ttl:以秒为单位,返回指定键的剩余有效时间
当 key 不存在时,返回 -2 。
当 key 存在但没有设置剩余生存时间时,返回 -1 。
否则,以秒为单位,返回 key 的剩余生存时间。
⑥select:选择一个数据库,默认连接的数据库是0,可以支持共16个数据库。在配置文件中,通过databases 16 关键字定义。
⑦move:将当前数据库的键移动到指定的数据库中
⑧ type:返回键的类型
⑨ dbsize:返回当前库中键的数量(所有类型)
⑩ save:保存所有的数据。很少在生产环境直接使用SAVE 命令,因为它会阻塞所有的客户端的请求,可以使用BGSAVE 命令代替. 如果在BGSAVE命令的保存数据的子进程发生错误的时,用 SAVE命令保存最新的数据是最后的手段。
①①info:获取服务器的详细信息
①②config get:获取redis服务器配置文件中的参数。支持通配符
①③flushdb:删除当前数据库中所有的数据
①④flushall:删除所有数据库中的所有数据
Redis高级应用
1)密码防护
# 给redis服务器设置密码
1、修改配置文件
$ vim /usr/local/redis/etc/redis.conf requirepass 123456 #取消注释,并修改 2、重启redis
$ pkill redis
$ /usr/local/redis/bin/redis-server /usr/local/redis/etc/redis.conf
3、客户端登录
$ /usr/local/redis/bin/redis-cli -a 123456 或 交互模式下使用【auth密码】命令
2)主从同步
# Redis主从复制过程:
Ø Slave与master建立连接,发送sync同步命令
Ø Master会启动一个后台进程,将数据库快照保存到文件中,同时master主进程会开始收集新的写命令并缓存。
Ø 后台完成保存后,就将此文件发送给slave
Ø Slave将此文件保存到硬盘上
# 主服务器给自己设置好密码即可(iptables&SELinux关闭)
#. 从服务器修改配置文件,用来连接主服务器
1)从服务器安装redis;
老版本:
从:
slaveof <masterip> <msterport> #主服务器的IP和端
masterauth <masterpass> #主服务器的密码(主服务器要设置好密码)
新版本redis 5.* 以上:
主:
找到 bind 127.0.0.1 注释掉,或者修改为本机的IP地址(重启)
从:
replicaof <masterip> <msterport> #主服务器的IP和端口\
masterauth <masterpass> #主服务器的密码(主服务器要设置好密码)
2)编译安装:
$ yum -y install gcc* lrzsz
$ tar –zxvf redis-2.8.6.tar.gz
$ cd redis-2.8.6
$ make
$ make test #验证当前环境是否匹配
$ make PREFIX=/usr/local/redis install
指定安装位置,如果没有指定安装位置PREFIX=/usr/local/redis,则make install会把redis安装到/usr/local/bin/目录下
3)创建配置文件etc目录,将配置文件复制进去。
$ mkdir /usr/local/redis/etc
$ cp -a ./redis.conf /usr/local/redis/etc/
复制Redis的配置文件到/usr/local/redis/etc/下,便于管理。
4)修改配置文件:
$ mkdir /usr/local/redis/data #创建Redis数据库文件保存位置
$ vim /usr/local/redis/etc/redis.conf
$ daemonize no 修改为yes #后台启动 dir ./ 修改为具体的绝对路径 #将redis数据库文件保存在哪个位置
$ slaveof <masterip> <msterport> #主服务器的IP和端口
$ masterauth <masterpass> #主服务器的密码(主服务器要设置好密码)
5)启动服务:
$ /usr/local/redis/bin/redis-server 配置文件 #必须指定配置文件位置,否则会提示警告
重启从服务器,然后测试(可通过info命令获取当前服务器身份类型)
从:
$ /usr/local/redis/bin/redis-cli
-h IP: 连接指定的redis服务器
-p 6379: 指定redis服务器的端口
-a 密码: 使用密码登录
-n 数据库号: 指定连接哪个数据库(只有16个,默认是0)
--raw: redis支持存储中文
info 获取当前服务器身份类型
keys *
get name
主:
/usr/local/redis/bin/redis-cli -a12345 info 获取当前服务器身份类型
3)数据持久化
Redis是一个支持持久化的内存数据库,也就是说需要经常将内存中的数据同步到硬盘来保证持久化
snapshotting(快照)--默认方式
RDB持久化方式能够在指定的时间间隔能对你的数据进行快照存储。是默认的持久化方式。这种方式是将内存中数据以快照的方式写入到二进制文件中,默认的文件名为dump.rdb。这种持久化方式被称为快照 snapshotting(快照)。
# 过了900秒并且有1个key发生了改变 就会触发save动作
# 过了300秒并且有10个key发生了改变 就会触发save动作
# 过了60秒并且至少有10000个key发生了改变 也会触发save动作
结论:在redis.conf文件中dir ./定义了数据库文件的存放位置,默认是当前目录。所以每次重启redis服务所在的位置不同,将会生成新的dump.rdb文件;建议服务器搭建完成时先修改快照文件保存位置。
append-only file(缩写aof)
使用AOF 会让你的Redis更加耐久: 你可以使用不同的持久化策略:每次写的时候备份、每秒备份、无备份。使用默认的每秒备份策略,Redis的性能依然很好(备份是由后台线程进行处理的,主线程会尽力处理客户端请求),一旦出现故障,你最多丢失1秒的数据。
打开redis.conf配置文件开启AOF持久化 appendonly no 默认不使用AOF持久化(450行)将no改成yes。 # appendfsync always 有写操作,就马上写入磁盘。效率最慢,但是最安全 appendfsync everysec 默认,每秒钟写入磁盘一次。 # appendfsync no 不进行AOF备份,将数据交给操作系统处理。最快,最不安全
测试:重启redis服务,登录client添加一个键值,退出然后ls命令查看下是否生成appendonly.aof。可以用cat查看。
.