NoSQL

一 NoSQL基础

a. 关系式数据的优点

1. 通用性和相对较高的性能
2. 保证数据的一致性和原子性,根据事物管理器
3. 数据的更新开销更小
4. 发布时间久,相对成熟的案例


b. 关系式数据库的缺点

1. 批量数据的写入处理时有可能会发生冲突
2. 为有数据更新的表做结构变更时效率低下
3. 字段的不固定应用,无法固定使用的字段数量类型
4. 无法实现对简单查询需要快速返回结果的处理,因为结构限制


c.NoSQL (No SQL)

弥补关系式数据库的不足


d.NoSQL 网站

nosql-database.org


e. NoSQL特点

1. 便于扩展和提升性能
      垂直扩展
       水平扩展:集群
2. 数据相对分散,数据与数据之间没有关联
3. 速度更快,绝大多数nosql都是工作在内存里
4. 高可用,自身就可以实现故障转移

 

f. NoSQL分类

1. 面向键值得数据库 { key-value }键值就是变量,键就是变量值就是变量代表的值
      存储速度较快。
      临时性:存储在内存中,数据有可能丢失,如memcached
      永久性:存储在硬盘中,数据不会丢失,如ROMA,FLSRE
      兼具俩者。工作在内存中,瞒住条件是会将数据保存至硬盘,如REDIS

2. 面向文档的数据库
      可以使用复杂的查询条件
      不定义表结构(可以向自定义的表结构一样使用)

 3. 面向列的数据库
      一列为单位存储数据
          修改大量行,少数列的数据库时,进行列的修改更新效率更高
      高扩展性
          即使数据增加也不会降低响应的速度,特别是写入速度(很稳定的速度)

 

g. 安装nosql数据库

 make
 make test 
 make PREFIX=/usr/local/redis install
cd
/usr/local/redis/ cd bin/ cp /usr/src/redis-3.0.3/redis.conf ./ [root@localhost bin]# pwd    /usr/local/redis/bin [root@localhost bin]# ./redis-server redis.conf #启动

[root@localhost bin]# vim redis.conf 37 daemonize yes #不占有整个页面,将redis放进后台运行 [root@localhost bin]# ./redis-cli -h localhost -p 6379 #无密码登录

 

二 操作命令

#支持的数据类型

String  字符串类型
Hash   散列类型
List   双向队列类型
Set    集合类型
Zset   有序集合类型


1. string 字符串类型
 

 set    创建键
 get    查看键
 setnx  创建新键,若存在则放弃操作
 mset   批量创建
 mget   批量查看
 getset  查看原值,设置新值
 setrange  替换字符串
 incr   +1
 decr   -1
 incrby  +N
 decrby  +N
 strlen 查看字符长度
 del    删除字符
 setex  设置生存周期
 tl      查看生存周期

 

localhost:6379> get a
"1111"
localhost:6379> 
localhost:6379> getset a 666
"1111"
localhost:6379> 
localhost:6379> get a 
"666"


localhost:6379> get a
"666"
localhost:6379> setrange a 2 111
(integer) 5
localhost:6379> get a
"66111"


 
localhost:6379> set a3 1
OK
localhost:6379> incr a3
(integer) 2
localhost:6379> incr a3
(integer) 3
localhost:6379> incr a3
(integer) 4
localhost:6379> incr a3
(integer) 5
localhost:6379> get a3
"5"



localhost:6379> get a3
"1"
localhost:6379> 
localhost:6379> 
localhost:6379> incrby a3 10
(integer) 11
localhost:6379> incrby a3 10
(integer) 21
localhost:6379> incrby a3 10
(integer) 31
localhost:6379> get a3
"31"

 

2. hash 散列类型

hset   创建键
hget   查看键
hmset  批量创建键
hmget  批量查看键
hkeys  查看指定键对应的所有字段的名称
hvals  查看指定键对应的所有的值
hsetnx 创建键 防止覆盖
hexists 查看指定键是否存在
hgetall 查看指定键对应的所有字段和值
hdel    删除字段

 

localhost:6379> hset h h1 111
(integer) 0
localhost:6379> hkeys h
1) "h1"
localhost:6379> hvals h
1) "111"
localhost:6379> hset h h2 222
(integer) 1
localhost:6379> hkeys h
1) "h1"
2) "h2"
localhost:6379> hvals h
1) "111"
2) "222"



localhost:6379> hget h h1  #查看单个
"111"
localhost:6379> hget h h2
"222"


