redis

redis

1.概念

redis是一款高性能的NOSQL系列的非关系型,高缓存型数据库。

关系型数据库与非关系型数据库(NOSQL)
redis

1.1 NOSQL与关系型数据库比较

  • 优点
    1. 成本:nosql数据库简单易部署,基本都是开源软件。关系型数据库一般为收费。
    2. 查询速度:nosql数据库将数据存储与缓存之中,关系型数据库储存在硬盘中,nosql读取速度更快
    3. 储存格式:nosql的储存格式为key、value形式,value形式多样:文档形式、图片形式等。而关系型数据库则只支持基础类型。
    4. 扩展性:关系型数据库有类似join这样的多表查询机制的,导致后期扩展困难
  • 缺点
    1. 维护工具和资料有限。
    2. 不提供对sql的支持。即数据库之间没有统一的标准命令。学习成本高,每一个nosql数据库之间没有任何联系。
    3. 不提供关系型数据库对事务的处理。
  • 总结:关系型数据库与nosql数据库并非对立而是互补的关系,一般会将数据储存在关系型数据库中,在nosql数据库中去备份关系型数据库中的数据。利用两者互补的关系,从而提高数据的访问速度。

1.2 Redis储存键值数据类型:

  • 字符串类型【String】:
  • 哈希类型【hash】:
  • 列表类型【list】:
  • 集合类型【set】:
  • 有序集合类型【sortedset】:

1.3 redis的应用场景

  • 缓存(数据查询、新闻内容)
  • 聊天室的在线好友列表
  • 任务队列(抢购、秒杀)
  • 应用排行榜
  • 网站访问统计
  • 数据过期处理
  • 分布式集群架构中的session分离

1.4 注意:

  1. Key支持自动过期被删除

  2. 下载安装

  3. 官网:https://redis.io/

  4. 中文网:https://www.redis.net.cn/

  5. 绿色版【解压直接可以使用】:

    1. redis.windows.conf:核心配置文件
    2. redis-cli.exe:redis的客户端
    3. redis-server.exe:redis的服务器端

2. 命令操作

2.1 redis数据结构

  1. redis储存的是:key,value格式的数据。其中key都是字符串,value有5中不同的数据结构。

    1. 字符串类型【String】:
    2. 哈希类型【hash】:map格式
    3. 列表类型【list】 :linkedlist --> 元素可以重复
    4. 集合类型【set】 :hashset --> 元素不可以重复
    5. 有序集合类型【sortedset】: --> 元素不可以重复,且输入存入之后会自动排序

redis

2.2 命令操作

  1. 字符串类型【String】:
    1. 存储:
      1. set key value:存储数据
      2. setex key seconds value:存储数据,seconds秒后自动删除
    2. 获取:get key
    3. 删除:del key
  2. 哈希类型【hash】:数据不可重复,会覆盖
    1. 存储:hset key filed value
    2. 获取单条:hget key filed【获取指定的filed对应的值】
    3. 获取全部:hgetall key【获取所有的filed和value】
    4. 删除:hdel key filed
  3. 列表类型【list】:数据可重复,
    可以添加一个元素到列表的头部(左边)或者尾部(右边)。
    【可以当作队列来使用】
    1. 添加
      1. lpush key value:将元素插入到列表最左边
      2. rpush key vaule:将元素插入到列表最右边
    2. 获取:
      1. lrange key start end:范围获取
      2. lrange myList 0 -1 【查询所有】
      3. 列表下标从0开始
    3. 删除:
      1. lpop key:删除列表中最左边的元素,并将元素返回
      2. rpop key:删除列表中最右边的元素,并将元素返回
  4. 集合类型 set:不允许重复元素
    1. 存储:sadd key value
    2. 获取:smembers key:可以获取set集合中的所有元素
    3. 删除:srem key value:可以删除set集合中的某个元素
  5. 有序集合类型 sortedset:不允许重复元素,且按照指定的score从小到大排序
    1. 存储:zadd key score value
      1. 存如数据时:score可以单独覆盖,其他数据不变
    2. 获取:zrange key start value 【withscores】
    3. 删除:zrem key value
  6. 通用命令
    1. key *:查询所有键
    2. type key :查询该键对应的value的类型
    3. del key:删除指定key value

