目录
一、NoSQL的简介
NoSQL 是 Not Only SQL 的缩写,意即”不仅仅是SQL”的意思,泛指
非关系型
的数据库。
以简单的
key-value
模式存储。因此大大的增加了数据库的扩展能力。
NoSQL产品是传统关系型数据库的功能阉割版本,通过减少用不到或很少用的功能,来大幅度提高产品
性能
(
性能为王
)
总结NoSql
-
NoSql就是为了
性能
而诞生的
-
NoSql是Sql的阉割版本,是为了解决行业内特定问题
-
NoSql没有特定的数据结构定义,使用时不需要表
-
NoSql对事务的支持很差
二、redis简介
Redis 是用
C语言开发的一个开源的
、基于
内存
、支持多种数据结构的
key-value
存储系统,可以作为数据库、缓存和消息中间件。
特点:
2、支持多种数据结构:string(字符串);list(列表);hash(哈希),set(集合);zset(有序集合)
3、提供 RDB 和 AOF 两种数据的持久化存储方案,解决内存数据库最担心的数据丢失问题
4、
提供高可用方案,主从复制、哨兵模式、集群
三、redist安装与启动
3.1.linux安装redis
3.1.1.准备
Redis是c语言开发的。安装redis需要c语言的环境。
yum install gcc-c++
3.1.2.安装redis
将redis-3.0.0.tar.gz拷贝到/usr/upload下解压源码
tar -zxvf redis-3.0.0.tar.gz
进入解压后的目录进行编译
cd /usr/upload/redis-3.0.0
make
安装到指定目录
make install PREFIX=/usr/local/redis
3.2.启动和关闭redis
3.2.1.前端启动(不推荐)
1、启动方式:
直接运行redis安装目录下bin/redis-server将以前端模式启动。
cd /usr/local/redis/bin
./redis-server
2、启动缺点:
命令窗口关闭则redis-server程序结束,不推荐使用此方法
3、前端启动的关闭:
ctrl+c
3.2.2.后端启动
1.启动:
第一步:
进入源码目录,里面有一份配置文件 redis.conf,然后将其拷贝到安装路径下
cp /usr/upload/redis-3.0.0/redis.conf /usr/local/redis/bin
第二步:
修改/usr/local/redis/bin下的redis.conf,将daemonize由no改为
yes
vim /usr/local/redis/bin/redis.conf
第三步:
启动
cd /usr/local/redis/bin
./redis-server redis.conf
2.关闭:
到redis/bin目录下执行如下命令
cd /usr/local/redis/bin
./redis-cli -p 端口号 shutdown
3.3.redis的基本命令
redis-cli连上redis服务后,可以在命令行发送命令:
./redis-cli -h 127.0.0.1 -p 6379
1.set和get:使用set和get可以向redis设置数据、获取数据
2、keys *:查看当前库中所有的key值
3、exists:判断key值是否存在
4、expire 和 ttl:expire设置key的过期时间,ttl查看key的有效期
5、clear:可以使用clear命令对redis-cli终端屏幕清屏。
3.4.多数据库
一个redis实例可以包括多个数据库,客户端可以指定连接某个redis实例的哪个数据库,就好比一个mysql中创建多个数据库,客户端连接时指定连接哪个数据库。
一个redis实例最多可提供16个数据库,下标从
0
到
15
,客户端默认连接第0号数据库,也可以通过select选择连接哪个数据库
如下连接1号库:
注意:
redis
不支持修改数据库的名称
,只能通过select 0、select 1…选择数据库。
两个命令:
FLUSHALL –清空所有数据库的所有数据
FLUSHDB –清空当前所在数据库的数据
四、redis的5种数据类型及相关命令
4.1.
字符串类型<String,String>
4.1.1.特点
字符串类型是编程语言和应用程序中最常见和最有用的数据类型,也是Redis的基本数据类型之一,事实上,Redis中所有key键都必须是字符串
4.1.2.相关命令
存放:
set
key
value
127.0.0.1:6379> set name zhangsan
获取:
get
key
127.0.0.1:6379> get name
"zhangsan"
删除:
del
key
127.0.0.1:6379> get name
"zhangsan"
127.0.0.1:6379> del name
(integer) 1
127.0.0.1:6379> get name
(nil)
127.0.0.1:6379>
更新值,返回旧值:
getset
key
new-value
127.0.0.1:6379> getset name lisi
"zhangsan"
127.0.0.1:6379> get name
"lisi"
批量存放获取:
mset
key1
value1
key2
value
2
mget
key1 key2
127.0.0.1:6379> mset name1 xiaoming name2 xiaohong
OK
127.0.0.1:6379> mget name1 name2
1) "xiaoming"
2) "xiaohong"
127.0.0.1:6379>
递增:
incr
key
incrby
key
10
127.0.0.1:6379> set age 10
OK
127.0.0.1:6379> get age
"10"
127.0.0.1:6379> incr age
(integer) 11
127.0.0.1:6379> incrby age 10
(integer) 21
127.0.0.1:6379> get age
"21"
127.0.0.1:6379>
递减:
decr
age
decrby
age
10
127.0.0.1:6379> decr age
(integer) 20
127.0.0.1:6379> decrby age 10
(integer) 10
127.0.0.1:6379>
4.2.
list数据类型<String,List<
String
>>
4.2.1.特点
列表是应用程序开发中非常有用的数据类型之一,列表能存储一组对象,因此它也可以被用于栈或者队列,在Redis中,与键相关联的值可以是字符串组成的列表,Redis中的列表更像是数据结构中的
双向链表
4.2.2.相关命令
左插入:
lpush
key
a b c
右插入:
rpush
key
1 2 3
取出:
lrange
key
0 -1
其中key值后面写要取数据在集合中的下标区间
0 -1
代表
全部取出
127.0.0.1:6379> lpush list a b c
(integer) 3
127.0.0.1:6379> lrange list 0 -1
1) "c"
2) "b"
3) "a"
127.0.0.1:6379> rpush list 1 2 3
(integer) 6
127.0.0.1:6379> lrange list 0 -1
1) "c"
2) "b"
3) "a"
4) "1"
5) "2"
6) "3"
127.0.0.1:6379> lrange list 2 3
1) "a"
2) "1"
127.0.0.1:6379>
弹出:
lpop
key 弹出集合最左元素 弹出之后就没有了
rpop
key 弹出集合最右元素 弹出之后就没有了
127.0.0.1:6379> lpop list
"c"
127.0.0.1:6379> rpop list
"3"
127.0.0.1:6379> lrange list 0 -1
1) "b"
2) "a"
3) "1"
4) "2"
127.0.0.1:6379>
删除:
lrem
key
count value
count > 0 : 从表头开始向表尾搜索,移除与 VALUE 相等的元素,数量为count
count < 0 : 从表尾开始向表头搜索,移除与 VALUE 相等的元素,数量为count的绝对值
count = 0 : 移除表中所有与 VALUE 相等的值
127.0.0.1:6379> lrange code 0 -1
1) "a"
2) "a"
3) "a"
4) "b"
5) "a"
6) "a"
7) "a"
127.0.0.1:6379> lrem code 2 a
(integer) 2
127.0.0.1:6379> lrange code 0 -1
1) "a"
2) "b"
3) "a"
4) "a"
5) "a"
127.0.0.1:6379> lrem code -1 a
(integer) 1
127.0.0.1:6379> lrange code 0 -1
1) "a"
2) "b"
3) "a"
4) "a"
127.0.0.1:6379> lrem code 0 a
(integer) 3
127.0.0.1:6379> lrange code 0 -1
1) "b"
127.0.0.1:6379>
4.3.
hash数据类型<String,Map<
String
,
String
>>
哈希表示字段和值之间的映射关系,与JAVA中的Map类似,Redis数据集本身就可以看做一个哈希,其中字符串类型的键关联到如字符串和列表之类的数据对象,而Reidis的数据对象也可以再次使用哈希,其字段和值必须 是字符串。
4.4.
set数据类型<String,Set<
String
,
String
>>
集合类型是由唯一,无序对象组成的集合(collection).它经常用于测试某个成员是集合中,重复项删除和集合运算(求并,交,差集),Redis的值对象可以是字符串集合。
4.5.
zset(sortset)数据类型
有序集合是一个类似于set但是更复杂的数据类型,单词sorted意为着这种集合中的每个元素都有一个可用于排序的权重,并且我们可以按顺序从集合中得到元素在某些需要一个保持数据有序的场景中,使用这种原生的序的特性是很方便的。
五、redis的持久化
5.1.RDB(快照)
Redis可以通过创建快照来获得存储在内存里面的数据在某个时间点上的副本。Redis创建快照之后,可以对快照进行备份,可以将快照复制到其他服务器从而创建具有相同数据的服务器副本(Redis主从结构,主要用来提高Redis读性能),还可以将快照留在原地以便重启服务器的时候使用。
快照持久化是Redis默认采用的持久化方式,在redis.conf配置文件中默认有此下配置
save 900 1 #在900秒(15分钟)之后,如果至少有1个key发生变化,Redis就会自动触发BGSAVE命令创建快照。
save 300 10 #在300秒(5分钟)之后,如果至少有10个key发生变化,Redis就会自动触发BGSAVE命令创建快照。
save 60 10000 #在60秒(1分钟)之后,如果至少有10000个key发生变化,Redis就会自动触发BGSAVE命令创建快照。
优点:性能较好,备份文件小,恢复数据快
缺点:不能保证数据的完整性,可能会丢失最后一次save的数据
5.2.AOF(只追加文件)
以日志的形式来记录每个写操作,在Redis重启时,根据日志文件的内容将写指令从前到后执行一次来重构整个数据
默认情况下Redis没有开启AOF(append only file)方式的持久化,可以通过appendonly参数开启:appendonly yes
开启AOF持久化后每执行一条会更改Redis中的数据的命令,Redis就会将该命令写入硬盘中的AOF文件。AOF文件的保存位置和RDB文件的位置相同,都是通过dir参数设置的,默认的文件名是appendonly.aof
在Redis的配置文件中存在三种不同的 AOF 持久化方式,它们分别是:
appendfsync always #每次有数据修改发生时都会写入AOF文件,这样会严重降低Redis的速度
appendfsync everysec #每秒钟同步一次,显示地将多个写命令同步到硬盘
appendfsync no #让操作系统决定何时进行同步
优点:数据完整性更高,实时性更好
缺点:影响性能,备份的文件比较大,恢复备份速度比较慢
六、redis的主从复制
主机数据更新后根据配置和策略,自动同步到备机的master/slaver机制,Master以写为主,Slave以读为主
配置
配从不配主,从机中配置主机ip和端口号
在从机中执行 slaveof 主机ip 主机port
例如 slaveof 127.0.0.1 6379
七、redis集群
7.1.集群的原理
7.1.1.执行流程
7.1.2.哈希槽
Redis 集群中内置了 16384 个哈希槽,并且会根据redis集群的节点数量大致均等的将哈希槽映射到不同的节点(例如三个节点:节点一【0~5460】,节点二【5461~10922】,节点三【10923~16383】)。当需要在 Redis 集群中放置一个 key-value时,redis 先对 key 使用 crc16 算法算出一个结果,然后把结果对 16384 求余数,这样每个 key 都会对应一个编号在 0-16383 之间的哈希槽,再根据哈希槽编号存储到对应节点中
7.1.3.架构细节
(1)
所有的redis节点彼此互联(PING-PONG机制),
节点的fail是
通过
投票容错机制判断,
当集群中超过半数的节点
投票认为某个节点
失效时才生效。所以redis集群最少要有三个节点,为了保证集群的高可用,需要每个节点有一个备份机。因此redis集群最少要有六台服务器,三主三从。
(2)
存取数据时连接任一节点都可以
,如果redis集群中的一个节点没有备份从节点,当这个节点fail整个集群都会fail,
因为存取数据时会对key值进行
crc16
散列算法后求余得到一个hash槽编号,当这个
hash槽编号
对应的是
失效节点时,无法存取。
7.2.集群的搭建
单机模拟redis集群搭建
7.2.1.拷贝6台redis
搭建伪分布式,需要6个redis实例放到/usr/local/redis-cluster目录下,并且运行在不同的端口7001-7006
注意:拷贝前必须删除dump.rdb和appendonly.aof文件
cp -r /usr/local/redis /usr/local/redis-cluster/redis-7001
cp -r /usr/local/redis /usr/local/redis-cluster/redis-7002
cp -r /usr/local/redis /usr/local/redis-cluster/redis-7003
cp -r /usr/local/redis /usr/local/redis-cluster/redis-7004
cp -r /usr/local/redis /usr/local/redis-cluster/redis-7005
cp -r /usr/local/redis /usr/local/redis-cluster/redis-7006
7.2.2.修改配置文件
#修改端口
port 7000
#开启后端启动
daemonize yes
# 打开aof 持久化
appendonly yes
# 开启集群
cluster-enabled yes
# 集群的配置文件,该文件自动生成
cluster-config-file nodes-7000.conf
# 集群的超时时间
cluster-node-timeout 5000
7.2.3.创建启动脚本和关闭脚本
创建启动集群的脚本:start-all.sh 放在/usr/java/redis-cluster目录下
vim /usr/java/redis-cluster/start-all.sh
内容:
cd /usr/local/redis-cluster/redis-7001/bin
./redis-server redis.conf
cd /usr/local/redis-cluster/redis-7002/bin
./redis-server redis.conf
cd /usr/local/redis-cluster/redis-7003/bin
./redis-server redis.conf
cd /usr/local/redis-cluster/redis-7004/bin
./redis-server redis.conf
cd /usr/local/redis-cluster/redis-7005/bin
./redis-server redis.conf
cd /usr/local/redis-cluster/redis-7006/bin
./redis-server redis.conf
修改脚本权限
[root@localhost redis-cluster]# chmod 777 start-all.sh
创建关闭集群的脚本:shutdown-all.sh,放在/usr/local/redis-cluster目录下。
vim /usr/java/redis-cluster/shutdown-all.sh
内容:
cd /usr/local/redis-cluster/redis-7001/bin
./redis-cli -p 7001 shutdown
./redis-cli -p 7002 shutdown
./redis-cli -p 7003 shutdown
./redis-cli -p 7004 shutdown
./redis-cli -p 7005 shutdown
./redis-cli -p 7006 shutdown
修改脚本权限
[root@localhost redis-cluster]# chmod 777 shutdown-all.sh
执行启动脚本
cd /usr/local/redis-cluster
./start-all.sh
7.2.4.集群搭建
方法一:使用ruby脚本搭建redis集群
第一步:安装ruby环境
使用ruby脚本搭建集群,需要安装ruby
redis的版本和ruby包的版本最好保持一致
[root@upload ~]# yum install ruby
[root@upload ~]# yum install rubygems
[root@upload ~]# gem install redis-3.0.0.gem
第二步:切换到*.rb目录
[root@localhost ~]# cd /usr/upload/redis.3.0.0/src
[root@localhost src]# ll *.rb
-rwxrwxr-x. 1 root root 48141 Apr 1 2015 redis-trib.rb
第三步:执行
[root@localhost src]# ./redis-trib.rb create --replicas 1 192.168.25.153:7001
192.168.25.153:7002 192.168.25.153:7003 192.168.25.153:7004 192.168.25.153:7005
192.168.25.153:7006
7.2.5.测试
启动时使用-c参数来启动集群模式,命令如下:
[root@localhost ~]# cd /usr/local/redis-cluster/redis-7001/bin
[root@localhost bin]# ./redis-cli -c -p 7001
127.0.0.1:7001> set name zhangsan
-> Redirected to slot [5798] located at 192.168.5.134:7002
OK
192.168.5.134:7002>
redis cluster命令:
cluster info #打印集群的信息
cluster nodes #列出集群当前已知的所有节点(node),以及这些节点的相关信息