NoSql 是什么
非关系型数据库
基本上除了主流关系型数据库之外的数据库都是非关系型数据库,
可以直接面上对象
Redis 、MongoDB、Hbase、CouhDB等
关系型数据库:
1、结构化的数据库,创建关系模型的基础上
2、一遍都是面向记录
orale、 mysql 、SQL service、 DB2、Microsoft Access等
Nosql产生背景
三高
1、数据库高并发读写
2、海量数据下载的效率
3、高扩展和可用性(主要指的服务器的扩展)
cap定理【布罗尔定律】
c强一致性
a可用性
p分区容错性
网络分区:在网络分区的前提下,保证数据容错机制
在web2.0时代,CAP之间不能共存的,我们醉倒只能满足两个条件
CA可用性和强一直性 代表RDB【关系型数据库】
PA可用性和分区容错性,代表NoSql
CP前已执行和分区容错性,代表分布式数据链
BASE定理
1、基本可用:可用性有要求,单不是那么高
2、软状态<->强一致性 数据库不许要实时保存一直
3、最终一致性:
关注点
1、事务一直性
2、实时读写
NoSQL的优缺点
NoSql给我门带来哪些变化
缺点:
1不支持sql语句
2时间短还不是很完善
优点:
1扩展方便
2读写速度快
3、降低服务成本
4、数据类型灵活
Redis简介
开源的基于内存的远程字典的Nosql数据库,由C语言编写,基于运行内存并支持持久化 存储形式;Key-Value型
redis的特点
内存使用便是及其优异
数据读写速度高效
持久化性能好
扩展性和一直性好
目前分布式中不可或缺的一环
常见的应用场景:
缓存
去最新N个数据操作list
排行榜类的应用
redis的安装
需要先下载好配置文件然后直接放在root目录下面
tar zxvf redis-5.0.7.tar.gz
cd redis-5.0.7/
make
make PREFIX=/usr/local/redis install
ln -s /usr/local/redis/bin/* /usr/local/bin/
cd utils/
./install_server.sh ##一直回车就行
..... 省略部分内容
Selected default - /var/lib/redis/6379
Please select the redis executable path [/usr/local/bin/redis-server] /usr/local/redis/bin/redis-server ##配置文件路径可以改也可不改
Selected config:
Port : 6379 ##端口号
Config file : /etc/redis/6379.conf ##配置文件路径
Log file : /var/log/redis_6379.log ##日志文件路径
Data dir : /var/lib/redis/6379 ##数据文件路径
Executable : /usr/local/bin/redis-server ##可执行文件路径
Cli Executable : /usr/local/bin/redis-cli ##客户端命令工具
netstat -lunpt |grep redis ##过滤出端口
/etc/init.d/redis_6379 stop ##关
/etc/init.d/redis_6379 start ##开
/etc/init.d/redis_6379 restart ##重启
/etc/init.d/redis_6379 status ##查看
简单的优化
给主配置文件绑定下自己的IP地址
vim /etc/redis/6379.conf
...
bind 127.0.0.1 20.0.0.10
/etc/init.d/redis_6379 restart
redis-cli -h 127.0.0.1 -p 6379
下面命令是便于控制redis的操作
cd /etc/init.d/
cp redis_6379 redisd
service redisd stop
netstat -aunpt |grep redis
service redisd start
netstat -aunpt |grep redis ##能过滤出端口号
redis的基本命令
redis有五种存储的类型:string(字符串),hash(哈希)、list(列表)、set(集合)、及zset(sorted set:有序集合)
1、string是redis的基本类型,可以理解与Memcached一样的类型,一个key对应一个value
string类型是二进制安全的,redis的string可以包含任何数据,如jpg图片或者序列化的对象
string类型是Redis最基本的数据类型,string类型的最大能存512MB
2、redis hash是一个键值(key=>value)对集合
Redis hash是一个string类型的field和value的映射表,bash特别适合用于存储对象,每一个hash可以存储2的32次方-1键值对
//作用场景:
键值对集合,即编程语言中的Map类型,适合存储对象,并且可以像数据库中update一个属性一样只修改某一项属性值。
redis-cli -h 20.0.0.10 -p 6379
第一种类型
set name zhangsan ##创建类name 输入数据zhangsan
get name ##查看数据
type name ##看name是什么类型的
keys * ##查看有哪些类
第二种hash类型
若输入的内容中有中文则是不能显示的,需要添加格式转换
20.0.0.10:6379> hmset stu name lisi age 18 sex 男 ##输入
OK
20.0.0.10:6379> keys * ##看有哪些类
1) "name"
2) "stu"
20.0.0.10:6379> type stu ##看stu的类型
hash
20.0.0.10:6379> hget stu age ##显示年龄
"18"
20.0.0.10:6379> hget stu name
"lisi"
20.0.0.10:6379> hget stu sex ##显示性别 不能看
"\xe7\x94\xb7"
20.0.0.10:6379> quit
[root@localhost utils]# redis-cli -h 20.0.0.10 -p 6379 --raw ##加入格式转换
20.0.0.10:6379> hget stu sex ##能显示中文
男
3、Redis列表是简单的字符串列表,按照插入顺序排序,可以重复,可以添加一个元素到列表的头部(左边)或者尾部(右边),列表最多可存储2的32次方-1元素
//作用场景:
增删快,提供了操作某一段元素的API ##最新消息排行等功能(比如朋友圈的时间线)##消息队列
LPUSH hobby read play sport ##存储一个类名为兴趣还好里面三个数据
20.0.0.10:6379> lrange hobby 0 10 ##取其中一到10 的数据
sport
play
read
20.0.0.10:6379> lrange hobby 0 0 ##取第一数据最后入先取出
sport
20.0.0.10:6379> keys *
name
stu
hobby
20.0.0.10:6379> lrange hobby 1 2
play
read
20.0.0.10:6379> lrange hobby 2 3
read
20.0.0.10:6379> lpush hobby read ##可存入相同的数
4
20.0.0.10:6379> lrange hobby 0 10
read
sport
play
read
4、Set集合
Set是redis中string类型中的无序集合
集合是通过hash实现的,所以添加,删除查找的复杂度都是0和1
//作用场景
##公共好友##利用唯一性,统计访问网站的所有独立ip##好友推荐时根据tag求交集,大于某个阔值就可以推荐
sadd命令
添加一个string元素到key对应的set集合中,成功返回1,如果没有返回0
0.10:6379> type hobby
list
20.0.0.10:6379> sadd color red green yellow blue ##创建color类
4
20.0.0.10:6379> keys *
name
color
stu
hobby
20.0.0.10:6379> smembers color ##查看color类中的数据
blue
red
green
yellow
20.0.0.10:6379> sadd color red ##存入red数据时无法存入返回为0
0
20.0.0.10:6379> smembers color
blue
red
green
yellow
5、zset(sorted set:有序集合)
Redis zset和set一样也是string类型的元素集合,且不允许重复的成员
不同的是每个元素都会关联一个double类型的分数,redis正是通过分数来来为集合的成员进行从小到大的排序
zset的成员是唯一的,但分数(score)却可以重复
//作用场景
将Set中的元素增加一个权重参数score,元素按score有序排列
数据插入集合时,已经进行天然排序##排行榜##带权重的消息队列
zadd命令添加元素到集合,元素在集合中存在则更新对应score
20.0.0.10:6379> del color ##删除color类
1
20.0.0.10:6379> keys *
name
stu
hobby
20.0.0.10:6379> zadd color 0 red ##中间一个数值
1
20.0.0.10:6379> zadd color 1 blue
1
20.0.0.10:6379> zadd color 2 green
1
20.0.0.10:6379> zadd color 3 yellow
1
20.0.0.10:6379> zrangebyscore color 0 10
red
blue
green
yellow
20.0.0.10:6379> zrangebyscore color 0 0
red
20.0.0.10:6379> zrangebyscore color 1 1
blue
20.0.0.10:6379> zrangebyscore color 3 3
yellow
20.0.0.10:6379> zrangebyscore color 2 3
green
yellow
20.0.0.10:6379> zadd color 1.6 black ##插入数值在1和2之间会在他们中间排序
1
20.0.0.10:6379> zrangebyscore color 0 10
red
blue
black
green
yellow
多数据库概念
Redis支持多个数据库,并且每个数据库的数据是隔离的不能共享,并且基于单机才有,如果是集群就没有数据库的概念。
Redis是一个字典结构的存储服务器,而实际上一个Redis实例提供了多个用来存储数据的字典,
客户端可以指定将数据存储在哪个字典中。这与我们熟知的在一个关系数据库实例中可以创建多个数据库类似,所以可以将其中的每个字典都理解成一个独立的数据库。
每个数据库对外都是一个从0开始的递增数字命名,Redis默认支持16个数据库(可以通过配置文件支持更多,无上限),可以通过配置databases来修改这一数字。客户端与Redis建立连接后会自动选择0号数据库,
不过可以随时使用SELECT命令更换数据库,如要选择1号数据库:
20.0.0.10:6379> select 1 ##更换数据库
OK
20.0.0.10:6379[1]> select 2 ##更换到第2数据库
OK
20.0.0.10:6379[2]> select 1 ##更换到第1个库
OK
20.0.0.10:6379[1]> keys * ##什么都没有
20.0.0.10:6379[1]> select 0 ##切换到第0个库
OK
20.0.0.10:6379> keys * ##查看都有哪些库
name
color
stu
hobby
20.0.0.10:6379> move stu 1 ##数据库迁移 将stu的数据库迁移到1号库
1
20.0.0.10:6379> keys *
name
color
hobby
20.0.0.10:6379> select 1 ##查看1号库
OK
20.0.0.10:6379[1]> keys * ##显示1号库的内容
stu
20.0.0.10:6379[1]> hget stu name ##被迁移的数据
lisi
20.0.0.10:6379[1]> hget stu age ##查看被迁移的数据
18
20.0.0.10:6379[1]> FLUSHALL ##清空所有的内容
OK
20.0.0.10:6379[1]> ksys *
(error) ERR unknown command `ksys`, with args beginning with: `*`,
FLUSHALL && EXISTS
Redis不支持自定义数据库的名字,每个数据库都以编号命名,开发者必须自己记录哪些数据库存储了哪些数据。另外Redis也不支持为每个数据库设置不同的访问密码,所以一个客户端要么可以访问全部数据库,
要么连一个数据库也没有权限访问。最重要的一点是多个数据库之间并不是完全隔离的,
比如FLUSHALL命令可以清空一个Redis实例中所有数据库中的数据。
宗上所述,这些数据库更像是一种命名空间,而不适宜存储不同应用程序的数据。作用场景:
可以使用0号数据库存储某个应用生产环境中的数据,使用1号数据库存储测试环境中的数据,但
不适宜使用0号数据库存储A应用的数据而使用1号数据库B应用的数据,不同的应用应该使用不同的Redis实例存储数据。由于Redis非常轻量级,一个空Redis实例占用的内存只有1M左右,所以不用担心多个Redis实例会额外占用很多内存。
redis-ali -h 20.0.0.10 -p 6379
20.0.0.10:6379> set name zhangsan #输入一个库为name里面有个zhangsan数据
OK
20.0.0.10:6379> get name ##输出
"zhangsan"
20.0.0.10:6379> exists name ##查看返回值判断是否库中有数据
(integer) 1
20.0.0.10:6379> rename name names ##更改库的名字
OK
20.0.0.10:6379> EXISTS name ##查看是不是更改了
(integer) 0
20.0.0.10:6379> EXISTS names ##证明已经更改
(integer) 1
20.0.0.10:6379> keys * ##查看所有的库
1) "names"
20.0.0.10:6379> pttl names ##以毫秒为单位返回生存时间
(integer) -1 ##-1代表没有设置
20.0.0.10:6379> pexpire names 3000 ##设置生存时间为3秒
(integer) 1 ##1代表有设置
20.0.0.10:6379> keys * ##可以看到3秒后names库已经没有了
(empty list or set)
20.0.0.10:6379> set name zhangsan
OK
20.0.0.10:6379> PTTL name ##查看有么有设置生命周期
(integer) -1
20.0.0.10:6379> pexpire name 50000 ##设置生命周期为50秒
(integer) 1
20.0.0.10:6379> pttl name ##查看还剩多长时间消失(逐渐减少)
(integer) 43641
20.0.0.10:6379> pttl name
(integer) 41597
20.0.0.10:6379> pttl name
(integer) 40219
20.0.0.10:6379> pttl name
(integer) 38613
20.0.0.10:6379> pttl name
(integer) 37371
20.0.0.10:6379> persist name ##取消生命周期的设置
(integer) 1 ##代表取消设置成功
20.0.0.10:6379> pttl name
(integer) -1
20.0.0.10:6379> keys *
1) "name"
20.0.0.10:6379> mset age 19 sex boy score 88 ##同时建立了三个库
OK
20.0.0.10:6379> keys *
1) "score"
2) "sex"
3) "name"
4) "age"
20.0.0.10:6379> RANDOMKEY ##可以随机的显示库的名字
"age"
20.0.0.10:6379> RANDOMKEY
"sex"
20.0.0.10:6379> RANDOMKEY
"sex"
20.0.0.10:6379> RANDOMKEY
"age"
20.0.0.10:6379> RANDOMKEY
"score"
20.0.0.10:6379> RANDOMKEY
"name"
20.0.0.10:6379> RANDOMKEY
"sex"
20.0.0.10:6379> RANDOMKEY
"name"
20.0.0.10:6379> RANDOMKEY
"score"
关键词
orale
make PREFIX=/usr/local/redis install 执行安装命令
cd utils/ 进入系统工具目录
./install_server.sh 自动安装服务器启动程序
#daemonize:是否以后台daemon方式运行
#pidfile:pid文件位置
#port:监听的端口号
#timeout:请求超时时间
#loglevel:log信息级别
#logfile:log文件位置
#databases:开启数据库的数量
bind -----绑定
set------创建、设置
get------得到
type----类型
keys—秘钥关键帧,这就是显示库用的
hmse-----哈希的类型的创建
hget-----哈希类型的查看
lrange----列表的创建
smembers----集合中查看数据用的
sadd-------无序的创建
del-----删除
zadd------有序创建
zrangebyscore-----查看序号
select------进入序号
move-----转移
FLUSHALL------删全部
exists------存在、存活
rename------重命名
EXISTS-----设置生命周期
pttl--------查看周期
pexpire-------添加生命周期
persist--------取消生命周期
RANDOMKEY------取随机库