jedis

牛逼哄哄的布隆过滤器,到底有什么用?

為{幸葍}努か 提交于 2020-10-03 13:23:31
作者:CodeBear的园子 www.cnblogs.com/CodeBear/p/10911177.html 本文是站在小白的角度去讨论布隆过滤器,如果你是科班出身,或者比较聪明,又或者真正想完全搞懂布隆过滤器的可以移步。 不知道从什么时候开始,本来默默无闻的布隆过滤器一下子名声大燥,仿佛身在互联网,做着开发的,无人不知,无人不晓,哪怕对技术不是很关心的小伙伴也听过它的名号。 我也花了不少时间去研究布隆过滤器,看了不少博客,无奈不是科班出身,又没有那么聪明的头脑,又比较懒...经过“放弃,拿起,放弃,拿起”的无限轮回,应该算是了解了布隆过滤器的核心思想,所以想给大家分享下。 布隆过滤器的应用 我们先来看下布隆过滤器的应用场景,让大家知道神奇的布隆过滤器到底能做什么。 缓存穿透 我们经常会把一部分数据放在Redis等缓存,比如产品详情。这样有查询请求进来,我们可以根据产品Id直接去缓存中取数据,而不用读取数据库,这是提升性能最简单,最普遍,也是最有效的做法。面试常问,缓存三大问题及解决方案! 一般的查询请求流程是这样的:先查缓存,有缓存的话直接返回,如果缓存中没有,再去数据库查询,然后再把数据库取出来的数据放入缓存,一切看起来很美好。 但是如果现在有大量请求进来,而且都在请求一个不存在的产品Id,会发生什么?既然产品Id都不存在,那么肯定没有缓存,没有缓存

Redis分布式锁的正确实现姿势

放肆的年华 提交于 2020-10-03 03:18:57
分布式锁可以解决在分布式环境下的多资源竞争问题,常见的分布式锁实现有以下3种: 基于数据库的唯一索引方式或乐观锁方式。 基于Redis单线程特性的原子操作。 基于Zookeeper的临时有序节点。 本文主要介绍Redis如何实现分布式锁的获取和解除以及实现的正确姿势是什么。 一、前言   在我们日常工作中,除了Spring和Mybatis外,用到最多无外乎分布式缓存框架——Redis。但是很多工作很多年的朋友对Redis还处于一个最基础的使用和认识。所以我就像把自己对分布式缓存的一些理解和应用整理一个系列,希望可以帮助到大家加深对Redis的理解。本系列的文章思路先从Redis的应用开始。再解析Redis的内部实现原理。最后以经常会问到Redist相关的面试题为结尾。 二、分布式锁的实现要点 为了实现分布式锁,需要确保锁同时满足以下四个条件: 互斥性。在任意时刻,只有一个客户端能持有锁 不会发生死锁。即使一个客户端持有锁的期间崩溃而没有主动释放锁,也需要保证后续其他客户端能够加锁成功 加锁和解锁必须是同一个客户端,客户端自己不能把别人加的锁给释放了。 容错性。只要大部分的Redis节点正常运行,客户端就可以进行加锁和解锁操作。 三、Redis实现分布式锁的错误姿势 3.1 加锁错误姿势   在讲解使用Redis实现分布式锁的正确姿势之前,我们有必要来看下错误实现方式。   首先

一口气说出 6种 延时队列的实现方案,面试稳稳的

时光毁灭记忆、已成空白 提交于 2020-10-03 01:43:27
最强面试题推荐: 2020Java面试题及答案,命中率高达90% 五一期间原计划是写两篇文章,看一本技术类书籍,结果这五天由于自律性过于差,禁不住各种诱惑,我连电脑都没打开过,计划完美宣告失败。所以在这能看出和大佬之间的差距,人家没白没夜的更文,比你优秀的人比你更努力,难以望其项背,真是让我自愧不如。 知耻而后勇,这不逼着自己又学起来了,个人比较喜欢一些实践类的东西,既学习到知识又能让技术落地,能搞出个 demo 最好,本来不知道该分享什么主题,好在最近项目紧急招人中,而我有幸做了回面试官,就给大家整理分享一道面试题:“ 如何实现延时队列? ”。 下边会介绍多种实现延时队列的思路,文末提供有几种实现方式的 github 地址。其实哪种方式都没有绝对的好与坏,只是看把它用在什么业务场景中,技术这东西没有最好的只有最合适的。 一、延时队列的应用 什么是延时队列?顾名思义:首先它要具有队列的特性,再给它附加一个延迟消费队列消息的功能,也就是说可以指定队列中的消息在哪个时间点被消费。 延时队列在项目中的应用还是比较多的,尤其像电商类平台: 1、订单成功后,在30分钟内没有支付,自动取消订单 2、外卖平台发送订餐通知,下单成功后60s给用户推送短信。 3、如果订单一直处于某一个未完结状态时,及时处理关单,并退还库存 4、淘宝新建商户一个月内还没上传商品信息,将冻结商铺等 。。。。

