Redis分布式锁如何续期
我们目前项目中使用的 redis 锁并没有续期的功能,所以在执行长时间任务时会触发 attempt to unlock '{}', not locked by current thread. 异常,解决这个问题比较正确的姿势是采用 redisson 这个客户端工具.具体介绍可以搜索最大的同性交友网站 github. 我们看官方的解释: Redisson 为避免存储这个分布式锁的Redisson节点宕机出现锁死的情况,在内部提供了一个监控锁的看门狗,其作用是在Redisson实例被关闭前,不断延长锁的有效期。默认情况下,看门狗的检查锁的超时时间是30秒,可以通过修改 Config.lockWatchdogTimeout 来指定。另外Redisson还通过加锁的方法提供了 leaseTime 的参数来指定加锁的时间。超过这个时间后锁便自动解开了。 细心的同学可能会发现上面解释的歧义: 看门狗每隔 30...
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...
布隆过滤器原理及使用
什么是布隆过滤器?我们来看这么一个场景:目标网站有上千万个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...
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...