redisson

一线互联网公司Redis使用精髓,你必须要掌握这4点!

对着背影说爱祢 提交于 2020-11-13 06:52:28
先来看一下这些Redis面试题你会几道? 1、什么是 Redis?简述它的优缺点? 2、Redis 与 memcached 相比有哪些优势? 3、Redis 支持哪几种数据类型? 4、Redis 主要消耗什么物理资源? 5、Redis 有哪几种数据淘汰策略? 6、Redis 官方为什么不提供 Windows 版本? 7、一个字符串类型的值能存储最大容量是多少? 8、为什么 Redis 需要把所有数据放到内存中? 9、Redis 集群方案应该怎么做?都有哪些方案? 10、Redis 集群方案什么情况下会导致整个集群不可用? 11、MySQL 里有 2000w 数据,redis 中只存 20w 的数据,如何保证 redis 中的数据都是热点数据? 12、Redis 有哪些适合的场景? 13、Redis 支持的 Java 客户端都有哪些?官方推荐用哪个? 14、Redis 和 Redisson 有什么关系? 15、Jedis 与 Redisson 对比有什么优缺点? 16、说说 Redis 哈希槽的概念? 17、Redis 集群的主从复制模型是怎样的? 18、Redis 集群会有写操作丢失吗?为什么? 19、Redis 集群如何选择数据库? 20、Redis 如何做内存优化? 了解Redis Redis是一种基于键值对(Key-Value)的NoSQL数据库

分布式锁之redisson

倾然丶 夕夏残阳落幕 提交于 2020-11-07 13:05:03
redisson是redis官网推荐的java语言实现分布式锁的项目。当然,redisson远不止分布式锁,还包括其他一些分布式结构。详情请移步:https://github.com/mrniko/redisson/wiki   redisson支持4种链接redis的方式:    Cluster (集群)    Sentinel servers (哨兵)    Master/Slave servers (主从)    Single server (单机)   下面通过简单的案例使用redisson的lock。   1、RedissonManager类,管理redisson的初始化等操作。 public class RedissonManager { private static final String RAtomicName = "genId_"; private static Config config = new Config(); private static Redisson redisson = null; public static void init(){ try { config.useClusterServers() //这是用的集群server .setScanInterval(2000) //设置集群状态扫描时间

利用Zookeeper实现

与世无争的帅哥 提交于 2020-11-06 13:56:46
许多场景中, 数据一致性 是一个比较重要的话题,在单机环境中,我们可以通过Java提供的 并发API 来解决;而在分布式环境(会遇到网络故障、消息重复、消息丢失等各种问题)下要复杂得多,常见的解决方案是 分布式事务 、 分布式锁 等。 本文主要探讨如何利用Zookeeper来实现分布式锁。 关于分布式锁 分布式锁是控制分布式系统之间 同步访问共享资源 的一种方式。 在 实现 分布式锁的过程中需要注意的: 锁的可重入性(递归调用不应该被阻塞、避免死锁) 锁的超时(避免死锁、死循环等意外情况) 锁的阻塞(保证原子性等) 锁的特性支持(阻塞锁、可重入锁、公平锁、联锁、信号量、读写锁) 在 使用 分布式锁时需要注意: 分布式锁的开销(分布式锁一般能不用就不用,有些场景可以用乐观锁代替) 加锁的粒度(控制加锁的粒度,可以优化系统的性能) 加锁的方式 以下是几种常见的实现分布式锁的方案及其优缺点。 基于数据库 1. 基于数据库表 最简单的方式可能就是直接创建一张锁表,当我们要锁住某个方法或资源时,我们就在该表中增加一条记录,想要释放锁的时候就删除这条记录。给某字段添加唯一性约束,如果有多个请求同时提交到数据库的话, 数据库会保证只有一个操作可以成功 ,那么我们就可以认为操作成功的那个线程获得了该方法的锁,可以执行方法体内容。 会引入数据库单点、无失效时间、不阻塞、不可重入等问题。 2.

造了一个 Redis 分布锁的轮子,没想到还学到这么多东西!!!

|▌冷眼眸甩不掉的悲伤 提交于 2020-10-08 05:33:59
书接上文 上篇文章「 MySQL 可重复读,差点就让我背上了一个 P0 事故! 」发布之后,收到很多小伙伴们的留言,从中又学习到很多,总结一下。 上篇文章可能举得例子有点不恰当,导致有些小伙伴没看懂为什么余额会变负。 这次我们举得实际一点,还是上篇文章 account 表,假设 id=1,balance=1000 ,不过这次我们扣款 1000 ,两个事务的时序图如下: 这次使用两个命令窗口真实执行一把: 注意事务 2,③处查询到 id=1,balance=1000 ,但是实际上由于此时事务 1 已经提交,最新结果如②处所示 id=1,balance=900 。 本来 Java 代码层会做一层余额判断: if (balance - amount < 0) { throw new XXException("余额不足,扣减失败"); } 但是此时由于 ③ 处使用快照读,读到是个旧值,未读到最新值,导致这层校验失效,从而代码继续往下运行,执行了数据更新。 更新语句又采用如下写法: UPDATE account set balance=balance-1000 WHERE id =1; 这条更新语句又必须是在这条记录的最新值的基础做更新,更新语句执行结束,这条记录就变成了 id=1,balance=-1000 。 之前有朋友疑惑 t12 更新之后,再次进行快照读,结果会是多少。 上图执行结果

