欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

NOSQL数据库——Redis

程序员文章站 2022-07-12 20:59:31
...

什么是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
    NOSQL数据库——Redis

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
    NOSQL数据库——Redis

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文件)
    NOSQL数据库——Redis

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

    查看 RDB持久化机制的配置(redis.conf)
    NOSQL数据库——Redis

配置 意义
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配置文件
    NOSQL数据库——Redis

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

    开启AOF持久化机制后要关闭服务,再启动服务,才会产生一个appendonly.aof文件
    NOSQL数据库——Redis

  4. AOF方式数据持久化时机
    查看AOF持久化机制的配置(redis.conf)NOSQL数据库——Redis

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

Jedis的基本使用

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

相关jar报包
NOSQL数据库——Redis
常用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
相关标签: # JavaWeb