redis分布式锁

redis在分布式中的使用

匿名 (未验证) 提交于 2019-12-03 00:44:02
作者:孤独烟 来自:http://rjzheng.cnblogs.com/ 为什么要用redis :为了并发和性能,使用redis做为缓冲 使用redis有什么缺点 主要是四个问题 (һ) 缓存和数据库双写一致性问题 分析:一致性问题是分布式常见问题,还可以再分为最终一致性和强一致性。数据库和缓存双写,就必然会存在不一致的问题。答这个问题,先明白一个前提。就是如果对数据有强一致性要求,不能放缓存。我们所做的一切,只能保证最终一致性。 另外,我们所做的方案其实从根本上来说,只能说降低不一致发生的概率,无法完全避免。因此,有强一致性要求的数据,不能放缓存。 回答:首先,采取正确更新策略,先更新数据库,再删缓存。其次,因为可能存在删除缓存失败的问题,提供一个补偿措施即可,例如利用消息队列。 (二) 缓存雪崩问题 解决方案 : (一)给缓存的失效时间,加上一个随机值,避免集体失效。 (二)使用互斥锁,但是该方案吞吐量明显下降了。 (三)双缓存。我们有两个缓存,缓存A和缓存B。缓存A的失效时间为20分钟,缓存B不设失效时间。自己做缓存预热操作。然后细分以下几个小点 I 从缓存A读数据库,有则直接返回 II A没有数据,直接从B读数据,直接返回,并且异步启动一个更新线程。 III 更新线程同时更新缓存A和缓存B。 (三) 缓存击穿问题 解决方案: (一)利用互斥锁,缓存失效的时候,先去获得锁

Redis应用场景

匿名 (未验证) 提交于 2019-12-03 00:44:02
Memcached 采用客户端 - 服务器的架构,客户端和服务器端的通讯使用自定义的协议标准,只要满足协议格式要求,客户端 Library 可以用任何语言实现。 Memcached服务器 使用基于 Slab 的内存管理方式,有利于减少内存碎片和频繁分配销毁内存所带来的开销。各个 Slab 按需动态分配一个 page 的内存(和 4Kpage 的概念不同,这里默认 page Ϊ 1M ), page 内部按照不同 slab class 的尺寸再划分为内存 chunk 供服务器存储 KV 键值对使用( slab机制相当于内存池机制, 实现从操作系统分配一大块 内存, 然后 memcached 自己管理这块内存, 负责分配与回收。) 关于memcached的内存分配机制: Memcached 内存分配机制介绍   1.MySQL需要不断进行拆库拆表,Memcached也需不断跟着扩容,扩容和维护工作占据大量开发时间。   2.Memcached与MySQL数据库数据一致性问题。   3.Memcached数据命中率低或down机,大量访问直接穿透到DB,MySQL无法支撑。   4.跨机房cache同步问题。 Memcache存储大数据的问题   众多NoSQL百花齐放,如何选择   最近几年,业界不断涌现出很多各种各样的NoSQL产品,那么如何才能正确地使用好这些产品

一篇详解Redis -- 延时队列

匿名 (未验证) 提交于 2019-12-03 00:44:02
Redis的 list 数据结构常用来作为 异步消息队列 使用,使用 rpush/lpush 操作 入队 ,使用 lpop/rpop 来操作 出队 > rpush my-queue apple banana pear (integer) 3 > llen my-queue (integer) 3 > lpop my-queue "apple" > llen my-queue (integer) 2 > lpop my-queue "banana" > llen my-queue (integer) 1 > lpop my-queue "pear" > llen my-queue (integer) 0 > lpop my-queue (nil) 空队列 如果队列为空,客户端会陷入 pop的死循环 , 空轮询 不仅拉高了 客户端的CPU , Redis的QPS 也会被拉高 如果空轮询的客户端有几十个, Redis的慢查询 也会显著增加,可以尝试让客户端线程 sleep 1s 但睡眠会导致消息的 延迟增大 ,可以使用 blpop/brpop (blocking, 阻塞读 ) 阻塞读在队列没有数据时,会立即进入 休眠 状态,一旦有数据到来,会立即被 唤醒 , 消息延迟几乎为0 空闲连接 如果线程一直阻塞在那里,Redis的客户端连接就成了 闲置连接 闲置过久, 服务器 一般会 主动断开

redis入门(一)

