标签: Redis

他在笑_1 | 2周前 | RedisJava

Redis "高级"应用场景 -- 限流、延时队列、幂等处理

持续创作,加速成长!这是我参与「掘金日新计划 · 10 月更文挑战」的第 6 天,[点击查看活动详情][Link 1] 🍳引言 自Redis入门篇过后,已经好久没更Redis了,接下来应该从实战篇,原理篇,面试篇几个层次来展开,本篇主要是实战篇环节,以问题展开,应对面试场景作答【melo称其为"手撕面答"】,尽量简短,某些部分可能不会进行详细介绍。 emmm,但后边有些部分还是干脆整合在一起了,可观性好一点,不至于看得一头雾水 🎨本篇脑图速览 🎯🎈Redis限流是怎么做的? 固定窗口计数 固定窗口计数是指,假设我们的限流规则是:1min内最多只能访问10次,那么固定窗口就是固定了【 1min-2min】这个窗口内,只能有10次访问 ,相应的我们就要给这个窗口维护一个计数器。 为了节省空间,其实我们不需要维护一个个窗口,只需要维护当前访问时间所在的窗口即可,以及对应的计数...

 129 |  3 |  0 RedisJava

但丁. | 2022-06-29 | RedisJava

自定义注解防止重复提交

场景:假设多个人同时点击或者单人多次点击导致并发请求,存在幂等性问题,我们可通过redis加锁来控制并发处理。 创建注解类 lockTime用作扩展属性,可供不同业务场景进行不同时间设置 创建切面类 @Aspect 定义切面类 @Around 定义切入逻辑处理 可根据当前路径+登录人token控制并发限制,写入redis超时设置。 ![e97dc4...

 308 |  5 |  2 RedisJava

晴天 | 2021-11-17 | Redis后端相关

面试官:说一下redis的持久化

Redis是一个键值对数据库服务器,由于Redis是内存数据库,那么有很多内存的特点,例如掉电易失,或者进程退出,服务器中的数据也将消失不见,所以需要一种方法将数据从内存中写到磁盘,这一过程称之为数据持久化。 持久化有两种方式,一种是RDB,操作手段是将数据从内存中写到磁盘,生成一个经过压缩的RDB文件,另一种持久化方式叫AOF,是把Redis执行的命令行逐句记录下来,追加在类似日志的文件中。 RDB持久化 Redis中有两个命令可以用来生成RDB文件,一个是 SAVE ,另一个是 BGSAVE 。 SAVE是线程阻塞的,当调用这个命令后,服务器不再对外提供服务,直到内存中需要存储的数据全都持久化为RDB文件。 bgsave 与 save 不同, bgsave 会创建一个子线程来完成数据持久化的任务,主服务器依旧对外提供服务。 无论是哪种方式,底层都是调用同一个函数rdb.c/rdbSave()来完成,下面是二者实现的伪代码: c def save(): rdbSave() c def BGSAVE(): 创建子进程

 1053 |  7 |  2 Redis后端相关

蔡文姬 | 2021-11-17 | Redis后端相关Java

Redis 实现限流的三种方式

面对越来越多的高并发场景,限流显示的尤为重要。 当然,限流有许多种实现的方式,Redis具有很强大的功能,我用Redis实践了三种的实现方式,可以较为简单的实现其方式。Redis不仅仅是可以做限流,还可以做数据统计,附近的人等功能,这些可能会后续写到。 第一种:基于Redis的setnx的操作 我们在使用Redis的分布式锁的时候,大家都知道是依靠了setnx的指令,在CAS(Compare and swap)的操作的时候,同时给指定的key设置了过期实践(expire),我们在限流的主要目的就是为了在单位时间内,有且仅有N数量的请求能够访问我的代码程序。所以依靠setnx可以很轻松的做到这方面的功能。 比如我们需要在10秒内限定20个请求,那么我们在setnx的时候可以设置过期时间10,当请求的setnx数量达到20时候即达到了限流效果。代码比较简单就不做展示了。 具体的setnx用法可以参照我另一篇博客 [RedisTemplate下Redis分布式锁引发的系列问题](http://mp.weixin.qq.com/s?__biz=MzI4Njc5NjM1NQ &

 950 |  5 |  0 Redis后端相关

404 | 2021-11-16 | Redis后端相关Java

redis实践及思考

导语:当面临存储选型时是选择关系型还是非关系型数据库?如果选择了非关系型的redis,redis常用数据类型占用内存大小如何估算的?redis的性能瓶颈又在哪里? 背景 前段时间接手了一个业务,响应时间达到 10s左右 。阅读源码后发现,每一次请求都是查询多个分表数据(task1,task2….),然后再join其他表(course,teacher..), 时间全部花在了大量磁盘I/O上 。脑袋一拍,重构,上redis! 为什么选择redis 拍脑袋做技术方案肯定是不行的,得用数据和逻辑说服别人才可以。 时延 时延=后端发起请求db(用户态拷贝请求到内核态)+ 网络时延 + 数据库寻址和读取 如果想要降低时延,只能减少请求数(合并多个后端请求)和减少数据库寻址和读取得时间。从降低时延的角度,基于 单线程和内存 的redis,每秒10万次得读写性能肯定远远胜过磁盘读写性能。 数据规模 以redis一组K-V为例(”hello” “world”),一个简单的set命令最终会产生4个消耗内存的结构。 ![df9510ac8fa44736888

 852 |  5 |  0 Redis后端相关

叶凡 | 2021-11-10 | MQ 消息中间件Redis后端相关MySQLJava

缓存与数据库一致性保证

本文主要讨论这么几个问题: (1)啥时候数据库和缓存中的数据会不一致 (2)不一致优化思路 (3)如何保证数据库与缓存的一致性 一、需求缘起 上一篇《[缓存架构设计细节二三事](http://mp.weixin.qq.com/s?__biz=MjM5ODYxMDA5OQ &mid=404087915&idx=1&sn=075664193f334874a3fc87fd4f712ebc&scene=21 wechat_redirect)》(点击查看)引起了广泛的讨论,其中有一个结论:当数据发生变化时,“先淘汰缓存,再修改数据库”这个点是大家讨论的最多的。 上篇文章得出这个结论的依据是,由于操作缓存与操作数据库不是原子的,非常有可能出现执行失败。 假设先写数据库,再淘汰缓存:第一步写数据库操作成功,第二步淘汰缓存失败,则会出现DB中是新数据,Cache中是旧数据,数据不一致【如

 873 |  4 |  0 MQ 消息中间件Redis

叶凡 | 2021-11-10 | MQ 消息中间件Redis后端相关Java

认识 MySQL 和 Redis 的数据一致性问题

1. 什么是数据的一致性 “数据一致”一般指的是:缓存中有数据,缓存的数据值 = 数据库中的值。 但根据缓存中是有数据为依据,则”一致“可以包含两种情况: 缓存中有数据,缓存的数据值 = 数据库中的值(需均为最新值,本文将“旧值的一致”归类为“不一致状态”) 缓存中本没有数据,数据库中的值 = 最新值(有请求查询数据库时,会将数据写入缓存,则变为上面的“一致”状态) ”数据不一致“:缓存的数据值 ≠ 数据库中的值;缓存或者数据库中存在旧值,导致其他线程读到旧数据 2. 数据不一致情况及应对策略 根据是否接收写请求,可以把缓存分成读写缓存和只读缓存。 只读缓存:只在缓存进行数据查找,即使用 “更新数据库+删除缓存” 策略; 读写缓存:需要在缓存中对数据进行增删改查,即使用 “更新数据库+更新缓存”策略。 2.1 针对只读缓存(更新数据库+删除缓存) 只读缓存:新增数据时,直接写入数据库;更新(修改/删除)数据时,先删除缓存。后续,访问这些增删改的数据时,会发生缓存缺失,进而查询数据库,更新缓存。 新增数据时 ,写入数据库;访问数据时,

 1093 |  4 |  0 MQ 消息中间件Redis

OOM | 2021-11-06 | Redis后端相关

Redis的47连环炮,试试你能看住几个

1、说说什么是Redis? Redis 是一个开源(BSD许可),内存存储的数据结构服务器,可用作数据库,高速缓存和消息队列代理。它支持字符串、哈希表、列表、集合、有序集合,位图,HyperLogLogs 等数据类型。内置复制、Lua 脚本、LRU 收回、事务,以及不同级别磁盘持久化功能,同时通过 Redis Sentinel 提供高可用,通过 Redis Cluster 提供自动分区。根据月度排行网站 DB-Engines的数据,Redis 是最流行的键值对存储数据库。 以上是官方的介绍,我们也可以做一个简单回答: Redis 全称为:Remote Dictionary Server(远程数据服务),是一个基于内存且支持持久化的高性能 key-value 数据库。具备一下三个基本特征: 多数据类型 持久化机制 主从同步 2、Redis 有什么优点和缺点

 1982 |  6 |  0 Redis后端相关

蔡文姬 | 2021-10-29 | Redis后端相关

Redis(三):持久化

Redis作为内存数据库高性能的同时也带来了内存存储数据在重启或异常宕机后会丢失数据的问题。因此redis提供了RDB、AOF和混合持久化三种方式来对内存中的数据进行持久化。 一、RDB RDB是redis默认的持久化方式,符合一定条件时将目前服务中的所有数据全部写入到磁盘中。 优势 1. rdb是二进制压缩文件,本身占用空间很小,数据恢复速度快。 2. 对redis服务能力影响较小,只有在fork子进程的瞬间会阻塞,其他情况下都不影响主进程提供的服务能力。 劣势 数据可靠性相对aof方式要低,使用 RDB 方式实现持久化,一旦 Redis 异常退出,就会丢失最后一次快照以后更改的所有数据。 1.1 RDB触发条件配置 在redis.conf中有一个save的配置项: js 格式:save <seconds <changes save 900 1 :表示15分钟(900秒钟)内至少1个键被更改则进行快照。 save 300 10 :表示5分钟(300秒)内至少10个键被更改则进行快照。 save 60 10000 :表示1分钟内至少

 884 |  7 |  2 Redis后端相关

后端小二 | 2021-10-12 | Redis后端相关

Redis入门指南总结

一 简介 Redis是一个高性能的key-value数据库。Redis对数据的操作都是原子性的。 1.1 优缺点 优点: 1. 基于内存操作,内存读写速度快。 2. Redis是单线程的,避免线程切换开销及多线程的竞争问题。单线程是指在处理网络请求(一个或多个redis客户端连接)的时候只有一个线程来处理,redis运行时不止有一个线程,数据持久化或者向slave同步aof时会另起线程。 3. 支持多种数据类型,包括String、Hash、List、Set、ZSet等 4. 支持持久化。Redis支持RDB和AOF两种持久化机制,持久化功能有效地避免数据丢失问题。 5. redis 采用IO多路复用技术。多路指的是多个socket连接,复用指的是复用一个线程。redis使用单线程来轮询描述符,将数据库的开、关、读、写都转换成了事件。多路复用主要有三种技术:select,poll,epoll。epoll是最新的也是目前最好的多路复用技术。 缺点:对join或其他结构化查询的支持就比较差。 1.2 io多路复用 将用户socket对应的文件描述符(file ...

 1772 |  4 |  0 Redis后端相关

后端小二 | 2021-10-12 | Redis后端相关

Redis面试题汇总

一 Redis是什么? Redis( Remote Dictionary Server )是一个使用 C 语言编写的,高性能非关系型的键值对数据库。与传统数据库不同的是,Redis 的数据是存在内存中的,所以读写速度非常快,被广泛应用于缓存方向。Redis可以将数据写入磁盘中,保证了数据的安全不丢失,而且Redis的操作是原子性的。 二 Redis优缺点? 优点 : 1. 基于内存操作 ,内存读写速度快。 2. Redis是 单线程 的,避免线程切换开销及多线程的竞争问题。单线程是指网络请求使用一个线程来处理,即一个线程处理所有网络请求,Redis 运行时不止有一个线程,比如数据持久化的过程会另起线程。 3. 支持多种数据类型 ,包括String、Hash、List、Set、ZSet等。 4. 支持持久化 。Redis支持RDB和AOF两种持久化机制,持久化功能可以有效地避免数据丢失问题。 5. 支持事务 。Redis的所有操作都是原子性的,同时Redis还支持对几个操作合并后的原子性执行。 6. 支持主从复制 。主节点会自动将...

 1744 |  5 |  0 Redis后端相关

liuliu | 2021-04-07 | Redis

分布式锁汇总

一 基于数据库实现分布式锁 1.1 悲观锁 利用select … where … for update 排他锁 注意: 其他附加功能与实现一基本一致,这里需要注意的是“where name=lock ”,name字段必须要走索引,否则会锁表。有些情况下,比如表不大,mysql优化器会不走这个索引,导致锁表问题。 1.2 乐观锁 所谓乐观锁与前边最大区别在于基于CAS思想,是不具有互斥性,不会产生锁等待而消耗资源,操作过程中认为不存在并发冲突,只有update version失败后才能觉察到。我们的抢购、秒杀就是用了这种实现以防止超卖。 通过增加递增的版本号字段实现乐观锁 二 基于jdk的实现方式 思路:另启一个服务,利用jdk并发工具来控制唯一资源,如在服务中维护一个concurrentHashMap,其他服务对某个key请求锁时,通过该服务暴露的端口,以网络通信的方式发送消息,服务端解析这个消息,将concurrentHashMap中的key对应值设为true,分布式锁请求成功,可以采用基于netty通信调用,当然你想用java的bio、nio或...

 973 |  2 |  0 Redis