localhost:6379> hmset h h3 333 h4 444
OK
localhost:6379> hkeys h
1) "h1"
2) "h2"
3) "h3"
4) "h4"
localhost:6379> hvals h
1) "111"
2) "222"
3) "333"
4) "444"

localhost:6379> hgetall h
1) "h1"
2) "111"
3) "h2"
4) "222"
5) "h3"
6) "333"
7) "h4"
8) "444"



localhost:6379> hexists h h1
(integer) 1      #有 为 1

localhost:6379> hexists h h6
(integer) 0    #无 为 0

 

3. list 双向队列/双向链表类型

lpush   创建队列
lrange  显示队列内容
linsert 插入指定内容(before 值)、
lset    替换指定内容
lpop    删除第一个数据
rpop    删除最后一个数据
lrem    删除重复的数据(指定目标)

 

localhost:6379> lrange d1 0 -1
1) "4"
2) "3"
3) "hello"
4) "2"
5) "1"
localhost:6379> 
localhost:6379> 
localhost:6379> 
localhost:6379> 
localhost:6379> linsert d1 before 1 '6666'
(integer) 6
localhost:6379> lrange d1 0 -1
1) "4"
2) "3"
3) "hello"
4) "2"
5) "6666"
6) "1"

localhost:6379> lset d1 0 111
OK
localhost:6379> lrange d1 0 -1
1) "111"
2) "3"
3) "hello"
4) "2"
5) "6666"
6) "1"

 

4. set集合

 sadd   创建集合
 smembers  查看集合
 srandmember  随机抽取
 spop   随机删除
 sismember  统计集合中元素个数

 sunion   查看并集
 sinter   查看交集
 sdiff    查看差集
      store   保存结果

 

localhost:6379> sadd m1 1 2 3 4
(integer) 4
localhost:6379> smembers m1
1) "1"
2) "2"
3) "3"
4) "4"
localhost:6379> scard m1
(integer) 4
localhost:6379> srandmember m1   #抽取随机数字
"3"

localhost:6379> spop m1   #随机删除
"1"


localhost:6379> smembers m1
1) "2"
localhost:6379> 
localhost:6379> sismember m1 2   #判断2 是否在 m1
(integer) 1
localhost:6379> sismember m1 3   #判断3 是否在 m1
(integer) 0



localhost:6379> sadd m2 1 2 3 4
(integer) 4
localhost:6379> sadd m3 3 4 5 6
(integer) 4
localhost:6379> 
localhost:6379> sunion m2 m3
1) "1"
2) "2"
3) "3"
4) "4"
5) "5"
6) "6"
localhost:6379> 
localhost:6379> sunionstore m4 m2 m3
(integer) 6
localhost:6379> smembers m4
1) "1"
2) "2"
3) "3"
4) "4"
5) "5"
6) "6"
localhost:6379> 
localhost:6379> sinter m2 m3
1) "3"
2) "4"
localhost:6379> sinterstore m5 m2 m3
(integer) 2
localhost:6379> smembers m5
1) "3"
2) "4"
localhost:6379> 
localhost:6379> sdiff m2 m3
1) "1"
2) "2"
localhost:6379> sdiff m3 m2
1) "5"
2) "6"

 

5. zset有序集合

 zadd     创建有序集合
 zrange   查看集合
 zrevrange  反向查看有序集合
 zrangebyscore  查看指定分数区间的元素
 zincrby 增加分值或创建新元素
 zrank   返回指定元素的下标
 zrevrank 返回指定元素的下标(分数从大到小排列)
 zcount   返回指定分数区间内的元素个数
 zremrangebyrank   删除下标在指定区间范围内的元素
 zremrangebyscore  删除分数在指定区间范围内的元素

 

localhost:6379> zadd test 1 aa 2 bb 3 cc
(integer) 3
localhost:6379> zrange test 0 -1
1) "aa"
2) "bb"
3) "cc"
localhost:6379> 
localhost:6379> zrange test 0 -1 withscores
1) "aa"
2) "1"
3) "bb"
4) "2"
5) "cc"
6) "3"
localhost:6379> 
localhost:6379> 
localhost:6379> zrevrange test 0 -1 withscores
1) "cc"
2) "3"
3) "bb"
4) "2"
5) "aa"
6) "1"
localhost:6379> 
localhost:6379> zrangebyscore test 2 3 withscores
1) "bb"
2) "2"
3) "cc"
4) "3"
localhost:6379> 
localhost:6379> 
localhost:6379> zincrby test 4 dd
"4"
localhost:6379> zrange test 0 -1 withscores
1) "aa"
2) "1"
3) "bb"
4) "2"
5) "cc"
6) "3"
7) "dd"
8) "4"
localhost:6379> 
localhost:6379> zincrby test 4 dd
"8"
localhost:6379> zincrby test 4 dd
"12"
localhost:6379> zrange test 0 -1 withscores
1) "aa"
2) "1"
3) "bb"
4) "2"
5) "cc"
6) "3"
7) "dd"
8) "12"


