Redis基础入门

简介

完全开源免费的,用C语言编写的,是一个高性能的(key/value)分布式内存数据库,基于内存运行,并支持持久化的NoSQL数据库。

优势

  • 性能极高 – Redis能读的速度是110000次/s,写的速度是81000次/s 。
  • 丰富的数据类型 – Redis支持二进制案例的 Strings, Lists, Hashes, Sets 及 Ordered Sets 数据类型操作。
  • 原子 – Redis的所有操作都是原子性的,意思就是要么成功执行要么失败完全不执行。单个操作是原子性的。多个操作也支持事务,即原子性,通过MULTI和EXEC指令包起来。
  • 丰富的特性 – Redis还支持 publish/subscribe, 通知, key 过期等等特性。。
  • Redis支持数据的备份,即master-slave模式的数据备份。
  • Redis支持数据的持久化,可以将内存中的数据保存在磁盘中,重启的时候可以再次加载进行使用。

应用场景

  1. 热点数据缓存: 由于 Redis 访问速度块、支持的数据类型比较丰富,所以 Redis 很适合用来存储热点数据
  2. 限时业务实现: expire 命令设置 key 的生存时间,到时间后自动删除 key。收集验证码、优惠活动等业务场景。
  3. 计数器实现: incrby 命令可以实现原子性的递增,所以可以运用于高并发的秒杀活动、分布式序列号的生成。比如限制一个手机号发多少条短信、一个接口一分钟限制多少请求、一个接口一天限制调用多少次等等。
  4. 排行榜实现: 借助 SortedSet 进行热点数据的排序。例如:下单量最多的用户排行榜,最热门的帖子(回复最多)等。
  5. 布式锁实现: 利用 Redis 的 setnx 命令进行。后面会有详细的实现介绍。
  6. 队列机制实现: Redis 有 list push 和 list pop 这样的命令,所以能够很方便的执行队列操作。

与java整合

  • maven坐标
    <dependency>
        <groupId>redis.clients</groupId>
        <artifactId>jedis</artifactId>
        <version>3.2.0</version>
        <scope>test</scope>
    </dependency>
  • 连接Redis
public class JedisPoolUtil {
    public static volatile JedisPool jedisPool = null;
    /**
     * 创建连接池
     * @return
     */
    public static JedisPool getJedisPoolInstance() {
        if (null == jedisPool) {
            synchronized (JedisPoolUtil.class) {
                if (null == jedisPool) {
                    JedisPoolConfig poolConfig = new JedisPoolConfig();
                    //逐出连接的最小空闲时间 默认1800000毫秒(30分钟)
                    poolConfig.setMinEvictableIdleTimeMillis(30000);
                    ////最大空闲连接数, 默认8个
                    poolConfig.setMaxIdle(8);
                    //最大连接数, 默认8个
                    poolConfig.setMaxTotal(8);
                    //最小空闲连接数, 默认0
                    poolConfig.setMinIdle(0);
                    jedisPool = new JedisPool(poolConfig, "192.168.100.110", 6379);
                }
            }
        }
        return jedisPool;
    }

    /**
     * 获取Jedis实例
     *
     * @return
     */
    public static Jedis getJedis() {
        if (jedisPool != null) {
            return jedisPool.getResource();
        } else {
            Jedis jedis = getJedisPoolInstance().getResource();
            return jedis;
        }
    }

    /**
     * 释放资源
     * @param jedis
     */
    public static void close(final Jedis jedis) {
        if (jedis != null) {
            jedis.close();
        }
    }
}

数据类型 redis命令大全:http://doc.redisfans.com/

  • String(字符串)

    String是简单的 key-value 键值对,value 不仅可以是 String,也可以是数字。它是Redis最基本的数据类型,一个redis中字符串value最多可以是512M。

  • Hash(哈希)

    Redis hash 是一个键值对集合,对应Value内部实际就是一个HashMap,Hash特别适合用于存储对象。

  • List(列表)

    Redis 列表是简单的字符串列表,按照插入顺序排序。你可以添加一个元素导列表的头部(左边)或者尾部(右边)。底层实现为一个双向链表,即可以支持反向查找和遍历,更方便操作,不过带来了部分额外的内存开销,Redis内部的很多实现,包括发送缓冲队列等也都是用的这个数据结构。

  • Set(集合)

    Redis的Set是String类型的无序集合,它的内部实现是一个 value永远为null的HashMap,实际就是通过计算hash的方式来快速排重的,这也是set能提供判断一个成员是否在集合内的原因。

  • zset(有序集合)

    Redis zset 和 set 一样也是String类型元素的集合,且不允许重复的成员,不同的是每个元素都会关联一个double类型的分数,用来排序。

    @Test
    public void setZset(){
        Jedis jedis = JedisPoolUtil.getJedis();
        jedis.zadd("runoobkey",1,"redis");
        jedis.zadd("runoobkey",4,"mongodb");
        jedis.zadd("runoobkey",6,"mysql");
        jedis.zadd("runoobkey",3,"mysql11");
        jedis.zadd("runoobkey",7,"mongodb111");
        jedis.zadd("runoobkey",0,"redis1313");
    }
        @Test
    public void getString(){
        Jedis jedis = JedisPoolUtil.getJedis();
        jedis.zrange("runoobkey", 0, 5).forEach(item ->{
            System.out.println(item);
        });
  • 发布订阅在这里插入图片描述

事务

​ Redis事务是一个单独的隔离操作:事务中的所有命令都会序列化、按顺序地执行。事务在执行的过程中,不会被其他客户端发送来的命令请求所打断。

​ Redis的事务不保证原子性,单条命令是原子执行。在Redsi的事务中,任意命令执行失败,事务不会回滚,其他命令还是会倍执行

​ Redis事务的三个阶段:1、开始事务,2、命令入队,3、执行事务

​ 这里需要注意一下WATCH的这个命令,类似与乐观锁。必须在事务开启之前执行(MULTI)、可以执行多次。WATCH监听的key如果在事务执行期间更改了值,那事务是不会执行成功的。

posted @ 2020-04-11 18:50  无话可说丶  阅读(148)  评论(0编辑  收藏  举报