一、数据库概述
根据不同存储数据类型分类分成两种数据库
- 结构化数据库(sql):里面存储的数据类型是结构化数据。(关系型数据库)
- 非结构化数据库(nosql):里面存储的数据类型是非结构化数据。(非关系型数据库)
关系数据库与非关系型数据库
- 关系型数据库
一个结构化的数据库,创建在关系模型基础上
一般面向于记录
包括:Oracle、MySQL、SQL Server、Microsoft Access、DB2等 - 非关系型数据库
除了主流的关系型数据库外的数据库,都认为是非关系型
包括:Redis、MongBD、Hbase、CouhDB等
非关系型数据库产生背景
- High performance——对数据库高并发读写需求
- Hug——Storage——对海量数据高效存储与访问需求
- High Scalability && High Availability——对数据库高可扩展性与高可用性需求
Redis简介
- Redis基于内存运行并支持持久化
- 采用key-value(键值对)的存储形式
- 优点
具有极高的数据读写速度
支持丰富的数据类型
支持数据的持久化
原子性
支持数据备份
二、Redis 数据类型
Redis支持五种数据类型:
string(字符串)
hash(哈希)
list(列表)
set(集合)
zset(sorted set:有序集合)
1.String(字符串)
string是redis最基本的类型,你可以理解成与Memcached一模一样的类型,一个key对应一个value。
string类型是二进制安全的。redis的string可以包含任何数据。比如jpg图片或者序列化的对象。
string类型是redis最基本的数据类型,string类型的值最大能存储512MB。
String实例
set string1 10 ##设置键值对:set 键 值,表示string1值为10
get string1 ##获取键的值:get 键
10
Incr string1 ##键值自增1
11
Decr string1 ##键值自减1
10
Decrby string1 5 #键值自减5(自定义)
5
Incrby string1 7 #键值自增7(自定义)
12
2.Hash(哈希字典)
Redis hash是一个键值(key=>value)对集合
Redis hash是一个string类型的field和value的映射表,hash特别适合用于存储对象
每个hash可以存储2的32次方-1键值对
- 作用场景:
键值对集合,即编程语言中的Map类型
适合存储对象,并且可以像数据库中update一个属性一样只修改某一项属性值
Hash实例
hset hash1 key1 a #hset添加hash数据
hset hash1 key2 b
hset hash1 key3 c
hset hash1 field1 a1 field2 a2
hget hash1 key1 #hget获取hash数据
a
hmget hash1 key1 key2 key3 #hmget获取多个hash数据
a b c
3.List(列表)
Redis列表是简单的字符串列表,安照插入顺序排序,可以重复。可以添加一个元素到列表的头部(左边)或者尾部(右边)。列表最多可存储2的32次方-1元素。
- 作用场景:
增删快,提供了操作某一段元素的API
最新消息排行等功能(比如朋友圈的时间线)或者小心队列
List实例
lpush list1 1 #lpush从左边推入值
lpush list1 2
lpush list1 3
lien list1 #lien查看某个list数据类型的长度
3
rpop list1 #rpop从右边弹出值
1
lien list1
2
lpop list1 #lpop从左边弹出值
3
rpush list2 1 #rpush从右边推入值
4.Set(集合)
Redis的Set是string类型的无序集合