cas5.x实现将ticket维护到redis集群(不使用官方提供的哨兵模式)

北城以北 提交于 2020-10-01 16:47:48
转载至: http://zhfeat.cc/article/45 2020博客地址汇总 2019年博客汇总 前段时间基于CAS 5.2.6为公司二次开发了一套SSO单点登陆系统,整体来说比较顺利,不过最后卡在了将CAS服务端登陆所产生的ticket放到redis集群中这一环节。现在网上相关资料最多的是基于CAS 4.x版本的文章,对于CAS 5.x版本相关的资料还是比较少的,因此没有找到具体的解决同学,纠结了许久最后通过覆盖官方提供的jar包中的类解决了这个问题,希望能帮助到同样遇到这个问题的童鞋。该问题可能会有更优雅的解决方式,如果大家有更好的解决思路希望能分享给我,大家一同进步。 什么是CAS 这段是对CAS原理的一个剖析和总结,已经很清楚的同学可以略过。 SSO单点登录访问流程主要有以下步骤 访问服务:SSO客户端发送请求访问应用系统提供的服务资源。 定向认证:SSO客户端会重定向用户请求到SSO服务器。 用户认证:用户身份认证。 发放票据:SSO服务器会产生一个随机的Service Ticket。 验证票据:SSO服务器验证票据Service Ticket的合法性,验证通过后,允许客户端访问服务。 传输用户信息:SSO服务器验证票据通过后,传输用户认证结果信息给客户端。 CAS 原理和协议 从结构上看,CAS 包含两个部分: CAS Server 和 CAS Client

Redis

浪子不回头ぞ 提交于 2020-09-27 13:59:00
Redis Nosql ​ 现在是大数据时代,一般的关系型数据库无法快速处理那么大的访问量。 为什么使用Nosql 单机Mysql时代 ​ 那时候更多使用静态网页Html,访问量不会很大,单个数据库已经足够。 这样的模式存在什么问题? 数据量如果太大,一台服务器放不下 数据的索引(B+Tree),一台服务器也放不下 读写混合,一台服务器无法承受 Memcached(缓存) + MySQL + 垂直拆分 ​ 实际场景80%都是进行查询的操作,每次都去查数据库效率很低。所以我们希望使用缓存减轻数据库压力。 ​ 发展历程:优化数据结构和索引——》文件缓存(IO)——》Memcached 分库分表 + 水平拆分 + MySQL集群 ​ 以前使用MylSAM : 表锁 查一行数据锁住了整张表 高并发下有严重的问题 Innodb使用行锁解决 ​ MySQL在那个时代推出了表分区,但是使用的不多。 ​ 集群在这时已经能满足大部分需求。 大数据时代 ​ 2010-2020发生了翻天覆地的变化,各种实时变化的数据。 ​ MySQL等关系型数据库的弊端就暴露了,无法应付这种场景。 为什么要用NoSQL ​ 用户的每天生成的个人信息,社交网络,地理位置等等以PB计,呈爆发式增长。 ​ NoSQL非常适合应对这种场景。 什么是NoSQL ​ NoSQL = Not Only SQL 不仅仅是SQL

Redis入门--进阶详解

