文章目录
关系数据库与非关系型数据库
关系型数据库
一个结构化的数据库,创建在关系模型基础上
一般面向与记录
包括
Oracle、MySQL、SQL Server、Microsoft Access、DB2等
非关系型数据库
除了主流的关系型数据库外的数据库,都认为是非关系型
包括
时间序列数据库
非关系型数据库中加入了时间轴的概念
Reads、MongoDB、Hbase、CouhDb等
非关系型数据库产生背景
High performance——对数据库高并发读写需求
Huge Storage——对海量数据高效存储与访问需求
High Scalability && High Availability——对数据库高扩展性与高可用性需求
Redis简介
Redis基于内存运行并支持持久化
采用key-value(键值对)的存储形式
优点
具有极高的数据读写速度
支持丰富的数据类型
支持数据的持久化
原子性
支持数据备份
在Web应用发展的初期,那时关系型数据库受到了较为广泛的关注和应用,原因是因为那时候Web站点基本上访问和并发不高、交互也较少。而在后来,随着访问量的提升,使用关系型数据库的Web站点多多少少都开始在性能上出现了一些瓶颈,而瓶颈的源头一般是在磁盘的I/O上。而随着互联网技术的进一步发展,各种类型的应用层出不穷,这导致在当今云计算、大数据盛行的时代,对性能有了更多的需求,主要体现在以下四个方面:
1.低延迟的读写速度:应用快速地反应能极大地提升用户的满意度
2.支撑海量的数据和流量:对于搜索这样大型应用而言,需要利用PB级别的数据和能应对百万级的流量
3.大规模集群的管理:系统管理员希望分布式应用能更简单的部署和管理
4.庞大运营成本的考量:IT部门希望在硬件成本、软件成本和人力成本能够有大幅度地降低
为了克服这一问题,NoSQL应运而生,它同时具备了高性能、可扩展性强、高可用等优点,受到广泛开发人员的青睐。
Redis是现在最受欢迎的NoSQL数据库之一,Redis是一个使用ANSIC编写的开源、包含多种数据结构、支持网络、基于内存、可选持久性的键值对存储数据库,其具备如下特性:
1、基于内存运行,性能高效
2、支持分布式,理论上可以无限扩展
3、key-value存储系统
4、开源的使用ANSIC语言编写、遵守BSD协议、支持网络、可基于内存亦可持久化的日志型、Key-Value数据库,并提供多种语言的API
相比于其他数据库类型,Redis具备的特点是:
1、C/S通讯模型
2、单进程单线程模型
3、丰富的数据类型
4、操作具有原子性
5、持久化
6、高并发读写
7、支持lua脚本
Redis数据类型及主要特性
Redis支持五种数据类型: string(字符串),hash(哈希),list(列表),set(集合)及zset(sorted set:有序集合)。
String(字符串)
string是redis最基本的类型,你可以理解成与Memcached一模一样的类型,一个key对应一个value。
string 类型是二进制安全的。redis的string可以包含任何数据。比如jpg图片或者序列化的对象
string 类型是Redis最基本的数据类型,string类型的值最大能存储512MB。
基本命令
GET/MGET
SET/SETEX/MSET/MSETNX
INCR/DECR
GETSET
DEL
示例:
192.168.195.180:6379> set name zhangsan
OK
192.168.195.180:6379>get name
"zhangsan"
Hash(哈希字典)
Redis hash是一个键值(key= >value)对集合。
Redis hash是一个string 类型的field和value的映射表,hash特别适合用于存储对象。
每个hash可以存储2的32次方-1键值对。
作用场景:
键值对集合,即编程语言中的Map类型 适合存储对象,并且可以像数据库中update一个属性一样只修改某一项属性值
192.168.195.119:6379>hmset stu name lisi age 18 sex男
oK
192.168.195.119:6379> keys *
1) "score"
2) "stu
3) "ns"
192.168.195.119:6379> hget stu name
"lisi"
192.168.195.119:6379> hget stu age
"18""
192.168.195.119:6379> hget stu sex
"lxe7x941xb7
192.168.195.119:6379> quit
//--raw 解决中文乱码问题 --raw解析中文
[root@localhost utils]# redis-cli -h 192.168.195.119 -p 6379 --raw
is2.168.195.119:6379>keys *
score
stu
ns
192.168.195.119:6379> hget stu sex
男
192.168.195.119:6379> type stu
hash
List(列表)(可以存重复的值 )
Redis列表是简单的字符串列表,按照插入顺序排序,可以重复。可以添加一个元素到列表的头部(左边)或者尾部(右边)。
列表最多可存储2的32次方-1元素。
//作用场景;
增删快,提供了操作某一段元素的API
最新消息排行等功能(比如朋友圈的时间线)消息队列
192.168.195.119:6379> LPUSH hobby read
1
132.168.195.119:6379> LPUSH hobby play
2
192.168.195.119:6379> LPUSH hobby sport
3
192.168.195.119:6379> keys *
hobby
score
stu
ns
192.168.195.119:6379> lrange hobby 0 10
sport
play
read
192.168.195.119:6379>lrange hobby 0 0
sport
192.168.195.119:6379>lrange hobby 1 1
play
192.168.195.119:6379>lrange hobby 2 2
read
先存进去的数据,最后才读出来
192.168.195.119:6379> type hobby
list
192.168.195.119:6379> LPUSH hobby read
4
192.168.195.119:6379>lrange hobby e 1e
read
sport
play
read
Set(集合)(不可以存重复的值)
Redis的Set是string类型的无序集合。
集合是通过哈希表实现的,所以添加,删除,查找的复杂度都是o(1).
作用场景:
共同好友
利用唯一性,统计访问网站的所有独立ip
好友推荐时,根据tag求交集,大于某个阈值就可以推荐
sadd命令
添加一个string元素到key对应的set集合中,成功返回1,如果元素已经在集合中返回0。
示例:
192.168.195.180:6379> sadd color red green yellow
3
192.168.195.180:6379> smembers color
red
yellow
green
192.168.195.180:6379> sadd color red //不能存重复的值
0
zset (sorted set:有序集合)
Redis zset和set一样也是string类型元素的集合,且不允许重复的成员。
不同的是每个元素都会关联一个double类型的分数。redis正是通过分数来为集合中的成员进行从小到大的排序。
zset的成员是唯一的,但分数(score)却可以重复。
作用场景:
将Set中的元素增加一个权重参数score,元素按score有序排列
数据插入集合时,已经进行天然排序
1、排行榜 2、带权重的消息队列
zadd命令
添加元素到集合,元素在集合中存在则更新对应score
192.168.195.119:6379> zadd color 0 red
1
192.168.195.119:6379> zadd color 0 blue
1
192.168.195.119:6379> zadd color 1 yellow
1
192.168.195.119:6379>ZRANGEBYSCORE color 0 10
blue
red
yellow
192.168.195.119:6379>ZRANGEBYSCORE color 0 0
blue
red
192.168.195.119:6379>ZRANGEBYSCORE color 1 1
yellow
192.168.195.119:6379> zadd color 0.5 green
1
192.168.195.119:6379> ZRANGEBYSCORE color 0 10
blue
red
green
Redis配置文件
配置参数(/etc/redis/6379.conf)
bind:监听的主机地址
port:端口
daemonize yes:启用守护进程
pidfile:指定PID文件
loglevel notice:日志级别
logfile:指定日志文件
附加:若出现kill -9 杀死进程,发现PID文件并没有被删除,下一次启动该进程的时候起不来 说明PID文件冲突(因为上一次服务的进程号没有被删除,本次服务的进程号与上一次的不一样),解决思路,及时找到上一个PID文件的路径,rm-rf删除,在开启服务,所有想介绍进程推荐使用pkill -9去杀死进程(会自动删除pid文件)
key相关命令
keys:获取符合规则的键值列表
exists:判断键值是否存在
del:删除当前数据库的指定key
type:获取key对应的value值类型
rename(覆盖)/renamenx(不覆盖):重命名
dbsize:查看当前数据库中key的数目
在 Redis数据库中,与key相关的命令主要包含以下几种
1)keys
使用keys命令可以取符合规则的键值列表,通常情况可以结合*、?等选
项来使甬
[root@localhost~]#redis-cli
i27.0.0.1:6379>set k1 1
OK
127.0.0.1:6379>set k2 2
OK
127.0.0.1:6379>set k3 3
OK
127.o.0.1:6379>set v1 4
OK
127.0.0.1:6379>set v5 5
OK
127.0.0.1:6379>KEYS* ####查看当前数据库中所有键
"teacher"
"v1"
"k3"
"k1"
"k2”
“v5"
127.0.0.1:6379>set v22 5
OK
127.0.0.1:6379>KEYS v*//查看当前数据库中以v开头的数据
1)"v1"
2"v22”
3"v5"
127.0.0.1:6379>KEYS v?//查看当前数据库中以v开头后面包含任意一位自
数据
1)"v1"
2)"v5”
127.0.0.1:6379>KEYS v??//查看当前数据库中以v开头v开头后面包含任
意两位的数据
1)"v22*
2)exists
exists命令可以判断键值是否存在。
127.0.0.1:6379>exists teacher //判断teacher键是否存在
(integer) 1 //表示teacher键是存在
127.0.0.1:6379>exists tea
(integer)0 //表示tea键不存在
3)del
del命令可以删除当前数据库的指定key
127.0.0.1:6379>keys*
1) "teacher"
2)"v1"
3)"v22
4)"k3"
5)"k1”
6)"k2"”
7)"v5"
127.0.0.1:6379>del v5
(integer)1
127.0.o.1:6379>get v5
(nil)
4)type
便用type命令可以获取key 对应的value值类型
127.0.0.1:6379>type kl
string
5)rename
rename命令是对已有key进行重命名,其命令格式为:rename 源 key目标key。使用rename命令进行重命名时,无论目标key是否存在都进行重命名,且源key_的值会覆盖真标key的值。―在实际使用过程中,建议先用exists命令查看目标key 是否存在,然后再决定是否执行rename命令,以避免覆盖重要数据
127.0.0.1:6379>keys v*
1)"v1”
2)"v22"
127.0.0.1:6379>rename v22 v2
1)OK
127.0.0.1:6379>keys v*
1)"vl"
2)"v2"
127.0.0.1:6379>get v1
"4"
127.o.0.1:6379>get v2
"5
127.0.0.1:6379>rename vl v2
OK
127.0.0.1:6379>get v1
(nil)
127.0.0.1:6379>get v2
”4"
6)renamenx
renamenx命令的作用是对已有key进行重命名,并检测新名是否存在。其命令格式与rename的命令格式除命令关键字不同外基本相同,renamenx源 key目标key。使用renamenx命令进行重命名时,如果目标key存在则不进行重命名
127.0.0.1:6379>keys *
1)"teacher"
2)"k3"
3)"k1"
4)"k2"
5)"v2"
127.0.0.1:6379>get teacher
'zhanglong"
127.0.0.1:6379>get v2
"4"
127.0.0.1:6379>renamenx v2 teache
(integer)0
127.0.0.1:6379>keys *
)"teacher"
2)"k3"
3)"k1"
4)"k2"
)"v2"
127.0.0.1:6379>get teacher
zhanglong"
127.0.0.1:6379>get v2
7)dbsize
dbsize命令的作用是查看当前数据库中 key的数目
127.0.0.1:6379>dbsize
(integer)5
Redis数据库常用命令
前面提到,Redis数据库采用key-value(键值对)。的数据存储形式。所使用的布令是
set与get命令。
set:存放数据,基本的命令格式为set key value。
get:获取致据,基本的命令格式为get key .
例如在 Redis的命令行模式下执行”set teacher zhanglong”,表示在当箭薮据库下存放一个key'为teacher,value为 zhanglong的数据,而执行“getteacher“命令即可查看刚才存放的数据
[root@localhost~]#redis-cli
127.0.0.1:6379> set techer zhanglong
OK
多数据库常用命令
1)多数据车间切换
Redis支持多数据库,Redis在没有任何改动的情况下默认包含16个数据库,数据库名称是用数字0-15来依次命名的。使用Select命令可以进行Redis的多数据年之间的切换,命令格式为selectindex,其中index表示数据库的序号。而使用redis-cli连接Redis数据库后,默认使用的是序号为0的数据库。
如下所示,使用select命令切换数据库后,会在前端的提示符中显示当前所在的数据库序号如“127.0.0.1:6379[10]>”表示当前使用的是序号为10的数据库;
若当前使用的数据库是序号为0的数据库,提示符中则不显示序号,如“127.0.0.1:6379>表示当前使用
的是序号为0的数据库。
127.0.0.1:6379>select 10//切换至序号为10的数据库
OK
127.0.0.1:6379[10]>select 15//切换至序号为15的数据库
OK
127.0.0.1:6379[15]>select 0//切换至序号为0的数据库
OK
127.0.0.1:6379>
2)多数据库间移动数据
Redis 的多数据库在一定程度上是相对独立的,例如在数据库0上面存放的k1的数据,
在其它的1-15 的数据库上是无法查看到的。
127.0.0.1:6379>set kl 100
OK
127.o.0.1 :6379>get k1
"100”
127.0.0.1:6379>select 1
OK
127.0.0.1:6379[1]>get kl
(nil)
3)清除数据库内数据
Redis数据库的整库数据删除主要分为两个部分:清空当前数据库数据,使用FLUSHDB命令实现:清空所有数据库的数据,使用FLUSHALL命令实现。但是,数据清空操作比较危险,生产环境下一般不建议使用。
127.0.0.1:6379>flushdb
OK
##Redis持久化####
Redis是一种高级key-value数据库。它跟memcached类似,不过数据可以持久化,而且支持的数据类型很丰富。有字符串,链表,集合和有序集合。支持在服务器端计算集合的Redis数据库提供了一个move的命令,可以进行多数据库的数据移动。命令的基本语法格式为”move key dbindex“。其中“key“表示当前数据库的目标键,“dbindex“表示自标数据库的序号。
127.0.0.1:6379[1]>select 0//切换至目标数据库0
OK
127.0.0.1:6379>get k1//查看目标数据是否存在
"100”
127.0.0.1:6379>move k1 1//将数据库О中kl移动到数据库1中
(integer) 1
127.0.0.1:6379>select 1 //切换至目标数据库1
OK
127.0.0.1:6379[1]>get k1//查看被移动数据
"100"
127.0.0.1:6379[1]> select o
OK
127.0.0.1:6379>get k1//在数据库0中无法查看到k1的值
(nil)
Redis安装部署
编译安装Redis
[root@server1 ~]# tar zxf redis-5.0.7.tar.gz
[root@server1 ~]# cd redis-5.0.7/
[root@server1 redis-5.0.7]# make -j2
[root@server1 redis-5.0.7]# make PREFIX=/usr/local/redis install
[root@server1 redis-5.0.7]# ln -s /usr/local/redis/bin/* /usr/local/bin #将redis的所有命令拷贝到/usr/local/bin目录下,可以更便捷的使用
设置Redis相关配置文件
[root@server1 ~]# cd redis-5.0.7/
[root@server1 redis-5.0.7]# cd utils/
[root@server1 utils]# ./install_server.sh #执行安装服务脚本
Welcome to the redis service installer
This script will help you easily set up a running redis server
Please select the redis port for this instance: [6379] 回车 #确定端口号
Selecting default: 6379
Please select the redis config file name [/etc/redis/6379.conf] 回车#redis配置文件
Selected default - /etc/redis/6379.conf
Please select the redis log file name [/var/log/redis_6379.log] 回车#日志文件
Selected default - /var/log/redis_6379.log
Please select the data directory for this instance [/var/lib/redis/6379] 回车#数据存放目录
Selected default - /var/lib/redis/6379
Please select the redis executable path [/usr/local/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
Is this ok? Then press ENTER to go on or Ctrl-C to abort.
Copied /tmp/6379.conf => /etc/init.d/redis_6379
Installing service...
Successfully added to chkconfig!
Successfully added to runlevels 345!
Starting Redis server...
Installation successful!
登录redis
[root@server1 src]# redis-cli -h 127.0.0.1 -p 6379 默认为127.0.0.1
127.0.0.1:6379>
Redis数据库常用命令
Redis数据库常用命令5.1
redis-cli命令行工具
连接本地数据库
[root@localhost utils]#/usr/local/redis/bin/redis-cli //cli表示客户端
127.0.0.1:6379>
连接远程数据库
[root@localhost utils]# redis-cli -h 192.168.10.161-p 6379 //-h:host -p:ort
192.168.10.161:6379>
Redis数据库常用命令5-2
redis-cli命令行工具
获取命令帮助
help @<group>:获取<group>中的命令列表
help <command>:获取某个命令的帮助
help <tab>:获取可能帮助的主题列表
[root@localhost utils]# /usr/local/redis/bin/redis-cli
127.0.0.1:6379>help @list
BLPOP key [key ...] timeout
summary: Remove and get the first element in a list,or block
until one is available
since:2.0.0
127.0.0.1:6379> help set
SETkey value[Ex seconds][PX milliseconds][NX|XX]
2
summary: Set the string value of a key
since:1.0.0
group: string
Redis数据库常用命令5-3
redis-cli命令行工具
set:存放数据
get:获取数据
[root@localhost~]#/usr/local/redis/bin/redis-cli
127.0.0.1:6379> set teacher zhanglong
OK
127.0.0.1:6379>get teacher
"zhanglong"
库操作环境,执行exit”或“quit”命令即可返还原来的 Shell环境
redis-benchmark测试工具
redis-benchmark是官方百带的Redis 性能测试工具,可以有效的测试
Redis服务的性能。基本的测试语法为redis-benchmark [option][option value]。
-h:指定服务器主机名。
-p:指定服务器端口。
-s:指定服务器socket。
-c:指定并发连接数。
-n:指定请求数。
-d:以字节的形式指定 SET/GET 值的数据大小。
-k: 1=keep alive 0=reconnect 0
-r:SET/GET/INCR使用随机key,SADD使用随机值。
-P:通过管道传输<numreq>请求。
-q:强制退出redis:仅显示query/sec值。
--csv:以csV 格式输出。
-l:生成循环,永久执行测试。
-t:仅运行以逗号分隔的测试命令列表。
-I:idle模式。仅打N个idle连接并等待。
结合上述选项,可以针对某台Redis服务器进行性能检测,如执行redis-benchmark -h
192.168.100.42 -p 6379 -c 100 -n 100000命令即可向IP地址为192.168.100.42、端口
为6379的Redis服务器发送100个并发连接与100000个请求测试性能。
[root@localhost~]#redis-benchmark -h 192.168.100.42-p 6379 -c
100 -n 100000
执行redis-benchmark -h 192.168.100.41 -p 6379 -q -d 100命令的作用是测试存取
大小为100字节的数据包的性能。
[root@localhost utils]# redis-benchmark -h 192.168.100.41-p 6379
-q -d 100
还可以测试某些操作的性能,例如执行redis-benchmark -t set,lpush -n 100000 -q
命令的作用是测试本机上Redis服务在进行set 与 lpush操作时的性能。
[root@localhost~]# redis-benchmark -t set,lpush -n 100000 -q
RDB持久化
Redis的默认持久化方式
默认文件名dump.rdb
触发条件
在指定的时间间隔内,执行指定次数的写操作(配置文件控制)
执行save或者是bgsave (异步)命令
执行flushall命令,清空数据库所有数据
执行shutdown命令,保证服务器正常关闭且不丢失任何数据
优缺点
适合大规模的数据恢复
如果业务对数据完整性和一致性要求不高,RDB是很好的选择
数据的完整性和一致性不高
备份时占用内存
通过RDB文件恢复数据将dump.rdb文件拷贝到redis的安装目录的bin目录下,重启redis服务即可配置文件选项
vim /etc/redis/6379.conf
save 900 1//900秒之内至少一次写操作、300秒之内至少发生10次写操作、60秒之内发生至少10000次写操作,只要满足其一都会触发快照操作,注释所有的save项表示关闭RDB
save 300 10
save 60 10000
dbfilename dump.rdbRDB文件名称
dir /var/lib/redis/6379
RDB文件路径
rdbcompression yes
是否进行压缩
AOF持久化
Redis默认不开启弥补RDB的不足(数据的不一致性)采用日志的形式来记录每个写操作,并追加到文件中
Redis重启会根据日志文件的内容将写指令从前到后执行一次以完成数据的恢复工作
根据AOF文件恢复数据
将appendonly.aof文件拷贝到Redis的安装目录的bin目录下,重启Redis服务即可
配置文件选项
vim /etc/redis/6379.conf
appendonly yes //开启AOF持久化
appendfilename "appendonly.aof " //AOF文件名称
# appendfsync always //always:同步持久化,每次发生数据变化会立刻写入磁盘
everysec:默认推荐,每秒异步记录一次(默认值)
no:不同步,交给操作系统决定如何同步
appendfsync everysec
#appendfsync no
aof-load-truncated yes //忽略最后一条可能存在问题的指令
[root@server1]# cd /var/lib/redis/6379/
[root@server1 6379]# ll
总用量 8
-rw-r--r--. 1 root root 0 11月 10 12:06 appendonly.aof
-rw-r--r--. 1 root root 175 11月 10 12:26 dump.rdb
-rw-r--r--. 1 root root 781 11月 10 12:26 nodes-6379.conf
测试
[root@server1 src]# redis-benchmark -h 20.0.0.10 -p 6379 -c 100 -n 10000
====== PING_INLINE ======
10000 requests completed in 0.05 seconds
100 parallel clients
3 bytes payload
keep alive: 1
99.05% <= 1 milliseconds
99.58% <= 2 milliseconds
100.00% <= 2 milliseconds
200000.00 requests per second
###省略部分内容###
====== MSET (10 keys) ======
10000 requests completed in 0.05 seconds
100 parallel clients
3 bytes payload
keep alive: 1
100.00% <= 0 milliseconds
217391.30 requests per second
存取大小为100字节的数据包的性能
[root@master1 src]# redis-benchmark -h 20.0.0.10 -p 6379 -q -d 100
PING_INLINE: 221238.94 requests per second
PING_BULK: 216450.20 requests per second
SET: 229357.80 requests per second
GET: 226757.36 requests per second
INCR: 224215.23 requests per second
LPUSH: 175746.92 requests per second
RPUSH: 168067.22 requests per second
LPOP: 203665.98 requests per second
RPOP: 219298.25 requests per second
SADD: 222717.16 requests per second
HSET: 227790.42 requests per second
SPOP: 224719.11 requests per second
LPUSH (needed to benchmark LRANGE): 172413.80 requests per second
LRANGE_100 (first 100 elements): 84745.77 requests per second
LRANGE_300 (first 300 elements): 33233.63 requests per second
LRANGE_500 (first 450 elements): 22794.62 requests per second
LRANGE_600 (first 600 elements): 16926.20 requests per second
MSET (10 keys): 185873.61 requests per second
测试本机上Redis服务在进行set与lpush操作时的性能
[root@master1 src]# redis-benchmark -h 20.0.0.10 -p 6379 -t set,lpush -n 100000 -q
SET: 233644.86 requests per second
LPUSH: 204081.62 requests per second
Redis性能管理
内存碎片率
操作系统分配的内存值used_memory_rss除以Redis使用的内存值used_memory计算得出
内存碎片是由操作系统低效的分配/回收物理内存导致的不连续的物理内存分配
跟踪内存碎片率对理解Redis实例的资源性能是非常重要的
内存碎片率稍大于1是合理的,这个值表示内存碎片率比较低
内存碎片率超过1.5,说明Redis消耗了实际需要物理内存的150%,其中50%是内存碎片率
内存碎片率低于1的,说明Redis内存分配超出了物理内存,操作系统正在进行内存交换
内存使用率
redis实例的内存使用率超过可用最大内存,操作系统将开始进行内存与swap空间交换
避免内存交换
针对缓存数据大小选择
尽可能的使用Hash数据结构
设置key的过期时间
回收key
1、保证合理分配redis有限的内存资源
2、当达到设置的最大阀值时,需选择一种key的回收策略
默认情况下回收策略是禁止删除
redis.conf配置文件中修改maxmemory-policy属性值
1)volatile-lru:使用LRU算法从已设置过期时间的数据集合中淘汰数据
2)volatile-ttl:从已设置过期时间的数据集合中挑选即将过期的数据淘汰
3)volatile-random:从已设置过期时间的数据集合中随机挑选数据淘汰
4)allkeys-lru:使用LRU算法从所有数据集合中淘汰数据
5)allkeys-random:从数据集合中任意选择数据淘汰
6)no-enviction:禁止淘汰数据