1. Nosql
1.1 nosql 简介
NoSQL 数据库(意即"不仅仅是SQL")并非表格格式,其存储数据的方式与关系表不同。NoSQL 数据库的类型因数据模型而异。主要类型包括文档、键值、宽列和图形。它们提供了灵活的模式,可以随大量数据和高用户负载而轻松扩展。
1.2 nosql(非关系型数据库) 和 rdbms(关系型数据库管理系统) 的区别。
1、数据存储方式不同。
关系型和非关系型数据库的主要差异是数据存储的方式。关系型数据天然就是表格式的,因此存储在数据表的行和列中。数据表可以彼此关联协作存储,也很容易提取数据。
与其相反,非关系型数据不适合存储在数据表的行和列中,而是大块组合在一起。非关系型数据通常存储在数据集中,就像文档、键值对或者图结构。你的数据及其特性是选择数据存储和提取方式的首要影响因素。
2、扩展方式不同。
SQL和NoSQL数据库最大的差别可能是在扩展方式上,要支持日益增长的需求当然要扩展。
要支持更多并发量,SQL数据库是纵向扩展,也就是说提高处理能力,使用速度更快速的计算机,这样处理相同的数据集就更快了。
因为数据存储在关系表中,操作的性能瓶颈可能涉及很多个表,这都需要通过提高计算机性能来客服。虽然SQL数据库有很大扩展空间,但最终肯定会达到纵向扩展的上限。而NoSQL数据库是横向扩展的。
而非关系型数据存储天然就是分布式的,NoSQL数据库的扩展可以通过给资源池添加更多普通的数据库服务器(节点)来分担负载。
3、对事务性的支持不同。
如果数据操作需要高事务性或者复杂数据查询需要控制执行计划,那么传统的SQL数据库从性能和稳定性方面考虑是你的最佳选择。SQL数据库支持对事务原子性细粒度控制,并且易于回滚事务。
虽然NoSQL数据库也可以使用事务操作,但稳定性方面没法和关系型数据库比较,所以它们真正闪亮的价值是在操作的扩展性和大数据量处理方面。
图 例
2. nosql 的产品
常见的NoSQL产品:redis、memcache、mongdb等 NoSQL产品的显著特点: 1、NoSQL产品一般不使用严格的表关系; 2、NoSQL产品的数据查询一般不用在sql上。
特点:
面向集合存储,易存储对象类型的数据。
基于文档的数据库系统,格式是以BSON(JSON,半结构化数据)存储。
性能的保证,基于C++研发,速度快。
支持完全索引(数据读取全靠索引)
不支持事务,意味每一个操作都是原子的且是强一致性。
操作在内存中进行,定义同步到磁盘。
支持很好的扩展性,比如复制,auto_sharding。
能基于复制自动完整故障转移。
支持文档的查询,可以返回一个文档也可以返回一个游标(结果集)。
支持查询性能分析。
支持动态查询,就是可以像MySQL那样自己书写查询条件,而有些NoSQL这不行。
支持使用Map Redure做分组聚合操作,处理大数据极强。
支持空间索引,用于地理数据表述的场景,如地图。
自动处理碎片,以支持云计算层次的扩展性。
3. redis简介
Redis(Remote Dictionary Server ),即远程字典服务,是一个开源的使用ANSI C语言编写、支持网络、可基于内存亦可持久化的日志型、Key-Value数据库,并提供多种语言的API。
3.1 特点:
内存数据库,速度快,也支持数据的持久化,可以将内存中的数据保存在磁盘中,重启的时候可以再次加载进行使用。
Redis不仅仅支持简单的key-value类型的数据,同时还提供list,set,zset,hash等数据结构的存储。
Redis支持数据的备份,即master-slave模式的数据备份。
支持事务
3.2 redis 优势
性能极高 – Redis能读的速度是110000次/s,写的速度是81000次/s 。
丰富的数据类型 – Redis支持二进制案例的 Strings, Lists, Hashes, Sets 及 Ordered Sets 数据类型操作。
原子 – Redis的所有操作都是原子性的,同时Redis还支持对几个操作合并后的原子性执行。(事务)
丰富的特性 – Redis还支持 publish/subscribe, 通知, key 过期等等特性。
3.3 Redis为什么这么快
1、完全基于内存,绝大部分请求是纯粹的内存操作,非常快速。数据存在内存中,类似于HashMap,HashMap的优势就是查找和操作的时间复杂度都是O(1);
2、数据结构简单,对数据操作也简单,Redis中的数据结构是专门进行设计的;
3、采用单线程,避免了不必要的上下文切换和竞争条件,也不存在多进程或者多线程导致的切换而消耗 CPU,不用去考虑各种锁的问题,不存在加锁释放锁操作,没有因为可能出现死锁而导致的性能消耗;
4、使用多路I/O复用模型,非阻塞IO;
5、使用底层模型不同,它们之间底层实现方式以及与客户端之间通信的应用协议不一样,Redis直接自己构建了VM 机制 ,因为一般的系统调用系统函数的话,会浪费一定的时间去移动和请求;
6.多路 I/O 复用模型
多路I/O复用模型是利用 select、poll、epoll 可以同时监察多个流的 I/O 事件的能力,在空闲的时候,会把当前线程阻塞掉,当有一个或多个流有 I/O 事件时,就从阻塞态中唤醒,于是程序就会轮询一遍所有的流(epoll 是只轮询那些真正发出了事件的流),并且只依次顺序的处理就绪的流,这种做法就避免了大量的无用操作。
4. 安装 redis
4.1 redis 客户端连接redis 服务器
4.1.1 导入压缩包进行解压
4.1.2 运行 make install
4.1.3 登陆成功
4.1.4 redis客户端连接redis服务器
redis-cli 连接本地redis服务
redis-cli -h 192.168.223.166 -p 6379
-h: redis服务器主机的ip
-p: redis服务器的端口号
4.1.5 redis的配置文件
--------ps -ef | grep redis 查 看 进 程---------
--------kill -9 + 进程号 关闭进程---------
4.1.6 设置redis远程连接
4.1.7 进行验证
5. 安装redis 的客户端ui软件
6. redis中常用命令
官方网址
redis命令手册http://www.redis.net.cn/order/
Redis 命令参考 — Redis 命令参考http://redisdoc.com/
6.1 关于key 的相关命令
set :设置指定key值
get :获取指定key值
keys *: 查看redis中所有的key
del key [key....]: 删除指定key的内容
expire key seconds: 为指定的key设置过期时间
ttl key: 查看当前的key的剩余时间
exists key: 判断指定的key是否存在 返回0表示不存在指定的key 否则表示存在指定的key
setnx :只有在 key 不存在时设置 key 的值
decr : 数值减一
6.2 .关于数据库的命令
默认redis支持数据库的个数为16个
select n: 选择数据库
flushdb: 清空当前库
flushall: 清空所有库的数据
6.3 .redis支持的数据类型
官方网址
这里所说的数据类型----指的是value的数据类型。
String 字符串类型
Hash 对象类型
List: 队列类型
Set: 集合类型
ZSet: 有序集合类型.
不同的数据类型有不同的命令
6.3.1 :String 字符串类型
表示它的value为字符串类型,它是使用最多的类型,因为任意数据类型都可以转化为字符串。value存储值的大小:512M.
1. set key value: 设置指定 key 的值
2. get key 获取指定 key 的值
3. mset key value key value .... 同时设置一个或多个 key-value 对。
4. mget key key .... 获取所有(一个或多个)给定 key 的值。
5. incr key 将 key 中储存的数字值增一。 类似于 点赞 收藏
6. decr key 将 key 中储存的数字值减一
7. setnx key value 只有在 key 不存在时设置 key 的值。
8.strlen 返回 key 所储存的字符串值的长度
6.3.2 hash 类型
1. hset key field value 将哈希表 key 中的字段 field 的值设为 value
2. hget key field 获取存储在哈希表中指定字段的值/td>
3. hget key 获取在哈希表中指定 key 的所有字段和值 + all 全部
4. hkeys key 获取所有哈希表中的字段
5.hvals key 获取哈希表中所有值
6.3.3 list 队列
1. LPush key value value value... 将一个或多个值插入到列表头部
2. lrange key start end 获取列表指定范围内的元素
3 .lpop key 移出并获取列表的第一个元素
4. llen :获取列表长度
6.3.4 . sort set有序集合
和上面的set区别在于多了一个score分数列----- 排行耪
1.zadd key score value score value :向有序集合添加一个或多个成员,或者更新已存在成员的分数
2.zrange key 通过索引区间返回有序集合成指定区间内的成员
3.ZREVRANK key start end 返回有序集合中指定成员的排名,有序集成员按分数值递减(从大到小)排序
4 .zcard 获取有序集合的成员数