分享redis基础知识(五)

56 阅读2分钟

持续创作,加速成长!这是我参与「掘金日新计划 · 6 月更文挑战」的第29天,点击查看活动详情

image.png

redis单机版本分布式锁

public class MyRedisLock {

    private static int lockSuccess = 1;

    /**

     * @param lockKey 在redis中创建的key

     * @param notLockTime 尝试获取锁的超时时间

     * @param timeOut 设置有效期,防止死锁  (预估锁的超时时间,在提交事务时,检查锁是否超时,如果已经超时,则业务代码手动回滚)

     * @return 返回lock成功值

     */

    public String getLock(String lockKey, int notLockTime, int timeOut){

        //获取redis连接

        Jedis jedis = RedisUtils.getJedis();

        try {

            //计算尝试获取锁的超时时间

            Long endTime = System.currentTimeMillis()+notLockTime;

            //系统时间小于endTime,获取锁没有超时,否则退出循环

            while (System.currentTimeMillis() < endTime) {

                String lockValue = UUID.randomUUID().toString();

                //当多个jvm同时创建一个相同的redis的key,谁能创建成功谁就获取到锁

                if(jedis.setnx(lockKey,lockValue) == lockSuccess){

                    //加上有效期

                    jedis.expire(lockKey,timeOut/1000);

                    //退出循环

                    return lockValue;

                }

                //否则继续循环

            }

        }catch (Exception e){

            e.printStackTrace();

        }finally {

            if(jedis != null){

                jedis.close();

            }

        }

        return null;

    }


    /**

     * 释放锁(jvm自己获取的锁,自己释放锁)

     * @return

     */

    public boolean unLock(String lockKey, String lockValue){

        //获取redis连接

        Jedis jedis = RedisUtils.getJedis();

        try {

            //判断是否删的自己的锁

            if(lockValue.equals(jedis.get(lockKey))){

                return jedis.del(lockKey) > 0 ? true : false;

            }

        }catch (Exception e){

            e.printStackTrace();

        }finally {

            if(jedis != null){

                jedis.close();

            }

        }

        return false;

    }

}

redis主从复制

在分布式领域中不可能实现强一致性。(主redis同步到从redis中,需要一个时间过程,网络原因)

作用:

单个redis如果某种原因宕机的话,可能导致整个redis服务不可用,可以使用redis主从复制实现一主多从,主节点负责读和写。从节点负责读数据。

主从复制:

1、实现redis集群

2、数据的备份

3、读写分离

相关配置Redis.conf

slaveof 192.168.212.155 6379

masterauth 123456

info replication

主从复制需要注意的问题:

主节点会将数据采用增量或全量的过程,同步到从服务器

主从复制原理过程:

1、在从服务redis的redis.conf中配置slaveof指向主redis服务ip地址和端口号,(192.168.1.110:6379和密码)

2、从redis服务器和主redis服务器建立socket长连接

3、采用全量和增量形式将数据同步给redis服务器

全量:从redis服务器第一次启动时(发送二进制执行文件dump) rdb

增量:主redis每次有新的set请求时候 aof日志文件

主从复制存在那些缺陷?

主节点宕机后,导致整个redis服务不能做写的操作。(需要哨兵机制,选举出新的master节点)