redis分布式锁

redis 数据库总结

橙三吉。 提交于 2019-12-03 20:35:02
简单来说 Redis 就是一个数据库,不过与传统数据库不同的是 Redis 的数据是存在内存中的,所以存写速度非常快,因此 Redis 被广泛应用于缓存方向。 另外, Redis 也经常用来做分布式锁。 Redis 提供了多种数据类型来支持不同的业务场景。 除此之外, Redis 支持事务 、持久化、LUA 脚本、LRU 驱动事件、多种集群方案。 本文将从以下几个方面全面解读 Redis: 为什么要用 Redis / 为什么要用缓存 为什么要用 Redis 而不用 map/guava 做缓存 Redis 和 Memcached 的区别 Redis 常见数据结构以及使用场景分析 Redis 设置过期时间 Redis 内存淘汰机制 Redis 持久化机制(怎么保证 Redis 挂掉之后再重启数据可以进行恢复) Redis 事务 缓存雪崩和缓存穿透问题解决方案 如何解决 Redis 的并发竞争 Key 问题 如何保证缓存与数据库双写时的数据一致性 为什么要用 Redis / 为什么要用缓存? 主要从“高性能”和“高并发”这两点来看待这个问题。 高性能 假如用户第一次访问数据库中的某些数据。这个过程会比较慢,因为是从硬盘上读取的。 将该用户访问的数据存在缓存中,这样下一次再访问这些数据的时候就可以直接从缓存中获取了。 操作缓存就是直接操作内存,所以速度相当快

基于Redis实现分布式锁

