redis分布式锁

redis 的数据类型

拜拜、爱过 提交于 2019-12-11 13:16:47
redis支持丰富的数据类型,从最基础的string到复杂的常用到的数据结构都有支持: string:最基本的数据类型,二进制安全的字符串,最大512M。 list:按照添加顺序保持顺序的字符串列表。 set:无序的字符串集合,不存在重复的元素。 sorted set:已排序的字符串集合。 hash:key-value对的一种集合。 bitmap:更细化的一种操作,以bit为单位。 hyperloglog:基于概率的数据结构。 2、集群(Cluster) 单台服务器资源的总是有上限的,CPU资源和IO资源我们可以通过主从复制,进行读写分离,把一部分CPU和IO的压力转移到从服务器上。但是内存资源怎么办,主从模式做到的只是相同数据的备份,并不能横向扩充内存;单台机器的内存也只能进行加大处理,但是总有上限的。所以我们就需要一种解决方案,可以让我们横向扩展。最终的目的既是把每台服务器只负责其中的一部分,让这些所有的服务器构成一个整体,对外界的消费者而言,这一组分布式的服务器就像是一个集中式的服务器一样(之前在解读REST的博客中解释过分布式于基于网络的差异:基于网络应用的架构)。 在Redis官方的分布式方案出来之前,有twemproxy和codis两种方案,这两个方案总体上来说都是依赖proxy来进行分布式的,也就是说redis本身并不关心分布式的事情

【大厂面试真题350道】性能优化+微服务+并发编程+开源框架+分布式