localhost:6379> zrank test dd
(integer) 3
localhost:6379> zrevrank test dd
(integer) 0

localhost:6379> zcount test 5 20
(integer) 1

localhost:6379> zremrangebyrank test 0 2
(integer) 3
localhost:6379> zrange test 0 -1 withscores
1) "dd"
2) "12"



localhost:6379> zadd test2 1 a 2 b 3 c 4 d 55 e 66 f
(integer) 6
localhost:6379> zrange test2 0 -1 withscores
 1) "a"
 2) "1"
 3) "b"
 4) "2"
 5) "c"
 6) "3"
 7) "d"
 8) "4"
 9) "e"
10) "55"
11) "f"
12) "66"
localhost:6379> zremrangebyscore test2 3 60
(integer) 3
localhost:6379> zrange test2 0 -1 withscores
1) "a"
2) "1"
3) "b"
4) "2"
5) "f"
6) "66"
View Code

 

6. 补充

 keys *  查看键列表
 type   查看类型
 expire 设置生存周期
 exists  查看指定键是否存在
 select  选择库(0-15)
 move    移动数据
 flushdb   清空当前库
 flushall  清空所有库
 info     查看服务器基本配置
 dbsize   查看当前库中的键的数量

 

localhost:6379> keys *
 1) "c"
 2) "w"
 3) "m4"
 4) "m1"
 5) "m5"
localhost:6379> move m5 15
(integer) 1
localhost:6379> select 15
OK
localhost:6379[15]> keys *
1) "m5"

 

三 NoSQL应用

a.密码认证

[root@localhost bin]# pwd
/usr/local/redis/bin
[root@localhost bin]# vim redis.conf  #修改配置文件
    391 requirepass 123456

[root@localhost bin]# pkill redis  #结束进程
[root@localhost bin]# ./redis-server redis.conf  #重启

第一种登录方式:
  [root@localhost bin]# ./redis-cli
  127.0.0.1:6379> keys *
  (error) NOAUTH Authentication required.
  127.0.0.1:6379> auth 123456
  OK
  127.0.0.1:6379> exit

第二种登录方式:
  [root@localhost bin]# ./redis-cli -a '123456'

 

b. 备份

持久化:
   dir 备份文件的目录

 

1. 查看
[root@localhost ~]# /usr/local/redis/bin/redis-cli
127.0.0.1:6379> auth 123456
OK
127.0.0.1:6379> keys *
 1) "test2"
 2) "test"
 3) "a2"
 4) "m4"
 5) "a1"
 6) "d1"
 7) "m1"
 8) "w"
 9) "h"
10) "a"
11) "m3"
12) "c"
13) "m2"
127.0.0.1:6379> exit
    

2.
[root@localhost ~]# pkill redis
[root@localhost ~]# /usr/local/redis/bin/redis-server /usr/local/redis/bin/redis.conf  #启动


3.
[root@localhost ~]# /usr/local/redis/bin/redis-cli
127.0.0.1:6379> auth 123456
OK
127.0.0.1:6379> keys *
(empty list or set)


4.
[root@localhost ~]# cd /usr/local/redis/
[root@localhost redis]# ls
bin
[root@localhost redis]# cd bin/
[root@localhost bin]# ls
dump.rdb         redis-check-aof   redis-cli   redis-sentinel
redis-benchmark  redis-check-dump  redis.conf  redis-server
[root@localhost bin]# pkill redis
[root@localhost bin]# ./redis-server redis.conf  
[root@localhost bin]# ./redis-cli -a 123456
127.0.0.1:6379> keys *
 1) "m3"
 2) "m2"
 3) "a"
 4) "test"
 5) "test2"
 6) "a2"
 7) "m1"
 8) "h"
 9) "w"
10) "c"
11) "a1"
12) "d1"
13) "m4"
127.0.0.1:6379> exit


5.
[root@localhost bin]# pwd
/usr/local/redis/bin
[root@localhost bin]# ll
总用量 15500
-rw-r--r-- 1 root root dump.rdb   #dump.db 是redis备份之一。dump记录所有创建的键。只有在dump.db所在目录下,启动服务,才能进行下载上