喜夏-厌秋 提交于 2019-12-03 14:44:15
我们知道分布式锁的特性是排他、避免死锁、高可用。分布式锁的实现可以通过数据库的乐观锁(通过版本号)或者悲观锁(通过for update)、Redis的setnx()命令、Zookeeper(在某个持久节点添加临时有序节点,判断当前节点是否是序列中最小的节点,如果不是则监听比当前节点还要小的节点。如果是,获取锁成功。当被监听的节点释放了锁(也就是被删除),会通知当前节点。然后当前节点再尝试获取锁,如此反复) redis.png 本篇文章,主要讲如何用Redis的形式实现分布式锁。后续文章会讲解热点KEY读取,缓存穿透和缓存雪崩的场景和解决方案、缓存更新策略等等知识点,理论知识点较多。 Redis配置 spring: redis: port: 6379 database: 0 host: 127.0.0.1 password: jedis: pool: max-active: 8 max-wait: -1ms max-idle: 8 min-idle: 0 timeout: 5000ms  Jedis工具类 public class JedisConnectionUtil { private static JedisPool pool = null; static { JedisPoolConfig jedisPoolConfig = new JedisPoolConfig();

redis面试题及答案

谁说我不能喝 提交于 2019-12-03 13:57:08
1. Redis有哪些数据结构? 2. 使用过Redis分布式锁么,它是什么回事? 3. 假如Redis里面有1亿个key,其中有10w个key是以某个固定的已知的前缀开头的,如果将它们全部找出来? 4. 如果这个redis正在给线上的业务提供服务,那使用keys指令会有什么问题? 5. 使用过Redis做异步队列么,你是怎么用的? 6. 如果对方追问redis如何实现延时队列? 7. 如果有大量的key需要设置同一时间过期,一般需要注意什么 8. Redis如何做持久化的? 9. Pipeline有什么好处,为什么要用pipeline? 10. Redis的同步机制了解么? 11. 是否使用过Redis集群,集群的原理是什么? 12. 使用redis有哪些好处? 13. redis相比memcached有哪些优势? 14. Memcache与Redis的区别都有哪些? 15. redis常见性能问题和解决方案: 16. 为什么redis需要把所有数据放到内存中? 17. Redis是单进程单线程的 18. redis的并发竞争问题如何解决? 19. redis事物的了解CAS(check-and-set 操作实现乐观锁 )? 20. redis持久化的几种方式 21. redis 最适合的场景 一、Redis有哪些数据结构? 字符串String、字典Hash、列表List

【转】分布式之redis复习精讲

痴心易碎 提交于 2019-12-03 09:24:04
转自: https://www.cnblogs.com/rjzheng/p/9096228.html 引言 为什么写这篇文章? 博主的 《分布式之消息队列复习精讲》 得到了大家的好评,内心诚惶诚恐,想着再出一篇关于复习精讲的文章。但是还是要说明一下,复习精讲的文章偏面试准备,真正在开发过程中,还是脚踏实地,一步一个脚印,不要投机取巧。 考虑到绝大部分写业务的程序员,在实际开发中使用redis的时候,只会setvalue和getvalue两个操作,对redis整体缺乏一个认知。又恰逢博主某个同事下周要去培训redis,所以博主斗胆以redis为题材,对redis常见问题做一个总结,希望能够弥补大家的知识盲点。 复习要点? 本文围绕以下几点进行阐述 1、为什么使用redis 2、使用redis有什么缺点 3、单线程的redis为什么这么快 4、redis的数据类型,以及每种数据类型的使用场景 5、redis的过期策略以及内存淘汰机制 6、redis和数据库双写一致性问题 7、如何应对缓存穿透和缓存雪崩问题 8、如何解决redis的并发竞争问题 正文 1、为什么使用redis 分析 :博主觉得在项目中使用redis,主要是从两个角度去考虑: 性能 和 并发 。当然,redis还具备可以做分布式锁等其他功能,但是如果只是为了分布式锁这些其他功能,完全还有其他中间件(如zookpeer等

redis分布式锁

一个人想着一个人 提交于 2019-12-03 04:49:46
可靠性 首先,为了确保分布式锁可用,我们至少要确保锁的实现同时满足以下四个条件: 互斥性。在任意时刻,只有一个客户端能持有锁。 不会发生死锁。即使有一个客户端在持有锁的期间崩溃而没有主动解锁,也能保证后续其他客户端能加锁。 具有容错性。只要大部分的Redis节点正常运行,客户端就可以加锁和解锁。 解铃还须系铃人。加锁和解锁必须是同一个客户端,客户端自己不能把别人加的锁给解了。 上锁: ublic class RedisTool { private static final String LOCK_SUCCESS = "OK"; private static final String SET_IF_NOT_EXIST = "NX"; private static final String SET_WITH_EXPIRE_TIME = "PX"; /** * 尝试获取分布式锁 * @param jedis Redis客户端 * @param lockKey 锁 * @param requestId 请求标识 * @param expireTime 超期时间 * @return 是否获取成功 */ public static boolean tryGetDistributedLock(Jedis jedis, String lockKey, String requestId, int

redis入门(一)

假装没事ソ 提交于 2019-12-03 04:25:52
目录 redis入门(一) 前言 特性 速度快 简单稳定 丰富的功能 历史 历史版本 安装与启动 安装 数据类型与内部编码 数据结构 内部编码 常用API与使用场景 常用命令 字符串 列表 哈希 集合 有序集合 总结 参考文档 redis入门(一) 前言 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

Redis面试题及答案整理

家住魔仙堡 提交于 2019-12-03 01:38:33
Redis面试题及答案整理 1. Redis有哪些数据结构? 字符串String、字典Hash、列表List、集合Set、有序集合SortedSet。 如果你是Redis中高级用户,还需要加上下面几种数据结构HyperLogLog、Geo、Pub/Sub。 2. 使用过Redis分布式锁么,它是什么回事? 先拿setnx来争抢锁,抢到之后,再用expire给锁加一个过期时间防止锁忘记了释放。 这时候对方会告诉你说你回答得不错,然后接着问如果在setnx之后执行expire之前进程意外crash或者要重启维护了,那会怎么样? 这时候你要给予惊讶的反馈:唉,是喔,这个锁就永远得不到释放了。紧接着你需要抓一抓自己得脑袋,故作思考片刻,好像接下来的结果是你主动思考出来的,然后回答:我记得set指令有非常复杂的参数,这个应该是可以同时把setnx和expire合成一条指令来用的!对方这时会显露笑容,心里开始默念:摁,这小子还不错。 jedis.set(String key, String value, String nx, String expx, int time),这个set()方法一共有五个形参: 第一个为key,我们使用key来当锁,因为key是唯一的。 第二个为value,我们传的是requestId,很多童鞋可能不明白,有key作为锁不就够了吗,为什么还要用到value

Redis知识点总结

…衆ロ難τιáo~ 提交于 2019-12-03 01:37:12
文章目录 Redis知识点总结 1.Redis是什么?都有哪些使用场景? 2.Redis有哪些功能? 3.Redis和 memecache 有什么区别? 4.Redis为什么是单线程的? 5.什么是缓存穿透?怎么解决? 6.Redis支持的数据类型有哪些? 7.Redis支持的 java 客户端都有哪些? 8.jedis 和 redisson 有哪些区别? 9.怎么保证缓存和数据库数据的一致性? 10.Redis持久化有几种方式? RDB快照 AOF diskstore方式 11.Redis怎么实现分布式锁? 12.Redis分布式锁有什么缺陷? 13.Redis如何做内存优化? 14.Redis淘汰策略有哪些? 15.Redis常见的性能问题有哪些?该如何解决? Master写内存快照 Master AOF持久化 Master调用BGREWRITEAOF Redis主从复制的性能问题 总结 16. 缓存预热 17. 缓存更新 18. 缓存降级 Redis知识点总结 1.Redis是什么?都有哪些使用场景? Redis 是一个key-value存储系统,为了解决应用服务器减少IO读操作,减轻IO压力。大部分情况下是因为其高性能的特性,被当做缓存使用。但是不支持需要事务操作和基于SQL结构化的复杂查询。 **使用场景:**配合关系型数据库作为缓冲、缓冲高频次访问的数据,降低数据库IO

Redis 分布式锁的实现

匿名 (未验证) 提交于 2019-12-03 00:44:02
0X00 测试环境 CentOS 6.6 + Redis 3.2.10 + PHP 7.0.7(+ phpredis 4.1.0) [root@localhost ~]# cat /etc/ issue CentOS release 6.6 (Final) Kernel \r on an \m [root@localhost ~]# redis-server - v Redis server v = 3.2 . 10 sha= 00000000 : 0 malloc=jemalloc- 3.6 . 0 bits= 32 build= 8903a4502b3c9f88 [root@localhost ~]# php - v PHP 7.0 . 7 (cli) (built: Feb 11 2017 16 : 47 : 30 ) ( NTS ) Copyright (c) 1997 - 2016 The PHP Group Zend Engine v3. 0.0 , Copyright (c) 1998 - 2016 Zend Technologies with Xdebug v2. 5.5 , Copyright (c) 2002 - 2017 , by Derick Rethans 0X01 什么是分布式锁 redis 官网上对分布式锁的描述( https://redis.io

基于redisTemplate的redis的分布式锁正确打开方式

匿名 (未验证) 提交于 2019-12-03 00:44:02
import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.data.redis.core.RedisCallback; import org.springframework.data.redis.core.RedisTemplate; import org.springframework.stereotype.Component; import org.springframework.util.StringUtils; import redis.clients.jedis.Jedis; import redis.clients.jedis.JedisCluster; import redis.clients.jedis.JedisCommands; import javax.annotation.Resource; import java.util.ArrayList; import java.util.List; import java.util.UUID; /** * @author superchen * @since 2018/5/16 **/ @Component public class RedisDistributedLock{ @Resource