Nosql(非关系型数据库)
什么是nosql
1):NoSQL(NoSQL = Not Only SQL ),直译为“不仅仅是SQL‘’泛指非关系型的数据库。随着互联网web2.0网站的兴起,传统的关系数据库在应付web2.0网站,特别是超大规模和高并发的SNS类型的web2.0纯动态网站已经显得力不从心,暴露了很多难以克服的问题,而非关系型的数据库则由于其本身的特点得到了非常迅速的发展。NoSQL数据库的产生就是为了解决大规模数据集合多重数据种类带来的挑战,尤其是大数据应用难题,包括超大规模数据的存储。当数据多起来,有些关系型数据往往不能满足其持久化保存数据的目的,这些类型的数据存储不需要固定的模式,无需多余操作就可以横向扩展。
怎么用nosql
为什么用nosql
Nosql的优势
易扩展:
NoSQL数据库种类繁多,但是一个共同的特点都是去掉关系数据库的关系型特性。数据之间无关系,这样就非常容易扩展。也无形之间,在架构的层面上带来了可扩展的能力。
大数据量高性能:
NoSQL数据库都具有非常高的读写性能,尤其在大数据量下,同样表现优秀。这得益于它的无关系性,数据库的结构简单。一般MySQL使用Query Cache,每次表的更新Cache就失效,是一种大粒度的Cache,在针对web2.0的交互频繁的应用,Cache性能不高。而NoSQL的Cache是记录级的,是一种细粒度的Cache,所以NoSQL在这个层面上来说就要性能高很多了。
多样灵活的数据模型:
NoSQL无需事先为要存储的数据建立字段,随时可以存储自定义的数据格式。而在关系数据库里,增删字段是一件非常麻烦的事情。如果是非常大数据量的表,增加字段简直就是一个噩梦。
传统RDBMS VS NOSQL的对比
RDBMS | NoSQL
|
为什么要用nosql
1): NoSQL数据库的出现,弥补了关系数据:
比如MySQL在有些方面的不足(大部分的MySQL都应该是IO密集型的,事实上,如果你的MySQL是个CPU密集型的话,那么很可能你的MySQL设计得有性能问题,需要优化了。大数据量高并发环境下的MySQL应用开发越来越复杂,也越来越具有技术挑战性。分表分库的规则把握都是需要经验的。分库分表的子库到一定阶段又面临扩展问题。还有就是需求的变更,可能又需要一种新的分库方式。MySQL数据库也经常存储一些大文本字段,导致数据库表非常的大,在做数据库恢复的时候就导致非常的慢,不容易快速恢复数据库。比如1000万4KB大小的文本就接近40GB的大小,如果能把这些数据从MySQL省去,MySQL将变得非常的小。关系数据库很强大,但是它并不能很好的应付所有的应用场景。还有mySQL的扩展性差(也可通过复杂技术实现解决)
在某些方面能极大的节省开发成本和维护成本。MySQL和NoSQL都有各自的特点和使用的应用场景,两者的紧密结合将会给web2.0的数据库发展带来新的思路。让关系数据库关注在关系上,NoSQL关注在存储上。
Nosql基本操作
1): nosql的分类:
列存储:Hbase、Cassandra、Hypertable
文档存储:MongoDB、CouchDB
k-v存储:TokyoCabinet、BerkeleyDB、Memcache、redis
对象(图)存储:Neo4J、Versant
Xml数据库:BerkeleyDB、BaseX
2):redis
下面主要讲redis(现阶段大多数使用率最多)
什么是redis
redis是一个key-value存储系统。和Memcached类似,redis的出现,很大程度补偿了memcached这类keyvalue存储的不足,在部 分场合可以对关系型数据库起到很好的补充作用,它支持存储的value类型相对更多,包括string(字符串)、list(链表)、set(集合)和zset(有序集合)。这些数据类型都支持push/pop、add/remove及取交集并集和差集及更丰富的操作。
Redis的优点
- 性能极高 – Redis能读的速度是110000次/s,写的速度是81000次/s 。
- 丰富的数据类型 – Redis支持二进制案例的 Strings, Lists, Hashes, Sets 及 Ordered Sets 数据类型操作。
- 原子 – Redis的所有操作都是原子性的,意思就是要么成功执行要么失败完全不执行。单个操作是原子性的。多个操作也支持事务,即原子性,通过MULTI和EXEC指令包起来。
- 丰富的特性 – Redis还支持 publish/subscribe, 通知, key 过期等等特性。
常见的redis五种数据类似操作命令
Redis的五种基本数据类型
- String: 字符串
- Hash: 散列
- List: 列表
- Set: 集合
- Sorted Set: 有序集合
字符串的命令:
set key value # 保存一个键值对 get key # 通过key来去对应的值 mset key1 v1 k2 v2... # 一次保存多个键值对 mget k1 k2 k3 # 通过key来去对应的值 setex key second value # 保存一个键值对,同时规定它的失效时间(second)
incr key # 对key对应值 加一,注意,只对数据字符串有效 incrby key value # 对key对应值 加value
decr key # 对key对应值 减一,注意,只对数据字符串有效 decrby key value # 对key对应值 减value
strlen key # 求key对应值的长度 append key value # 对key对应的值进行新的拼接 setnx key vaule # 如果存在key,则无效,如果不存在,则保存该键值对
|
hash命令:主要用来存储对象的
u1 = User(1, "liujianhong", 16, "zhengzhou") u2 = User(2, "liusong", 26, "xinyang")
hset key field value # 存储key对应属性field的值 hget key field # 获取key对应属性field的值 hmset key f1 v1 f2 v2...# 存储key对应多个属性field的值 hmget key f1 f2... # 获取key对应多个属性field的值 hgetall key # 获取key对象所有属性和对应的值 hkeys key # 获取key对象的所有属性的名称 hvals key # 获取key对象的所有属性的值 hlen key # 获取key的所有属性个数 hstrlen key field # 获取key对应的属性的值的长度 hexists key field # 判断某个对象是否存在该属性 hsetnx key field value # 判断对象的属性是否存在,存在则不操作,不存在,则保存 hincrby key field value # 对对象的属性(必须是数字字符串)进行加法运算
|
key操作
keys * # 查询当前数据库中所有key的个数 exists key # 判断某个key是否存在在当前数据库 del key # 删除对应的key type key # 判断key的类型 expire key second value # 为一个存在的key设置一个失效时间 ttl key # 查看key的失效时间 -2表示不存在 -1 永久存在 正数表示存活的秒数 move key db # 移动key到db数据库中 select index # 切换数据库 info [xxxx] # 查看当前数据库的状态 dbsize # 返回当前数据库的key的个数 flushdb # 删除当前数据库的所有数据 flushall # 删除所有数据库的所有数据
|
list命令
lpush key v1 v2... # 从左侧将值放入list中 rpush key v1 v2... # 从右侧将值放入list中 lrange key start end # 循环显示list linsert key b|a piovt v # 将值插入到对应的位置 lpop key # 从左侧删除第一个元素 rpop key # 从右侧删除最后一个元素 llen key # 获取list的长度 ltrim key start stop # 切割列表 lindex key index # 获取索引位对应的元素
|
Set命令
SADD key member1 [member2] #向集合添加一个或多个成员 SCARD key #获取集合的成员数 SDIFF key1 [key2] #返回给定所有集合的差集 SDIFFSTORE destination key1 [key2] #返回给定所有集合的差集并存储在 destination 中 SINTER key1 [key2] #返回给定所有集合的交集 SINTERSTORE destination key1 [key2] #返回给定所有集合的交集并存储在 destination 中 SISMEMBER key member #判断 member 元素是否是集合 key 的成员 SMEMBERS key #返回集合中的所有成员 SREM key member1 [member2] #移除集合中一个或多个成员 SUNIONSTORE destination key1 [key2] #所有给定集合的并集存储在 destination 集合中 SSCAN key cursor [MATCH pattern] [COUNT count] #迭代集合中的元素
sadd key v1 [v2 v3] # 添加值到set集合中 sinter s1 s2 # 求两个集合之间的交集 |
Sorted Set:
ZADD key score1 member1 [score2 member2] # 向有序集合添加一个或多个成员,或者更新已存在成员的分数 ZCARD key #获取有序集合的成员数 ZCOUNT key min max #计算在有序集合中指定区间分数的成员数 ZINTERSTORE destination numkeys key [key ...] ZRANGE key start stop [WITHSCORES] ZRANK key member ZREMRANGEBYSCORE key min max #ZUNIONSTORE destination numkeys key [key ...] ZREVRANGE key start stop [WITHSCORES] ZSCAN key cursor [MATCH pattern] [COUNT count]
|