Redis

作者: 醒醒Coco | 来源:发表于2018-08-14 10:10 被阅读0次

概述

简介
NoSQL : Not only SQL,泛指一切非关系型数据库
关系型数据库:指以表的形式来保存数据库,以键/表的形式维护数据库之前的关系。如 Oracle、DB2、Microsoft SQL Server、Microsoft Access、MySQL
非关系型数据库:泛指 关系型数据库之外其它类型的数据库 。如 NoSql、Cloudant等

关系型数据库的缺点

  • 高并发问题:海量的请求同时访问数据库
  • 高性能问题:数据量越来越大,需要从海量的数据量瞬间访问/操作某一些数据
  • 高扩展问题:数据库的集群,数据的迁移和移植

非关系型数据库的优点

  • 实现高性能要求:数据之间没有关系,所以数据的存取效率是非常高
  • 数据结构非常灵活:不以表的形式保存数据,可以以任何适合的格式来保存数据
  • 高扩展的优点:可以非常灵活进行数据移植

web 应用开发中非关系型数据库的使用

仍然是以关系型数据库来持久化报错数据,可以维护数据之间的业务关系。非关系型数据库作为补充。可以用来提升数据库的存取效率。
通常把 Redis 数据库与作为数据缓存,缓存了一些经常读取,但不经常修改的数据。列如:商品的分类信息,可以放在在缓存里。页面需要显示分类的时候,从缓存里读取,速度或比较快,可以有效提高 web 应用的访问性能。

Redis

C编写的免费开源,以 key-value 存取数据的非关系型数据库,把数据存储到内存中,而不是磁盘中,有非常高的读写性能。
Redis 的端口:6379 merz

操作Redis

Redis 的数据类型

以 key-value 保存数据
key:始终是字符串。通常来说,key的长度不要超过1024个字节,否则会影响数据的读写性能。
value:数据类型是五种 :

  • string:字符串类型,一个string可以保存512M数据
  • hash:哈希列表,类似于 HashMap,一个hash可以保存 2^23-1个数据
  • List:列表类型,类似于 LinkedList, 2^23-1
  • set:无序不重复的数据集合,类似于Set, 2^23-1
  • zset:(sorted set)有序不重复的数据集合, 2^23-1
Redis 的数据操作
  • 操作 string

    设置数据:set key value  比如: set username zhangsan
    获取数据: get key     比如: get username
    删除数据: del key         比如: del username
    
  • 操作 hash

    添加数据: hset key field value   比如: hset user username coco
    获取数据: hget key field      比如: hget user username
    删除数据: hdel key field      比如: hdel user username
    获取所有: hgetall key         比如: hgetall user
    
  • 操作 List

    添加数据: 
      从左边压入数据: lpush key value1 value2...
      从右边压入数据:rpush key value1 value2...
    弹出数据:
        从左边弹出数据:lpop key
        从右边弹出数据:rpop key
    查看数据:
    lrange key 0 -1     其中:-1表示最后一个数据
    
  • 操作 Set

    添加数据: sadd key value
    随机取出一个数据: srandmember key
    查看数据: smembers key
    删除数据: srem key member
    
    多集合之间的运算:
      交集: sinter key1 key2
      并集: sunion key1 key2
      差集: sdiff key1 key2
    
  • 通用的 key 操作

    查询key: keys表达式  比如:keys *, keys myset?
    删除key: del key
    判断key是否存在: exists key
    获取key的类型: type key
    

Jedis

Redis 在 web 应用开发中,是作为缓存来使用的,通过 Java 程序来操作 Redis 数据。
Jedis 操作 Redis 数据库需要的 jar 包:

  • Jedis-*.jar
  • common-pool*.jar u 连接池使用的

操作步骤:

  • 获取连接 Jedis 对象
  • 操作 Jedis
  • 释放资源,关闭 Jedis
Jedis 的 API
构造方法: Jedis(String host,int port)

常用方法: 方法名和命令名称一致
    设置string数据: set(String key,String value)
    获取string数据: get(String key)
    删除string数据: del(String key)
    从左边向list添加一个数据: lpush(String key,String value)
    
关闭连接: jedis.close();
Jedis 操作示例
@Test
public void demo1(){
    //1. 创建 Jedis 连接对象
    Jedis jedis = new Jedis("localhost",6379);

    //2. 操作 Redis 数据库
    //jedis.set("username","zhangsan");
    String username = jedis.get("username");
    System.out.println(username);

    //3. 关闭连接对象
    jedis.close();
}
Jedis 连接池的 API
连接池的构造方法:
    JedisPool(String host,int port)  使用默认配置的连接池
    JedisPool(JedisPoolConfig config,String host,int port) 使用自定义的连接池

连接池配置信息对象
    无参构造: JedisPoolConfig()
    常用方法:
        setMaxTotal(int maxTotal) 设置最大连接数
        setMaxIdle(int maxIdle) 设置最大空闲连接数
 
从连接池 JedisPool 里获取连接:
    Jedis jedis = pool.getResource()
