¶一、NoSQL
NoSQL
,指的是非关系型的数据库。NoSQL
有时也称作Not Only SQL
的缩写,是对不同于传统的关系型数据库的数据库管理系统的统称。NoSQL
一般应用于超大规模数据的存储。关系型数据库已经不适合处理当今成倍数据量增加的大型互联网商务应用了。这时nosql
数据库由于其更高的性能、更快的速度、更好的可扩展性等优势对解决大规模数据起到了良好的应用作用。
¶二、NoSQL四大分类
分类 | Examples举例 | 典型应用场景 | 数据模型 | 优点 | 缺点 |
---|---|---|---|---|---|
键值(key-value) | Redis,Tokyo Cabinet/Tyrant, Voldemort, Oracle BDB | 内容缓存,主要用于处理大量数据的高访问负载,也用于一些日志系统等等。 | Key 指向 Value 的键值对,通常用hash table来实现 | 查找速度快 | 数据无结构化,通常只被当作字符串或者二进制数据 |
列存储数据库 | Cassandra, HBase, Riak | 分布式的文件系统 | 以列簇式存储,将同一列数据存在一起 | 查找速度快,可扩展性强,更容易进行分布式扩展 | 功能相对局限 |
文档型数据库 | CouchDB, MongoDb | Web应用(与Key-Value类似,Value是结构化的,不同的是数据库能够了解Value的内容) | Key-Value对应的键值对,Value为结构化数据 | 数据结构要求不严格,表结构可变,不需要像关系型数据库一样需要预先定义表结构 | 查询性能不高,而且缺乏统一的查询语法。 |
图形(Graph)数据库 | Neo4J, InfoGrid, Infinite Graph | 社交网络,推荐系统等。专注于构建关系图谱 | 图结构 | 利用图结构相关算法。比如最短路径寻址,N度关系查找等 | 很多时候需要对整个图做计算才能得出需要的信息,而且这种结构不太好做分布式的集群方案。 |
NoSQL适用场景
1、数据模型比较简单;
2、需要灵活性更强的IT系统;
3、对数据库性能要求较高;
4、不需要高度的数据一致性;
5、对于给定key,比较容易映射复杂值的环境。
NoSQL优缺点
优点 | 缺点 |
---|---|
数据高并发读写 | ACID相比于关系型数据库过于简单 |
海量数据存储和访问效率高 | 无法做太复杂的关系数据库模型 |
对数据可扩展且高可用 |
¶三、Redis
¶1. 简介
Redis
是key-value
(键值对)的存储系统。支持存储的value
类型相对更多,包括string
、list
、set
(集合)、zset
(有序集合)和hash
(哈希类型)。
一般来说:
Oracle
、mysql
、sqlserver
等这样的关系型数据库主要用于存放持久化数据,将数据存储在硬盘中,读取速度较慢。而redis
主要将数据存储在缓存中,缓存的读取速度快,能够大大的提高运行效率,但相应的保存时间有限。
使用Redis
的情景一般是会话缓存(session cache
),用Redis
缓存会话比其他存储(如Memcached
)的优势在于:Redis
提供持久化,即可以将内存中的数据序列化到硬盘中,如此以确保用户数据的安全性。此外Redis
哎集群方面具有很好的优势。
¶2. 安装
¶2.1 window下安装
步骤大致如下:
¶2.1.1下载
下载地址:https://github.com/microsoftarchive/redis/releases
¶2.1.2 启动和关闭
解压到任意目录后,点击安装目录里的redis-server.exe即可启动,关闭redis-server.exe启动的窗口即可关闭。
¶2.2.3 开启后台守护进程
cmd进入安装目录并执行以下命令即可安装成系统守护进程服务。(当然你可以将安装目录放到环境变量中,就可以在任意目录执行redis命令了,这里为了简便就不做此操作了)
1 | redis-server --service-install redis.windows-service.conf --loglevel verbose |
(1)启动和关闭守护进程服务
1 | 启动(如果启动失败,在安装目录里创建一个名称为Logs的文件夹即可) |
¶2.2.4 卸载
如果没有开启守护进程服务,那么直接删除安装目录即可卸载。
如果开启守护进程服务,那么可在安装目录里通过执行以下命令来卸载守护进程服务,执行该命令后删除安装目录即可完全卸载。
1 | redis-server --service-uninstall |
更多内容可参考菜鸟教程。
¶2.2 Linux下安装
这里主要讲linux
下编译安装。
¶2.2.1 下载
下载地址: https://redis.io/download ,这里使用的是3.0版本。
1 | 下载redis-3.0.0 |
¶2.2.2 安装
1 | 解压到/usr/local/ |
看到类似“Hint: It's a good idea to run 'make test' ;)
”这样的提示表示编译完成。make 后编译好的文件会保存到src目录下。这些文件中有两个重要的文件:
redis-server 服务端程序
redis-cli 客户端程序
其实这个时候我们已经可以执行redis-server
和redis-cli
直接使用了,但为了更好的管理程序,我们可以将这些编译好的文件和配置文件移动到其他目录去。如/usr/local/redis/bin/
和/usr/local/redis/etc/
。
1 | 创建两个目录用来存放redis配置文件和编译好的文件 |
¶2.2.3 卸载
直接删除/usr/local/redis-3.0.0
、/usr/local/redis/bin/
和/usr/local/redis/etc/
目录即可完成卸载。
¶3. 服务端常用命令和配置
¶3.1 启动服务端
1 | redis-server + redis配置文件 一起启动服务 |
可以通过打开另一个终端执行ps -ef | grep redis
或者 ps -ef | grep 6379
查看redis
线程。
可以按Ctrl+C
中断停止服务端启动。
¶3.2 配置服务端
默认开启redis-server
需要保持当前终端开启才能使用,如果关闭当前终端或者中断进程了那么服务就关闭了,如果希望后台启守护进程,我们可以修改redis
的配置文件,修改daemonize
的值为yes
来实现。
1 | vim /usr/local/redis/etc/redis.conf |
注意重启redis-server后才能生效
以下是其他配置,但学习的话并不建议
1 | port 6379 #默认端口,可以修改 |
¶3.3 启动服务端守护进程
1 | /usr/local/redis/bin/redis-server /usr/local/redis/etc/redis.conf |
¶3.4 关闭服务端守护进程
1 | /usr/local/redis/bin/redis-cli shutdown |
¶4. 客户端使用
¶4.1 启动客户端
1 | /usr/local/redis/bin/redis-cli |
¶4.2 关闭客户端
按Ctrl+C
就能停止客户端启动
¶5. 常用命令大全
¶5.1 key相关
1 | keys * #查询当前库的所有键 |
案例
¶(1)查询当前库的所有键
1 | 127.0.0.1:6379> keys * |
¶(2)修改 key的名称
1 | 127.0.0.1:6379> set name qcmoke |
¶5.2 String相关
1 | set key value #添加键值对 |
案例
¶(1)添加键值对
set key value
1 | 127.0.0.1:6379> set name zhangsan |
如果已经存在相应的key/value
,那么会将原本的值覆盖掉。添加完成后,会根据配置文件中的dir
的路径每隔一段时间序列化生成dump.rdb
文件。这个文件可以备份和删除,但删除了相应的数据库中就没有相应的数据了,故不要轻易的删除,这很危险。
setnx key value
如果不存在key则设置,如果存在key则不设置
1 | 127.0.0.1:6379> setnx name qcmoke |
¶(2)查询对应键值
get key
1 | 127.0.0.1:6379> get name |
¶(3)删除已存在的键
del key
1 | 127.0.0.1:6379> del name |
¶5.3 哈希(Hash)
1 | HDEL key field1 [field2] #删除一个或多个哈希表字段 |
案例
¶(1)将哈希表 key 中的字段 field 的值设为 value
1 | 127.0.0.1:6379> hmset user age 21 |
¶(2)将多个 field-value (域-值)对设置到哈希表 key 中
1 | 127.0.0.1:6379> hmset user name zhangsan description "a good boy" |
¶(3)从hash里获取指定字段的值
1 | 127.0.0.1:6379> hget user name |
¶(4)从hash获取指定 key 的所有字段和值
1 | 127.0.0.1:6379> hgetall user |
¶(5)从hash获取指定 key 的所有值
1 | 127.0.0.1:6379> hvals user |
¶5.4 列表(List)
根据收尾添加的不同,既可以实现栈,也可以实现队列。
1 | BLPOP key1 [key2 ] timeout # 移出并获取列表的第一个元素, 如果列表没有元素会阻塞列表直到等待超时或发现可弹出元素为止。 |
案例
¶(1)将一个或多个值插入到列表头部
1 | 127.0.0.1:6379> lpush lkey zhangsan |
¶(2)获取列表指定范围内的元素
1 | 127.0.0.1:6379> LRANGE lkey 0 10 |
¶5.5 集合Set
1 | SADD key member1 [member2] #向集合添加一个或多个成员 |
案例
¶(1)向集合添加一个或多个成员
1 | 127.0.0.1:6379> sadd skey zhangsan |
¶(2)返回集合中的所有成员
1 | 127.0.0.1:6379> smembers skey |
¶5.6 有序集合(sorted set)
1 | ZADD key score1 member1 [score2 member2] #向有序集合添加一个或多个成员,或者更新已存在成员的分数 |
案例
(1)向有序集合添加一个或多个成员,或者更新已存在成员的分数
1 | 127.0.0.1:6379> zadd sskey 1 zhangsan |
(2)过索引区间返回有序集合成指定区间内的成员
1 | 127.0.0.1:6379> zrange sskey 0 10 |
(3)取分数和值
1 | 127.0.0.1:6379> zrange sskey 0 10 WITHSCORES |
¶5.7 高级命令
1 | select [数据库下标] #选择数据库,数据库为0--15(16个),默认进入第0个 |
案例
¶(1)切换到下标为某个数字的数据库
1 | 127.0.0.1:6379> select 1 |
¶(2)清空当前数据库的key
1 | 127.0.0.1:6379> flushdb |
关键字可大小写
更多命令请参考:https://redis.io/commands
¶6. 集群
¶6.1 主从复制
主节点具有可读可写权限;而从节点只有可读操作
实验测试:
¶(1)网络环境
master:
ip: 10.51.220.137
port: 6379
密码:无
防火墙都已关闭
slave0:
ip: 10.51.220.136
port: 6379
密码:无
防火墙都已关闭
¶(2)操作步骤
主节点:
1 | 启动服务器 |
从节点:
slave0根据主节点master的ip、端口、密码(如果主节点没有设置密码那么slave不配置)修改配置文件。
1 | 修改配置文件,配置master的ip、端口、密码(如果主节点没有设置密码那么slave不配置)。 |
1 | 启动服务器 |
主节点:
1 | 查看数据库信息 |