匿名 (未验证) 提交于 2019-12-03 00:44:02
Ŀ¼ Redis是什么? redis 是一种基于键值对(key-value)的NoSQL数据库。Redis会将所有数据都存放在内存中,所以它的读写性能非常惊人。不仅如此,Redis还可以将内存的数据利用快照和日志的形式保存到硬盘上,这样在发生类似断电或者机器故障的时候,内存中的数据不会“丢失”。Redis还提供了键过期、发布订阅、事务、流水线、Lua脚本等附加功能。 Redis能做什么 在谈为什么需要redis之前,先要清楚redis可以做什么。 缓存。通过引入缓存加快数据的访问速度,降低后端数据源的压力。 排行榜。redis提供给列表和有序几何数据结构可以很方便的构建各种排行榜系统。 计数器。redis原生支持高性能的计数功能,可以为视频播放量、网页浏览数等提供支持。 消息队列。redis提供发布订阅功能。 我们为什么选择redis? 官方给出的读写速度可以达到10W/s,以下是我本机双核四线程低压i7上测试的对字符串的读写速度。 C:\Users\Dm_ca> redis-benchmark -n 100000 -t set,get -q -a test1 SET: 11993.28 requests per second GET: 57603.69 requests per second 若使用redis管道技术可以得到更高的读写速度 C:\Users\Dm_ca>

redis分布式锁

匿名 (未验证) 提交于 2019-12-03 00:44:02
通过setnx(set if not exists) 指令设置锁,调用 del 指令释放锁。 // 这里的冒号:就是一个普通的字符,没特别含义,它可以是任意其它字符,不要误解 > setnx lock:codehole true OK ... do something critical ... > del lock:codehole (integer) 1 但是有个问题,如果逻辑执行到中间出现异常了,可能会导致 del 指令没有被调用,这样 就会陷入死锁,锁永远得不到释放。 于是我们在拿到锁之后,再给锁加上一个过期时间,比如 5s,这样即使中间出现异常也 可以保证 5 秒之后锁会自动释放。 > setnx lock:codehole true OK > expire lock:codehole 5 ... do something critical ... > del lock:codehole (integer) 1 但是以上逻辑还有问题。如果在 setnx 和 expire 之间服务器进程突然挂掉了,可能是因 为机器掉电或者是被人为杀掉的,就会导致 expire 得不到执行,也会造成死锁。因为setnx 和 expire 是两条指令而不是原子指令。 Redis 2.8 版本中作者加入了 set 指令的扩展参数,使得 setnx 和expire 指令可以一起执行 > set

数据库 | Redis 缓存雪崩解决方案

匿名 (未验证) 提交于 2019-12-03 00:44:02
Redis 雪崩 缓存层承载着大量的请求,有效保护了存储层。但是如果由于缓存大量失效或者缓存整体不能提供服务,导致大量的请求到达存储层,会使存储层负载增加,这就是缓存雪崩的场景。 解决缓存雪崩,可以从以下几个方面入手。 1.保持缓存层的高可用性 使用Redis 哨兵模式或者Redis 集群部署方式,即便个别Redis 节点下线,整个缓存层依然可以使用。除此之外,还可以在多个机房部署 Redis,这样即便是机房死机,依然可以实现缓存层的高可用。 2.限流降级组件 无论是缓存层还是存储层都会有出错的概率,可以将它们视为资源。作为并发量较大的分布式系统,假如有一个资源不可用,可能会造成所有线程在获取这个资源时异常,造成整个系统不可用。降级在高并发系统中是非常正常的,比如推荐服务中,如果个性化推荐服务不可用,可以降级补充热点数据,不至于造成整个推荐服务不可用。常见的限流降级组件如 Hystrix、Sentinel 等。 3.缓存不过期 Redis 中保存的 key 永不失效,这样就不会出现大量缓存同时失效的问题,但是随之而来的就是Redis 需要更多的存储空间。 4.优化缓存过期时间 设计缓存时,为每一个 key 选择合适的过期时间,避免大量的 key 在同一时刻同时失效,造成缓存雪崩。 5.使用互斥锁重建缓存 在高并发场景下,为了避免大量的请求同时到达存储层查询数据、重建缓存

Redis相关面试题