2.3 持久化操作

  1. redis 是一个内存数据库,当服务器断电再连接时,有可能会丢失数据,所以我们选择持久化数据到硬盘中

  2. redis持久化机制:

    1. RDB:默认方式,不需要进行配置,但在打开服务器时,加载指定配置文件【redis.windows.conf】。

      在一定间隔时间内,检测key值的变化情况,然后持久化数据,

      1. 编辑redis所在窗口中的 【redis.windows.conf】文件
        下面三种情况满足其中一中将进行持久化任务

        1. after 900 sec (15 min) if at least 1 key changed
          15分钟后,超过一条key值改变

          save 900 1

        2. after 300 sec (5 min) if at least 10 keys changed
          5分钟后,超过10条key值改变

          save 300 10

        3. after 60 sec if at least 10000 keys changed
          1分钟后,超过10000条key值改变

          save 60 10000

      2. 先在redis所在窗口中打开dos窗口

      3. 再通过该命令【 redis-server.exe redis.windows.conf 】加载配置文件

    2. AOF:日志记录的方式,可以记录每一条命令的操作。可以在每一次命令操作后,持久化数据,
      会将数据持久化到【appendonly.aof】文件中

      1. 通过编辑【redis.windows.conf】文件中的【appendonly】属性值来打开或关闭AOF
        1. appendonly no:关闭AOF
        2. appendonly yes:打开AOF
      2. 设置【appendfsync】属性来决定持久化的条件
        1. appendfsync always:每一次操作都进行持久化任务
        2. appendfsync everysec:每过一秒进行依次持久化任务
        3. appendfsync no:不进行持久化任务

3. 通过Java代码操作redis

3.1Java代码操作redis

  • 使用Java代码连接数据库时,要保证服务器的打开状态,不然连接超时
  1. 导入相关jar包

  2. commons-pool2-2.3.jar

  3. jedis-2.7.0.jar

  4. 创建连接

    1. Jedis jedis = new Jedis();空参。默认连接为本地数据库,端口号默认为:6379
    2. Jedis jedis = new Jedis(“localhost”, 6379);
      1. localhost:连接的ip地址
      2. 6379:连接的端口号
  5. 执行任务

    jedis.set("username","zhangsan");
    String username = jedis.get("username");
    System.out.println(username);
    
  6. 释放资源:jedis.close();

3.2 jedis连接池:jedisPool

jedisPool已经在jedis中内置了,不需要使用其他第三方

  • 使用

    1. 创建JedisPool连接池对象
    2. 调用方法 getResource()方法,获取jedis连接
  • 连接池配置

    1. 获取连接池配置:JedisPoolConfig jedisPoolConfig = new JedisPoolConfig();

    2. 设置连接池其属性:

      1. 设置最大连接: jedisPoolConfig.setMaxTotal(50);
      2. 设置最大空闲连接: jedisPoolConfig.setMaxIdle(10);
    3. 连接池其他属性:

      #最大活动对象数     
      redis.pool.maxTotal=1000    
      #最大能够保持idel状态的对象数      
      redis.pool.maxIdle=100  
      #最小能够保持idel状态的对象数   
      redis.pool.minIdle=50    
      #当池内没有返回对象时,最大等待时间    
      redis.pool.maxWaitMillis=10000    
      #当调用borrow Object方法时,是否进行有效性检查    
      redis.pool.testOnBorrow=true    
      #当调用return Object方法时,是否进行有效性检查    
      redis.pool.testOnReturn=true  
      #“空闲链接”检测线程,检测的周期,毫秒数。如果为负值,表示不运行“检测线程”。默认为-1.  
      redis.pool.timeBetweenEvictionRunsMillis=30000  
      #向调用者输出“链接”对象时,是否检测它的空闲超时;  
      redis.pool.testWhileIdle=true  
      # 对于“空闲链接”检测线程而言,每次检测的链接资源的个数。默认为3.  
      redis.pool.numTestsPerEvictionRun=50  
      #redis服务器的IP    
      redis.ip=xxxxxx  
      #redis服务器的Port    
      redis1.port=6379   
      

3.3 Jedis工具类提取

public class JedisPoolUtils {

    private static JedisPool jedisPool;

    static {
        //使用类加载器获取配置文件的is流
        InputStream is = JedisPoolUtils.class.getClassLoader().getResourceAsStream("jedis.properties");
        //创建读取配置文件的 Properties
        Properties pro = new Properties();
        try {
            //把is流绑定到Properties上
            pro.load(is);
        } catch (IOException e) {
            e.printStackTrace();
        }
        //新建jedisPool配置对象
        JedisPoolConfig jedisPoolConfig = new JedisPoolConfig();
        //根据Properties中读取的信息,设置配置对象
        jedisPoolConfig.setMaxTotal(Integer.parseInt(pro.getProperty("maxTotal")));
        jedisPoolConfig.setMaxIdle(Integer.parseInt(pro.getProperty("maxIdle")));
        jedisPool = new JedisPool(jedisPoolConfig, pro.getProperty("host"), Integer.parseInt(pro.getProperty("port")));
    }

    public static Jedis getJedis() {
        return jedisPool.getResource();
    }
}

上一篇:Jedis的基本操作


下一篇:Spring Boot基于redis分布式锁模拟直播秒杀场景