redis的概念
Nosql:not only sql(非关系型数据库:主流的数据库以外,基本上都是nosql)
非关系数据库也有库,库是系统自带的,而且也不需要创建,也不能创建,也无需在库中创建表,直接再预设的库中,以键值对的形式保存数据
键值之间没有任何关联,值可以是任意合法的数值
redis:redis是开源的,使用c语言编写的nosql数据库,redis基于内存运行的,只有执行持久化操作之后,数据才会写入到磁盘中去(自带的,定时执行持久化)
1、持久化要打开
2、注意内存的使用率
redis:内存型缓存数据库
redis的工作模式
1、redis是单进程模式,启动一个就是一个进程,一台服务器可以启动多个redis的进程
端口不能相同,默认端口6379
2、在工作中,要根据情况来选择开启多少个进程,单进程的高并发的情况下处理速度也会降低,进程的数量太多,会影响cpu的效率
特点
redis特点;
1、具有极高的读写速度,读取速度1110000次/s,每秒钟81000/s次的写操作
2、数据类型非常丰富
3、支持数据的持久化
4、原子性,redis的所有操作都是原子性
5、也支持数据的备份和恢复以及集群
应用场景
redis的应用场景:排行榜,计数器,存储关系之类,实时日志记录,日志分析
redis的配置
redis是使用apt安装的
c
apt-get update
apt -y install redis
vim /etc/redis/redis.conf
第68行
bind 127.0.0.1 192.168.42.50
保存退出
systemctl restart redis
netstat -antp | grep 6379
管理和维护redis数据库常用命令
redis-cli:连接服务端的命令行
redis benchmark:检测redis的运行效率
redis-check-aof:修复aof的持久化文件
redis-check-rdb:修复rdb的持久化文件
c
redis-cli -h 192.168.42.50 -p 6379
#用于连接服务端的命令行
redis的数据类型和操作命令
数据类型
1、string字符串,最常见的类型,如五特殊声明默认类型
2、list 列表类型
3、hash 散列
4、set 集合
5、sorted set 有序集合
操作命令
命令 | 含义 |
---|---|
set 表名 内容 | 新建 |
get 表名 | 查看 |
del 表名 | 删除 |
keys * | 所有,在工作不要使用!!!! |
keys t? | ?任意单个字符 |
keys t* | 任意长度字符 |
type 表名 | 查看数据类型 |
rename test1 test2 | 修改键值对名称 |
redis一共有16个库,默认为0库,每个库之间都是独立的
redis的生命周期
键值对的生命周期:
如果在默认条件,set的方式都是永久存储
EX seconds | PX milliseconds
ex以秒为单位计算生命周期
px:以毫秒为单位计算生命周期
生命周期到期之后,会自动从库中删除。
c
set test2 ex 30
#新建键值对生命周期30秒
expire test1 30
#对已经创建好的键值对创建生命周期
ttl test1
#查询生命周期
move test1 1
#把键值对移到1号库
dbsize
#查看当前库中有几个键值对
config set requirepass 123456
#设定密码
auth 123456
#在命令行认证密码
string类型
string类型:redis的基础数据类型,最大的存储是512MB,可以存储的数据类型,字符串,数字,图片等等
exists;判断键值是否存在,存在返回,否则返回0
append key value:对已存在的键值对返回值的长度,不存在的直接创建键值对
strlen:返回键值对的长度
incr key:可以对键值对的值自增1(整数类型的)
decr key:自减1
incrby key 数字 :自增多少
decrby key 数字:自减多少
批量设置键值对,批量查询:
mset :批量设置
mget:批量查询
list列表数据类型
c
lpush test10 a b c d
#从左到右一次插入,列表类型的数据不能用get查看
lrange test10 0 3
#反向查看列表
lrange test10 0 -1
#用-1来代表列表的最后一个
rpush test11 a b c d
#从右到左一次插入
lrange test11 0 -1
lset test11 2 6
#修改索引下标的值
linsert test11 before a 10
在a之前插入一个值
linsert test11 after a 11
在a之后插入一个值
hash 散列
散列类型,用于存储对象,用对象的类别和id构成键名,用字段表示对象化的数据,字段值,就是对象的属性值
c
hset myhash xy105 greate
#创建
hget myhash xy105
#查看
hdel myhash xy105
#删除键里面的对象
del myhash
#删除键
hincrby
#自增
hmset test2 num 10 num1 11
#批量创建
hmget
#查看
hgetall
hkeys
hvals
set 无序集合
声明一个key,键里面的值是元素,元素可以有多个,元素的类型是string,元素的值是唯一的,不能重复。
多个集合类型之间可以进行并集,交集,集差的运算
c
saad test1 a b c c d
#创建
smembers test1
#查询
scard test1
#查询键值有多少元素
srandmember test
#随机查询
spop test1
#随机移除
smove test1 test2 a
#把test1的a移到test2
scordted set zset 有序集合
1、声明一个key,key里面有元素,元素有多个,类型也是string,元素都是唯一的,不能重复
2、每个元素都会关联的double类型的分散,表示的是权重,元素可以通过权重的大小进行排序,元素的权重可以享用
c
zadd test1 1 one 3 two 3 three
#创建
zrange test1 0 -1 withscores
#显示元素和权重,不加withscores就不显示
zrank test1 one
#表示索引下标的位置
zcount test1 1 2
#权重比的数字是大于等于1小于等于2的范围
命令 | 含义 |
---|---|
set key value | 创建键队值 |
get key | 查看 |
ttl key | 查询键值的生命周期,生命周期到期之后,禁止自动删除 |
select index(0-15) | 默认都是0库 |
-a auth 123456 | 密码 |
redis的持久化和高可用
在redis当中,高可用的技术包括持久化,主从复制,哨兵模式,集群
持久化是最简单的高可用的方法,作用就是备份数据,即将数据保存到硬盘,防止进程退出导致数据丢失
redis的持久化
1、RDB持久化:人工或者是定时的把内存当中的数据保存到磁盘,这是一种冷备份(备份的时候不用关闭服务,回复的时候西药关闭),默认的持久化方式
2、AOF持久化:类似于mysql的二进制日志,把所有redis的操作记录在二进制日志当中,恢复的时候从二进制日志的内容进行恢复,全热备份,服务需要重启
AOF的持久化的实时性耿浩,进程以外丢失,恢复的数据是最多的,AOF是主流的持久化
RDB持久化
RDB持久化:快照持久化,文件的后缀名是.rdb,redis每次重启时都护读取rdb文件进行恢复
save和bgsave
save被禁用的原因
1、执行save之后,主进程进入阻塞
2、读写不能执行
3、主进程创建rdb文件,知道rdb文件创建完成之后,进程的阻塞才会解除
save:可以在配置文件声明,也可以手动
bgsave:向主进程发送一个信号,主进程fork(后台)新建一个子进程,在fork的过程中,主进程阻塞,创建完子进程之后,阻塞解除,子进程来创建rdb文件。
c
vim /etc/redis/redis.conf
第307行
save 900 1
#执行bgsave,当时间到900秒,redis数据发生了一次变化,就执行bgsave
save 300 10
#执行bgsave,当时间到300秒,redis数据发生了10次变化,就执行bgsave
save 60 10000
#执行bgsave,当时间到60秒,redis数据发生了10000次变化,就执行bgsave
第340行
rdbchecksum yes
#是否开启rdb文件的压缩
cd /var/lib/redis
cp -a dump.rdb /opt/
rm -rf dump.rdb
cp -a /opt/dump.rdb /var/lib/redis/
systemctl restart redis
AOF持久化
一旦开启AOF持久化,redis会默认选择aof作为持久化方式,并且立刻读取二进制文件
c
vim /etc/redis/redis.conf
第1096行
appendonly yes
appendfilnemae "appendonly.aof"
第1192行
aof-load-truncated yes
#当发现aof文件被截断时,如果是yes,redis在重启时发现被截断,redis会尽可能的恢复数据,继续运行。
no,如果发现AOF文件被截断,redis会拒绝启动。
截断:写入的过程中出现异常,内存当中有,但是没有完整的写入到磁盘
AOF的rewrite机制:重写
重写表示的是压缩,当这个二进制日志文件内容越来越多,文件越来越大,于是就有了重写的功能,对二进制文件进行压缩
bgrewriteaof进程来进行处理
通过命令来处理:redis-cli bgrewriteaof
c
vim /etc/redis/redis.conf
第1167行
auto-aof-rewrite-percentage 100
#文件的基准,超过文件基准的大小的两倍
auto-aof-rewrite-min-size 64mb
#aof文件执行重写的最小值
区别
rdb和aof之间的优缺点:
1、RDB的文件体积afo小,适合全量备份那,速度也快aof快
2、rdb不能实施持久,数据如此重要,不能够丢失
3、RDB的兼容性比AOF要差,新老版本之间不能见兼容
生产中:redis的一定要一致,5.0.7
APE的优点:实时持久化的测了,兼容性也好,文本格式保存的命令
缺点:文件比较大,恢复速度比较慢,对磁盘的l/o性能也比较高
redis的性能管理
1、查看redis的使用情况
c
used_memory:871704 redis数据占用的内存
used_memory_rss:11272192 redis向操作系统申请的内存
used_memory_peak:933784 redis使用系统内存的峰值
c
root@redis1:/var/lib/redis# redis-cli info memory | grep ratio
allocator_frag_ratio:1.23 I
分配器的碎片比例,分配器的碎片越多,分配的内存越多,这个值越小越好
allocator_rss_ratio:2.76
分配器使用多少系统的内存
rss_overhead_ratio:2.74
rss的开销比列,占用系统的物理内存的额外开销,这个值越低越好,越接近0,redis的实际的使用比列越高
mem_fragmentation_ratio:13.92
内存的碎片比列,内存碎片,系统分配之后但是不能被利用的内存,越低,内存的利用率·越高
配置redis的初始化,必须要给redis的内存设置阈值,不设置阈值,只要有需要,redis会占满整个内存,而且会继续占用交换分区的空间。
设置阈值后,不会使用交换分区了,到达阈值,系统会自动回收生命周期不足的key。
volatile-lru:根据算法lru,从过期时间的数据集合当中淘汰键值,主要是针对设置了ttl的键值对
volatile-ttl:根据算法,淘汰即将多起的数据(也是针对设置生命周期的数据)
allkeys-lru:lru算法淘汰最近很少使用的数据
allkeys-random:淘汰任意的数据
一直删除到小于或者等于内存阈值,才不会继续删除
redis的雪崩,redis的击穿,redis的穿透
缓存雪崩:整个作为数据库缓存的键值对,全部失效,redis没有办法处缓存,所有的请求全部集中到数据库上数据库很快就崩溃
1、redis集群大面积故障
2、所有的缓存键值对全部被删除(作为数据库缓存的键值对是不会设置生命周期)
3、大量的redis请求失败,所有的请求直接到了数据库
缓存击穿:热点数据的缓存失败,大量的热点请求全部转发到了数据库,会导致数据库的性能大幅下降。
热点数据设置成永不过期
1、我通过mysql的慢查询日志,发现了sql执行的速度突然大幅下降
2、查询redis,发现的缓存的键值对消失了
3、我没有redis的密码,提交给专门负责数据库的人处理