redis 挂掉

线上报错:

[25136] 18 Sep 16:24:38 # === REDIS BUG REPORT END. Make sure to include from START to END. ===

    Please report the crash opening an issue on github:

        http://github.com/antirez/redis/issues

 

原因是必须修改linux /etc/sysctl.conf

vm.overcommit_memory = 1

 

推荐的redis配置:

daemonize yes
pidfile /duitang/data/work/redis_session.pid
port 6389
timeout 300
bind 192.168.172.13
loglevel notice
logfile /duitang/logs/sys/redis_session.log
databases 6
save 900 1
maxclients 0
rdbcompression yes
dbfilename session.rdb
dir /duitang/data/redis_session/
slave-serve-stale-data yes
appendonly no
appendfsync no
no-appendfsync-on-rewrite yes
slowlog-log-slower-than 10000
slowlog-max-len 1024
vm-enabled no
vm-swap-file /duitang/data/work/redis_session.swap
vm-max-memory 0
vm-page-size 64
vm-pages 268435456
vm-max-threads 8
hash-max-zipmap-entries 4096
hash-max-zipmap-value 4096
list-max-ziplist-entries 4096
list-max-ziplist-value 4096
set-max-intset-entries 4096
activerehashing yes
zset-max-ziplist-entries 4096
zset-max-ziplist-value 4096

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
好的,可以参考以下的Java代码实现Redis锁,并提供Redis挂掉之后的补偿机制: ```java import redis.clients.jedis.Jedis; import redis.clients.jedis.JedisPool; import redis.clients.jedis.JedisPoolConfig; public class RedisLock { // Redis连接池 private static JedisPool jedisPool; // 锁的key private String key; // 锁的超时时间,单位秒 private int timeout = 10; // 锁的过期时间,单位毫秒 private long expireTime; // 锁的状态 private boolean locked; static { // 初始化连接池配置 JedisPoolConfig config = new JedisPoolConfig(); config.setMaxTotal(100); config.setMaxIdle(20); config.setMaxWaitMillis(1000L); // 初始化Redis连接池 jedisPool = new JedisPool(config, "localhost", 6379); } public RedisLock(String key) { this.key = key; } public RedisLock(String key, int timeout) { this.key = key; this.timeout = timeout; } // 加锁 public boolean lock() { // 获取当前时间 long now = System.currentTimeMillis(); // 计算锁的过期时间 expireTime = now + timeout * 1000L; // 获取Redis连接 try (Jedis jedis = jedisPool.getResource()) { // 尝试加锁 long result = jedis.setnx(key, String.valueOf(expireTime)); // 判断是否加锁成功 if (result == 1L) { // 加锁成功 locked = true; return true; } else { // 获取锁的过期时间 String value = jedis.get(key); if (value != null && Long.parseLong(value) < now) { // 锁已经过期,尝试重新加锁 String oldValue = jedis.getSet(key, String.valueOf(expireTime)); if (oldValue != null && oldValue.equals(value)) { // 重新加锁成功 locked = true; return true; } } } } catch (Exception e) { // Redis连接异常,加锁失败 e.printStackTrace(); } // 加锁失败 return false; } // 解锁 public void unlock() { if (locked) { // 获取Redis连接 try (Jedis jedis = jedisPool.getResource()) { // 判断锁是否过期 String value = jedis.get(key); if (value != null && Long.parseLong(value) > System.currentTimeMillis()) { // 锁未过期,删除锁 jedis.del(key); } } catch (Exception e) { // Redis连接异常,删除锁失败 e.printStackTrace(); } // 解锁完成 locked = false; } } // Redis挂掉后的补偿机制 public void compensation() { // 获取当前时间 long now = System.currentTimeMillis(); // 获取Redis连接 try (Jedis jedis = jedisPool.getResource()) { // 获取锁的过期时间 String value = jedis.get(key); if (value != null && Long.parseLong(value) < now) { // 锁已经过期,尝试重新加锁 String oldValue = jedis.getSet(key, String.valueOf(expireTime)); if (oldValue != null && oldValue.equals(value)) { // 重新加锁成功 locked = true; } } } catch (Exception e) { // Redis连接异常,加锁失败 e.printStackTrace(); } } } ``` 补偿机制的实现是在`compensation()`方法中,它会在Redis挂掉之后,尝试重新加锁。当Redis重新恢复后,由于锁的过期时间还未到,所以锁还没有被释放,因此可以通过重新加锁的方式来恢复锁的状态。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值