Redis 基础知识介绍
Nosql
原因
解决思路
这就是Nosql
Nosql概念
-
Nosql:即 Not-Only sql( 泛指非关系型的数据库),作为关系型数据库的补充。 作用:应对基于海量用户和海量数据前提下的数据处理问题。
-
特征
- 可扩容,可伸缩,大数据量下高性能,直接对内存进行操作
- 灵活的数据模型、高可用。自己设计了数据存储格式,保证效率比较高。
-
- Redis、memcache、HBase、MongoDB
Redis
概念
特征
-
1.数据间没有必然的关联关系
-
2.内部采用单线程机制进行工作
-
3.高性能。官方提供测试数据,50个并发执行100000 个请求,读的速度是110000 次/s,写的速度是81000次/s。
-
4.多数据类型支持
-
字符串类型,string list
-
列表类型,hash set
-
散列类型,zset/sorted_set
-
集合类型
-
有序集合类型
-
-
5.支持持久化,可以进行数据灾难恢复
应用场景
- 1.为热点数据加速查询(主要场景)。如热点商品,热点新闻,热点资讯,推广类等高访问量信息等
- 2.即时信息查询。如各类排行榜、各类网站访问统计、公交到站信息、在线人数信息(聊天室、网站)、设备信号等
- 3.时效性信息控制。如验证码控制,投票控制等。
- 4.分布式数据共享。如分布式集群架构中的session分离
- 5.消息队列--已经弱化
Redis的使用
#启动服务器,默认启动端口为6379
redis-server
#启动服务器,指定6380端口启动
redis-server --port 6380
#启动客户端,默认连接6379端口 redis-cli [-h host] [-p port]
redis-cli
#启动客户端,指定6380端口连接
redis-cli -p 6380
持久化
什么是持久化
- 利用永久性存储介质将数据进行保存,在特定的时间将保存的数据进行恢复的工作机制成为持久化
- 持久化用于防止数据的意外丢失,确保数据安全性
持久化过程保存什么
- 将当前数据状态进行保存,快照形式,存储数据结果,存储格式简单,关注点在数据---RDB
- 将数据的操作过程进行保存,日志形式,存储操作过程,存储格式复杂,关注点在数据的操作过程---AOF
RDB
-
sava指令
-
bgsave指令
#second:监控时间范围 changes:监控key的变化量
save second changes
save 10 2
- 从redis启动开始,如果十秒内key变化2次,在第十秒的时候直接保存操作,后台也还是bgsave进行保存
- 如果在十秒内变化了一次,那么redis会在变化第二次的时候进行后台保存操作,第二个周期会在第一次保存的时候开始计时
- 注意:save配置要根据实际业务情况进行设置,频度过高或者过低都会出现性能问题,结果可能是灾难性的,save配置启动后执行的是bgsave操作
-
RDB特殊启动形式
- 服务器运行过程中重启
debug reload
- 关闭服务器时指定保存数据
shutdown save
-
RDB优点
-
RDB缺点
-
RDB存储的弊端
AOF
- AOF持久化:以独立日志的方式记录每次写命令,重启时再重新执行AOF文件中命令达到恢复数据的目的。与RDB相比可以简单理解为由记录数据改为记录数据变化
- AOF的主要作用就是解决了数据持久化的实时性,目前已经是redis持久化的主流方式
AOF重写
- 重写指令
- 存入元素后进行重写
bgrewriteaof
- 自动重写
RDB与AOF区别
数据删除策略
定时删除
- 创建一个定时器,当key设置有过期时间,且过期时间到达时,由定时器任务立即执行对键的删除操作
- 优点:节约内存,到时就删除,快速释放掉不必要的内存占用
- 缺点:cpu压力很大,无论cpu此时负载量多高,均占用cpu,会影响redis服务器响应时间和指令吞吐量
- 总结:用处理器性能换取存储空间(拿时间换空间)
惰性删除
数据到达过期时间,不做处理。等下次访问该数据时,我们需要判断
- 如果未过期,返回数据
- 发现已过期,删除,返回不存在
定期删除
定时删除和惰性删除这两种方案都是走的极端,那有没有折中方案?
- Redis启动服务器初始化时,读取配置server.hz的值,默认为10
- 每秒钟执行server.hz次serverCron()-------->databasesCron()--------->activeExpireCycle()
- activeExpireCycle()对每个expires[*]逐一进行检测,每次执行耗时:250ms/server.hz
- 对某个expires[*]检测时,随机挑选W个key检测
如果key超时,删除key
如果一轮中删除的key的数量>W*25%,循环该过程
如果一轮中删除的key的数量≤W*25%,检查下一个expires[*],0-15循环
W取值=ACTIVE_EXPIRE_CYCLE_LOOKUPS_PER_LOOP属性值
- 参数current_db用于记录activeExpireCycle() 进入哪个expires[*] 执行
- 如果activeExpireCycle()执行时间到期,下次从current_db继续向下执行
总的来说:定期删除就是周期性轮询redis库中的时效性数据,采用随机抽取的策略,利用过期数据占比的方式控制删除频度
数据淘汰策略(逐出算法)
概述
什么叫数据淘汰策略?什么样的应用场景需要用到数据淘汰策略?
当新数据进入redis时,如果内存不足怎么办?在执行每一个命令前,会调用freeMemoryIfNeeded()检测内存是否充足。如果内存不满足新 加入数据的最低存储要求,redis要临时删除一些数据为当前指令清理存储空间。清理数据的策略称为逐出算法。
注意:逐出数据的过程不是100%能够清理出足够的可使用的内存空间,如果不成功则反复执行。当对所有数据尝试完毕, 如不能达到内存清理的要求,将出现错误信息如下
(error) OOM command not allowed when used memory >'maxmemory'
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 [email protected] 举报,一经查实,本站将立刻删除。