六眼飞鱼酱① 提交于 2020-09-26 01:47:52
Redis NoSql入门和概述 入门概述 互联网时代背景下大机遇,为什么用nosql 1.单机MySQL的美好年代 在90年代,一个网站的访问量一般都不大,用单个数据库完全可以轻松应付,在那个时候,更多的都是静态网页,动态交互类型的网站不多 上述架构下,我们来看看数据存储的瓶颈是什么? 数据量的总大小 一个机器放不下时 数据的索引(B+ Tree)一个机器的内存放不下时 访问量(读写混合)一个实例不能承受 2.Memcached(缓存)+MySQL+垂直拆分 后来,随着访问量的上升,几乎大部分使用MySQL架构的网站在数据库上都开始出现了性能问题,web程序不再仅仅专注在功能上,同时也在追求性能。程序员们开始大量的使用缓存技术来缓解数据库的压力,优化数据库的结构和索引。开始比较流行的是通过文件缓存来缓解数据库压力,但是当访问量继续增大的时候,多台web机器通过文件缓存不能共享,大量的小文件缓存也带了了比较高的IO压力。在这个时候,Memcached就自然的成为一个非常时尚的技术产品 Memcached作为一个独立的分布式的缓存服务器,为多个web服务器提供了一个共享的高性能缓存服务,在Memcached服务器上,又发展了根据hash算法来进行多台Memcached缓存服务的扩展,然后又出现了一致性hash来解决增加或减少缓存服务器导致重新hash带来的大量缓存失效的弊端 3

redis主从+哨兵sentinel+VIP高可用结构

守給你的承諾、 提交于 2020-08-20 08:56:11
前言 哨兵sentinel是redis自带的高可用程序,可以发现并自动切换主从状态的redis服务配置,而且哨兵sentinel还可以支持管理多套redis主从. 而应用可以通过类似jedis的驱动直接连接哨兵,来实现高可用.jedis会在哨兵sentinel里发现真实的主库地址,然后让程序连上真实主库地址操作. 不过这个架构有三个问题,第一,应用程序的配置要实现这个功能的话就要从连接真实IP的redis改成连接哨兵.第二,如果哨兵挂了,应用会报错而无法切换(3.2还会出现).第三,如果一套哨兵管理多套redis主从,并不是很好管理. 解决的方法有两个,一个是在哨兵前面加类似nginx的负载均衡来控制jedis访问哨兵地址,另一个就是在redis主从上加入高可用vip的操作来代替jedis直连哨兵,因为哨兵sentinel支持切换发生时接入脚本操作. 这篇文章说的就是加入高可用vip方式. 哨兵sentinel通信原理 在讲主题之前,我想想讲一下哨兵sentinel的原理. 通讯原理: 当一个完全没接入哨兵sentinel的redis主从里,第一个哨兵sentinel主动和redis主库通信,询问有没有其他的redis从库和哨兵sentinel连接信息.如果没有,这个哨兵sentinel就创建配置,等待同步其他哨兵信息. 然后,第二个哨兵连进redis主库

Redis 管道(Pipelining)、PUB/SUB

安稳与你 提交于 2020-08-19 22:59:04
http://redis.cn/topics/pipelining.html 是否可以这样理解: 如果是组织大量的、无依赖关系的命令,可以选择管道,当然也可以选择脚本。 如果命令之间有依赖关系,比如后续的命令需要处理先前命令的返回值,只能选择脚本。 Redis 提供了 PUB/SUB 订阅功能,实际我们在使用时,一定要注意,它提供的 不是一个可靠的 订阅系统 Redis 是不持久化 Publish 的消息的 当然,不能说 Redis Pub/Sub 毫无使用的场景,以下艿艿来列举几个: 在使用 Redis Sentinel 做高可用时,Jedis 通过 Redis Pub/Sub 功能,实现对 Redis 主节点的故障切换,刷新 Jedis 客户端的主节点的缓存。 如果出现 Redis Connection 订阅的异常断开,会重新 主动 去 Redis Sentinel 的最新主节点信息, 从而解决 Redis Pub/Sub 可能因为网络问题,丢失消息 Redis Sentinel 节点之间的部分信息同步,通过 Redis Pub/Sub 订阅发布。 在我们实现 Redis 分布式锁时,如果获取不到锁,可以通过 Redis 的 Pub/Sub 订阅锁释放消息,从而实现其它获得不到锁的线程,快速抢占锁。 当然,Redis Client 释放锁时,需要 PUBLISH

springboot 缓存添加redis缓存支持

那年仲夏 提交于 2020-08-19 22:07:20
1.添加maven支持 <!-- springboot cache --> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-cache</artifactId> </dependency> <!-- redis --> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-data-redis</artifactId> </dependency> <!-- shiro-redis --> <dependency> <groupId>org.crazycake</groupId> <artifactId>shiro-redis</artifactId> <version>2.4.2.1-RELEASE</version> </dependency> 2.配置redis环境参数 # Redis数据库索引(默认为0) spring.redis.database=0 # Redis服务器地址 spring.redis.host=127.0.0.1 # Redis服务器连接端口 spring.redis.port=6379 #