zoukankan      html  css  js  c++  java
  • 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如果在事务执行期间更改了值,那事务是不会执行成功的。

  • 相关阅读:
    Cf序列化器-Serializer解析
    yield和return
    pymongo的使用
    Homebrew介绍和使用
    TypeError: expected string or bytes-like object
    JavaScript读取文本,并渲染在html
    反序相等
    打印邮票的组合
    打印对称平方数
    字符串按照原意输出
  • 原文地址:https://www.cnblogs.com/yangk1996/p/12681579.html
Copyright © 2011-2022 走看看