基础知识
概括
Redis是用C语言开发的一个开源的高性能键值对(key-value)数据库,官方提供测试数
据,50个并发执行100000个请求,读的速度是110000次/秒,写的速度是81000次/秒,
且Redis通过提供多种键值数据类型来适应不同场景下的存储需求,目前为止Redis支持的
键值数据类型,如有
字符串类型(String)
哈希类型(hash)
列表类型(list)
集合类型(set)
有序集合类型(SortedSet)
应用场景
缓存(数据查询,短连接,新闻内容,商品内容等等)
聊天室的在线好友列表
任务队列。(秒杀,抢购,12306等等)
应用排行榜
网站访问统计
数据过期处理
分布式集群架构中的session分离
基础命令
dbsize 当前redis库的大小
select 7 切换redis库
keys * 当前redis库存储的所有key
flushdb 清除当前redis库中所有数据
flushall 清除全部redis库中数据
config get requirepass 当前使用的密码
set requirepass "123456"设置密码
auth 123456 输入密码
info replication 查看当前库的信息
细节
1. redis默认有16个数据库(配置文件中内容),默认使用的是第0个
2. redis是单线程的
redis是基于内存操作,CPU不是redis性能瓶颈,redis的瓶颈是根据机器的内存和网络带宽。
并且redis是c语言写的,官方提供的数据未100000+的QPS,完全不比同样是使用key-value
的memecache差
测试性能
测试工具
redis-benchmark,官方自带的性能测试工具
执行位置
redis所在目录,执行如上语句即可
redis-benchmark命令参数
-h 指定服务器主机名
-p 指定服务器端口
-s 指定服务器socket
-c 指定并发连接数
-n 指定请求数
-d 以字节的形式指定set/get值的数据大小
-k 1=keep alive 0=reconnect
-r set/get/incr 使用随机key,sadd使用随机值
-p 通过管道传输请求
-q 强制退出redis,仅显示query/sec值
--csv 以csv格式输出
自定义测试选项
redis-server FeraoRedisConfig/redis.conf 启动redis服务
redis-cli -p 6379 启动客户端
redis-benchmark -h localhost -p 6379 -c 100 -n 100000 发出测试命令(bin目录下)
配置文件(Redis.conf)
单位
引入配置文件
网络
bind 127.0.0.1 绑定的ip
protected-mode yew 保护模式
port 6379 端口设置
1
2
3
4
5
通用 GENERAL
Daemonize yes 以守护进程的方式进行,默认是no,开发者需要自己开启为yes
pidfile /var/run/redis_6379.pid
如果以后台的方式运行,我们就需要制定一个pid文件
loglevel notice 日志水平(debug、verbose、notice、warning)
logfile "" 日志的文件位置名
databases 16 数据库的数量,默认是16个数据库
always-show-logo yes 是否总是显示Logo
[注]
1.redis存储的是:key,value 格式的数据,其中Key都是字符串,value有5种不同的数据结构
2.列表类型支持重复元素
3.redis列表是简单的字符串列表,按照插入顺序排序,操作者可以添加一个元素到列表头部(左边)或者尾部(右边)
4.集合类型不允许重复元素
5.有序集合类型,不允许重复元素,且元素有顺序,每个元素都会关联一个double类型的分数,redis正是通过分数来为集合中的成员进行从小到大的排序。
redis事务
本质
一组命令的集合。一个事务中的所有命令都会被序列化,在事务执行过程中,会按照顺序执行。
特性
一次性、顺序性、排他性。
注意
1、redis事务没有隔离级别的概念。所有的命令在事务中,并没有直接执行,只有发起执行命令的时候才
会执行(Exec)
2、redis单条命令是保证原子性的,但是事务不保证原子性
操作
开启事务(multi)
命令入队(正常命令集合)
执行事务(exec)
所有情况
正常执行事务
放弃事务
编译型异常(代码有问题命令出错,事务中所有的命令都不会被执行)
运行时异常(IO异常,如果事务队列中存在逻辑问题,那么执行命令的时候,其他命令是可以正常执行的,
错误命令抛出异常)
redis 持久化
1.简单概述
2.RDB模式
3.AOF模式
4.合理使用
简单概述
轮廓
redis是内存数据库,如果不将内存中的数据库状态保存到磁盘,那么一旦服务器进程退出,服务器中的数据库状态也会消失。所以redis提供了持久化功能,且分为RDB、AOF两种方式
配置文件
redis.windows.conf文件
RDB模式
RDB模式原理
在指定的时间间隔内将内存中的数据库快照写入磁盘,再次恢复时再将快照文件直接读到内存里。
在此期间,redis会单独创建(fork)一个子进程来进行持久化,会先将数据写入到一个临时文件中,待持久化过程都结束了,再用这个临时文件替换上次持久化好的文件。整个过程中,主进程是不进行任何io操作的。
这就确保了极高的性能。如果需要进行大规模数据的恢复,且对于数据恢复的完整性不是非常敏感,那RDB方式要比AOF方式更加的高效。但RDB存在缺陷是最后一次持久化的数据可能丢失。当我们安装好的redis,其默认持久化模式是RDB模式【一般情况下不需要修改】,RDB保存的文件是dump.rdb。都是在redis配置文件中快照中进行配置的。
简单可记住,RDB默认方式,不需要进行配置,默认就使用这种机制,在一定的间隔时间中,检测key的变化情况,然后持久化数据
触发机制
三种情况下会触发RDB规则
1.sava的规则满足的情况下,会自动触发rdb规则
2.执行fushall命令,也会触发我们的rdb规则
3.退出redis,也会产生rdb文件
恢复机制
只需要将rdb文件放在redis启动目录下即可,redis启动的时候回自动检测dump.rdb,恢复数据
相关配置
save 900 1 after 900 sec (15 min) if at least 1 key changed
save 300 10 after 300 sec (5 min) if at least 10 keys changed
save 60 10000 after 60 sec if at least 10000 keys changed
优缺点
RDB模式的优势是适合大规模的数据恢复、且对数据的完整性不高。但与之相对,不足之处是需要一定的时间间隔进程操作,如果redis意外宕机,这个最后一次修改数据就没有了,且fork进程的时候,会占用一定的内存空间。
AOF模式
AOF模式原理
【append only file】将开发者操作redis的所有命令都记录下来,恢复的时候就把文件内所有写的操作执行一遍。
它以日志的形式来记录每个写操作,将redis执行过的所有指令记录下来(读操作不记录),且只许追加文件但不可以改写文件。当redis启动之初会读取该文件重新构建数据。换句话说,redis重启的话就根据日志文件的内容将写指令从前到后执行一次以完成数据的恢复工作。
aof模式保存的文件名是appendonly.aof。在redis配置中,默认是不开启的,开发者需要手动配置,只需要将appendonly改为yes即可开启、再进行重启redis,就可以生效了。
如果aof文件有错位,这时候redis是启动不起来的,开发者需要修复aof文件,redis为开发者提供了一个工具,也就是bin目录下的redis-check-aof,开发者只需在redis bin目录下执行redis-check-aof --fix appendonly.aof即可
如果文件正常了,重启后就可以直接恢复了。
简单理解aof是日志记录的方式,可以记录每一条命令的操作。可以每一次命令操作后,持久化数据
重写规则
aof默认就是文件的无限追加,文件会越来越大,如果aof文件大于64m,redis会fork一个新的进程来将文件进行重写
相关配置
appendfsync no (关闭aof,不进行持久化)
appendonly yes (开启aof)
appendfsync always (每一次操作都进行持久化)
appendfsync everysec (每间隔一秒进行一次持久化)
优缺点
AOF模式的优势是每一次修改都同步时,文件的完整性会更好;每秒同步一次方式时,可能会丢失1s的数据;从不同步时,效率最高。
相对于数据文件来说,AOF文件远远大于RDB;修复的速度也比RDB慢;AOF运行效率要比RDB慢,所以redis默认的配置就是RDB持久配置
[注]
1.redis是一个内存数据库,当redis 服务器重启,获取电脑重启,数据会丢失,我们可以将redis 内存中的数据持久化保存到硬盘的文件中。
2.修改后,重启redis服务器,并制定配置文件的名称
合理使用
同时开启两种持久化方式
在这种情况下,当redis重启的时候会优先载入aof文件来恢复原始的数据,因为在通常情况下aof文件保存的数据要比rdb文件保存的数据要完整,而rdb的数据不实时。
同时使用两者时服务器重启也只会找aof文件,那要不要只使用aof呢,这里建议不要,因为rdb更适合用于备份数据库(aof在不断改变不好备份),快速重启时,而且不会有aof可能潜在的bug,留着作为一个万一的手段。
性能建议
因为rdb文件只用作后备用途,建议只在Slave上持久化rdb,而且只要15分钟备份一次就够了,只保留save 900 1 这一条规则
————————————————
版权声明:本文为CSDN博主「Ferao」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/qq_21561501/article/details/103145155