redis学习总结

什么是redis?

Redis 是一个用c语言编写的基于内存的高性能key-value数据库。它是非关系性数据库,能支持多种复杂的数据结构,因为基于内存,所以有着高效的读写性能。

redis的下载地址:
https://github.com/microsoftarchive/redis/releases

测试redis的性能

在redis安装目录的cmd里执行redis-benchmark -n 100000 -q (-n表示指定请求数,-q表示仅显示 query/sec 值,还有很多参数可选)
在这里插入图片描述

 
redis支持的五种数据结构
1.string(字符串)
它是最基本的数据类型,可以存储字符串,执行一些自增等操作,操作都是原子性的不用考虑线程安全问题
在这里插入图片描述
2.hash(哈希)
它是一个string类型的key-value,它适合存储对象
在这里插入图片描述
3.list(列表)
按照string插入元素排序,图中是从左边进入列表还可以从右边进。
在这里插入图片描述
4.set(集合)
string元素组成的无序集合,由哈希表实现,不允许重复
在这里插入图片描述
5.sorted set(有序集合)
string元素组成的有序集合,由哈希表实现,也不可重复。有序集合中的每个元素都需要指定一个分数,根据分数对元素进行升序排序在这里插入图片描述

一些重要的配置

redis的配置都写在redis安装目录下的.conf文件里,可以直接修改配置。
daemonize no:默认不是守护进程

loglevel:日志级别,有debug、verbose、notice、warning四个级别,3.0.504版本默认notice。

save < seconds > < changes >:指定时间内的指定更新次数后就将数据更新都数据文件
默认:save 900 1
save 300 10
save 60 10000
意思是900秒(15分钟)内有1个更改,300秒(5分钟)内有10个更改以及60秒内有10000个更改

dbfilename dump.rdb:默认存放数据的文件。

maxclients:最大可以同时连接的客户数量,默认10000

appendonly no:指定是否在每次更新操作后进行日志记录,默认no

appendfilename appendonly.aof:指定更新日志文件名

appendfsync everysec:更新日志的条件
no:表示等操作系统进行数据缓存同步到磁盘(快)
always:表示每次更新操作后手动调用fsync()将数据写到磁盘(慢,安全)
everysec:表示每秒同步一次(折衷,默认值)
 

pub/sub发布订阅模式

pub/sub是一种消息通信模式:发送者(pub)发送消息,订阅者(sub)接收消息
客户端可以订阅任意数量的频道。
在这里插入图片描述
开两个客户端订阅频道1,一个客户端发布消息到频道1
在这里插入图片描述
在这里插入图片描述
 

redis的持久化

redis有两种持久化方式,快照(RDB)和Append-only file(AOF)
1.快照
将内存中数据以快照的方式写入到二进制文件中,也就是我们默认的dump.rdb文件。配置文件中的:save 900 1
save 300 10
save 60 10000
就是一种自动的快照持久化配置

redis首先会调用fork一个子进程,父进程负责继续处理请求,子进程则负责将内存数据写入临时文件。当子进程将快照写入临时文件完毕后,用临时文件替换快照文件,此时子进程就会终止。

tip:也可以用bgsave,save等命令就执行一次快照。save是在主进程中保存快照所以会阻塞主进程,不建议使用

快照方式的缺点:它会将内存数据全部写入磁盘,数据量大时,会引起大量的磁盘I/O影响性能。redis突然挂掉,可能会丢失最近一次的快照数据

2.AOF
在配置文件中改配置为appendonly yes即可开启AOF持久化

redis 会将每一个收到的写命令都通过 write 函数追加到文件中(默认是 appendonly.aof), redis 重启时会通过重新执行文件中保存的写命令来在内存中重建整个数据库的内容。

不过这个时机可能不是立刻写入,我们可以在配置文件中,配置。
appendfsync everysec:更新日志的条件
no:表示等操作系统进行数据缓存同步到磁盘(快)
always:表示每次更新操作后手动调用fsync()将数据写到磁盘(慢,安全)
everysec:表示每秒同步一次(折衷,默认值)

缺点:当文件数据很多时,我们重建数据库会很慢。

AOF文件不断变大的解决方案

redis提供了bgrewriteaof命令,它也会fork一个子进程,子进程把新的AOF写入一个临时文件,主进程此时还是不变像AOF和内存中写命令,当子进程重写完成后,用新的AOF文件替换旧的AOF文件。

 

redis的主从结构

redis采用主从的模式将读写分离,我们使用master来更新数据,使用slave来查询数据,这样能提高效率。

那么rmaster和slave之间怎么同步数据?
slave会发一个sync命令到master,master的后台进程会将更新的数据快照保存在文件中。master会将更新的RDB文件发给slave(此时如果生成 RDB 文件过程中存在写数据操作会导致 RDB 文件和当前主 redis 数据不一致,所以此时 master 主进程会开始收集写命令并缓存起来),slave用新的RDB文件替换旧RDB文件,master 把缓存的命令转发给 slave。

这是第一次同步的过程,之后的同步只会发送增量的写操作!在这里插入图片描述

热点问题

MySQL里有2000w数据,redis中只存20w的数据,如何保证redis中的数据都是热点数据.
redis 提供 6种数据淘汰策略:
voltile-lru:从已设置过期时间的数据集(server.db[i].expires)中挑选最近最少使用的数据淘汰
volatile-ttl:从已设置过期时间的数据集(server.db[i].expires)中挑选将要过期的数据淘汰
volatile-random:从已设置过期时间的数据集(server.db[i].expires)中任意选择数据淘汰
allkeys-lru:从数据集(server.db[i].dict)中挑选最近最少使用的数据淘汰
allkeys-random:从数据集(server.db[i].dict)中任意选择数据淘汰
no-enviction(驱逐):禁止驱逐数据

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值