NOSQL数据库——Redis

什么是Redis

Redis是用C语言开发的一个开源的高性能键值对(key-value)数据库,通过提供多种键值数据类型来适应不同场景下的存储需求。

在开发中,关系型数据库是主数据库,用于存储数据,维护数据关系。 Redis(非关系型数据库)作为辅助数据库,提供数据缓存功能,把某些数据缓存到Redis里,获取资源时,优先从Redis里查找,以此提高性能。

Linux版的Redis

简单使用

  • 启动Redis服务:./redis-server redis.conf
  • 使用客户端连接Redis服务:./redis-cli./redis-cli [-h Redis的ip地址 -p Redis的端口]
  • 关闭Redis服务:./redis-cli shutdown
    在这里插入图片描述

Redis的数据类型

redis是一种高级的key-value的存储系统

key:String类型

注:key不要太长,太长会消耗内存还会降低查找效率,长度不要超过1024个字节。

value:支持五种数据类型

  1. 字符串(String)

    应用场景:缓存(数据查询,商品内容等)

  2. 哈希(hash)

  3. 字符串列表/双向链表(list)
    应用场景:任务队列(秒杀、抢购、12306等)

  4. 字符串集合(set)
    应用场景:(数学中的集合运算) 如:共同好友

  5. 有序字符串集合(sorted set)
    应用场景:排行榜

Redis的数据操作(待完善)

string类型常用命令

  • 设置数据:set key value
  • 获取数据:get key
  • 删除数据:del key
    在这里插入图片描述

hash类型常用命令

Redis中的Hash类型可以看成具有String Key(field )和String Value(value)的map容器。

  • 设置数据:hset key field value
  • 获取数据:hget key field
  • 删除数据:hdel key field

list类型常用命令

,List类型是按照插入顺序排序的字符串链表。和数据结构中的普通链表一样,我们可以在其头部(left)和 尾部(right)添加新的元素

  • 添加数据:
    • 从左边添加:lpush key value1 value2...
    • 从右边添加:rpush key value value2...
  • 弹出数据:
    • 从左边弹出:lpop key
    • 从右边弹出:rpop key
  • 范围查询:lrange key start end
    • 查询全部:lrange key 0 -1

set类型的常用命令

Redis的通用命令(通用的对key的操作)

查询所有key:keys *
查询my开头的key:keys my*
查询(如:myset加上一位任意字符)的key:keys myset?
删除key: del key
判断key是否存在:exists key
获取key对应的value类型:type key

Redis的持久化

Redis的高性能是由于其将所有数据都存储在了内存中,为了使Redis在重启之后仍能保证数据不丢失,需要将数据从内存中同步到硬盘中,即持久化。Redis支持两种方式的持久化( RDB持久化,AOF持久化)。使用时可单独使用其中一种或将二者结合使用。

RDB持久化机制

  1. 该机制是指在指定的时间间隔内将内存中的数据集快照写入磁盘,默认开启。

  2. 文件保存位置:默认在Redis的运行目录下(dump.rdb文件)
    在这里插入图片描述

  3. 什么时候将数据集快照写入磁盘(RDB方式数据持久化时机):

    查看 RDB持久化机制的配置(redis.conf)
    在这里插入图片描述

配置 意义
save 900 1 每900秒(15分钟)至少有1个key发生变化,则dump内存快照
save 300 10 每300秒(5分钟)至少有10个key发生变化,则dump内存快照

注:① dump (备份文件系统)Dump文件

  1. RDB持久化机制优点:
    性能最大化,相比于AOF机制,如果数据集很大,RDB的启动效率会更高。
  2. RDB持久化机制缺点:
    系统一 旦在定时持久化之前出现宕机现象,此前没有来得及写入磁盘的数据都将丢失,安全性略低。(保证数据的高可用性,即最大限度的避免数据丢失,RDB持久化机制l略有不足)

AOF持久化机制

  1. 该机制将以日志的形式记录服务器所处理的每一个写操作,在Redis服务器启动之初会读取该文件来重新构建数据库,以保证启动后数据库中的数据是完整的。

  2. 开启AOF持久化机制方法:修改redis.conf配置文件
    在这里插入图片描述

  3. 文件保存位置:默认在Redis的运行目录下(appendonly.aof文件)

    开启AOF持久化机制后要关闭服务,再启动服务,才会产生一个appendonly.aof文件
    在这里插入图片描述

  4. AOF方式数据持久化时机
    查看AOF持久化机制的配置(redis.conf)在这里插入图片描述