集合是通过哈希表实现的,所以添加、删除、查找的复杂度都是O(1)
- 作用场景:
1.共同好友 2.利用唯一性,统计访问网站的所有独立IP
3.好友推荐时,根据tag求交集,大于某个阈值就可以推荐
sadd命令
添加一个string元素带key对应的set集合中,成功返回1,如果元素已经在集合中放回0
Set实例:
sadd set1 12 #sadd key member添加一个string元素到key对应的set集合中,成功返回1,如果元素已经在集合中返回0
1
sadd set1 13
1
sadd set1 12
0
scard set1 //scard查看set数据中存在的元素个数
2
sismember set1 11 //sismember判断set数据中是否 存在某个元素
0
sismember set1 13
1
srem set1 13 //srem删除某个set数据中的元素
1
sismember set1 13
0
smember set1 //列出所有set1的值
5.zset(sorted set:有序集合)
Reis zset和set一样也是string类型元素的集合,且不允许重复的成员
不同的是每个元素都会关联一个double类型的分数。redis正是通过分数来为集合中的成员进行从小到大的排序
zset的成员是唯一的,但分数(score)却可以重复
- 作用场景
将Set中的元素增加一个权重参数score,元素按score有序排列
数据插入集合时,已经进行天然排序
1.排行榜
2.带权重的消息队列
zadd命令
添加元素到集合,元素在集合中存在则更新对应score
zadd zset1 1.1 val1 #zadd key score member天啊及元素到集合,元素在集合中存在则更新对应score
zadd zset1 2.2 val2
zcard #查询
zrang #数据排序
三、部署redis
操作步骤
1.解压软件包
2.make && make install
3.设置Redis相关配置文件
4.查看运行状态
1.编译安装
[root@localhost ~]# tar zxvf redis-5.0.7.tar.gz -C /opt/
[root@localhost ~]# cd /opt/redis-5.0.7
[root@localhost redis-5.0.7]# make
[root@localhost redis-5.0.7]# make PREFIX=/usr/local/redis install
[root@localhost redis-5.0.7]# ln -s /usr/local/redis/bin/* /usr/local/bin/
2.设置Redis相关配置文件
[root@localhost ~]# cd /opt/redis-5.0.7/utils/
[root@localhost 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]
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!
[root@localhost utils]# vim /etc/redis/6379.conf
...
bind 127.0.0.1 20.0.0.10 '//70行'
...
port 6379 '//93行'
...
daemonize yes '//137行'
...
pidfile /var/run/redis_6379.pid '//159行'
...
loglevel notice '//167行'
...
logfile /var/log/redis_6379.log '//172行'
...
3.Redis进程控制
[root@localhost utils]# /etc/init.d/redis_6379 status '//查看状态'
[root@localhost utils]# /etc/init.d/redis_6379 stop '//停止'
[root@localhost utils]# /etc/init.d/redis_6379 start '//启动'
[root@localhost utils]# /etc/init.d/redis_6379 restart '//重启'
Redis数据库常用命令
key相关命令
set:存放数据
get:获取数据
keys:获取符合规则的建值列表
exists:判断键值是否存在
del:删除当前数据库的指定key
type:获取key对应的value值类型
rename(覆盖)/renamenx(不覆盖):对已有的key进行重命名
dbsize:查看当前数据库中key的数目
Redis配置文件
配置参数(/etc/redis/6379.conf)
bind:监听的主机地址
port:端口
daemonize yes:启用守护进程
pidfile:指定PID文件
loglevel notice:日志级别
logfile:指定日志文件
Redis部署流程
#预安装环境
[root@localhost ~]# yum -y install gcc gcc-c++ make
#编译安装
[root@localhost ~]# tar zxvf redis-5.0.7.tar.gz -C /opt/
[root@localhost ~]# cd /opt/redis-5.0.7
[root@localhost redis-5.0.7]# make
[root@localhost redis-5.0.7]# make PREFIX=/usr/local/redis install
[root@localhost redis-5.0.7]# ln -s /usr/local/redis/bin/* /usr/local/bin/
#安装Redis
[root@localhost ~]# cd /opt/redis-5.0.7/utils/
[root@localhost 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]
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!
#配置文件
[root@localhost utils]# vim /etc/redis/6379.conf
...
bind 127.0.0.1 20.0.0.10 '//70行'
...
port 6379 '//93行'
...
daemonize yes '//137行'
...
pidfile /var/run/redis_6379.pid '//159行'
...
loglevel notice '//167行'
...
logfile /var/log/redis_6379.log '//172行'
...
[root@localhost utils]# /etc/init.d/redis_6379 restart '//重启'
#登录Reids数据库
[root@localhost utils]# redis-cli -h 20.0.0.10 -p 6379
20.0.0.10:6379> '//quit退出'
三、多数据库操作
Redis支持多数据库,默认支持16个数据库,0-15命名
多个数据库相互独立,互不干扰
多数据库常用命令
1.keys
使用keys命令可以取符合规则的键值列表,通常可以结合*、?等选项来使用
set k1 1
set k2 2
set v33 3
set v4 4
keys * #查看当前数据库中所有键
1)k1
2)k2
3)v33
4)v4
keys k* #查看当前数据库中以k开头的所有键
1)k1
2)k2
keys v? #查看当前数据库中以v开头并只跟了一个参数的键
1)v4
keys v?? #查看当前数据库以v开头并跟了两个参数的键
1)v33
2.del删除
del命令可以删除当前数据库指定的key
keys *
1)k1
2)k2
del k2 #删除k2
(integer)1
get k2
(nil)
3.exists 判断存在
exists命令可以判断键值是否存在
exists k1
(integer)1 #表示键存在
exists k2
(integer)0 #表示不存在
4.flushdb 清空数据库数据
redis数据库的整库数据删除主要分为两个部分:
1.清空当前数据库数据
2.使用flushdb清空所有数据库数据
flushdb #清空所有数据库数据
ok #返回删除完成确认
5.move 多数据库移动
redis数据库提供了一个move命令,可以进行多数据库的数据移动,命令的基本语法格式为move key dbindex,启动key表示目标键,dbindex表示目标序号
select 0 #切换至目标数据库0
get k1 #查看是否存在
move k1 1 #将数据库0中的k1移动到数据库1中
get k1 #数据此时不存在
select 1
get k1 #数据存在数据库1中
6.select 多数据库切换
redis支持多数据库,在redis没有任何改动的情况下默认包含16个数据库,数据库名称是用数字0-15一次命名,使用select可以进行redis的多数据库之间的切换,命名格式为select index,index表示数据库序号,使用redis-cli连接数据库后,默认使用序号为0的数据库
select 15 ##切换至数据库15
7.rename 重命名
rename命令是对已有key进行重命名,格式为rename 源key 目标key,使用rename进行重命名时,无论目标key是否存在都进行重命名,且源key的值会覆盖目标key的值,在实际使用过程中,建议先用exists命令查看目标key是否存在,再决定是否重命名,以避免覆盖数据
keys v*
1)v3
2)v4
get v3
3
rename v3 v2
keys v*
1)v2
2)v4
get v2
3
8.renamenx
renamenx命令作用是对已有key进行重命名,并检测新名是否存在,其命令格式与rename的命令格式除命令关键字不同外基本相同,renamenx 源key 目标key,使用renamenx命令进行重命名时,如果目标key存在则不进行重命名
keys *
1)k1
2)k2
renamenx k1 k2
(integer)0 #失败
9.type 查看value值类型
使用type可以获取key对应的value值类型
type k1
string #查询到为字符串型
四、Redis持久化
Redis持久化概述
- Redis是运行在内存中,内存中的数据断电丢失
- 为了能够重用Redis数据,或者防止系统故障,需要将Redis中Redis中的数据写入到磁盘空间,即持久化
- 持久化分类
RDB方式:创建快照的方式获取某一时刻Redis中所有数据的副本
AOF方式:将执行的写命令写到文件的末尾,以日志的方式来记录数据的变化
1.RDB持久化
Redis的默认持久化方式
默认文件名dump.rdb
触发条件
在指定的时间间隔内,执行指定次数的写操作(配置文件控制)
执行save或者是bgsave(异步)命令
执行flushall命令,清空数据库所有数据
执行shutdown命令,保证服务器正常关闭且不丢失任何数据
优缺点
适合大规模的数据恢复
如果业务对数据完整性和一致性要求不高,RDB是很好的选择
数据的完整性和一致性不高
备份时占用内存
通过RDB文件恢复数据
将dump.rdb文件拷贝到redis的安装目录的bin目录下,重启redis服务即可
配置文件选项
vim /etc/redis/6379.conf
save 900 1
save 300 10
save 60 10000
//900秒之内至少一次写操作,300秒之内至少发生10次写操作,60秒之内发生至少10000次写操作,只要满足其一都会触发快照操作,注释所有的save项表示关闭RDB
dbfilename dump.rdb //RDB文件名称
dir /var/lib/redis/6379 //RDB文件路径
rdbcompression yes //是否进行压缩
2.AOF持久化
Redis默认不开启
弥补RDB的不足(数据的不一致性)
采用日志的形式来记录每个写操作,并追加到文件中
Redis重启会根据日志文件的内容将写指令从前到后执行一次以完成数据的恢复工作
根据AOF文件恢复数据
根据AOF文件恢复数据
将appendonly.aof文件拷贝到Redis的安装目录的bin目录下,重启Redis服务即可
配置文件选项
vi /etc/redis/6379.conf
appendonly yes //开启AOF持久化
appendfilename "appendonly.aof" //AOF文件名称
# appendfsync always //always:同步持久化,每次发生数据变化会立刻写入磁盘
appendfsync everysec //everysec:默认推荐,每秒异步记录一次(默认值)
# appendfsync no //no:不同步,交给操作系统决定如何同步
aof-load-truncated yes //忽略最后一条可能存在问题的指令
AOF的重写机制
AOF的工作原理是将写操作追加到文件中,文件的冗余内容会越来越多
当AOF 文件的大小超过所设定的阈值时,Redis就会服AOF文件的内 容压缩
AOF重写的原理
Redis会fork除一条新进程,读取内存中的数据(并没有读取旧文件),并重写到一个临时文件夹中,最后替换旧的aof文件
AOF 重写配置
vim /etc/redis/6379.conf
# 在日志进行BGPWRITEAOF时,如果设置为yes表示新写入操作不进行同步fsync,只是暂存在缓存区里,避免造成磁盘IO操作冲突,等重写完成后在写入。redis中默认为no
no-appendfsunc-on-rewrite no
# 当前AOF文件大小是上次日志重写时AOF文件大小两倍时,发生 BGPEWRITEAOF操作
auto-aof-rewrite-percentage 100
# 当前AOF文件执行BGPEWRITEAOF命令的最小值,避免刚开始启动Redis时由于文件尺寸较小导致频繁的BGPEWRITEAOF
auto-aof-rewrite-min-size 64mb
五、redis性能管理
1.redis内存使用c查看
127.0.0.1:6379> info memory ## Memory
used_memory:2650536
used_memory_human:2.53M ## 内存使用总量
used_memory_rss:12120064
used_memory_rss_human:11.56M
...
mem_fragmentation_ratio:4.57 ## 内存碎片率
2.redis内存碎片率
- 操作系统分配的内存值used_memory_res除以Redis使用的内存值used_memory计算得出
- 内存碎片是由操作系统低效的分配/回收物理内存导致的
不连续的物理内存分配 - 跟踪内存碎片率对理解Redis实例的资源性能是非常重要的
1.内存碎片率稍大于1是合理的,这个值表示内存碎片率比较低
2.内存碎片率超过1.5,说明Redis消耗了实际需要物理内存的150%,其中50%是内存碎片率
3.内存碎片率低于1的,说明Redis内存分配超出了物理内存,操作系统正在进行内存交换
3.redis内存使用率
- redis实例的内存使用率超过可用最大内存,操作系统将开始进行内存与swap空间交换
- 避免内存交换
1.针对缓存数据大小选择
2.尽可能的使用Hash数据结构
3.设置key的过期时间
4.回收key
- 保证合理分配redis有限的内存资源
- 当达到设置的最大阈值时,需选择一种key的回收策略
默认情况下回收策略是禁止删除
redis.conf配置文件中修改maxmemory-policy属性值
volatile-lru:使用LRU算法从已设置过期时间的数据集合中淘汰数据
volatile-ttl:从已设置过期时间的数据集合中挑选即将过期的数据淘汰
volatile-random:从已设置过期时间的数据集合中随机挑选数据淘汰
allkeys-lru:使用LRU算法从所有数据集合中淘汰数据
allkeys-random:从数据集合中任意选择数据淘汰
no-enviction:禁止淘汰数据