Redis是什么
那么到底什么是redis呢?
- 从历史方向来看 数据从单表,演进出了分库分表
- Mysql从单机演进出了集群
- 数据量增长
- 读写数据压力的不断增加
面临的问题
随着业务的增加,一个mysql的速度就跟不上了,接着出现了集群
为什么需要redis
数据分冷热 热数据:经常被访问到的数据
将热数据存储到内存中
具体的读和写操作
读操作: 优先在Redis中进行读取,如果读取不到,那么再去mysql中读取 写操作: 先写入mysql集群,然后通过监听binlog修改Redis
redis服务器重启数据丢失问题
我们都知道redis会有一个隐患就是断点或者服务器重启,内存里面的数据就会丢失 其实redis里面有解决的方法: redis用的resp协议 在写命令的同时,写命令会醉驾到AOF文件,到硬盘中,在硬盘中其实还有RDB文件(包含当前这个redis实例的所有文件,所有的key信息),这就保证了redis在重新启动之后,会和上一次的状态会一致的。
重启恢复上次文件的流程
先读取RDB文件,在与AOF进行对比,看有没有没有执行的命令,有区别的话会自动把没有执行的命令进行执行。
Redis应用案例
案例
- 连续签到 业务逻辑:连续签到,按照如果每天都签到,签到数每天加一,如果缺席一天,就会自动归0,这里其实用到了redis的过期时间,如果如果假设今天的redis过期时间设置的是后天过期,如果用户进行签到了,那么就会进行延期
redis注意事项
redis之所以快是因为它是一款内存数据库,但是一台机器内存都是有限且比较珍贵的资源,使用redis的时候需要合理的规划对应的内存优化策略。
1、控制key的长度,当key的量级很大的时候,合理的控制key的长度可以节省很大的空间。
2、避免存储bigkey,除了控制key的长度,value的大小也要关注,string的大小控制在10kb以下,list、hash、set、zset也要控制。
3、合理的选择数据类型
String、Set 在存储 int 数据时,会采用整数编码存储。Hash、ZSet 在元素数量比较少时(可配置),会采用压缩列表(ziplist)存储,在存储比较多的数据时,才会转换为哈希表和跳表。
String、Set:尽可能存储 int 类型数据 Hash、ZSet:存储的元素数量控制在转换阈值之下,以压缩列表存储,节约内存 4、把redis尽可能的当成缓存使用
5、实例设置maxmemory+淘汰策略 虽然使用redis的时候会设置key的过期时间,但是如果业务写入量比较大的话,那么短期内redis的内存依旧会快速增加。需要提前预估业务数据量,然后给实例设置maxmemory控制实例的内存上限,然后需要设置内存过期策略。