NoSQL
NoSQL,泛指非关系型数据库。随着互联网的发展,传统的关系型数据库在应付超大型和高并发的网站已经新的力不从心,暴露了很多难以克服的问题,而非关系型的数据库则由于其本身的特点得到了非常迅速的发展。NoSQL数据库的产生就是为了解决大规模数据集合多重数据种类带来的挑战,尤其是大数据应用难题。
NoSQL的四大分类
1.键值存储数据库
这一类数据库只要会使用一个哈希表,这个表中有一个特定的键和一个指针指向特定的数据。key/value模型对于IT系统来说的优势在于简单、易部署。举例如:Redis,Voldemort,Oracle BDB,Tokyo Cabinet/Tyrant
2.列存储数据库
这部分数据库通常是用来应对分布式存储的海量数据。键依然存在,但是他们的特点是指向多个列。这些列是由列家族来安排的。如:Cassandra, HBase, Riak
3.文档型数据库
文档型数据库的灵感是来自于Lotus Notes办公软件的,而且它同第一种键值存储相类似。该类型的数据模型是版本化的文档,半结构化的文档以特定的格式存储,比如JSON。文档型数据库可 以看作是键值数据库的升级版,允许之间嵌套键值。而且文档型数据库比键值数据库的查询效率更高。如:CouchDB, MongoDb
4.图形数据库
图形结构的数据库同其他行列以及刚性结构的SQL数据库不同,它是使用灵活的图形模型,并且能够扩展到多个服务器上。NoSQL数据库没有标准的查询语言(SQL),因此进行数据库查询需要制定数据模型。许多NoSQL数据库都有REST式的数据接口或者查询API。如:Neo4J, InfoGrid, Infinite Graph.
NoSQL的适用场景
- 数据模型比较简单
- 需要灵活性更强的IT系统
- 对数据库性能要求较高
- 不需要高度的数据一致性
- 对于给定key,比较容易映射复杂值的环境
Redis
Redis是一个key-value存储系统。和Memcached类似,它支持存储的value类型相对更多,包括string(字符串)、list(链表)、set(集合)、zset(sorted set 有序集合)和hash(哈希类型)。这些数据类型都支持push/pop、add/remove及取交集并集和差集及更丰富的操作,而且这些操作都是原子性的。在此基础上,Redis支持各种不同方式的排序。与Memcached一样,为了保证效率,数据都是缓存在内存中。区别的是redis会周期性的把更新的数据写入磁盘或者把修改操作写入追加的记录文件,并且在此基础上实现了master-slave(主从)同步。
Redis支持主从同步。数据可以从主服务器向任意数量的从服务器上同步,从服务器可以是关联其他从服务器的主服务器。这使得Redis可执行单层树复制。存盘可以有意无意的对数据进行写操作。由于完全实现了发布/订阅机制,使得从数据库在任何地方同步树时,可订阅一个频道并接收主服务器完整的消息发布记录。同步对读取操作的可扩展性和数据冗余很有帮助。
Redis的安装
1.windows下的安装
因为redis官网上没有msi文件的redis安装包,所以我们可以点击下面的链接
redis msi下载地址
下载完成后点击安装即可
2.ubuntu下安装(linux下安装)
- 使用apt自行安装
sudo apt-get install Redis`
-
压缩包安装
- 到官网下载Redis压缩包文件
- 解压下载的压缩包文件
- 到解压的文件下使用make编译生成可执行文件。使用make命令要确保系统中安装了c语言解释环境。若出错可以安装gcc,使用下面的命令.
`sudo apt-get install gcc`
make命令执行完成之后,会在src文件加下生成多个文件
其中包含有redis-cli、redis-server、redis-benchmark、redis-stat文件
redis-cli:redis命令行操作工具
redis-server:redis服务器的deamon启动程序(后台程序,守护进程)
redis-benchmark:redis的性能测试工具,测试redis在你的系统记你的配置下的读写性能
redis-stat:redis状态检测工具,可以检测redis当前状态参数及延迟状况
k4. 编译完成之后进入src文件夹下进行安装 使用make install命令验
(ll查看src下的目录,有redis-server 、redis-cil即可)
5. 建立redis目录(非必须)
这个过程不是必须的,只是为了将Redis相关的资源统一管理而进行的操作
建立俩个文件夹存放redis命令和配置文件
mkdir -p /usr/local/redis/etc`
`mkdir -p /usr/local/redis/bin`
把redis.conf 移动到/usr/local/redis/etc下,
`cpredis.conf/usr/local/redis/etc/`
把的mkreleasehdr.sh、redis-benchmark、redis-check-aof、redis-check-dump、redis-cli、redis-server
文件移动到bin下,命令:
`mv mkreleasehdr.sh redis-benchmark redis-check-aof redis-check-dump redis-cli redis-server /usr/local/redis/bin`
6. 配置参数
在我们成功安装Redis后,我们直接执行redis-server即可运行Redis,此时它是按照默认配置来运行的(默认配置甚至不是后台运行)。我们希望Redis按我们的要求运行,则我们需要修改配置文件,Redis的配置文件就是redis.conf
下面是一部分的参数意义
* daemonize:是否以后台daemon方式运行
* bind 127.0.0.1:指定redis只接受来自此ip的请求,若比设置,则处理所有请求
* pidfule:pid文件位置
* port:监听端口
* timeout:请求超时时间,0 代表永不超时
* tcp-keepalive 0 :指定tcp连接是否为长连接。默认为0,表示禁用
* loglevel:日志信息级别,从高到底以此为debug、verbose、notice和warning
* logfile:日志文件位置
* database:开启数据库数量
* dbfilename dump.rbd:存储数据的文件名
* dir ./. 存储数据的文件的所在路径
* rdbcompression:是否使用压缩
* save 900 1
save 300 10
save 60 10000
保存数据快照的频率,即将数据持久化到dump.rdb文件中的频度。用来描述”在多少秒期间至少多少个变更操作”触发snapshot数据保存动作
默认设置,意思是:
if(在60 秒之内有10000 个keys 发生变化时){
进行镜像备份
}else if(在300 秒之内有10 个keys 发生了变化){
进行镜像备份
}else if(在900 秒之内有1 个keys 发生了变化){
进行镜像备份
}
* stop-writes-on-bgsave-error yes:当持久化出现错误时是否依然进行动作,是否终止所有的客户端write请求。
默认设置”yes”表示终止,一旦snapshot数据保存故障,那么此server为只读服务。如果为”no”,那么此次snapshot将失败,但下一次snapshot不会受到影响,不过如果出现故障,数据只能恢复到”最近一个成功点“
* slaveof:设置该数据库为其他数据库的从数据库,并为其指定master信息。
* masterauth:主数据库连接需要密码验证时,在这里指定
* requirepass :设置密码(安全验证)
Redis的数据类型
redis的五种基本数据类型
string 字符串
set 集合
list 列表
zset 有序集合
-
hash 对象(哈希类型)
string类型的操作指令
<pre class="prettyprint linenums prettyprinted" style="box-sizing: border-box; overflow: auto; font-family: Menlo, Monaco, Consolas, "Courier New", monospace; font-size: 13px; display: block; padding: 9.5px; margin: 0px 0px 10px; line-height: 1.42857; color: rgb(51, 51, 51); word-break: break-all; overflow-wrap: break-word; background-color: rgb(245, 245, 245); border: 1px solid rgb(204, 204, 204); border-radius: 4px; font-style: normal; font-variant-ligatures: normal; font-variant-caps: normal; font-weight: 400; letter-spacing: normal; orphans: 2; text-align: start; text-indent: 0px; text-transform: none; widows: 2; word-spacing: 0px; -webkit-text-stroke-width: 0px; text-decoration-style: initial; text-decoration-color: initial;">
-
set key value #设置key对应string类型的值,返回1表示成功,0失败
-
get key # 获取指定key对应的值。如果key不存在,返回nil。如果key的value不是string,就返回错误
-
setnx key value #若key不存在,设置value的值,若存在,则不作操作 get key | 获取指定key的value值
-
getset key value #先获取key的值 在设置可以的值,若可以不存在,则返回nil
mget k1 k2 ... #获取多个key的值,若对应的key不存在,则返回nil
mset k1 v1 k2 v2 ... #一次设置多个key的值,成功返回1,表示所有的值都设置成功,返回0表示没有任何值被设置
msernx k1 v1 k2 v2 ... #设置多个key的值,但是不会覆盖已经存在的key
setex key second value #设置指定key的值,并设置它的失效时间(秒)
psetex key millionseconds value #和setex一样,唯一的区别是时间一毫秒为单位
incr key # 对key的值加1,只对数据字符串有效
incrby key value #对key的值加value,只对数据字符串有效
decr key #对key的值减1
decrby key value #对key的值减value
strlen key #求对应key的值的长度
append key value #对key对应的值及进行拼接(从末尾拼接)
getrange key start end #获取指定起始和结束为止的key的值的子串
setrange key offset value # 覆盖key对应值的指定位置的字符,offset为偏移量,value时在offset后放置的值。这个命令可以确保key有一个足够大的字符串
setbit key offset value #设置或者清空key的value(字符串)在offset处的bit值
scan curssor [match pattern][COUNT count] #迭代当前数据库中key的集合
getbit key offset #返回key对应的string在offset处的bit值
bitcount key [start end] #统计字符串被设置为1的bit数。将字符串转化成二进制,统计为1的数量
</pre>
hash类型的操作指令
<pre class="prettyprint linenums prettyprinted" style="box-sizing: border-box; overflow: auto; font-family: Menlo, Monaco, Consolas, "Courier New", monospace; font-size: 13px; display: block; padding: 9.5px; margin: 0px 0px 10px; line-height: 1.42857; color: rgb(51, 51, 51); word-break: break-all; overflow-wrap: break-word; background-color: rgb(245, 245, 245); border: 1px solid rgb(204, 204, 204); border-radius: 4px; font-style: normal; font-variant-ligatures: normal; font-variant-caps: normal; font-weight: 400; letter-spacing: normal; orphans: 2; text-align: start; text-indent: 0px; text-transform: none; widows: 2; word-spacing: 0px; -webkit-text-stroke-width: 0px; text-decoration-style: initial; text-decoration-color: initial;">
hdel key field [field...] 从key指定的哈希集中移除指定的属性
hexists key field # 返回对应hash中field知否存在。1表示存在,0表示不存在
hget key field #获取指定hash中给字段field的值
hgetall key #获取hash中所有字段和值,每个字段名后就是字段对应的值
hincrby key field value #增加key对应的哈希集中制定的数值(value)
hiincrbyfloat key field vaue #和hincrby一样,区别是加的值为float
hkeys key #获取指定哈希集的所有字段的名字
hlen key #获取指定哈希集包含的字段的长度
hmget key field [field...] #返回key对应哈希集中指定的字段的值
hmget key field value [field value] #设置指定的哈希集中指定的字段的值
hscan key cursor [match pattern][COUNT count] #迭代hash类型中的键值对
hset key field value #设置哈希集中指定字段的值如果字段在哈希集中存在,它将被重写。
hsernx key field value #设置哈希集中指定字段的值,如存在则不作操作
hstrlen key field #返回哈希集中指定字段对应的值的长度
hvals key #返回哈希集中所有的字段的值
</pre>
list类型的操作指令
<pre class="prettyprint linenums prettyprinted" style="box-sizing: border-box; overflow: auto; font-family: Menlo, Monaco, Consolas, "Courier New", monospace; font-size: 13px; display: block; padding: 9.5px; margin: 0px 0px 10px; line-height: 1.42857; color: rgb(51, 51, 51); word-break: break-all; overflow-wrap: break-word; background-color: rgb(245, 245, 245); border: 1px solid rgb(204, 204, 204); border-radius: 4px; font-style: normal; font-variant-ligatures: normal; font-variant-caps: normal; font-weight: 400; letter-spacing: normal; orphans: 2; text-align: start; text-indent: 0px; text-transform: none; widows: 2; word-spacing: 0px; -webkit-text-stroke-width: 0px; text-decoration-style: initial; text-decoration-color: initial;">
blpop key [key ...] timeout
brpop key [key ...] timeout
lindex key index #获取索引位对应的元素
linsert key before|after pivot value #把value插入到pivot前面或后面
llen key #但是key对应的list的长度
lpop key #移除并饭后key对应的list的第一个元素
lpush key value [value...] #从左(头)侧将值放入list中
rpush key value [value...] #从右(尾)侧将值放入list中
lpushx key value #只有当key对应的list存在才会从头部插入value
lrange key start stop #循环显示list的值
lrem key count value #从存于 key 的列表里移除前 count 次出现的值为 value 的元素。 这个 count 参数通过下面几种方式影响这个操作:
count > 0: 从头往尾移除值为 value 的元素。
count < 0: 从尾往头移除值为 value 的元素。
count = 0: 移除所有值为 value 的元素。
</pre>