Redis系列--1.redis概述

什么是redis?

Redis 是完全开源免费的,遵守BSD协议,是一个基于内存的高性能的key-value数据库。

Redis 与其他 key - value 缓存产品有以下三个特点:

  • Redis支持数据的持久化,可以将内存中的数据保存在磁盘中,重启的时候可以再次加载进行使用。
  • Redis不仅仅支持简单的key-value类型的数据,同时还提供list,set,zset,hash等数据结构的存储。
  • Redis支持数据的备份,即master-slave模式的数据备份。

为什么使用redis,有哪些优点?

  • 性能极高 – Redis能读的速度是110000次/s,写的速度是81000次/s 。
  • 丰富的数据类型 – Redis支持二进制案例的 Strings, Lists, Hashes, Sets 及 Ordered Sets 数据类型操作。
  • 原子 – Redis的所有操作都是原子性的,意思就是要么成功执行要么失败完全不执行。单个操作是原子性的。多个操作也支持事务,即原子性,通过MULTI和EXEC指令包起来。
  • 丰富的特性 – Redis还支持 publish/subscribe, 通知, key 过期等等特性。

redis的应用场景

1.缓存功能

缓存设计主要问题:
缓存穿透;
缓存击穿;
缓存与数据库不一致;
缓存热点数据;
https://www.cnblogs.com/scholar-xie/p/7111132.html
http://www.cnblogs.com/codeon/p/8287563.html
https://www.cnblogs.com/codeon/p/8287582.html

2、计数

http://zhuanlan.51cto.com/art/201707/543851.htm

3、共享session

http://zhuanlan.51cto.com/art/201705/540250.htm

 4、分布式限流

phoneNum = "138xxxxxxxx";
key = "shortMsg:limit:" + phoneNum;
// SET key value EX 60 NX
isExists = redis.set(key,1,"EX 60","NX");
if(isExists != null || redis.incr(key) <=5){    
// 通过
}else{    
// 限速
}
https://www.cnblogs.com/softidea/p/6229543.html 令牌桶算法

5、分布式锁实现

@Service("distributedLockHandler")
public class DistributedLockHandler  {
    private static final Integer Lock_Timeout = 3;
    @Autowired
    private RedisTemplate redisTemplate;

    private boolean innerTryLock(String lockKey){
        JedisCmd jedisCmd = redisTemplate.getJedisCmd();
        long currentTime = System.currentTimeMillis();
        String lockTimeDuration = String.valueOf(currentTime + Lock_Timeout + 1);
        
        Long result = jedisCmd.setnx(lockKey, lockTimeDuration);
        if(result == 1){
            return true;
        }else {
            if(checkIfLockTimeout(currentTime, lockKey)){//检查锁是否超时未释放
                String preLockTimeDuration = jedisCmd.getSet(lockKey,lockTimeDuration);//利用getSet原子性。
                //锁是否超时未释放,如果直接del key然后setnx key,当多个客户端使用时就后者就会覆盖前者操作。
                if(currentTime > Long.valueOf(preLockTimeDuration)){
                    return true;
                }
            }
            return false;
        }
}
//获取锁
public boolean tryLock(String lockKey, Long timeout){
        try{
            Long currentTime = System.currentTimeMillis();
            boolean result = false;
            while (true){
                if((System.currentTimeMillis() - currentTime)/1000 > timeout){//获取超时
                    jobLog.info("Execute DistributedLockHandler.tryLock method, Time out.");
                    break;
                }else {
                    result = innerTryLock(lockKey);
                    if(result){
                        break;
                    }else {//重试
                        jobLog.debug("Try to get the Lock,and wait 100 millisecond....");
                        Thread.sleep(100);
                    }
                }
            }
            return result;
        }catch (Exception e){
            jobLog.error("Failed to run DistributedLockHandler.getLock method.", e);
            return false;
        }
}
//释放锁
public void realseLock(String lockKey){
        JedisCmd jedisCmd = redisTemplate.getJedisCmd();
        jedisCmd.del(lockKey);
    }
//检查锁是否超时
public boolean checkIfLockTimeout(Long currentTime, String lockKey){
        JedisCmd jedisCmd = redisTemplate.getJedisCmd();
        if(currentTime > Long.valueOf(jedisCmd.get(lockKey))){
            return true;
        }else {
            return false;
        }
    }
}
View Code

6、分布式队列

用于秒杀、任务队列等
https://www.jianshu.com/p/7e7070a0abd2

redis数据类型

Redis支持五种数据类型:string(字符串),hash(哈希),list(列表),set(集合)及zset(sorted set:有序集合)。

  • string:是 redis 最基本的类型,你可以理解成与 Memcached 一模一样的类型,一个 key 对应一个 value。是二进制安全的。意思是 redis 的 string 可以包含任何数据。比如jpg图片或者序列化的对象。string 类型是 Redis 最基本的数据类型,string 类型的值最大能存储 512MB。
  • hash :是一个键值(key=>value)对集合。hash 是一个 string 类型的 field 和 value 的映射表,hash 特别适合用于存储对象。

  • list :是简单的字符串列表,按照插入顺序排序。你可以添加一个元素到列表的头部(左边)或者尾部(右边)。
  • set :是 string 类型的无序集合。集合是通过哈希表实现的,所以添加,删除,查找的复杂度都是 O(1)。

  • zset :和 set 一样也是string类型元素的集合,且不允许重复的成员。不同的是每个元素都会关联一个double类型的分数。redis正是通过分数来为集合中的成员进行从小到大的排序。zset的成员是唯一的,但分数(score)却可以重复。

redis使用一览表

redis设计原理

原文地址:https://www.cnblogs.com/jvStarBlog/p/12255432.html