两盒软妹~` 提交于 2019-12-11 08:28:37
一,性能优化专题: 1.tomcat性能调优 怎么给tomcat调优 如何加大comcat连接数 怎么加大tomcat的内存 tomcat中如何禁止列目录下的文件 Tomcat有几种部署方式 tomcat的优化经验 2.jvm性能优化专题: Java类加载过程 java内存分配 描述一下jvm加载class文件的原理机制 GC是什么?为什么要有GC? 简述java垃圾回收机制 如何判断一个对象是否存活?(或者GC对象的判定方法) 垃圾回收的优点和原理。并考虑2种回收机制。 垃圾回收器的基本原理是什么?垃圾回收器可以马上回收内存吗? 有什么办法主动通知虚拟机进行垃圾回收? java中会存在内存泄漏吗,请简单描述。 深拷贝和浅拷贝 syatem,gc**() 和runtime,gc ()**会做做什么事情? finalize方法什么时候被调用?析构函数(finalizatinon)的目的是什么? 如何对象的引用被置为null,垃圾收集器是否会立即释放对象占用的内存? 什么是分布式垃圾回收(DGC)?它是如何工作的? 串行(serial)收集器和吞吐量(throughout)收集器的区别是什么? 在Java中,对象什么时候可以被垃圾回收? 简述Java内存分配与回收策率以及minor GC和majorGC。 jvm的永久代中会发生垃圾回收吗? Java中垃圾收集的方法有哪些?

redis高可用集群方案

社会主义新天地 提交于 2019-12-11 04:45:24
絮叨 半步神游,神游之下,天下无敌。一梦一游 便是天下。 Redis前面几篇的文章链接: 从零开始学Redis之金刚凡境 从零开始学Redis之自在地境 从零开始学Redis之逍遥天境 上一篇的逍遥天境 讲的是Redis的内存淘汰策略 和持久化方式。那这半步神游就是带你们遨游Redis的主从HA,哨兵,和Lua脚本 Redis主从和哨兵模式 Redis 主从搭建(有兴趣的小伙伴自己用虚拟机搭一个玩玩) 1、环境说明 主机名称 IP地址 redis版本和角色说明 redis-master 192.168.56.11 redis 5.0.3(主) redis-slave01 192.168.56.12 redis 5.0.3(从) redis-slave02 192.168.56.13 redis 5.0.3(从) 2、修改主从的redis配置文件 [root@redis-master ~]# grep -Ev "^$|#" /usr/local/redis/redis.conf bind 192.168.56.11 protected-mode yes port 6379 daemonize yes pidfile /var/run/redis_6379.pid logfile "/var/log/redis.log" dir /var/redis/ [root@redis

21道 Redis 常见面试题,必须掌握!

怎甘沉沦 提交于 2019-12-10 21:25:08
1.什么是redis? Redis 是一个基于内存的高性能key-value数据库。 2.Reids的特点 Redis本质上是一个Key-Value类型的内存数据库,很像memcached,整个数据库统统加载在内存当中进行操作,定期通过异步操作把数据库数据flush到硬盘上进行保存。因为是纯内存操作,Redis的性能非常出色,每秒可以处理超过 10万次读写操作,是已知性能最快的Key-Value DB。Redis的出色之处不仅仅是性能,Redis最大的魅力是支持保存多种数据结构,此外单个value的最大限制是1GB,不像 memcached只能保存1MB的数据,因此Redis可以用来实现很多有用的功能,比方说用他的List来做FIFO双向链表,实现一个轻量级的高性 能消息队列服务,用他的Set可以做高性能的tag系统等等。另外Redis也可以对存入的Key-Value设置expire时间,因此也可以被当作一 个功能加强版的memcached来用。Redis的主要缺点是数据库容量受到物理内存的限制,不能用作海量数据的高性能读写,因此Redis适合的场景主要局限在较小数据量的高性能操作和运算上。 3.使用redis有哪些好处? 1.速度快,因为数据存在内存中,类似于HashMap,HashMap的优势就是查找和操作的时间复杂度都是O(1)2.支持丰富数据类型,支持string,list

面试还搞不懂redis,快看看这40道面试题(含答案和思维导图)

耗尽温柔 提交于 2019-12-10 11:45:42
Redis 面试题 1、什么是 Redis?. 2、Redis 的数据类型? 3、使用 Redis 有哪些好处? 4、Redis 相比 Memcached 有哪些优势? 5、Memcache 与 Redis 的区别都有哪些? 6、Redis 是单进程单线程的? 7、一个字符串类型的值能存储最大容量是多少? 8、Redis 的持久化机制是什么?各自的优缺点? 9、Redis 常见性能问题和解决方案: 10、redis 过期键的删除策略? 11、Redis 的回收策略(淘汰策略)? 12、为什么 edis 需要把所有数据放到内存中? 13、Redis 的同步机制了解么? 14、Pipeline 有什么好处,为什么要用 pipeline? 15、是否使用过 Redis 集群,集群的原理是什么? 16、Redis 集群方案什么情况下会导致整个集群不可用? 17、Redis 支持的 Java 客户端都有哪些?官方推荐用哪个? 18、Jedis 与 Redisson 对比有什么优缺点? 19、Redis 如何设置密码及验证密码? 20、说说 Redis 哈希槽的概念? 21、Redis 集群的主从复制模型是怎样的? 22、Redis 集群会有写操作丢失吗?为什么? 23、Redis 集群之间是如何复制的? 24、Redis 集群最大节点个数是多少? 25、Redis 集群如何选择数据库? 26

Redis调用

霸气de小男生 提交于 2019-12-10 11:23:18
Redis帮助类 using StackExchange.Redis; using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading; using System.Threading.Tasks; namespace ConsoleApp7 { public class RedisHelper { public static readonly RedisHelper Instance = new RedisHelper(); private readonly object _syncRoot = new object(); /// <summary> /// redis分布式锁 /// </summary> private Redlock.CSharp.Redlock dlm_redlock { get; set; } private RedisHelper() { } public ConnectionMultiplexer RedisConnectionManager { get; private set; } private IDatabase _redisDatabase; public IDatabase

redis分布式锁

此生再无相见时 提交于 2019-12-09 15:21:51
1:使用 redis 自带的分布式锁 , set px nx set key 1 px 60000 nx px 过期时间 nx 分布式锁参数,只有当不存在时,才可设置成功 public String getUser(String key) { User user = new User(); // 链接缓存 Jedis jedis = redisUtil.getJedis(); // 查询缓存 String userJson = jedis.get(key); if(StringUtils.isNotBlank(userJson)){//if(userJson!=null&&!userJson.equals("")) user = JSON.parseObject(userJson, User.class); }else{ // 如果缓存中没有,查询mysql // 设置分布式锁 String token = UUID.randomUUID().toString(); String OK = jedis.set(key + ":lock", token, "nx", "px", 10*1000);// 拿到锁的线程有10秒的过期时间 if(StringUtils.isNotBlank(OK)&&OK.equals("OK")){ // 设置成功,有权在10秒的过期时间内访问数据库

分布式ID生成器--SnowFlake

无人久伴 提交于 2019-12-09 13:01:59
分布式系统唯一ID生成方案汇总 数据库自增主键 最常见的方式。利用数据库,全数据库唯一。 优点: 1)简单,代码方便,性能可以接受。 2)数字ID天然排序,对分页或者需要排序的结果很有帮助。 缺点: 1)不同数据库语法和实现不同,数据库迁移的时候或多数据库版本支持的时候需要处理。 2)在单个数据库或读写分离或一主多从的情况下,只有一个主库可以生成。有 单点故障 的风险。 3)在性能达不到要求的情况下,比较 难于扩展 。 4)如果遇见多个系统需要 合并或者涉及到数据迁移会相当痛苦 。 5) 分表分库 的时候会有麻烦。 优化方案: 1)针对主库单点,如果有多个Master库,则每个Master库设置的起始数字不一样,步长一样,可以是Master的个数。比如:Master1 生成的是 1,4,7,10,Master2生成的是2,5,8,11 Master3生成的是 3,6,9,12。这样就可以有效生成集群中的唯一ID,也可以大大降低ID生成数据库操作的负载。 这种方式可保证id不重复。但导致id不是绝对递增,而是整体趋势上递增;其次是写入的压力仍然很大,mysql容易成为性能瓶颈。 数据库批量生成id(TDDL采用) 优点:效率高;降低数据库压力 缺点:需考虑安全性问题,防止取到重复id;如果业务需求是每次只生成一个id,性能有问题 备注:利用数据库,初始化一行数据,初始值为1

对Redis 单进程、单线程模型的理解(网摘)

巧了我就是萌 提交于 2019-12-09 11:42:34
1、基本原理 采用多路 I/O 复用技术可以让单个线程高效的处理多个连接请求(尽量减少网络IO的时间消耗) (1)为什么不采用多进程或多线程处理? 多线程处理可能涉及到锁 多线程处理会涉及到线程切换而消耗CPU (2)单线程处理的缺点? 无法发挥多核CPU性能,不过可以通过在单机开多个Redis实例来完善 2、Redis不存在线程安全问题? Redis采用了线程封闭的方式,把任务封闭在一个线程,自然避免了线程安全问题,不过对于需要依赖多个redis操作的复合操作来说,依然需要锁,而且有可能是分布式锁 3、什么是多路I/O复用(Epoll) (1) 网络IO都是通过Socket实现,Server在某一个端口持续监听,客户端通过Socket(IP+Port)与服务器建立连接(ServerSocket.accept),成功建立连接之后,就可以使用Socket中封装的InputStream和OutputStream进行IO交互了。针对每个客户端,Server都会创建一个新线程专门用于处理 (2) 默认情况下,网络IO是阻塞模式,即服务器线程在数据到来之前处于【阻塞】状态,等到数据到达,会自动唤醒服务器线程,着手进行处理。阻塞模式下,一个线程只能处理一个流的IO事件 (3) 为了提升服务器线程处理效率,有以下三种思路 (1)非阻塞【忙轮询】:采用死循环方式轮询每一个流,如果有IO事件就处理

Redis缓存穿透、缓存雪崩、redis并发问题分析

自古美人都是妖i 提交于 2019-12-09 02:46:41
把redis作为缓存使用已经是司空见惯,但是使用redis后也可能会碰到一系列的问题,尤其是数据量很大的时候,经典的几个问题如下: (一)缓存和数据库间数据一致性问题 分布式环境下(单机就不用说了)非常容易出现缓存和数据库间的数据一致性问题,针对这一点的话,只能说,如果你的项目对缓存的要求是强一致性的,那么请不要使用缓存。我们只能采取合适的策略来降低缓存和数据库间数据不一致的概率,而无法保证两者间的强一致性。合适的策略包括 合适的缓存更新策略,更新数据库后要及时更新缓存、缓存失败时增加重试机制,例如MQ模式的消息队列。 ( 二 )缓存击穿问题 缓存击穿表示恶意用户模拟请求很多缓存中不存在的数据,由于缓存中都没有,导致这些请求短时间内直接落在了数据库上,导致数据库异常。这个我们在实际项目就遇到了,有些抢购活动、秒杀活动的接口API被大量的恶意用户刷,导致短时间内数据库c超时了,好在数据库是读写分离,同时也有进行接口限流,hold住了。 解决方案的话: 方案1、使用互斥锁排队 业界比价普遍的一种做法,即根据key获取value值为空时,锁上,从数据库中load数据后再释放锁。若其它线程获取锁失败,则等待一段时间后重试。这里要注意,分布式环境中要使用分布式锁,单机的话用普通的锁(synchronized、Lock)就够了。 public String getWithLock(String