NOSQL
-
概念
NoSQL(Not Only SQL),是一项全新的数据库理念,泛指非关系型的数据库 -
关系型与非关系型
关系型:表与表之间的关系,一个表中字段与字段之间的关系。在mysql中,存在主子表关系,数据之间是有关系的
非关系型:数据之间没有任何关系
非关系型数据库存储用户经常查询的数据,在缓存数据库中查询数据的速度很快,但是缓存数据库数据不安全,所有缓存数据库会从mysql数据库获取数据存储到缓存中。这样可以保证mysql的数据存在两份,即使在缓存中丢失也无所谓,因为在mysql中还有一份数据 -
为什么需要使用NOSQL
NOSQL数据库可以大幅度提高web程序的性能,具体表现为对如下三高问题的解决
- High performance-- 对数据库高并发读写的需求
web2.0网站要根据用户个性化信息来实时生成动态页面和提供动态信息,所以基本上无法使用动态页面静态化技术,因此数据库并发负载非常高,往往要达到每秒上万次读写请求。关系数据库应付上万次SQL查询还勉强顶得住,但是应付上万次SQL写数据请求,硬盘IO就已经无法承受了。其实对于普通的BBS网站,往往也存在对高并发写请求的需求,例如网站的实时统计在线用户状态,记录热门帖子的点击次数,投票计数等,因此这是一个相当普遍的需求。 - Huge Storage-- 对海量数据的高效率存储和访问的需求
类似Facebook,twitter,Friendfeed这样的SNS网站,每天用户产生海量的用户动态,以Friendfeed为例,一个月就达到了2.5亿条用户动态,对于关系数据库来说,在一张2.5亿条记录的表里面进行SQL查询,效率是极其低下乃至不可忍受的。再例如大型web网站的用户登录系统,例如腾讯,盛大,动辄数以亿计的帐号,关系数据库也很难应付。 - High Scalability && High Availability 对数据库的高可扩展性和高可用性的需求
在基于web的架构当中,数据库是最难进行横向扩展的,当一个应用系统的用户量和访问量与日俱增的时候,你的数据库却没有办法像web server和app server那样简单的通过添加更多的硬件和服务节点来扩展性能和负载能力。对于很多需要提供24小时不间断服务的网站来说,对数据库系统进行升级和扩展是非常痛苦的事情,往往需要停机维护和数据迁移。
- 主流的NOSQL产品
- 键值(Key-Value)存储数据库
相关产品:Tokyo Cabinet/Tyrant,Redis,Voldemort,Berkeley DB
典型应用:内容缓存,主要用于处理大量数据的高访问负载
数据模型:一系列键值对
优点:快速查询
缺点:存储的数据缺少结构化 - 列存储数据库
相关产品:Cassandra,HBase,Riak
典型应用:分布式的文件系统
数据模型:以列簇式存储,将同一列数据存在一起
优点:查找速度快,可扩展性强,更容易进行分布式扩展
缺点:功能相对局限 - 文档型数据库
相关产品:CouchDB,MongoDB
典型应用:Web应用(与Key-Value类似,Value是结构化的)
数据模型:一系列键值对
优点:数据结构要求不严格
缺点:查询效率不高,而且缺乏统一的查询语法 - 图片数据库
相关数据库:Neo4j,InfoGrid,Infinite Graph
典型应用:社交网络
数据模型:图结构
优点:利用图结构相关算法
缺点:需要对整个图做计算才能得出结果,不容易做分布式的集群方案
Redis的基本介绍
- 概念
Redis是用C语言开发的一个开源的高性能键值对数据库。 - 特点
Redis通过多种键值对类型来适应不同场景下的存储需求,Redis支持多种键值类型,有
- 字符串类型 string
- 散列类型 hash
- 列表类型 list
- 集合类型 set
- 有序集合类型 sortedset
本质是通过查找key来获取value
Redis存储数据不会转码,而是按进制字节来存储,这也是查找效率高的一个原因
- 应用场景
- 缓存(数据查询,短链接,新闻内容,商品内容等)
- 聊天室的在线好友列表
- 任务队列(秒杀,抢购,12306等)
- 应用排行榜
- 网站访问统计
- 数据过期处理(可以精准到毫秒)
- 分布式集群架构中的session分离
总结:
redis的查询速度很快,但是如果mysql中的数据需要频繁的更新则不建议使用redis,这样会导致redis频繁从mysql更新数据,效率下降
redis适合存储经常查询又不经常更新的数据(不要毫秒级更新)
- Redis的安装
4.1 windows版的Redis下载与安装
下载:
官方提倡使用Linux版的Redis,所以官方只提供了Linux版本的Redis,可以在Github上下载windows版的Redis
官方下载地址:http://redis.io/download
github下载地址:https://github.com/MSOpenTech/redis/tags
安装:
解压压缩包即可,window版的Redis为绿色版
4.2 window版Redis的目录结构
文件 | 作用 |
---|---|
redis-benchmark | 性能测试工具 |
redis-check-aof | AOF文件修复工具 |
redis-check-dump | RDB文件检查工具(快照持久化文件) |
redis-cli | 命令行客户端 |
redis-server | redis服务器启动命令 |
redis.windows.conf | redis核心配置文件 |
4.3 启动和关闭
启动:双击redis-serve服务器端即可启动redis服务,占用的端口是6379
关闭:关闭Redis的控制台窗口即可关闭Redis服务
4.4 使用
双击redis-cli客户端即可使用
4.5 注意事项
- redis必须要解压到非中文目的里面,目录结构不可太深。
- redis所在的硬盘空间必须有20G以上
Redis的数据类型
五种数据类型
redis是一种高级的key-value的存储系统,其中value支持5种数据类型:
- String(字符串)
- hash(哈希,类似java中的map)
- list(字符串列表,类似java中的linkList)
- set(字符串集合,类似java中的set)
- sorted set(有序字符串集合)
最常用的是String类型
关于key的定义需要注意以下: - key不要太长,最好不要超过1024个字节,不然会消耗内存还会降低查找效率
- key不要太短,太短会降低key的可读性
- 在项目中,key最好有一个统一的命名规范(见名知意)
字符串类型String(重点)
- 概述:
字符串类型是Redis中最基础的数据存储类型。Redis中字符串类型是二进制安全的,存入的值和获取的值相同。在Redis中字符串类型的value最多可以容纳的数据长度是512M - 常用命令
- set key value
存值命令,设定key持有指定的字符串value,如果key存在则进行覆盖操作,成功返回OK - get key
获取key的value,如果与该key关联的value不是String类型,redis则返回错误信息,因为get命令只能获取字符串类型的值;如果key不存在,则返回(nil) - del key
删除指定的key
哈希类型hash
- 概述
Redis中的hash类型可以看成具有String Key和String Value的map容器。每一个Hash可以存储4294967295个键值对 - 哈希类型常用命令
- hset key field value
为指定的key设定field/value对 - hset key field value [field value…]设置key中的多个field/value
- hget key field
返回指定的key中的field的值 - hmget key fields 获取key中的多个field值
- hgetall myhash 一次获取key的所以map的key和value
- hdel key field [field] 删除一个或多个字段,返回值是被删除的字段个数
列表类型list
- 概述
在Redis中List类型是按照插入顺序排序的字符串链表(java中的linkedlist),可以从链表的头部或尾部插入value。插入时,如果该键并不存在,Redis将为该键创建一个新的链表。如果链表中所有的元素均被移出,那么该键也会从数据库中被删除。List可以包含的最大元素数量是4294967295 - 列表类型命令
- lpush key value1 value2
在指定的key所关联的list的头部插入所有的values,如果key不存在,该命令在插入值之前会创建一个与该key关联的空链表再插入数据。插入成功,返回元素的个数 - rpush key value1 value2 value3
- 在指定的key对应的list的尾部插入所有的value,如果该key不存在,该命令在插入之前创建一个与该key对应的空链表,再从尾部插入数据。插入成功,返回元素的个数
- lrange key start end
获取链表中从start到end元素的值,start和end表示索引值,从0开始;如果为负数,-1表示倒数第一个元素,-2表示倒数第二个元素,以此类推 - lpop key 从头部弹出元素
- rpop key 从尾部弹出元素
- llen key
返回指定key对应列表中的元素个数,即链表的长度
集合类型set
- 概述
在Redis中Set类型可以看作没有排序的字符集合。Set可以包含的最大元素数量是4294967295,Set集合中步云山出现重复的元素 - 常用命令
- sadd key values [value1 value2…]
向set中添加数据,如果value已经存在则不会重复添加 - smenbers key
获取set中所有的成员 - srem key members[member1,member2…]
删除set中指定的成员
Redis的通用命令
- keys pattern
获取所有与pattern匹配的key。*表示任意一个或多个字符,?表示任意一个字符 - del key1 key2…
删除指定的key - exists key
判断该key是否存在,1表示存在,0表示不存在 - type key
获取指定key的类型。返回的字符串有string,hash,list,set,如果key不存在则返回none - select 数字(需要切换到的数据库)
切换数据库
一个Redis服务器可以包括多个数据库,客户端可以指定连接Redis中的哪个数据库。
一个Redis实例最多可提供16个数据库,下标为0到15,客户端默认连接第0个数据库 - move key 数字
移key到其他数据库,数字代表数据库
Jedis
- 概述
Jedis是用来操作redis的java客户端。在redis的官方网站里有一些Java客户端,有Jedis,Redisson,Jredis,JDBC-Redis,官方推荐使用Jedis和Redisson。简单来说,Jedis是一个Java类,用来操作redis
github上的下载链接:https://github.com/xetorthio/jedis - 基本操作
常用API
方法 | 说明 |
---|---|
new Jedis(host,port) | 创建jedis对象,参数host是redis服务器地址,参数port是服务器端口 |
set(key,value) | 设置字符串类型的数据 |
get(key) | 获得字符串类型数据 |
hset(key,field,value) | 设置哈希类型的数据 |
hget(key,field) | 获取哈希类型的数据 |
lpush(key,value) | 设置列表类型的数据 |
lpop(key) | 列表头部出栈 |
rpop(key) | 列表尾部出栈 |
del(key) | 删除指定的key |