简单了解Redis
redis是什么
redis是一种支持key-value等多种数据结构的存储系统,可用于缓存,事件发布,消息队列等场景,支持多种数据类型
string、hash、list、set、zset。而且基于内存,可持久化,并且能够通过sentinel哨兵和自动分区cluster实现高可用。
补充:redis中list集合是双端循环列表(双向列表),可以当作队列使用,也能当作堆栈使用。
redis的持久化策略
redis的持久化策略有两种:
RDB模式:定期将内存中的数据进行持久化,实际上就是为内存做快照,备份速度快,但有可能会丢失少量的数据。
AOF模式:可以实时备份,安全性更好,但持久化速度较慢,AOF持久化文件的体积很大,数据恢复时需要耗费大量时间。
RDB模式是默认开启的,若两种模式同时开启优先采用AOF模式。
redis分片技术
使用分片可以实现内存数据的动态扩容,每台redis节点中尽可能保存1/n的数据量,防止数据丢失。
缺点是若有一台机器宕机,则整个分片将不能正常运行。
分片中采用的hash一致性算法:
数据如何保存:
1.将节点的ip + 算法确定唯一哈希值,之后在内存中确定节点的位置
2.保存数据时,根据key进行hash运算,确定唯一位置
3.根据当前key的位置顺时针查找最近的node节点进行挂载
该算法的特性: 均衡性:引入虚拟节点,让数据均匀分片
单调性:如果node节点新增,能动态实现数据的迁移
分散性:数据分布在各个节点(解决方案:一般在进行架构设计时,为了避免数据的分散,会要求使用全部的内存空间)
redis哨兵
原理:通过哨兵监控主机的状态,获取主机和丛机的信息,通过心跳检测机制,如果3次连接没有响应,则会断定主机宕机,哨兵会从丛机当中选举一台充当主机,
旧的主机修复完成后,会充当丛机等待下次选举。
redis常见名词及解决方案
脑裂: 因为选举机制投票平票导致出现多台主机称之为脑裂。
解决方案:增加节点的个数。
缓存穿透: 缓存穿透是指缓存和数据库中都没有的数据,而用户不断发起请求,我们数据库的 id 都是1开始自增上去的,如发起为id值为 -1 的数据或 id 为特别大不存在的数据。
这时的用户很可能是攻击者,攻击会导致数据库压力过大,严重会击垮数据库。
解决方案: 利用互斥锁,缓存失效时,先去获取锁,得到锁之后再去请求数据库,没有得到锁的就休眠一段时间。
Redis还有一个高级用法布隆过滤器(Bloom Filter)这个也能很好的防止缓存穿透的发生,他的原理也很简单就是利用高效的数据结构和算法快速判断出你这个
Key是否在数据库中存在,不存在你return就好了,存在你就去查了DB刷新KV再return。
缓存雪崩:在高并发下,大量的缓存key在同一时间失效,导致大量的请求落到数据库上,如活动系统里面同时进行着非常多的活动,但是在某个时间点所有的活动缓存全部过期。
解决方案:给缓存失效时间设置加上一个随机值,避免数据集体失效或者做缓存预热。
缓存击穿:缓存击穿是指一个Key,在不停的扛着大并发,大并发集中对这一个点进行访问,当这个Key在失效的瞬间,持续的大并发就穿破缓存,直接请求数据库,就像在一个完好无损的桶上凿开了一个洞。
解决方案:设置数据永远不过期。或者加上互斥锁就能搞定了,或者做缓存预热。
简单了解Redis的更多相关文章
- CentOS6.4 安装OpenResty和Redis 并在Nginx中利用lua简单读取Redis数据
1.下载OpenResty和Redis OpenResty下载地址:wget http://openresty.org/download/ngx_openresty-1.4.3.6.tar.gz Re ...
- 简单的redis缓存操作(get、put)
简单的redis缓存操作(get.put) 本文介绍简单的redis缓存操作,包括引入jedisjar包.配置redis.RedisDao需要的一些工具.向redis中放数据(put).从redis中 ...
- Go语言之从0到1实现一个简单的Redis连接池
Go语言之从0到1实现一个简单的Redis连接池 前言 最近学习了一些Go语言开发相关内容,但是苦于手头没有可以练手的项目,学的时候理解不清楚,学过容易忘. 结合之前组内分享时学到的Redis相关知识 ...
- 自己写了个简单的redis分布式锁【我】
自己写了个简单的redis分布式锁 [注意:此锁需要在每次使用前都创建对象,也就是要在线程内每次都创建对象后使用] package redis; import java.util.Collection ...
- 【spring boot】SpringBoot初学(8)– 简单整合redis
前言 到目前为止,把项目中需要用到的:properties读取.数据源配置.整合mybatis/JdbcTemplate.AOP.WebService.redis.filter.interceptor ...
- SpringBoot简单整合redis
Jedis和Lettuce Lettuce 和 Jedis 的定位都是Redis的client,所以他们当然可以直接连接redis server. Jedis在实现上是直接连接的redis serve ...
- 简单实现Redis缓存中的排序功能
1.在实现缓存排序功能之前,必须先明白这一功能的合理性.不妨思考一下,既然可以在数据库中排序,为什么还要把排序功能放在缓存中实现呢?这里简单总结了两个原因:首先,排序会增加数据库的负载,难以支撑高并发 ...
- 高并发简单解决方案————redis队列缓存+mysql 批量入库(ThinkPhP)
问题分析 问题一:要求日志最好入库:但是,直接入库mysql确实扛不住,批量入库没有问题,done.[批量入库和直接入库性能差异] 问题二:批量入库就需要有高并发的消息队列,决定采用redis lis ...
- 一个简单的Redis结合Spring MVC架构以及实现过程
为了加快开发人员对公司项目的理解.更加容易入手和对公司项目的整体把控. 整体框架 首先介绍公司项目的整体框架,闲话少说,直接上图 整体性能分析 这就是公司的一个整体的架构,为了开发人员对架构的侧重点的 ...
- 做个简单的Redis监控(源码分享)
Redis监控 Redis 是目前应用广泛的NoSQL,我做的项目中大部分都是与Redis打交道,发现身边的朋友也更多人在用,相对于memcached 来说,它的优势也确实是可圈可点.在随着业务,数据 ...
随机推荐
- git使用记录八:不同提交的指定文件的差异
不同提交的指定文件的差异 git diff commit-id1 commit-id2 path-to-filename
- 58.Partition Equal Subset Sum(判断一个数组是否可以分成和相等的两个数组)
Level: Medium 题目描述: Given a non-empty array containing only positive integers, find if the array c ...
- 别再说你不会ElasticSearch调优了,都给你整理好了
ES 发布时带有的默认值,可为 ES 的开箱即用带来很好的体验.全文搜索.高亮.聚合.索引文档 等功能无需用户修改即可使用,当你更清楚的知道你想如何使用 ES 后,你可以作很多的优化以提高你的用例的性 ...
- 字符串String的使用方法
var ddd = "举头望明月,低头思故乡" document.writeln(ddd.split(''));//选择字符串中的一个标识符,将字符串分割成数组; var slic ...
- linux100day(day8)--shell监控脚本练习
这是一个大型的监控脚本,方便于查看硬盘,网络,负载,内核版本等系统信息. 本脚本来自于github的atarallo,我对脚本做出了改编和一些注释,尽量让新手也能理解,这个脚本逻辑清楚简单,适合用于练 ...
- 三、Json方式函数
一.Json方式函数 // 4. 查看对象信息 console.dir(obj) =>可以显示一个对象所有的属性和方法. var info = { blog: "http://cllg ...
- exp ORA-01455: converting column overflows integer datatype
EXP-00008: ORACLE error 1455 encounteredORA-01455: converting column overflows integer datatype add ...
- H5 移动调试全攻略
H5 移动调试全攻略 随着移动设备的高速发展,H5 开发也成为了 F2E 不可或缺的能力.而移动开发的重中之重就是掌握调试技巧,定 Bug于无形. 一.概要 因为移动端操作系统分为 iOS 和 And ...
- js实用小函数收集
格式化金额 var val='212312.235423' var rex = /\d{1,3}(?=(\d{3})+$)/g; val.replace(/^(-?)(\d+)((\.\d+)?) ...
- spring boot poi 导出Excel
public class ExcelData implements Serializable { private static final long serialVersionUID = 444401 ...