匿名 (未验证) 提交于 2019-12-03 00:44:02
1 、 Redis 和 memched 有什么区别?为什么单线程的 Redis 比多线程的 Memched 效率要高? 区别: 数据支持类型: Redis: String(字符串):key-value 类型 Hash(哈希):字典(hashmap) Redis的哈希结构可以使你像在数据库中更新一个属性一样只修改某一项属性值 List(列表):实现消息队列 Set(集合):利用唯一性 Sorted Set(有序集合):可以进行排序 可以实现数据持久化 Bitmaps(位图) HyperLogLog、Geo(地理信息定位) Memched:简单的key/value数据类型 数据持久性: Redis:Redis通过RDB(Redis DataBase)与AOF(Append Only File)持久化,可以将内存中的数据保存到硬盘中,然后重启之后在读取数据。 这里说明一下RDB和AOF的原理: RDB:是在达到指定的时间或者操作次数后,自动将在内存中的数据写入磁盘(数据恢复时一致性和完整性较差,因为也许最后一次备份前就宕机了,适合数据量较大的数据恢复时候使用) AOF:是日志形式,当数据写入内存中的时候,在日志文件下记录下所有写操作。(数据量较大时,数据的恢复缓慢) 注意:如果不需要持久化的功能,可以关闭。如果想要达到持久化的效果,建议两者都使用(RDB,AOF) Memched

redis分布式锁

匿名 (未验证) 提交于 2019-12-03 00:44:02
简单场景: 单机模式下:添加synchronized实现同步,分布式环境下不能实现同步 redis是单线程 问题:假如执行到stringRedisTemplate.opsForValue().set("stock",realStock+");这行出问题,那么后面的stringRedisTemplate.delete(lockKey);没有执行,则会造成死锁 解决方法:添加try...catch,最后finally的时候一定删除键值,释放锁 问题:假如运维在stringRedisTemplate.opsForValue().set("stock",realStock+");这行代码执行的时候kill程序了,finally里面的释放锁又没有执行,又出现死锁了。 解决方法:key值添加超时时间: 问题:运行Boolean result=stringRedisTemplate.opsForValue().setIfAbsent(lockKey,"zhuge")后,程序挂掉,stringRedisTemplate.expire(lockKey,30,TimeUnit.SECONDS);这行代码没有执行,则又会出现死锁 解决办法:两句合成一句,执行redis的原子操作,对redis版本有要求 问题:设置超时时间10秒,程序运行到stringRedisTemplate.opsForValue()

Redis总结2

匿名 (未验证) 提交于 2019-12-03 00:44:02
一.Redis效率高的原因   众所周知,Redis常用来做缓存,从而提高项目QPS(每秒查询率)。 QPS = 并发量 / 平均响应时间   然而其效率高的原因包含但不仅限于如下几点:     1.Redis基于内存,绝大部分操作都是直接对内存的操作,执行效率高。官方提供的数据是可以达到100000+的QPS     2.数据结构简单,因此对数据的操作也简单     3.采用单线程处理请求,将多个请求串行处理,避免线程创建销毁的开销和线程上下文切换的开销     4.采用I/O多路复用,且是非阻塞IO 二.通过Redis实现分布式锁        如果key不存在,则创建并赋值,如果key存在,则设置失败,因此可以保证数据的安全性。可以通过expire来设置该key的生存时间,当超过生存时间后该key和value会被删除。     附:该方式设置成功返回1,失败返回0,时间复杂度为O(1),缺点是每次操作都需要setnx和expire两个步骤,原子性得不到满足,在setnx之后和expire之前的过程中甚至可能出现死锁等情况。        ex和px是过期时间,单位是秒和毫秒。nx是当key不存在的时候进行设置操作,而xx是当key存在的时候进行设置操作。该方法保证了原子性,提高了安全性,但多个对象同时过期的时候可能会造成短暂的卡顿

redis

匿名 (未验证) 提交于 2019-12-03 00:44:02
一 .Redis是什么? Redis 是互联网技术领域使用最为广泛的存储中间件,它是「 Re Di S ervice」的首字母缩写,也就是「远程字典服务」。 Redis 能做什么? Redis的业务应用范围非常广泛,让我们以掘金技术社区(juejin.im)的帖子模块为实例,梳理一下,Redis 可以用在哪些地方? (hash)。 ID 列表 (排序),便于快速显示用户的帖子列表 (zset)。 (hash)。 ID 列表,评论 ID 列表,用于显示和去重计数 (zset)。 (帖子内容空间占用比较大),减少数据库压力 (hash)。 ID,根据内容推荐相关帖子 (list)。 ID 是整数自增的,可以使用 Redis 来分配帖子 ID(计数器)。 (zset)。 ID 列表,总热榜和分类热榜 (zset)。 (zset,hash)。 Redis面试 Redis有哪些数据结构 (5个) String、列表List、集合Set、有序集合SortedSetHash Redis中高级用户,还需要加上下面几种数据结构HyperLogLog、Geo、Pub/Sub。 Redis Module,像BloomFilter,RedisSearch,Redis-ML,面试官得眼睛就开始发亮了。 Redis分布式锁么,它是什么回事? setnx来争抢锁,抢到之后,再用expire给锁加一个过期时间