Redis
文章平均质量分 93
知识记录者-vincent
这个作者很懒,什么都没留下…
展开
-
分布式系统中,如何回答锁的实现原理?
案例背景分布式锁是解决协调分布式系统之间,同步访问共享资源的一种方式。详细来讲:在分布式环境下,多个系统在同时操作共享资源(如写数据)时,发起操作的系统通常会通过一种方式去协调其他系统,然后获取访问权限,得到访问权限后才可以写入数据,其他系统必须等待权限释放分布式锁假设你正在面试,面试官模拟了系统秒杀的场景:为了防止商品库存超售,在并发场景下用到了分布式锁的机制,做商品扣减库存的串行化操作。然后问你:“你如何实现分布式锁?”你该怎么回答呢?案例分析当你听到这个问题后,心里会不会窃喜?觉.原创 2021-01-26 12:06:41 · 235 阅读 · 0 评论 -
Redis 是如何实现高可用的?
Redis 是如何实现高可用的?Redis 高可用的手段主要有以下四种数据持久化数据持久化保证了系统在发生宕机或者重启之后数据不会丢失,增加了系统的可靠性和减少了系统不可用的时间(省去了手动恢复数据的过程);主从数据同步(主从复制)主从数据同步可以将数据存储至多台服务器,这样当遇到一台服务器宕机之后,可以很快地切换至另一台服务器以继续提供服务;Redis 哨兵模式(Sentinel)哨兵模式用于发生故障之后自动切换服务器;Redis 集群(Cluster)Redis 集群提供了原创 2021-01-25 15:09:24 · 169 阅读 · 1 评论 -
Redis 中实现消息队列的方式有几种?
Redis 中实现消息队列的方式有几种?早在 Redis 2.0 版本之前使用 Redis 实现消息队列的方式有两种使用 List 类型实现 使用 ZSet 类型实现其中使用List 类型实现的方式最为简单和直接,它主要是通过lpush、rpop存入和读取实现消息队列的,如下图所示lpush可以把最新的消息存储到消息队列(List 集合)的首部,而rpop可以读取消息队列的尾部,这样就实现了先进先出,如下图所示命令行的实现命令如下127.0.0.1:6379...原创 2021-01-25 14:16:54 · 641 阅读 · 0 评论 -
Redis 怎么样实现的分布式锁?
Redis 怎么样实现的分布式锁?分布式锁是控制分布式系统之间同步访问共享资源的一种方式。是为了解决分布式系统中,不同的系统或是同一个系统的不同主机共享同一个资源的问题,它通常会采用互斥来保证程序的一致性,这就是分布式锁的用途以及执行原理分布式锁示意图,如下图所示分布式锁的常见实现方式有四种 基于 MySQL 的悲观锁来实现分布式锁,这种方式使用的最少,因为这种实现方式的性能不好,且容易造成死锁; 基于 Memcached 实现分布式锁,可使用 add 方法来实现,如果添加原创 2021-01-25 13:56:33 · 81 阅读 · 0 评论 -
Redis 是如何处理过期数据的?当内存不够用时 Redis 又是如何处理的?
Redis 是如何处理过期数据的?当内存不够用时 Redis 又是如何处理的?在新增 Redis 缓存时可以设置缓存的过期时间,该时间保证了数据在规定的时间内失效,可以借助这个特性来实现很多功能。比如,存储一定天数的用户(登录)会话信息,这样在一定范围内用户不用重复登录了,但为了安全性,需要在一定时间之后重新验证用户的信息。因此,我们可以使用Redis 设置过期时间来存储用户的会话信息对于已经过期的数据,Redis 将使用两种策略来删除这些过期键,它们分别是惰性删除和定期删除惰性删除是指 .原创 2021-01-25 11:20:33 · 1137 阅读 · 0 评论 -
Redis高并发介绍
在 Redis 存储的所有数据中,有一部分是被频繁访问的。有两种情况可能会导致热点问题的产生一个是用户集中访问的数据,比如抢购的商品,明星结婚和明星出轨的微博一种就是在数据进行分片的情况下,负载不均衡,超过了单个服务器的承受能力。热点问题可能引起缓存服务的不可用,最终造成压力堆积到数据库热点数据发现客户端我们可以在所有调用了 get、set 方法的地方,加上 key 的计数。但是这样的话,每一个地方都要修改,重复的代码也多。如果我们用的是 Jedis 的客户端,我们可以在 Jedis.原创 2020-09-03 15:37:02 · 460 阅读 · 0 评论 -
Redis客户端介绍
Jedis(github)特点Jedis 是我们最熟悉和最常用的客户端,轻量,简洁,便于集成和改造public static void main(String[] args) { Jedis jedis = new Jedis("127.0.0.1", 6379); jedis.set("vincent", "9527"); System.out.println(jedis.get("vincent")); jedis.close();}Jedis 多个线原创 2020-09-03 14:00:20 · 623 阅读 · 0 评论 -
Redis 分布式
如果要实现 Redis 数据的分片,我们有三种方案第一种是在客户端实现相关的逻辑,例如用取模或者一致性哈希对 key 进行分片,查询和修改都先判断 key 的路由 第二种是把做分片处理的逻辑抽取出来,运行一个独立的代理服务,客户端连接到这个代理服务,代理服务做请求的转发 第三种就是基于服务端实现客户端 ShardingJedis 客户端提供了 Redis Sharding 的方案,并且支持连接池ShardedJedispublic class ShardingTest...原创 2020-09-02 17:25:21 · 189 阅读 · 0 评论 -
Redis可用性保证之Sentinel
Sentinel 原理(官网)通过运行监控服务器来保证服务的可用性从 Redis2.8 版本起,提供了一个稳定版本的 Sentinel(哨兵),用来解决高可用的问题。它是一个特殊状态的 redis 实例。我们会启动一个或者多个 Sentinel 的服务(通过 src/redis-sentinel),它本质上只是一个运行在特殊模式之下的 Redis,Sentinel 通过 info 命令得到被监听 Redis 机器的master,slave 等信息。为了保证监控服务器的可用性,我.原创 2020-09-02 15:01:59 · 162 阅读 · 0 评论 -
Redis集群介绍
为什么 需要集群?性能Redis 本身的 QPS 已经很高了,但是如果在一些并发量非常高的情况下,性能还是会受到影响。这个时候我们希望有更多的 Redis 服务来完成工作扩展出于存储的考虑,因为 Redis 所有的数据都放在内存中,如果数据量大,很容易受到硬件的限制。升级硬件收效和成本比太低,所以我们需要有一种横向扩展的方法可用性可用性和安全的问题。如果只有一个 Redis 服务,一旦服务宕机,那么所有的客户端都无法访问,会对业务造成很大的影响。另一个,如果硬件发生故障,而单机的数据无法恢原创 2020-09-02 11:45:17 · 72 阅读 · 0 评论 -
Redis之持久化机制
持久化机制Redis 速度快,很大一部分原因是因为它所有的数据都存储在内存中。如果断电或者宕机,都会导致内存中的数据丢失。为了实现重启后数据不丢失,Redis 提供了两种持久化的方案,一种是 RDB 快照(Redis DataBase),一种是 AOF(Append Only File)RDBRDB 是 Redis 默认的持久化方案。当满足一定条件的时候,会把当前内存中的数据写入磁盘,生成一个快照文件 dump.rdb。Redis 重启会通过加载 dump.rdb 文件恢复数据R..原创 2020-09-02 09:38:39 · 259 阅读 · 0 评论 -
Redis之内存回收
Reids 所有的数据都是存储在内存中的,在某些情况下需要对占用的内存空间进行回收。内存回收主要分为两类,一类是 key 过期,一类是内存使用达到上限(max_memory)触发内存淘汰过期策略要实现 key 过期,我们有几种思路。定时过期(主动淘汰)每个设置过期时间的 key 都需要创建一个定时器,到过期时间就会立即清除。该策略可以立即清除过期的数据,对内存很友好;但是会占用大量的 CPU 资源去处理过期的数据,从而影响缓存的响应时间和吞吐量。惰性过期(被动淘汰)只有当访问一.原创 2020-09-01 13:46:04 · 102 阅读 · 0 评论 -
Redis为什么这么快
Redis为什么这么快?纯内存结构 单线程 多路复用内存KV 结构的内存数据库,时间复杂度 O(1)单线程单线程有什么好处呢?1、没有创建线程、销毁线程带来的消耗2、避免了上线文切换导致的 CPU 消耗3、避免了线程之间带来的竞争问题,例如加锁释放锁死锁等等异步非阻塞异步非阻塞 I/O,多路复用处理并发连接Redis 为什么是单线程的?(参考)因为单线程已经够用了,CPU 不是 redis 的瓶颈。Redis 的瓶颈最有可能是机器内存或者网络带宽。既然单线..原创 2020-08-31 17:35:38 · 168 阅读 · 0 评论 -
Redis之Lua脚本介绍
Lua是一种轻量级脚本语言,它是用 C 语言编写的,跟数据的存储过程有点类似。使用 Lua 脚本来执行 Redis 命令的好处1、一次发送多个命令,减少网络开销。2、Redis 会将整个脚本作为一个整体执行,不会被其他请求打断,保持原子性。3、对于复杂的组合命令,我们可以放在文件中,可以实现程序之间的命令集复用。在Redis 中调用Lua 脚本使用 eval 方法,语法格式:redis> eval lua-script key-num [key1 key2 key3 ..原创 2020-08-31 14:58:56 · 1822 阅读 · 0 评论 -
Redis事务
Redis事务Redis事务中文文档为什么要用事务?Redis 的单个命令是原子性的(比如 get set mget mset),如果涉及到多个命令的时候,需要把多个命令作为一个不可分割的处理序列,就需要用到事务例如:我们之前说的用 setnx 实现分布式锁,我们先 set,然后设置对 key 设置 expire,防止 del 发生异常的时候锁不会被释放,业务处理完了以后再 del,这三个动作我们就希望它们作为一组命令执行。Redis 的事务有两个特点1、按进入队列的顺序执行2、不会原创 2020-08-31 14:25:15 · 91 阅读 · 0 评论 -
Redis基本数据类型介绍
String 字符串存储类型可以用来存储字符串、整数、浮点数操作命令设置多个值(批量操作,原子性)mset vincent 9527 ling 666设置值,如果 key 存在,则不成功setnx vincent基于此可实现分布式锁。用 del key 释放锁。但如果释放锁的操作失败了,导致其他节点永远获取不到锁,怎么办?解决:加过期时间单独用 expire 加过期,也失败了,无法保证原子性,怎么办?解决:多参数set key value [expiration E原创 2020-08-31 13:47:58 · 340 阅读 · 0 评论 -
Redis 的基础介绍
为什么叫 REDIS它的全称是 REmote DIctionary Service,直接翻译过来是远程字典服务。关系型数据库的特点1、它以表格的形式,基于行存储数据,是一个二维的模式。2、它存储的是结构化的数据,数据存储有固定的模式(schema),数据需要适应表结构。3、表与表之间存在关联(Relationship)。4、大部分关系型数据库都支持 SQL(结构化查询语言)的操作,支持复杂的关联查询。5、通过支持事务(ACID 酸)来提供严格或者实时的数据一致性。但是使用关系型数据.原创 2020-08-31 09:51:36 · 77 阅读 · 0 评论 -
Redis 缓存击穿、穿透、雪崩的理解和解决方案
缓存击穿 (某个热点key缓存失效了)缓存中没有但数据库中有的数据,假如是热点数据,那key在缓存过期的一刻,同时有大量的请求,这些请求都会击穿到DB,造成瞬时DB请求量大、压力增大和缓存雪崩的区别在于这里针对某一key缓存,后者则是很多key预防:设置热点数据不过期,定时任务定时更新缓存,或者设置互斥锁缓存穿透(查询不存在数据)查询一个不存在的数据,由于缓存是不命中的,并且出于容错考虑,如发起为id为“-1”不存在的数据如果从存储层查不到数据则不写入缓存这将导致这个...原创 2020-08-26 15:33:47 · 81 阅读 · 0 评论 -
Redis的缓存淘汰策略
FIFO先进先出First In,First Out新访问的数据插入FIFO队列列尾部,数据在FIFO队列列中顺序移动,淘汰FIFO队列列头部的数据LRU最近最少使用 Least recently used根据数据的历史访问记录来进行数据淘汰,如果数据最近被访问过,那么将来被访问的几率也更高 新数据插入到链表头部,每当缓存数据被访问,则将数据移到链表头部,当链表满的时候,将链表尾部的数据丢弃LFU最近不经常使用 Least Frequently Used根据数据的历史访问频...原创 2020-08-26 15:24:04 · 83 阅读 · 0 评论