etcd分布式锁及事务

限于喜欢 提交于 2020-10-07 04:51:59
前言 分布式锁 是控制分布式系统之间同步访问共享资源的一种方式。在分布式系统中,常常需要协调他们的动作。如果不同的系统或是同一个系统的不同主机之间共享了一个或一组资源,那么访问这些资源的时候,往往需要互斥来防止彼此干扰来保证一致性,在这种情况下,便需要使用到分布式锁。 etcd分布式锁设计 排他性 :任意时刻,只能有一个机器的一个线程能获取到锁。 通过在etcd中存入key值来实现上锁,删除key实现解锁,参考下面伪代码: func Lock(key string, cli *clientv3.Client) error { //获取key,判断是否存在锁 resp, err := cli.Get(context.Background(), key) if err != nil { return err } //锁存在,返回上锁失败 if len(resp.Kvs) > 0 { return errors.New("lock fail") } _, err = cli.Put(context.Background(), key, "lock") if err != nil { return err } return nil } //删除key,解锁 func UnLock(key string, cli *clientv3.Client) error { _, err := cli

分布式事务解决方案常见误区与实用建议

ぐ巨炮叔叔 提交于 2020-09-30 06:41:34
前言 ​ 最近,工作中要为现在的老系统做拆分和升级,刚好遇到了分布式事务、幂等控制、异步消息乱序和补偿方案等问题,刚好基于实践结合个人的看法记录一下一些方案和思路。 分布式事务 首先,做系统拆分的时候几乎都会遇到分布式事务的问题,一个仿真的案例如下: 项目初期,由于用户体量不大,订单模块和钱包模块共库共应用(大war包时代),模块调用可以简化为本地事务操作,这样做只要不是程序本身的BUG,基本可以避免数据不一致。 后面因为用户体量越发增大,基于容错、性能、功能共享等考虑,把原来的应用拆分为订单微服务和钱包微服务,两个服务之间通过非本地事务操(这里可以是HTTP或者消息队列等)作进行数据同步,这个时候就很有可能由于异常场景出现数据不一致的情况。 事务中直接RPC调用达到强一致性 以上面的订单微服务请求钱包微服务进行扣款并更新订单状态为扣款这个调用过程为例,假设采用HTTP同步调用,项目如果由经验不足的开发者开发这个逻辑,可能会出现下面的伪代码: [订单微服务请求钱包微服务进行扣款并更新订单状态] 处理订单微服务请求钱包微服务进行扣款并更新订单状态方法(){ [开启事务] 1、查询订单 2、HTTP调用钱包微服务扣款 3、更新订单状态为扣款成功 [提交事务] } 这是一个从肉眼上看起来没有什么问题的解决方法,HTTP调用直接嵌入到事务代码块内部,猜想最初开发者的想法是

Redis 管道(Pipelining)、PUB/SUB

安稳与你 提交于 2020-08-19 22:59:04
http://redis.cn/topics/pipelining.html 是否可以这样理解: 如果是组织大量的、无依赖关系的命令,可以选择管道,当然也可以选择脚本。 如果命令之间有依赖关系,比如后续的命令需要处理先前命令的返回值,只能选择脚本。 Redis 提供了 PUB/SUB 订阅功能,实际我们在使用时,一定要注意,它提供的 不是一个可靠的 订阅系统 Redis 是不持久化 Publish 的消息的 当然,不能说 Redis Pub/Sub 毫无使用的场景,以下艿艿来列举几个: 在使用 Redis Sentinel 做高可用时,Jedis 通过 Redis Pub/Sub 功能,实现对 Redis 主节点的故障切换,刷新 Jedis 客户端的主节点的缓存。 如果出现 Redis Connection 订阅的异常断开,会重新 主动 去 Redis Sentinel 的最新主节点信息, 从而解决 Redis Pub/Sub 可能因为网络问题,丢失消息 Redis Sentinel 节点之间的部分信息同步,通过 Redis Pub/Sub 订阅发布。 在我们实现 Redis 分布式锁时,如果获取不到锁,可以通过 Redis 的 Pub/Sub 订阅锁释放消息,从而实现其它获得不到锁的线程,快速抢占锁。 当然,Redis Client 释放锁时,需要 PUBLISH