redis的使用

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的密码,提交给专门负责数据库的人处理

相关推荐
梓芮.17 分钟前
SQL Server 架构、数据库文件组和数据库对象
数据库·windows·sql·sqlserver·架构·mssql·数据库对象
huaqianzkh23 分钟前
Redis数据库主要数据结构类型
redis
陌夏微秋2 小时前
STM32单片机芯片与内部52 I2C 数据手册 寄存器
数据库·stm32·单片机·嵌入式硬件·信息与通信
沙滩de流沙6 小时前
ClickHouse
数据库·clickhouse
李歘歘7 小时前
MySQL数据库——多版本并发控制MVCC
数据库·mysql·mvcc·数据库索引
安静的_显眼包O_o9 小时前
locate() 在MySQL中的用法
数据库·mysql
鄃鳕9 小时前
扩充vmware磁盘大小以及分区
数据库·postgresql
CT随10 小时前
MySQL三大日志(binlog、redo log和undo log)详解
数据库·mysql
web1508509664110 小时前
【MsSQL】数据库基础 & 库的基本操作
前端·数据库·sqlserver
Run Out Of Brain10 小时前
MYSQL无法被连接问题
数据库·mysql