配置 意义
appendfsync always 每执行一次更新命令,持久化一次(同步持久化,每次发生的数据变化都会被立即记录到磁盘中,效率最低)
appendfsync everysec 每秒钟持久化一次(每秒同步是异步完成的,效率较高)
appendfsync no 不持久化
  1. AOF持久化机制优点:安全性高
  2. AOF持久化机制缺点:影响性能,还有可能保存大量的冗余命令

Jedis的基本使用

Jedis简介:Redis官方提供的Java语言操作Redis数据库的方式

相关jar报包
在这里插入图片描述
常用API

  • 连接对象:Jedis
    • 构造方法:Jedis(String host, int port)参数host:redis服务器地址,参数port:redis服务端口
    • 操作Redis的数据方法:执行的方法名称,和命令名称相同
      如:
      设置字符串类型的数据 set(key,value)
      获得字符串类型的数据get(key)
      设置哈希类型的数据 hset(key,field,value)
      获得哈希类型的数据 hget(key,field)

    • 释放资源:close()
  • 连接池配置信息对象:JedisPoolConfig
    • 构造方法: JedisPoolConfig()
    • 常用方法:
      • setMaxTotal(int maxTotal)
      • setMaxIdle(int maxIdle)
  • 连接池对象:JedisPool
    • 构造方法:
      • JedisPool(String host, int port)
      • JedisPool(JedisPoolConfig config, String host, int port)

扩展: jedis连接池

jedis连接资源的创建与销毁是很消耗程序性能,所以jedis为我们提供了jedis的池化技术,jedisPool在创建时初始化一些连接资源存储到连接池中,使用jedis连接资源时不需要创建,而是从连接池中获取一个资源进行redis的操作,使用完毕后,不需要销毁该jedis连接资源,而是将该资源归还给连接池,供其他请求使用。

jedis连接池工具类(获取Jedis连接与String类型的数据的增删改查封装)

public class JedisUtils {
    private static JedisPool pool;
    static {
        //读取配置文件,得到配置信息。
        //参数说明:src下的properties文件名称,不要加后缀名。
        ResourceBundle bundle = ResourceBundle.getBundle("jedis");
        String host = bundle.getString("host");
        int port = Integer.parseInt(bundle.getString("port"));
        int maxTotal = Integer.parseInt(bundle.getString("maxTotal"));
        int maxIdle = Integer.parseInt(bundle.getString("maxIdle"));
        //创建连接池配置信息
        JedisPoolConfig config = new JedisPoolConfig();
        //设置最大连接数
        config.setMaxTotal(maxTotal);
        //设置最大空闲连接数
        config.setMaxIdle(maxIdle);
        //创建连接池对象
        pool = new JedisPool(config, host, port);
    }

    //获取Jedis连接
    public static Jedis getJedis() {
        return pool.getResource();
    }

    //关闭Jedis连接
    public static void close(Jedis jedis) {
        if (jedis != null) {
            jedis.close();
        }
    }


    //设置缓存
    public static void setCache(String key, String value){
        Jedis jedis = null;
        try {
            jedis = JedisUtils.getJedis();
            jedis.set(key, value);
        } catch (Exception e) {
            System.out.println("设置缓存数据失败:["+key+":"+value+"]");
        } finally {
            close(jedis);
        }
    }

    //获取缓存
    public static String getCache(String key){
        Jedis jedis = null;
        String value = null;
        try {
            jedis = JedisUtils.getJedis();
            value = jedis.get(key);
        } catch (Exception e) {
            System.out.println("获取缓存失败:" + key);
        } finally {
            close(jedis);
        }
        return value;
    }

    //删除缓存
    public static void delCache(String key){
        Jedis jedis = null;
        try {
            jedis = JedisUtils.getJedis();
            jedis.del(key);
        } catch (Exception e) {
            System.out.println("删除缓存失败");
        } finally {
            close(jedis);
        }
    }
}

配置文件jedis.properties

host=192.168.184.130
port=6379
maxTotal=20
maxIdle=10
发布了48 篇原创文章 · 获赞 18 · 访问量 2950

猜你喜欢

转载自blog.csdn.net/qq_45615417/article/details/104321776