Jedis 连接池示例
//1. 创建一个连接池配置信息对象,设置连接池的参数信息
//2. 使用配置信息对象,创建连接池对象
//3. 从连接池里获取连接
@Test
public void demo2() {
    // 创建一个连接池的配置对象
    JedisPoolConfig jedisPoolConfig = new JedisPoolConfig();
    jedisPoolConfig.setMaxTotal(30);  //设置连接池里最多有30个连接
    jedisPoolConfig.setMaxIdle(10); //设置连接池里最多有10个空闲连接

    // 使用配置信息对象,创建连接池对象
    JedisPool jedisPool = new JedisPool(jedisPoolConfig, "localhost", 6379);

    //从连接池获取连接对象
    Jedis jedis = jedisPool.getResource();

    //操作 Redis 数据库
    String username = jedis.get("username");
    System.out.println(username);

    //关闭连接对象
    jedis.close();
}
封装 jedis 工具类 : JedisUtils
//1.JedisUtils

import redis.clients.jedis.Jedis;
import redis.clients.jedis.JedisPool;
import redis.clients.jedis.JedisPoolConfig;

import java.util.ResourceBundle;

public class JedisUtils {

    private static JedisPool pool;

    private static String host;
    private static int port;
    private static int maxTotal;
    private static int maxIdle;

    static{
        //加载资源文件
        ResourceBundle bundle = ResourceBundle.getBundle("jedis");
        host = bundle.getString("host");
        port = Integer.parseInt(bundle.getString("port"));
        maxTotal = Integer.parseInt(bundle.getString("maxTotal"));
        maxIdle = Integer.parseInt(bundle.getString("maxIdle"));

        //创建连接池配置信息
        JedisPoolConfig config = new JedisPoolConfig();
        config.setMaxTotal(maxTotal);
        config.setMaxIdle(maxIdle);

        //创建连接池对象
        pool = new JedisPool(config, host, port);
    }

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

    /**
     * 关闭Jedis连接
     * @param jedis 要关闭的Jedis连接对象
     */
    public static void close(Jedis jedis) {
        if (jedis != null) {
            jedis.close();
        }
    }

    /**
     * 设置缓存
     * @param key 缓存的key
     * @param value 缓存的value
     */
    public static void setCache(String key, String value){
        Jedis jedis = null;
        try {
            jedis = getJedis();
            jedis.set(key, value);
        } catch (Exception e) {
            System.out.println("设置缓存数据失败:["+key+":"+value+"]");
        } finally {
            //关闭连接
            if (jedis != null) {
                jedis.close();
            }
        }
    }

    /**
     * 获取缓存
     * @param key 缓存的key
     * @return 缓存的value
     */
    public static String getCache(String key) {
        Jedis jedis = null;
        try {
            jedis = getJedis();
            return jedis.get(key);
        } catch (Exception e) {
            System.out.println("获取缓存失败:" + key);
        } finally {
           //关闭连接
            if (jedis != null) {
                jedis.close();
            }
        }
        return null;
    }
}

//2. 配置文件 jedis.properties
host=localhost
port=6379
maxTotal=30
maxIdle=10
    
//3.test
@Test
public void demo2() {
    JedisUtils.setCache("username", "coco1");
}

@Test
public void demo3() {
    String username = JedisUtils.getCache("username");
    System.out.println(username);
}

持久化机制

​ Redis数据库是把数据保存在了内存当中,那么如果Redis服务关闭,就需要把内存里的数据进行持久化保存,所以Redis本身提供了持久化机制:在某些时候把内存里的数据保存到磁盘文件上。

​ Redis提供了两种持久化机制:RDB模式 和 AOF模式。

RDB 模式
RDB 模式:快照模式,默认是开启状态的。

定期把 Redis 内存中的数据,生成快照文件,保存到磁盘文件上。默认生成的文件:dump.rdb,默认保存在 Redis 安装目录中

RDB 模式的相关配置,在 redis.conf里
save 900 1 表示:如果数据变更1次,那么900秒生成一次快照文件
save 300 10  表示:如果数据变更10次,那么300秒生成一次快照文件
save 60 10000 表示:如果数据变更1000次,那么10000秒生成一次快照文件

dbfilename dump.rdb   默认生成的快照文件名称
dir ./             表示生成的快照文件,保存到redis-server的当前目录
AOF 模式
AOF模式:append only file模式,默认是关闭的。
如果我们在Redis里执行数据的变更,那么每次变量,Redis都会把执行的命令追加到一个文件里。等Redis重启、需要恢复数据的时候,读取文件里所有的命令,按顺序重新构建Redis的数据。

如果开启了AOF模式,Redis会把数据变更的命令保存到了appendonly.aof,默认在Redis的安装目录里。这些信息可以通过修改redis.conf更改配置:

appendonly no     AOF模式的开关,默认是关闭状态,如果要使用,需要手动更改成yes。需要重新Redis
appendfilename "appendonly.aof"   默认生成的文件名称appendonly.aof

# appendfsync always     每次数据变更,都保存变更的命令到aof文件里
appendfsync everysec     每秒保存一次
# appendfsync no          不保存
RDB模式和AOF模式的优缺点

RDB模式:默认开启,性能高;但是可能会丢失数据
AOF模式:默认关闭,比较安全,丢失数据的可能性小;影响性能。

Redis在web应用里的使用方式

web应用里的数据最终还是必须要保存到关系型数据库里,Redis作为数据的缓存使用。


Redis在web应用里的使用方式.png

相关文章

网友评论

      本文标题:Redis

      本文链接:https://www.haomeiwen.com/subject/abesbttx.html