Redis分布式锁如何续期
我们目前项目中使用的 redis 锁并没有续期的功能,所以在执行长时间任务时会触发 attempt to unlock '{}', not locked by current thread. 异常,解决这个问题比较正确的姿势是采用 redisson 这个客户端工具.具体介绍可以搜索最大的同性交友网站 github. 我们看官方的解释: Redisson 为避免存储这个分布式锁的Redisson节点宕机出现锁死的情况,在内部提供了一个监控锁的看门狗,其作用是在Redisson实例被关闭前,不断延长锁的有效期。默认情况下,看门狗的检查锁的超时时间是30秒,可以通过修改 Config.lockWatchdogTimeout 来指定。另外Redisson还通过加锁的方法提供了 leaseTime 的参数来指定加锁的时间。超过这个时间后锁便自动解开了。 细心的同学可能会发现上面解释的歧义: 看门狗每隔 30...
mysql 查询设置事务隔离级别
查询mysql 5.7 1SELECT @@tx_isolation; mysql 8.0 1select @@transation_isolation; 设置设置 seesion 级别为可重复读1set session transaction ISOLATION level repeatable read; 设置系统级别为可重复读1set global transaction ISOLATION level repeatable read; 所有的隔离级别 read uncommitted : 读未提交 (可以读到未提交的数据 (脏读) ) read committed : 读已提交 — oracle 默认隔离级别 (可能每次读取的数据结果不一致 (幻读)) repeatable read : 可重复读 — mysql 默认隔离级别 ( innodb 采用 mvcc 解决幻读问题) serializable : 串行化 (类似锁,写数据必须等待另一个事务结束) 设置 事务不自动提交123set autocommit = 0 ;或者start...
Redis面试题归纳
为什么使用 Redis在项目中使用 Redis,主要考虑两个角度:性能和并发。如果只是为了分布式锁这些其他功能,还有其他中间件 Zookpeer 等代替,并非一定要使用 Redis。 性能: 如下图所示,我们在碰到需要执行耗时特别久,且结果不频繁变动的 SQL,就特别适合将运行结果放入缓存。这样,后面的请求就去缓存中读取,使得请求能够迅速响应。 特别是在秒杀系统,在同一时间,几乎所有人都在点,都在下单。。。执行的是同一操作———向数据库查数据。 根据交互效果的不同,响应时间没有固定标准。在理想状态下,我们的页面跳转需要在瞬间解决,对于页内操作则需要在刹那间解决。 并发 如下图所示,在大并发的情况下,所有的请求直接访问数据库,数据库会出现连接异常。这个时候,就需要使用 Redis 做一个缓冲操作,让请求先访问到 Redis,而不是直接访问数据库。 使用 Redis 的常见问题 缓存和数据库双写一致性问题 缓存雪崩问题 缓存击穿问题 缓存的并发竞争问题 单线程的 Redis 为什么这么快这个问题是对 Redis 内部机制的一个考察。很多人都不知道 Redis...
Redis过期策略实现原理
在使用redis时,一般会设置一个过期时间,当然也有不设置过期时间的,也就是永久不过期。 当我们设置了过期时间,redis是如何判断是否过期,以及根据什么策略来进行删除的。 redis设置过期时间expire key time(以秒为单位)–这是最常用的方式 setex(String key, int seconds, String value)–字符串独有的方式 注: 除了字符串自己独有设置过期时间的方法外,其他方法都需要依靠expire方法来设置时间 如果没有设置时间,那缓存就是永不过期 如果设置了过期时间,之后又想让缓存永不过期,使用persist...
InnoDB为什么要选择B+树来存储数据
关于InnoDB索引,我们可能知道InnDB索引是用B+树实现的,而B+树就是一种能优化查询速度的数据结构。但我们又没想过这样一个问题,能优化查询速度的数据结构有很多,为什么InnoDB要采用B+树? 常见优化查询速度数据结构哈希表哈希表是一种以键 - 值(key-value)存储数据的结构,我们只要输入待查找的键即 key,就可以找到其对应的值即 Value。哈希的思路很简单,把值放在数组里,用一个哈希函数把 key 换算成一个确定的位置,然后把 value 放在数组的这个位置。 不可避免地,多个 key 值经过哈希函数的换算,会出现同一个值的情况。处理这种情况的一种方法是,拉出一个链表。 假设现在维护着一个身份证信息和姓名的表,需要根据身份证号查找对应的名字,这时对应的哈希索引的示意图如下所示: 图中,User2 和 User4 根据身份证号算出来的值都是 N,但没关系,后面还跟了一个链表。假设,这时候你要查 ID_card_n2 对应的名字是什么,处理步骤就是:首先,将 ID_card_n2 通过哈希函数算出 N;然后,按顺序遍历,找到...
mvcc浅析
在讲Mvcc前,我觉得有必要先了解一下InnoDB的行锁。mysql从5.5.5开始使用InnoDB作为默认存储引擎,lock的对象是事务,用来锁定的是数据库中的对象,如表、页、行。并且一般lock的对象仅在事务commit或rollback后进行释放(不同事务隔离级别释放的时间可能不同)。InnoDB存储引擎实现了如下两种标准的行锁: 共享锁(S Lock)允许事务读一行数据 排他锁(X Lock)允许事务删除或更新一行数据 说明: 读锁、S锁,若事务T对数据对象A加上S锁,则事务T可以读A但不能修改A,其他只能再对A加S锁,而不能加X锁,直到T释放A上的S锁。这保证了其他事务可以读A,但在T释放A上S锁之前不能对A做任何修改。 写锁、X锁,若事务T对数据对象A加上X锁,事务T可以读A也可以修改A,其他事务不能再对A加任何锁,直到T释放A上的锁,这保证了其他事务在T释放A上的锁之前不能再读取和修改A。 一致性非锁定读一致性的非锁定读(consistent nonlocking read )是指InnoDB通过行多版本控制(multi...
布隆过滤器原理及使用
什么是布隆过滤器?我们来看这么一个场景:目标网站有上千万个URL,如何判断某个URL是否已经访问过?使用DB存储的话,就是把每个URL存入DB,然后每次访问URL前执行 1slect id from table where url = 'xxxx' 但随着URL数据量增多,每次请求前都要访问DB一次,效率非常低。当然,也可以用redis的set结构存储URL,优于DB存储,但也同样存在一个问题:耗费内存过多。如何解决?布隆过滤器! 布隆过滤器从本质上讲是一个位数组,位数组就是数组的每个元素都只占用1bit。每个元素只能是0或者1。这样申请一个10000个元素的位数组只占用 10000/8 = 1250B 的空间。布隆过滤器除了一个位数组,还有K个哈希函数。当一个元素加入布隆过滤器的时候,会进行如下操作: 使用K个哈希函数对元素值进行K次计算,得到K个哈希值。 根据得到的哈希值,在数组中把对应下标的值设置为1。 如上图:url1通过f1,f2,f3...
生产环境缓存失效解决方案
Redis的持久化机制Redis的数据都存放在内存中,如果没有配置持久化,redis重启后数据就全丢失了,于是需要开启redis的持久化功能,将数据保存到磁盘上,当redis重启后,可以从磁盘中恢复数据。 持久化方式 RDB 持久化 RDB 持久化方式能够在指定的时间间隔对你的数据进行快照存储 AOF(append only file)持久化 AOF 持久化方式记录每次对服务器写的操作,当服务器重启的时候会重新执行这些命令来恢复原始的数据 RDB 方式 客户端直接通过命令BGSAVE或者SAVE来创建一个内存快照 BGSAVE 调用fork来创建一个子进程,子进程负责将快照写入磁盘,而父进程仍然继续处理命令。 SAVE 执行SAVE命令过程中,不再响应其他命令。 在redis.conf中调整save配置选项,当在规定的时间内,Redis发生了写操作的个数满足条件会触发发生 BGSAVE命令 123456# 900秒之内至少一次写操作save 900 1 # 300秒之内至少发生10次写操作save 300 10# 60秒之内发生至少10000次save 60...
ElasticSearch Centos7 安装
准备工作开放端口关闭防火墙 12systemctl stop firewalldsystemctl disable firewalld 或者开放对应的端口号,比如ElasticSearch的9300、9200,Kibana的5601 1234sudo firewall-cmd --zone=public --add-port=9300/tcp --permanentsudo firewall-cmd --zone=public --add-port=9200/tcp --permanentsudo firewall-cmd --zone=public --add-port=5601/tcp --permanentsudo firewall-cmd --reload 新建用户1234# 添加用户备用useradd elastic# 设置密码passwd elastic 创建安装目录1mkdir /usr/local/elastic 下载安装包下载安装包 elasticsearch、kibana、IK...
Redis安装及集群搭建手册
1、 环境信息12centos7redis5 单机安装 123456789101112wget http://download.redis.io/releases/redis-5.0.3.tar.gztar xzf redis-5.0.3.tar.gz -C /usr/local/cd /usr/local/redis-5.0.3make# 启动Redissrc/redis-server# 使用客户端命令窗口src/redis-cliredis> set foo barOKredis> get foo"bar" 2、整体集群信息1234# 以直接在一台机器上实现上述的伪集群,因为端口号特意设置为不同的。# 重点:不论机器多少,对于部署过程都是一样的,只不过是在不同机器启动redis-server而已192.168.100.242 (6381- 6386共6个端口)# 注意事项:如果你的服务器有多个IP,那你操作下面步骤时,尽量使用你的客户端能够访问的IP 3、安装Redis每台服务器上面都要下载安装 123456789wget...