
Redis:不只是数据库
文章平均质量分 92
Redis 是一个高性能的key-value数据库。 redis的出现,很大程度补偿了memcached这类key/value存储的不足,在部 分场合可以对关系数据库起到很好的补充作用。它提供了Java,C/C++,C#,PHP,JavaScript,Perl,Object-C,
云原生AI百宝箱
行万里路,此处相逢,共话云原生A之道。偶逗趣事,明月清风,与君同坐。已出版《Kubernetes:云原生与容器编排实战》,将出版《A大模型原理与场景应用》
展开
-
5种缓存更新策略
5种缓存更新策略缓存一般是为了应对高并发场景、缓解数据库读写压力,而将数据存储在读写更快的某种存储介质中(如内存),以加快读取数据的速度。缓存一般分为本地缓存(如java堆内存缓存)、分布式缓存(如redis)等。既然是缓存,就意味着缓存中暂存的数据只是个副本,也就意味着需要保证副本和主数据之间的数据一致性,这就是接下来要分析的缓存的更新。常见的缓存更新策略有:先删缓存,再更新数据库旁路缓存(Cache Aside) 先更新数据库,再删缓存先更新数据库,再更新缓存读/写直通(Read/Wri转载 2022-01-18 10:04:48 · 9274 阅读 · 0 评论 -
Redis为何这么快--数据存储角度
本文内容思维导图如下:一、简介和应用 Redis是一个由ANSIC语言编写,性能优秀、支持网络、可持久化的K-K内存数据库,并提供多种语言的API。它常用的类型主要是 String、List、Hash、Set、ZSet 这5种 Redis在互联网公司一般有以下应用:String:缓存、限流、计数器、分布式锁、分布式Session Hash:存储用...转载 2019-07-03 09:08:45 · 481 阅读 · 0 评论 -
解决缓存失效后并发问题: 双key方案
我们在使用缓存的时候,不管Redis或者是Memcached,基本上都会遇到以下3个问题:缓存穿透、缓存并发、缓存集中失效。这篇文章主要针对「缓存并发」问题展开讨论,并给出具体的解决方案。1.什么是缓存并发?在高并发的访问下,当某个缓存处于过期失效的时间点时,极有可能出现多个进程同时查询该缓存(该缓存是业务场景中非常 “热点” 的数据,比如首页的缓存数据)。因为查询DB并重新缓存需要一定的时间,而瞬时并发非常高,如果此时缓存失效了,这些并发请求都会直接访问DB,从而导致DB服务器的CPU或者内存转载 2021-09-25 17:15:15 · 770 阅读 · 1 评论 -
生成订单30分钟未支付,则自动取消,该怎么实现?
引言在开发中,往往会遇到一些关于延时任务的需求。例如生成订单30分钟未支付,则自动取消 生成订单60秒后,给用户发短信对上述的任务,我们给一个专业的名字来形容,那就是延时任务。那么这里就会产生一个问题,这个延时任务和定时任务的区别究竟在哪里呢?一共有如下几点区别定时任务有明确的触发时间,延时任务没有 定时任务有执行周期,而延时任务在某事件触发后一段时间内执行,没有执行周期 定时任务一般执行的是批处理操作是多个任务,而延时任务一般是单个任务下面,我们以判断订单是否超时为例,进...转载 2021-09-21 10:52:33 · 405 阅读 · 0 评论 -
Redis: 分布式锁的正确实现方式( Java 版 )
前言分布式锁一般有三种实现方式:1. 数据库乐观锁;2. 基于Redis的分布式锁;3. 基于ZooKeeper的分布式锁。本篇博客将介绍第二种方式,基于Redis实现分布式锁。虽然网上已经有各种介绍Redis分布式锁实现的博客,然而他们的实现却有着各种各样的问题,为了避免误人子弟,本篇博客将详细介绍如何正确地实现Redis分布式锁。可靠性首先,为了确保分布式锁可用,我们至少要确保锁的...转载 2019-02-14 16:43:02 · 9061 阅读 · 0 评论 -
Redis实现分布式锁:加锁、解锁、续租和一致
目录分布式锁及其应用场景为何需要分布式锁分布式锁的特性互斥性不死锁一致性可重入性支持阻塞和非阻塞:支持公平锁和非公平锁(可选)使用原生Redis实现分布式锁加锁解锁续租如何保障一致性集群问题1. 主备切换2. 集群脑裂集群问题解决使用红锁(RedLock)红锁的问题:使用WAIT命令。分布式锁及其应用场景应用开发时,如果需要在同进程内的不同线程并发访问某项资源,可以使用各种互斥锁、读写锁;如果一台主机上的多个进转载 2021-03-08 16:40:59 · 3742 阅读 · 4 评论 -
Redis:单线程模型效率为什么这么高,6.0为啥开始引入多线程
Redis6.0之前是单线程模型首先我们要明确一个共识,我们通常所说的Redis单线程是指获取 (socket 读)、解析、执行、内容返回 (socket 写) 等都由一个顺序串行的主线程处理,这个主线程就是我们平时说的"单线程",而其他的清理脏数据、无用连接的释放、LRU淘汰策略等等也是有其他线程在处理的,因此其实在Redis6之前的Redis本质上也是多线程的。为什么这些操作要放在同一个主线程中,官方给出的解释:传送门通常瓶颈不在 CPU,而是在内存和网络IO; 多线程会带来线程不安全.原创 2021-01-13 14:01:02 · 993 阅读 · 0 评论 -
Redis对象底层数据结构实现概述
本文是一篇redis读书笔记,主要内容整理自 Redis设计与实现。如果你想快速了解redis底层数据结构,相信这篇文章会有所帮助。 文章主要分为两大部分,第一部分介绍了Redis对象的各种底层数据结构,第二部分总结了redis对象与各种底层数据结构的关系。1 Redis对象底层数据结构1.1 SDS(简单动态字符串)Redis没有直接使用C语言传统的字符串表示(以空字符结尾的...转载 2019-03-26 11:44:16 · 709 阅读 · 0 评论 -
缓存穿透,缓存击穿,缓存雪崩解决方案分析
缓存处理流程前台请求,后台先从缓存中取数据,取到直接返回结果,取不到时从数据库中取,数据库取到更新缓存,并返回结果,数据库也没取到,那直接返回空结果。设计一个缓存系统,不得不要考虑的问题就是:缓存穿透、缓存击穿与失效时的雪崩效应。缓存穿透缓存穿透是指查询一个一定不存在的数据(缓存和数据库中都没有的数据),由于缓存是不命中时被动写的,并且出于容错考虑,如果从存储层查不到...转载 2019-01-20 20:20:50 · 10219 阅读 · 0 评论 -
Redis集群:使用Spring和jedisCluster操作Redis集群
jedisCluster 非Spring和jedisCluster操作Redis集群jar包 <!-- 指定版本号 --><properties> <!-- JEDIS --> <jedis.version>2.7.1</jedis.version></properties><...原创 2018-12-13 08:28:01 · 6484 阅读 · 0 评论 -
Redis集群:主从节点添加和删除
添加主节点集群创建成功后可以向集群中添加节点,下面是添加一个master主节点 添加7007结点,参考集群结点规划章节添加一个“7007”目录作为新节点。执行下边命令:./redis-trib.rb add-node 192.168.101.3:7007 192.168.101.3:7001 查看集群结点发现7007已添加到集群中: hash槽重新分配...原创 2018-12-13 08:24:19 · 8807 阅读 · 0 评论 -
Redis集群:Redis3.X集群环境搭建、查询集群信息
redis集群机制(1)所有的redis节点彼此互联(PING-PONG机制),内部使用二进制协议优化传输速度和带宽。(2)节点的fail是通过集群中超过半数的节点检测失效时才生效。(3)客户端与redis节点直连,不需要中间proxy层.客户端不需要连接集群所有节点,连接集群中任何一个可用节点即可。(4)redis-cluster把所有的物理节点映射到[0-16383]s...原创 2018-12-13 08:22:23 · 6696 阅读 · 0 评论 -
分布式Session:基于Spring-Session 和 Redis实现
分布式Session-前言在Web项目开发中,会话管理是一个很重要的部分,用于存储与用户相关的数据。通常是由符合session规范的容器来负责存储管理,也就是一旦容器关闭,重启会导致会话失效。因此打造一个高可用性的系统,必须将session管理从容器中独立出来。共享Session问题 HttpSession是通过Servlet容器创建和管理的,像Tomca...原创 2017-11-07 12:40:06 · 14604 阅读 · 0 评论 -
为什么我们做分布式选择使用Redis?
绝大部分写业务的程序员,在实际开发中使用 Redis 的时候,只会 Set Value 和 Get Value 两个操作,对 Redis 整体缺乏一个认知。这里对Redis 常见问题做一个总结,解决大家的知识盲点。1、为什么使用 Redis在项目中使用 Redis,主要考虑两个角度:性能和并发。如果只是为了分布式锁这些其他功能,还有其他中间件 Zookpeer 等代替,并非一定要使用 R...转载 2018-10-09 17:28:34 · 5952 阅读 · 0 评论 -
Redis:Bitmaps使用场景-用户签到、统计活跃用户、用户在线状态
BitMap是什么就是通过一个bit位来表示某个元素对应的值或者状态,其中的key就是对应元素本身。我们知道8个bit可以组成一个Byte,所以bitmap本身会极大的节省储存空间。Redis中的BitMapRedis从2.2.0版本开始新增了setbit,getbit,bitcount等几个bitmap相关命令。虽然是新命令,但是并没有新增新的数据类型,因为setbit等命令只不过是...转载 2018-09-11 18:03:16 · 13087 阅读 · 0 评论 -
JedisDataException: Please close pipeline or multi block before calling this method
错误原因transaction错误使用pipeline错误使用具体分析transaction错误使用Redis事务的执行结果是在exec之后才统一返回,所以Jedis会用一个Response对象最为事务对象transaction的执行放回值。如果我们在transaction执行exec方法之前调用response对象的get方法会出现异常:Exception in thread "main" re...原创 2018-04-09 07:34:28 · 22693 阅读 · 0 评论 -
JedisPool资源池优化
背景合理的JedisPool资源池参数设置能为业务使用Redis保驾护航,本文将对JedisPool的使用、资源池的参数进行详细说明,最后给出“最合理”配置。一、使用方法以官方的2.9.0为例子(Jedis Release),Maven依赖如下:<dependency> <groupId>redis.clients</groupId> <a...转载 2018-03-19 20:23:43 · 13824 阅读 · 0 评论 -
Jedis常见异常汇总
Jedis虽然使用起来比较简单,但是如果不能根据使用场景设置合理的参数(例如连接池参数),不合理的使用一些功能(例如Lua和事务)也会产生很多问题,本文对这些问题逐个说明:详细目录:一、redis.clients.jedis.exceptions.JedisConnectionException: Could not get a resource from the pool二、redis.clie...转载 2018-03-19 20:00:01 · 28295 阅读 · 0 评论 -
阿里云Redis开发规范
本文介绍了在使用阿里云Redis的开发规范,从键值设计、命令使用、客户端使用、相关工具等方面进行说明,通过本文的介绍可以减少使用Redis过程带来的问题。一、键值设计1. key名设计【建议】: 可读性和可管理性以业务名(或数据库名)为前缀(防止key冲突),用冒号分隔,比如业务名:表名:idugc:video:1【建议】:简洁性保证语义的前提下,控制key的长度,当key较多时,内存占用也不容忽...转载 2018-03-15 20:17:34 · 14172 阅读 · 0 评论 -
Redis:Bitmaps使用场景和常用命令
Bitmaps介绍Redis提供的Bitmaps这个“数据结构”可以实现对位的操作。Bitmaps本身不是一种数据结构,实际上就是字符串,但是它可以对字符串的位进行操作。 可以把Bitmaps想象成一个以位为单位数组,数组中的每个单元只能存0或者1,数组的下标在bitmaps中叫做偏移量。 单个bitmaps的最大长度是512MB,即2^32个比特位。 bitmaps的最大优势是节省存储...原创 2018-01-26 18:30:04 · 16915 阅读 · 0 评论 -
Redis事务:用法,常见错误和API
MULTI,EXEC,DISCARD和WATCH是Redis事务的基础。它们允许在一个步骤中执行一组命令,并有两个重要的保证:事务中的所有命令都被序列化并按顺序执行。在执行Redis事务的过程中,不会发生由另一个客户端发出的请求。这保证了命令作为一个单独的操作被执行。要么所有的命令都没有被处理、要么没有命令被执行,所以Redis事务也是原子的。EXEC命令,触发事务中的所有翻译 2018-01-05 14:34:20 · 15271 阅读 · 0 评论 -
Redis: pipeline加速Redis请求,实现批处理
Redis是基于TCP连接进行通信Redis是使用客户端 - 服务器模型的TCP服务器,称为请求/响应协议。这意味着通常一个请求是通过以下步骤完成的:客户端向服务器发送查询,并通常以阻塞的方式从套接字读取服务器响应。 服务器处理命令并将响应发送回客户端。知道redis是基于TCP连接进行通信的,每一个request/response都需要经历一个RTT(Round-Trip ...原创 2018-01-04 14:10:23 · 17506 阅读 · 0 评论 -
Redis:EVAL执行Lua脚本
EVAL 脚本 numkeys 键[键...] arg [arg ...]自Redis2.6.0版本起可用。 时间复杂度:取决于执行的脚本。 EVAL介绍 EVAL和EVALSHA用于从Redis2.6.0版本,开始使用内置在Redis中的Lua解释器来评估脚本。 EVAL的第一个参数是一个Lua 5.1脚本。脚本不需要定义一个Lua函数(不应该)。这只是一个将在Red...翻译 2018-01-02 20:14:18 · 29933 阅读 · 0 评论 -
Redis命令:scan实现模糊查询
1.scan前言从Redis v2.8开始,SCAN命令已经可用,它允许使用游标从keyspace中检索键。对比KEYS命令,虽然SCAN无法一次性返回所有匹配结果,但是却规避了阻塞系统这个高风险,从而也让一些操作可以放在主节点上执行。2.SCAN相关命令SCAN相关命令包括SSCAN 命令、HSCAN 命令和 ZSCAN 命令,分别用于集合、哈希键及有续集等SCAN 命令用...原创 2017-12-31 16:54:33 · 88474 阅读 · 4 评论 -
redis-GEO地理位置
Redis 3.2版本一个重大的更新是新增了GEO地理位置相关的命令。目前Redis对地理位置支持提供了一下6个命令:1. geoadd: 增加地理位置的坐标。2. geodist: 获取两个地理位置的距离。3. geohash: 获取地理位置的GeoHash值。4. geopos: 获取地理位置的坐标。5. georadius: 根据给定经纬度坐标获取指定范围内的地理位置集合原创 2017-11-29 19:38:45 · 14307 阅读 · 1 评论 -
Redis持久化:RDB和AOF配置和对比
1. 前言Redis的高性能是由于其将所有数据都存储在了内存中,为了使Redis在重启之后仍能保证数据不丢失,需要将数据从内存中同步到硬盘中,这一过程就是持久化。Redis支持两种方式的持久化,一种是RDB方式,一种是AOF方式。可以单独使用其中一种或将二者结合使用。2.RDB持久化持久化机制:指定的时间间隔内将内存中的数据集以快照写入磁盘RDB方式的持久化是通过快...原创 2017-11-28 09:52:12 · 15945 阅读 · 0 评论 -
Redis发布订阅和应用场景
发布订阅-应用场景Pub/Sub 从字面上理解就是发布(Publish)与订阅(Subscribe),在Redis中,你可以设定对某一个key值进行消息发布及消息订阅,当一个key值上进行了消息发布后,所有订阅它的客户端都会收到相应的消息。这一功能最明显的用法就是构建实时消息系统,比如普通的即时聊天,群聊等功能。订阅某个channel的信息发布信息到某个channel上简...原创 2017-11-10 08:46:39 · 39782 阅读 · 12 评论 -
Redis不同数据类型命令使用及应用场景
1.1Redis数据类型Redis数据类型:Redis使用key/value格式存储数据,其中key的类型永远是string,而value的类型非常丰富;常用的数据类型:string:存储字符串(最基础的数据类型,二进制的文件(图片、视频)512M)list:是一个集合,可以在头部或者尾部操作数据hash(Map):采用键值对存储set:无序不可重复的集合Sort...原创 2017-11-09 20:24:53 · 15138 阅读 · 0 评论