6.无从从哪个目录登录,都能加载到备份文件

[root@localhost bin]# vim redis.conf 
    187 dir /usr/local/redis/bin   #dir 备份文件的目录

[root@localhost bin]# pkill redis

7.测试
[root@localhost ~]# rm -rf dump.rdb 
[root@localhost ~]# /usr/local/redis/bin/redis-server /usr/local/redis/bin/redis.conf 
[root@localhost ~]# /usr/local/redis/bin/redis-cli 

 

c. 主从配置

1.准备
[root@localhost ~]# cd /usr/local/redis/
[root@localhost redis]# cd ..
[root@localhost local]# ls
bin  etc  games  include  lib  lib64  libexec  redis  sbin  share  src
[root@localhost local]# pwd
/usr/local
[root@localhost local]# ll
drwxr-xr-x  3 root root 4096 5月  25 20:08 redis

[root@localhost local]# cp -rp redis redis-slave



2.配置

[root@localhost local]# cd redis  #主服务器
[root@localhost redis]# ls
bin
[root@localhost redis]# cd bin/
[root@localhost bin]# ls
redis-benchmark  redis-check-aof  redis-check-dump  redis-cli  redis.conf  redis-sentinel  redis-server
[root@localhost bin]# vim redis.conf    #修改配置文件
     41 pidfile /usr/local/redis/redis.pid


[root@localhost redis]# cd /usr/local/     #从服务器
[root@localhost local]# ls
bin  etc  games  include  lib  lib64  libexec  redis  redis-slave  sbin  share  src
[root@localhost local]# cd redis-slave/
[root@localhost redis-slave]# ls
bin
[root@localhost redis-slave]# cd bin/
[root@localhost bin]# vim redis.conf    #修改配置文件
    41 pidfile /usr/local/redis-slave/redis.pid
    45 port 6380
    187 dir /usr/local/redis-slave/bin

    205 slaveof 192.168.10.10 6379
    212 masterauth 123456
    391 #requirepass 123456  #注释掉


3.重启服务
[root@localhost ~]# cd /usr/local/
[root@localhost local]# ls
bin  etc  games  include  lib  lib64  libexec  redis  redis-slave  sbin  share  src
[root@localhost local]# cd redis/bin/
[root@localhost bin]# ls
redis-benchmark  redis-check-aof  redis-check-dump  redis-cli  redis.conf  redis-sentinel  redis-server
[root@localhost bin]# ./redis-server redis.conf  #主服务器

[root@localhost bin]# netstat -antp
Proto Recv-Q Send-Q Local Address     Foreign Address     State    PID/Program name       
tcp        0      0 0.0.0.0:6379      0.0.0.0:*           LISTEN   32062/redis-server  


[root@localhost bin]# cd ../..
[root@localhost local]# ls
bin  etc  games  include  lib  lib64  libexec  redis  redis-slave  sbin  share  src
[root@localhost local]# cd redis-slave/bin/
[root@localhost bin]# ls
redis-benchmark  redis-check-aof  redis-check-dump  redis-cli  redis.conf  redis-sentinel  redis-server
[root@localhost bin]# ./redis-server redis.conf 
[root@localhost bin]# netstat -antp
Proto Recv-Q Send-Q Local Address               Foreign Address             State       PID/Program name      
tcp        0      0 0.0.0.0:6379                0.0.0.0:*                   LISTEN      32062/redis-server  
tcp        0      0 0.0.0.0:6380                0.0.0.0:*                   LISTEN      32172/./redis-serve




4.测试

[root@localhost bin]# ./redis-cli -h 192.168.10.10 -p 6379    #主服务器
192.168.10.10:6379> auth 123456
OK
192.168.10.10:6379> keys *
1) "wwwww"
2) "h"
3) "a"
4) "sss1"
192.168.10.10:6379> 
192.168.10.10:6379> sadd test1  111111111111111
(integer) 1
192.168.10.10:6379> exit



[root@localhost bin]# ./redis-cli -h 192.168.10.10 -p 6380  #从服务器
192.168.10.10:6380> keys *
1) "h"
2) "a"
3) "sss1"
4) "test1"
5) "wwwww"
192.168.10.10:6380> sadd test2 2222222222
(error) READONLY You can't write against a read only slave.       #从服务器,只能读,不能写
主从配置过程

 




   



posted @ 2018-05-17 21:39  shadow3  阅读(129)  评论(0)    收藏  举报