
redis
文章平均质量分 87
redis
Meiko丶
这个作者很懒,什么都没留下…
展开
-
Redis 6.0中的多线程
在Redis 6.0 推出之后,我想去了解下为什么采用多线程,现在采用的多线程和以前版本有什么区别?为什么这么晚才使用多线程?Redis不是已经采用了多路复用技术吗?不是号称很高的性能了吗?为啥还要采用多线程模型呢?本文就来分析下这些问题以及背后的思考。Redis为什么最开始被设计成单线程的?Redis作为一个成熟的分布式缓存框架,它由很多个模块组成,如网络请求模块、索引模块、存储模块、高可用集群支撑模块、数据操作模块等。很多人说Redis是单线程的,就认为Redis中所有模块的操作都是转载 2021-12-27 11:12:12 · 887 阅读 · 0 评论 -
3种常用的缓存读写策略
看到很多小伙伴简历上写了“熟练使用缓存”,但是被我问到“缓存常用的3种读写策略”的时候却一脸懵逼。在我看来,造成这个问题的原因是我们在学习 Redis 的时候,可能只是简单了写一些 Demo,并没有去关注缓存的读写策略,或者说压根不知道这回事。但是,搞懂3种常见的缓存读写策略对于实际工作中使用缓存以及面试中被问到缓存都是非常有帮助的!下面我会简单介绍一下自己对于这 3 种缓存读写策略的理解。另外,这3 种缓存读写策略各有优劣,不存在最佳,需要我们根据具体的业务场景选择更适合的。个人能力有原创 2021-11-26 17:56:18 · 337 阅读 · 0 评论 -
Redis的使用规范
1、Redis的使用规范1.1、 key的规范要点我们设计Redis的key的时候,要注意以下这几个点:以业务名为key前缀,用冒号隔开,以防止key冲突覆盖。如,live:rank:1 确保key的语义清晰的情况下,key的长度尽量小于30个字符。 key禁止包含特殊字符,如空格、换行、单双引号以及其他转义字符。 Redis的key尽量设置ttl,以保证不使用的Key能被及时清理或淘汰。1.2、value的规范要点Redis的value值不可以随意设置的哦。第一点,如果.原创 2021-10-19 11:55:01 · 948 阅读 · 0 评论 -
Redis SCAN 命令
Redis Scan 命令用于迭代数据库中的数据库键。SCAN 命令是一个基于游标的迭代器,每次被调用之后, 都会向用户返回一个新的游标, 用户在下次迭代时需要使用这个新游标作为 SCAN 命令的游标参数, 以此来延续之前的迭代过程。SCAN 返回一个包含两个元素的数组, 第一个元素是用于进行下一次迭代的新游标, 而第二个元素则是一个数组, 这个数组中包含了所有被迭代的元素。如果新游标返回 0 表示迭代已结束。相关命令:SSCAN命令用于迭代集合键中的元素。 HSCAN命令用于迭...原创 2021-10-18 15:38:36 · 315 阅读 · 0 评论 -
Redis与MySQL双写一致性如何保证
一致性就是数据保持一致,在分布式系统中,可以理解为多个节点中数据的值是一致的。强一致性:这种一致性级别是最符合用户直觉的,它要求系统写入什么,读出来的也会是什么,用户体验好,但实现起来往往对系统的性能影响大 弱一致性:这种一致性级别约束了系统在写入成功后,不承诺立即可以读到写入的值,也不承诺多久之后数据能够达到一致,但会尽可能地保证到某个时间级别(比如秒级别)后,数据能够达到一致状态 最终一致性:最终一致性是弱一致性的一个特例,系统会保证在一定时间内,能够达到一个数据一致的状态。这里之所以将最终一致转载 2021-10-09 17:18:57 · 150 阅读 · 0 评论 -
redis 分布式锁再这么用,我就劝退你
由于是做商城业务,要频繁的对商品库存进行扣减,应用是集群部署,为避免并发造成库存超买超卖等问题,采用 redis 分布式锁加以控制。本以为给扣库存的代码加上锁lock.tryLock就万事大吉了 /** * @author xiaofu * @description 扣减库存 * @date 2020/4/21 12:10 */ public String stockLock() { RLock lock = redissonClie转载 2021-10-08 11:28:59 · 194 阅读 · 0 评论 -
redis缓存淘汰策略LRU和LFU对比与分析
一、Redis占用内存大小我们知道Redis是基于内存的key-value数据库,因为系统的内存大小有限,所以我们在使用Redis的时候可以配置Redis能使用的最大的内存大小。1、通过配置文件配置通过在Redis安装目录下面的redis.conf配置文件中添加以下配置设置内存大小//设置Redis最大占用内存大小为100Mmaxmemory 100mb2、通过命令修改Redis支持运行时通过命令动态修改内存大小//设置Redis最大占用内存大小为100M127.0.0.1转载 2021-08-11 11:25:29 · 1512 阅读 · 0 评论 -
redisson
如果你之前是在用 Redis 的话,那使用 Redisson 的话将会事半功倍,Redisson 提供了使用 Redis的最简单和最便捷的方法。Redisson的宗旨是促进使用者对 Redis 的关注分离(Separation of Concern),从而让使用者能够将精力更集中地放在处理业务逻辑上。Redisson 是一个在 Redis 的基础上实现的 Java 驻内存数据网格(In-Memory Data Grid)。 Netty 框架:Redisson采用了基于NIO的Netty框架原创 2021-06-23 17:20:06 · 993 阅读 · 0 评论 -
Redis集群模式搭建与原理
Redis Cluster 集群模式通常具有 高可用、可扩展性、分布式、容错 等特性。Redis 分布式方案一般有两种:1.1 客户端分区方案客户端 就已经决定数据会被 存储 到哪个 redis 节点或者从哪个 redis 节点 读取数据。其主要思想是采用 哈希算法 将 Redis 数据的 key 进行散列,通过 hash 函数,特定的 key会 映射 到特定的 Redis 节点上。客户端分区方案 的代表为 Redis Sharding,Redis Sharding 是 R...转载 2021-03-30 11:07:23 · 234 阅读 · 0 评论 -
Redis数据结构之集合
如图所示,集合 user:1:follow 包含着 "it"、"music"、"his"、"sports" 四个元素,一个 集合 最多可以存储 2 ^ 32 - 1 个元素。Redis 除了支持 集合内 的 增删改查,同时还支持 多个集合 取 交集、并集、差集。合理地使用好集合类型,能在实际开发中解决很多实际问题。1. 相关命令1.1. 集合内的操作命令1.1.1. 添加元素sadd key element [element ...]返回结果为添加成功的 元素个数,例如:.原创 2021-03-29 12:09:27 · 208 阅读 · 0 评论 -
Redis数据结构之列表
列表 是一种比较 灵活 的 数据结构,它可以充当 栈 和 队列 的角色,在实际开发上有很多应用场景。如图所示,a、b、c、d、e 五个元素 从左到右 组成了一个 有序的列表,列表中的每个字符串称为 元素(element),一个列表最多可以存储 2 ^ 32 - 1 个元素。列表的 插入 和 弹出 操作列表的 获取、截取 和 删除 操作1. 相关命令下面将按照对 列表 的 5 种 操作类型 对命令进行介绍:1.1. 添加命令1.1....原创 2021-03-29 12:08:02 · 361 阅读 · 0 评论 -
SpringBoot整合Redis实现序列化存储Java对象
看了不少文章,往Redis里存对象基本上不外乎两种:将对象转化成Json,然后取出来之后在反序列化,或者将对象转成byte[]。而如果你使用SpringBoot的话,使用Spring-data-redis可能会更加简便。首先我们使用maven搭建Spring Boot项目,引入Spring data redis的依赖。<dependency> <groupId>org.springframework.boot</groupId> <ar...原创 2021-03-26 18:55:34 · 1362 阅读 · 0 评论 -
Redis数据结构之哈希
1. 相关命令1.1. 基本命令1.1.1. 设置值hset key field value下面为 user:1 添加一对 field-value,如果设置成功会返回 1,反之会返回 0。127.0.0.1:6379> hset user:1 name tom(integer) 1复制代码此外 Redis 提供了 hsetnx 命令,它们的关系就像 set 和 setnx 命令一样,只不过 作用域 由 键 变为 field。1.1.2. 获取值hget ke转载 2021-03-26 18:40:27 · 266 阅读 · 0 评论 -
Redis数据结构之字符串
1. 相关命令1.1. 常见命令1.1.1. 设置值set key value [ex seconds] [px milliseconds] [nx|xx]set 命令有几个选项:ex seconds:为 键 设置 秒级过期时间。 px milliseconds:为 键 设置 毫秒级过期时间。 nx:键必须 不存在,才可以设置成功,用于 添加。 xx:与 nx 相反,键必须 存在,才可以设置成功,用于 更新。除了 set 选项,Redis 还提供了 setex 和 setnx转载 2021-03-26 18:26:14 · 96 阅读 · 0 评论 -
Redis数据结构与全局命令概述
Redis 有 5 种 数据结构,它们是 键值对 中的 值,对于 键 来说有一些通用的命令。2.1. 查看所有键keys *下面插入了 3 对字符串类型的键值对:127.0.0.1:6379> set hello worldOK127.0.0.1:6379> set java jedisOK127.0.0.1:6379> set python redis-pyOK复制代码命令会将所有的键输出:127.0.0.1:6379> keys *1转载 2021-03-26 18:05:51 · 99 阅读 · 0 评论 -
redis 哨兵模式
Redis高可用概述在 Web 服务器中,高可用 是指服务器可以 正常访问 的时间,衡量的标准是在 多长时间 内可以提供正常服务(99.9%、99.99%、99.999% 等等)。在 Redis 层面,高可用 的含义要宽泛一些,除了保证提供 正常服务(如 主从分离、快速容灾技术 等),还需要考虑 数据容量扩展、数据安全 等等。在 Redis 中,实现 高可用 的技术主要包括 持久化、复制、哨兵 和 集群,下面简单说明它们的作用,以及解决了什么样的问题: 持久化:持久化是 最简单的 高可用方法。转载 2021-03-26 17:42:08 · 219 阅读 · 0 评论 -
redis 布隆过滤器
什么情况下需要布隆过滤器?先来看几个比较常见的例子字处理软件中,需要检查一个英语单词是否拼写正确 在 FBI,一个嫌疑人的名字是否已经在嫌疑名单上 在网络爬虫里,一个网址是否被访问过 yahoo, gmail等邮箱垃圾邮件过滤功能这几个例子有一个共同的特点:如何判断一个元素是否存在一个集合中?常规思路数组 链表 树、平衡二叉树、Trie Map (红黑树) 哈希表虽然上面描述的这几种数据结构配合常见的排序、二分搜索可以快速高效的处理绝大部分判断元素是否存在集合中的需求。但.原创 2021-03-25 20:09:21 · 217 阅读 · 0 评论 -
缓存穿透,缓存击穿,缓存雪崩
缓存穿透是指查询一个一定不存在的数据,由于缓存是不命中,将去查询数据库,但是数据库也无此记录,并且处于容错考虑,我们没有将这次查询的null写入缓存,这将导致这个不存在的数据每次请求都要到存储层去查询,失去了缓存的意义。在流量大时,可能DB就挂掉了,如果有人利用不存在的key频繁攻击我们的应用,这就属于漏洞。简单来说就是利用redis和mysql的机制(redis缓存一旦不存在,就访问mysql),直接绕过缓存访问mysql,而制造的db请求压力。解决: 为了防止缓存穿透将,null或者空字符串.原创 2021-03-25 19:16:09 · 100 阅读 · 0 评论 -
redis 流水线
看一下Redis1次网络命令通讯模型如果要执行多条命令,要执行多次操作,批量网络命令通讯模型如下我们知道Redis的命令执行时间是特别快的,但是网络相反会有很大的不同,可能是内网之间通讯,也有可能是外网之间通讯,也甚至可能是跨机房,跨地区访问都有可能。那么什么是流水线,流水线是将一批命令批量打包,然后在服务端进行批量计算,然后将批量结果返回给客户端,如下图所示,这样就会减少网络通讯时间因此pipeline其实要解决的是减少n次操作的网络连接时间使用客户端实现流水线举一个没有使用pipe原创 2021-03-25 15:23:14 · 304 阅读 · 0 评论 -
redis 事物
提到redis的事务,相信很多初学的朋友会对它的理解和使用有些模糊不清,料想它和我们常见的关系型数据库(mysql 、mssql等)中的事务相同,也支持回滚,但这样理解就进入了一个误区,首先:关系型数据中的事务都是原子性的,而redis 的事务是非原子性的。再多说一句,什么是程序原子性?简单的理解就是:整个程序中的所有操作,要么全部完成,要不全部不完成,不会停留在中间某个环节。那么非原子性就是不满足原子性的条件就是非原子性了。我们用例子来解释一下:原子性:数据库中的某个事务A中要更新t1表、t2表的某条原创 2021-03-25 11:52:14 · 103 阅读 · 0 评论 -
redis geo
Redis GEO 主要用于存储地理位置信息,并对存储的信息进行操作,该功能在 Redis 3.2 版本新增。Redis GEO 操作方法有:geoadd:添加地理位置的坐标。 geopos:获取地理位置的坐标。 geodist:计算两个位置之间的距离。 georadius:根据用户给定的经纬度坐标来获取指定范围内的地理位置集合。 georadiusbymember:根据储存在位置集合里面的某个地点获取指定范围内的地理位置集合。 geohash:返回一个或多个位置对象的 geohash 值原创 2021-03-25 11:25:45 · 116 阅读 · 0 评论 -
redis HyperLogLog
先了解一个概念:基数统计。维基百科中的解释是:cardinality of a set is a measure of the “number of elements“ of the set它的意思是:一个集合(注意:这里集合的含义是 Object 的聚合,可以包含重复元素)中不重复元素的个数。例如集合 {1,2,3,1,2},它有5个元素,但它的基数/Distinct 数为3。Redis 最常用的数据结构有字符串、列表、字典、集合和有序集合。后来,由于 Redis 的广泛应用,Redis 自身原创 2021-03-25 11:14:40 · 115 阅读 · 0 评论 -
redis bitmap
现代计算机用二进制(位) 作为信息的基础单位, 1个字节等于8位, 例如“big”字符串是由3个字节组成, 但实际在计算机存储时将其用二进制表示, “big”分别对应的ASCII码分别是98、 105、 103, 对应的二进制分别是01100010、 01101001和01100111, 如图3-9所示。许多开发语言都提供了操作位的功能, 合理地使用位能够有效地提高内存使用率和开发效率。 Redis提供了Bitmaps这个“数据结构”可以实现对位的操作。 把数据结构加上引号主要因为:Bit.原创 2021-03-25 10:54:41 · 166 阅读 · 0 评论 -
五种I/O模式
1.阻塞I/O模型老李去火车站买票,排队三天买到一张退票。耗费:在车站吃喝拉撒睡 3天,其他事一件没干。2.非阻塞I/O模型老李去火车站买票,隔12小时去火车站问有没有退票,三天后买到一张票。耗费:往返车站6次,路上6小时,其他时间做了好多事。3.I/O复用模型1.select/poll老李去火车站买票,委托黄牛,然后每隔6小时电话黄牛询问,黄牛三天内买到票,然后老李去火车站交钱领票。耗费:往返车站2次,路上2小时,黄牛手续费100元,打电话17次...原创 2021-03-24 18:49:56 · 520 阅读 · 0 评论 -
redis单线程高并发的原因
Redis的高并发和快速原因1.redis是基于内存的,内存的读写速度非常快;2.redis是单线程的,省去了很多上下文切换线程的时间;3.redis使用多路复用技术,可以处理并发的连接。非阻塞IO 内部实现采用epoll,采用了epoll+自己实现的简单的事件框架。epoll中的读、写、关闭、连接都转化成了事件,然后利用epoll的多路复用特性,绝不在io上浪费一点时间。下面重点介绍单线程设计和IO多路复用核心设计快的原因。为什么Redis是单线程的1.官方答案因为Redis是基于内存的原创 2021-03-24 16:56:46 · 611 阅读 · 0 评论 -
redis排行榜功能实现
redis中有一个有序集合(sorted set),通过此数据结构可以很轻松的实现排行榜的功能,例如直播中的排行榜,今日头条的热度榜等等。笔者阐述下实现思路,请大家参考。如有疑问请留言。一、redis实现排行榜Redis 有序集合和集合一样也是 string 类型元素的集合,且不允许重复的成员。不同的是每个元素都会关联一个 double 类型的分数。redis 正是通过分数来为集合中的成员进行从小到大的排序。有序集合的成员是唯一的,但分数(score)却可以重复。正是因为有分值,所以很适合...原创 2021-03-24 15:37:36 · 2143 阅读 · 0 评论 -
redis 复制
1、概述Master节点在平时提供服务,另外一个或多个Slave节点在平时不提供服务(或只提供数据读取服务)。当Master节点由于某些原因停止服务后,再人工/自动完成Slave节点到Master节点的切换工作,以便整个Redis集群继续向外提供服务。2、主从复制工作过程Redis的主从复制功能除了支持一个Master节点对应多个Slave节点的同时进行复制外,还支持Slave节点向其它多个Slave节点进行复制。这样使得我们能够灵活组织业务缓存数据的传播,例如使用多个Slave作为数据读取服.原创 2021-03-24 12:26:43 · 103 阅读 · 0 评论 -
Redis的磁盘持久化机制
前言Redis 是内存数据库,数据都是存储在内存中,为了避免进程退出导致数据的永久丢失,需要定期将 Redis 中的数据以数据或命令的形式从内存保存到本地磁盘。当下次 Redis 重启时,利用持久化文件进行数据恢复。Redis 提供了 RDB 和 AOF 两种持久化机制,前者将当前的数据保存到磁盘,后者则是将每次执行的写命令保存到磁盘(类似于 MySQL 的 Binlog)。本文将详细介绍 RDB 和 AOF 两种持久化方案,包括操作方法和持久化的实现原理。正文Redis 是一个基于键值对(转载 2021-03-16 16:40:36 · 527 阅读 · 0 评论 -
redis 配置文件
[root@node18 ~]# vim /apps/redis/etc/redis.confbind 0.0.0.0 #监听地址,可以用空格隔开后多个监听IP protected-mode yes #redis3.2 之后加入的新特性,在没有设置bind IP和密码的时候,redis只允许访问 127.0.0.1:6379,远程访问将提示警告信息并拒绝远程访问port 6379 #监听端口 .原创 2021-03-16 15:25:39 · 269 阅读 · 0 评论 -
redis设置过期时间
1.EXPIRE PEXPIRE EXPIRE接口定义:EXPIRE key "seconds" 接口描述:设置一个key在当前时间"seconds"(秒)之后过期。返回1代表设置成功,返回0代表key不存在或者无法设置过期时间。 PEXPIRE接口定义:PEXPIRE key "milliseconds" 接口描述:设置一个key在当前时间"milliseconds"(毫秒)之后过期。返回1代表设置成功,返回0代表key不存在或者无法设置过期时间。 ...原创 2021-03-16 14:42:16 · 3019 阅读 · 0 评论 -
基于Redis的Stream类型的完美消息队列解决方案
1 概述Redis5.0带来了Stream类型。从字面上看是流类型,但其实从功能上看,应该是Redis对消息队列(MQ,Message Queue)的完善实现。用过Redis做消息队列的都了解,基于Reids的消息队列实现有很多种,例如:PUB/SUB,订阅/发布模式 基于List的 LPUSH+BRPOP 的实现 基于Sorted-Set的实现每一种实现,都有典型的特点和问题,这个在 Redis 实现消息队列一文中有介绍。基于Redis实现消息队列http://www.hellokang.n转载 2021-03-01 16:05:09 · 515 阅读 · 0 评论 -
springboot+redis实现消息队列
涉及spring和springboot使用的部分RedisTemplate序列化的配置,以及api相关的应用 fastjson的JSONObject等相关使用 InitializingBean,ApplicationContextAware是使用,以及其实现接口的作用 线程池相关的问题学习 模板模式的抽象能力代码pom.xml文件 <modelVersion>4.0.0</modelVersion> <parent> .转载 2020-11-03 19:31:03 · 986 阅读 · 0 评论