![](https://img-blog.csdnimg.cn/20190918140145169.png?x-oss-process=image/resize,m_fixed,h_224,w_224)
redis
文章平均质量分 83
redis
秃了也弱了。
即使没有万全准备,也要勇敢迈出第一步。无论远方的风雨有多大、路有多难走。风里雨里陪伴你们,赠人玫瑰,手有余香。在技术领域,我会一如既往的坚持下去。
展开
-
Redis为什么会这么快?Redis到底有多快?
epoll:linux 还提供了 epoll 的系统调用,epoll 是基于事件驱动方式来代替顺序扫描,因此性能相对来说更高,主要原理是,当被监听的 fd 中,有 fd 就绪时,会告知当前进程具体哪一个 fd 就绪,那么当前进程只需要去从指定的 fd 上读取数据即可。从硬件设备复制数据到内核缓冲区是阻塞的,从内核缓冲区拷贝到用户空间,也是阻塞的,直到copy complete,内核返回结果,用户进程才解除block的状态。多路复用有很多的实现,以select为例,当用户进程调用了多路复用器,进程会被阻塞。原创 2023-06-05 09:00:17 · 831 阅读 · 0 评论 -
Redis使用Lua脚本,Redis中多命令保持原子性神器 - Lua
如果脚本执行了一部分被终止,就违背了脚本的原子性的目的。但是要注意的是,并不是所有的lua脚本执行的时候都可以kill,如果当前执行的Lua脚本对Redis的数据进行了修改(Set、DEL等),那么通过script kill命令是不能终止脚本运行的。Redis的指令执行本身是单线程的,这个线程还要执行客户端的Lua脚本,如果Lua脚本执行超时或者陷入了死循环,是不是就没办法为客户端提供服务了?在Redis从2.6版本之后,开始引入Lua脚本,也就是说,Redis可以用Lua来执行Redis命令。原创 2023-06-02 10:40:14 · 1168 阅读 · 0 评论 -
redis事务详解,带你搞懂redis的事务
通过multi的命令开启事务,multi执行后,客户端可以继续向服务器发送任意多条命令,这些命令不会立即执行,而是被放到一个队列中。Redis的事务涉及到四个命令:multi(开启事务),exec(执行事务),discard(取消事务),watch(监视)。我们发现,第一条命令是执行成功的,也就是在发生异常的情况下,之后错误的命令没有被执行,正确的命令还是执行成功,并没有被回滚。我们会发现,hset我们的语法有问题,事务会被拒绝执行,也就是队列中所有的命令都不会得到执行。如果中途不想执行事务了,怎么办?原创 2023-06-01 15:13:44 · 1212 阅读 · 0 评论 -
springboot使用redis实现消息队列功能,redis使用list和stream实现消息队列功能,redis实现消息队列的风险点分析
消息保序:保证消息的顺序消费。重复消费:对重复消息的有效处理。消息可靠性:保证消息不会因为服务器宕机而消失。对于以上三个要点,其实redis的list和stream是可以做到的。但是很多小伙伴也会使用发布/订阅模式来实现redis的消息队列,这样真的好吗?下面咱们就一起分析一下,list、stream、发布/订阅模式做消息队列的可行性。其实,关于 Redis 是否适合做消息队列,业界一直是有争论的。原创 2022-09-14 22:15:00 · 2860 阅读 · 3 评论 -
redis发布订阅模式详解
Redis 发布订阅 (pub/sub) 是一种消息通信模式:发送者 (pub) 发送消息,订阅者 (sub) 接收消息。Redis 客户端可以订阅任意数量的频道。下图展示了频道 channel1 , 以及订阅这个频道的三个客户端 —— client2 、 client5 和 client1 之间的关系:redis的发布订阅功能,很多小伙伴都会用来做消息队列使用。但是该功能风险太大,很容易造成消息丢失,所以并不建议做消息队列使用。原创 2022-09-11 00:15:00 · 1708 阅读 · 0 评论 -
redis中stream数据结构使用详解——redis最适合做消息队列的数据结构
Redis Stream 是 Redis 5.0 版本新增加的数据结构。Redis Stream 主要用于消息队列(MQ,Message Queue),Redis 本身是有一个 Redis 发布订阅 (pub/sub) 来实现消息队列的功能,但它有个缺点就是消息无法持久化,如果出现网络断开、Redis 宕机等,消息就会被丢弃。简单来说发布订阅 (pub/sub) 可以分发消息,但无法记录历史消息。原创 2022-09-10 04:30:00 · 2228 阅读 · 0 评论 -
redis的bitmap数据类型使用(亿级海量数据统计解决方案)
我们现在有几亿个数据,数据状态都是1或者0两个状态,比如用户签到次数、或者登录次数等。需要用什么数据类型存储呢?如果我们需要记录某一用户在一年中每天是否有登录我们的系统这一需求该如何完成呢?如果使用KV存储,每个用户需要记录365个,当用户量上亿时,这所需要的存储空间是惊人的。Redis 为我们提供了bitmap(位图)这一数据结构,每个用户每天的登录记录只占据一位,365天就是365位,仅仅需要46字节就可存储,极大地节约了存储空间。原创 2022-09-13 22:00:00 · 1204 阅读 · 0 评论 -
redis HyperLogLog数据类型——亿级用户访问量统计解决方案
我们可能会遇到这样一个统计场景:基数统计。基数统计就是指统计一个集合中不重复的元素个数。比如说统计网页的 UV(访问用户量)。网页 UV 的统计有个独特的地方,就是需要去重,一个用户一天内的多次访问只能算作一次。在 Redis 的集合类型中,Set 类型默认支持去重,所以看到有去重需求时,我们可能第一时间就会想到用 Set 类型。但是!如果一个网站用户数非常多,使用set类型来记录用户数,会造成大量的内存浪费。而HyperLogLog可以很好的满足这个要求。原创 2022-09-11 07:45:00 · 556 阅读 · 0 评论 -
redis GEO使用及基本原理——实现对经纬度的操作
redis的GEO数据结构,专门用来存储位置信息,并对存储的信息进行操作,该功能在 Redis 3.2 版本新增。举个例子:网约车平台存储所有的司机经纬度位置信息,用户发起打车请求的时候,我们记录用户的经纬度,并且计算哪一辆车距离用户最近,然后进行派单。一辆车的经纬度信息是不断变化的,修改频繁。此时就可以使用redis的GEO数据类型了。实际上,GEO 类型的底层数据结构就是用 Sorted Set 来实现的。原创 2022-09-10 10:15:00 · 2814 阅读 · 0 评论 -
redis持久化机制,深入分析redisAOF和RDB模式的利弊
我们都知道,Redis是一个内存数据库,数据保存在内存中,访问速度是相当快的。但是内存中的数据,服务器每次重启之后就会丢失,redis是如何做到持久化的呢?redis持久化设计有哪些巧妙之处呢?目前,Redis 的持久化主要有两大机制,即 AOF(Append Only File)日志和 RDB 快照。原创 2022-09-08 22:45:00 · 2192 阅读 · 1 评论 -
redis底层都有哪些数据结构?带你了解redis是如何存储数据的
我们都知道,redis有五种基本的数据类型: String(字符串)、List(列表)、Hash(哈希)、Set(集合)和 Sorted Set(有序集合)。今天,我们就一起聊聊我们熟知的这些数据类型,底层是如何实现的。其实,底层数据结构一共有 6 种,分别是简单动态字符串、双向链表、压缩列表、哈希表、跳表和整数数组。原创 2022-09-07 14:14:21 · 2198 阅读 · 0 评论 -
springboot使用redisTemplate操作lua脚本
操作redis使用Lua脚本有诸多好处减少网络开销:可以将多个请求通过脚本的形式一次发送,减少网络时延和请求次数。原子性的操作:Redis会将整个脚本作为一个整体执行,中间不会被其他命令插入。因此在编写脚本的过程中无需担心会出现竞态条件,无需使用事务。代码复用:客户端发送的脚步会永久存在redis中,这样,其他客户端可以复用这一脚本来完成相同的逻辑。速度快:见 与其它语言的性能比较, 还有一个 JIT编译器可以显著地提高多数任务的性能;...原创 2022-08-16 21:15:00 · 2563 阅读 · 0 评论 -
redis集群搭建-使用docker快速搭建一个测试redis集群
我们可以看到,7001、7002、7003是主节点,7006是7002的从,7005是7001的从,7004是7003的从。此时再查看节点信息,会发现7005号redis代替了7001,成为了主节点。–cluster-replicas1的意思就是设置主节点有一个从节点。我们发现,7001自动成为7005的从节点了。1.随便进入一台redis实例。1.随便连接某个redis结点。此时,redis集群搭建完成。4.set/get测试数据。2.创建redis集群。3.获取集群结点信息。...原创 2022-07-26 20:37:20 · 286 阅读 · 0 评论 -
springcache的使用详解(使用redis做分布式缓存)
使用springcache做缓存,需要首先明白几个概念:缓存穿透、缓存击穿、缓存雪崩,以及缓存一致性。缓存一致性解决方案——改数据时如何保证缓存和数据库中数据的一致性从查询数据库性能优化谈到redis缓存-谈一谈缓存的穿透、雪崩、击穿Spring 从 3.1 开始定义了 org.springframework.cache.Cache 和 org.springframework.cache.CacheManager 接口来统一不同的缓存技术; 并支持使用 JCache(JSR-107)注解简化我们开发;C原创 2022-07-03 09:49:20 · 5768 阅读 · 0 评论 -
redisson看门狗机制,redisson看门狗性能问题,redisson源码解析
Redisson内部提供了一个监控锁的看门狗,它的作用是在Redisson实例被关闭前,不断的延长锁的有效期。默认情况下,看门狗的检查锁的超时时间是30秒钟,也可以通过修改Config.lockWatchdogTimeout来另行指定。我们可以看到,leaseTime != -1时,只执行tryLockInnerAsync方法,其它情况会执行下面的代码,而leaseTime 就是我们调用lock(10, TimeUnit.SECONDS);方法传入的时间参数。由此可知:redisson如果只是用lock.原创 2022-06-30 16:46:29 · 4256 阅读 · 2 评论 -
redisson使用全解——redisson官方文档+注释(下篇)
Redisson Node指的是Redisson在分布式运算环境中作为独立节点运行的一种模式。Redisson Node的功能可以用来执行通过分布式执行服务或分布式调度执行服务发送的远程任务,也可以用来为分布式远程服务提供远端服务。 所有这些功能全部包含在一个JAR包里,您可以从这里下载。Redisson Node采用的是与Redisson框架同样的配置方法,并同时还增加了以下几个专用参数。值得注意的是ExecutorService使用的线程数量可以通过threads参数来设定。mapReduceWorke原创 2022-06-30 15:47:42 · 8235 阅读 · 0 评论 -
redisson使用全解——redisson官方文档+注释(中篇)
接上篇redisson使用全解——redisson官方文档+注释(上篇)基于Redis的Redisson分布式可重入锁RLock Java对象实现了java.util.concurrent.locks.Lock接口。同时还提供了异步(Async)、反射式(Reactive)和RxJava2标准的接口。大家都知道,如果负责储存这个分布式锁的Redisson节点宕机以后,而且这个锁正好处于锁住的状态时,这个锁会出现锁死的状态。为了避免这种情况的发生,Redisson内部提供了一个监控锁的看门狗,它的作用是在R原创 2022-06-30 11:47:22 · 40238 阅读 · 5 评论 -
redisson使用全解——redisson官方文档+注释(上篇)
redisson官方中文文档Redisson是架设在Redis基础上的一个Java驻内存数据网格(In-Memory Data Grid)。充分的利用了Redis键值数据库提供的一系列优势,基于Java实用工具包中常用接口,为使用者提供了一系列具有分布式特性的常用工具类。使得原本作为协调单机多线程并发程序的工具包获得了协调分布式多机多线程并发系统的能力,大大降低了设计和研发大规模分布式系统的难度。同时结合各富特色的分布式服务,更进一步简化了分布式环境中程序相互之间的协作。Redisson采用了基于NIO的N原创 2022-06-30 10:38:05 · 81283 阅读 · 6 评论 -
springboot整合redis——使用jedis做数据源
1、引入 redis-starter2、配置 redis3、使用 RedisTemplate 操作 redis4、切换使用 jedis因为lettuce自带的bug,所以尽量不用lettuce,使用jedis。Springboot操作Redis 报错“OutOfDirectMemoryError(堆外内存溢出) ”问题...原创 2022-06-28 08:52:16 · 737 阅读 · 0 评论 -
Springboot操作Redis 报错“OutOfDirectMemoryError(堆外内存溢出) ”问题
当进行压力测试时后期后出现堆外内存溢出OutOfDirectMemoryError新版本的Springboot的针对lettuce做了相关优化,在本人测试的时候使用lettuce未出现OutOfDirectMemoryError等BUG1,Springboot2.0以后默认使用lettuce作为操作redis的客户端,它使用netty进行网络通信2,lettuce的bug导致netty堆外内存溢出,netty如果没有指定堆外内存,默认使用虚拟机的-Xms的值,可以使用-Dio.netty.maxDire转载 2022-06-28 08:43:11 · 1581 阅读 · 0 评论 -
从查询数据库性能优化谈到redis缓存-谈一谈缓存的穿透、雪崩、击穿
实现了页面需要的功能,但是考虑到该页面是被用户高频访问的,所以性能必须进行尽可能的优化。一般一个系统最大的性能瓶颈,就是数据库的io操作。从数据库入手也是调优性价比最高的切入点。一般分为两个层面,一是提高数据库sql本身的性能,二是尽量避免直接查询数据库。提高数据库本身的性能首先是优化sql,包括:使用索引,减少不必要的大表关联次数,控制查询字段的行数和列数。另外当数据量巨大是可以考虑分库分表,以减轻单点压力。对于mysql的优化,请自行学习,这里不再赘述。MySQL高级-索引是个什么东西?explain原创 2022-06-24 17:25:50 · 558 阅读 · 0 评论 -
docker安装redis-简单而无坑
1.切换root用户2.下载镜像文件docker pull redis3.创建实例并启动4.redis配置文件详细配置(自行修改)https://raw.githubusercontent.com/antirez/redis/4.0/redis.conf想要修改配置文件,修改linux主机的/mydata/redis/conf/redis.conf即可5.使用 redis 镜像执行 redis-cli 命令连接...原创 2022-06-24 13:35:23 · 549 阅读 · 0 评论 -
redis高级-内存淘汰策略
目录一、redis缓存过期淘汰策略1.redis默认内存2.修改redis内存3.查看redis内存情况二、redis内存超出了设置的最大值会怎么样1.设置1个字节之后再赋值,会爆OOM三、内存淘汰策略1.一个键过期了,是怎么删除的2.内存淘汰策略3.修改内存淘汰策略lru算法一、redis缓存过期淘汰策略1.redis默认内存 如果不设置最大内存大小或者设置最大内存大小为0,在64位操作系统下不限制内存大小,在32位操作系统下最多使用3GB内存...原创 2021-05-25 17:30:25 · 1632 阅读 · 0 评论 -
redis-数据类型与应用
目录写在前面一、redis基础命令二、redis五大数据类型的落地应用※几种数据类型1.string①基础命令②应用场景2.hash(Map)(类似一个key放一个对象),>①基础命令②应用场景3.list(ArrayList;双向链表;有序有重复)①基本命令②应用场景4.set(HashSet;无序;无重复)①基本命令②应用场景5.zset(有序集合)①基础命令②应用场景写在前面redis一定要装6.0.8,装.原创 2021-05-25 16:51:57 · 1449 阅读 · 2 评论 -
如何用redis实现分布式锁?这篇文章教你用redisson实现分布式锁,封装之后的方法更好用!
使用redission实现分布式锁添加配置类import org.redisson.Redisson;import org.springframework.beans.factory.annotation.Value;import org.springframework.context.annotation.Bean;import org.springframework.context.annotation.Configuration;/** * redisson 配置类 */...原创 2020-08-21 11:12:43 · 6703 阅读 · 1 评论 -
超详细的redis总结
目录NOSQL简介非关系型数据库特点Redis简介redis安装redis数据类型String类型Hash类型(相当于map)(取变量名、设置map中的keyvalue)List类型(就像java中的queue)(有的公司利用redis的list做mq)set(无序)类型和zset(有序)类型(像java中的list)zset集合redis高级命令redis的安全性redis持久化机制NOSQL简介 NoSQL,泛指非关系型的数据库,NoS...原创 2020-07-29 10:15:22 · 6398 阅读 · 0 评论 -
redis如何设置密码
redis如何设置密码?密码设置redis密码设置有两种方式,一种需要重启redis服务,一种不需要重启redis服务。首先,介绍一下需要重启redis服务的设置方式即找到redis的配置文件—redis.conf文件,然后修改里面的requirepass,这个本来是注释起来了的,将注释去掉,并将后面对应的字段设置成自己想要的密码,保存退出。重启redis服务,即可。我这里是设置密码成了123然后是不需要重启redis服务的密码设置方式这种相对简单,连接redis之后,通过命转载 2020-07-07 16:29:21 · 5555 阅读 · 0 评论