Java小白学习指南【day53】---万能的非关系型数据库Redis

一、关系型数据库与非关系型数据库

RDBMS(关系型数据库)NOSQL(非关系型数据库)
并发不支持高并发支持高并发
存储数据解构数据都是有结构的(有表的概念)大部分非关系型数据库value都是没有解构的(没有表的概念)
数据存放位置只能放在磁盘上(所以不能承受高并发)可以放在内存和磁盘上
数据存储量解构和数据存储都是有限的(列最多200,数据量最多200万)只要硬件够好就没有限制

非关系型数据库又可以分为以下几种

image-20201214194023603

二、Redis概述

Redis数据Nosql的一种,主要用来做缓存的

1、特点:

  1. 开源免费的
  2. 支持高并发,读取速度非常快
  3. 存储的数据是放在内存和磁盘上的
  4. 支持多种类型的客户端进行访问(Java、C、PHP…)
  5. 支持集群部署

2、使用场景

  1. 中央缓存(主要使用场景,减轻数据库压力,减少访问时间,redis就是将数据放在存放在内存中)
  2. 计数器(点赞量、转发量)
  3. 实时防攻击系统
  4. 设定有效期的应用
  5. 自动去重
  6. 消息订阅系统

3、MySQL与Redis对比

mysqlredis
类型关系型非关系型
存储位置磁盘磁盘和内存
存储过期不支持支持
读写性能非常高

三、安装认识Redis

中文官网下载:http://redis.cn/

但是需要注意,在官网上下载的是Linux系统下的,Windows系统下的需要在GitHub中去下载:https://github.com/microsoftarchive/redis/releases

绿色软件可以解压后直接使用

Redis文件夹中的文件介绍:

image-20201214200152124

(重点)Redis存储值支持的解构:

首先要明确Redis都是以字符串的形式进行存储的,而Redis存储的解构仅仅是指摆放这些数据(字符串)的规则

五类:String、List、Set、ZSet(有序但不重复)、Hash

四、使用redis-cli 客户端操作redis

首先明确指令是学不完的,这里只列举常用的,剩下的可以在官网进行查询

image-20201214202405430

1、启动窗口

在Redis文件夹中进入dos窗口

启动服务:redis-server.exe-------->启动服务端

image-20201214202717136
启动客户端(需要再开启一个dos窗口):redis-cli.exe-------->启动客户端

image-20201214202959030

上面就是最基本的一个Redis启动,但是我们用过MySQL都知道,应该是会有用户名与密码的,所以我们需要进行设置,此时在Redis核心配置文件中开启密码并设置,也可以修改端口号,但是不建议!

image-20201214203218370
需要重启服务端,同时运行我们的设置文件:redis-server.exe redis.windows.conf

再次连接客户端后:auth 设置的密码-------->默认端口6379,本机的Redis中

image-20201214203323802
正常连接客户端是:redis-cli.exe -h 127.0.0.1 -p 6379

image-20201214204053764

2、redis对String的操作

set key value-------->设置单个key和value的值

get key-------->通过指定的key获取value的值

mset key1 value1 key2 value2 ......-------->一次设置多个key和value的值

mget key1 key2 key3...-------->一次获取多个key和value的值

image-20201214205031167

3、redis对Key的操作

keys *-------->查询当前库中的所有key值

del key1 key2...-------->根据key删除对应的键值对

expire key seconds-------->设置指定key,value的有效期,seconds单位是秒

ttl key-------->查询指定key,value得有效期(-1:永久存储;>0:存储指定得秒;-2:该键值对不存在)

incr key-------->自增+1(对应得值bicultural是整数类型得字符串)

decr key-------->自减+1(对应得值bicultural是整数类型得字符串)

incrby key num-------->自增num个数(对应得值bicultural是整数类型得字符串)

decrby key num-------->自减num个数(对应得值bicultural是整数类型得字符串)

image-20201214223152787

4、redis对库的操作

redis总共有16个库,默认选中的是第一个库(索引0)

select index-------->选中指定得库

flushdb-------->清空当前库

flushall-------->清空所有库

image-20201214223352856

5、redis对List的操作

lpush key val1 val2 val3...-------->从左进行添加value,在redis中得顺序是val3 val2 val1

rpush key val1 val2 val3-------->从右进行添加value,在redis中得顺序是val1 val2 val3

lindex key index-------->根据索引查找指定的值(查找单个值)

lrange key begin end-------->查询指定范围的值(查找多个值)

image-20201214224426074

lrem key count value-------->删除集合

  • count=0: 删除集合中所有value值
  • count>0: 删除集合中指定value的值,从左向右开始删除,删除count个
  • count<0: 删除集合中指定value的值,从右向左开始删除,删除count个

lpop key-------->移除并返回列表 key 的头(最左边)元素

rpop key-------->移除并返回列表 key 的尾(最右边)元素

image-20201214224908882

6、redis对Set的操作

sadd key val1 val2 val3...-------->添加指定的数据

smembers key-------->查看集合中所有的成员

srem key val1 val2-------->

image-20201214225519014

7、redis对Hash的操作

hset key field1 value1-------->根据key设置hash一对值

hget key field1-------->在hash中根据指定的字段获取对应的值

hmset key filed1 value1 field2 value2....-------->批量设置值

hmget key field1 field2...-------->在hash中根据多个field获取多个值

hkeys key-------->获取hash中所有的键

hvals key-------->获取hash中所有的值

hgetall key-------->获取hash中的键和值

image-20201214230000180

8、redis对ZSet的操作

因为不常用,所以这里不列举,可以自行查看官网得命令说明

五、java操作Redis

1、创建项目并导包

在Idea中创建普通的Java项目

导入要使用得连接池包与jedis包

image-20201214230324763

导入jar创建一个lib目录,并且进行添加jar包(Add as Library

2、简单的配置——连接

public class JedisTest {
    @Test
    public void getJedis(){
        /*创建连接,设置ip、端口号、以及超时时长*/
        String host = "127.0.0.1";
        Integer port = 6379;
        Integer timeout = 1000;//1秒就超时
        /*创建jedis对象*/
        Jedis jedis = new Jedis(host,port,timeout);
        /*执行操作,输入密码*/
        jedis.auth("652301");
        /*进行操作*/
        jedis.set("name", "张三");
        String name = jedis.get("name");
        System.out.println(name);
        /*关闭资源*/
        jedis.close();
    }
}

3、连接池配置

步骤:

  • 创建jedispool配置对象
  • 做相应的一些配置(最大连接数、最大等待时间、验证是否连接成功…)
  • 创建连接池对象
  • 从连接池中获取连接对象
  • 执行操作
  • 释放连接
@Test
    public void getJedisPool(){
        /*1、获取连接池配置对象*/
        JedisPoolConfig config = new JedisPoolConfig();
        /*2、进行配置*/
        config.setMaxIdle(2);//闲事最大连接
        config.setMaxTotal(10);//最大连接
        config.setMaxWaitMillis(1*1000); //创建连接超时
        config.setTestOnBorrow(true);//获取连接是测试连接是否畅通
        /*3、创建连接池对象*/
        JedisPool jedisPool = new JedisPool(config,"127.0.0.1",6379,2000,"652301");
        /*4、获取连接对象*/
        Jedis jedis = jedisPool.getResource();
        /*5、进行操作*/
        jedis.lpush("users", "张三", "王五", "赵四", "钱六");
        List<String> users = jedis.lrange("users", 0, -1);
        for (String s : users) {
            System.out.println(s);
        }
        /*6、释放连接资源*/
        jedis.close();
    }

4、工具类方式 JedisUtils

实际开发中会对连接池进行抽取

/*使用枚举限制单例模式,因为每个项目只需要一个该实例对象*/
public enum  JedisUtil {
    INSTAMCE;
    JedisPool jedisPool = null;
    static {
        JedisPoolConfig config = new JedisPoolConfig();
        /*2、进行配置*/
        config.setMaxIdle(2);//闲事最大连接
        config.setMaxTotal(10);//最大连接
        config.setMaxWaitMillis(1*1000); //创建连接超时
        config.setTestOnBorrow(true);//获取连接是测试连接是否畅通
        /*3、创建连接池对象*/
        JedisPool jedisPool = new JedisPool(config,"127.0.0.1",6379,2000,"652301");
    }

    /**
     * 获取连接资源
     * @return
     */
    public Jedis getJedis(){
        return jedisPool.getResource();
    }

    /**
     * 释放资源
     * @param jedis 需要释放的redis
     */
    public void closeJedis(Jedis jedis){
        if (jedis!=null){
            jedis.close();
        }
    }

    /**
     * 常规的设置值
     * @param key
     * @param val
     */
    public void set(String key , String val){
        Jedis jedis = null;
        try {
            //获取资源
            jedis = this.getJedis();
            //进行操作
            jedis.set(key, val);
        } catch (Exception e) {
            e.printStackTrace();
        }finally {
            this.closeJedis(jedis);
        }
    }

    /**
     * 带超时时间的设置值
     * @param key
     * @param val
     * @param timeout
     */
    public void set(String key , String val ,Integer timeout){
        Jedis jedis = null;
        try {
            //获取资源
            jedis = this.getJedis();
            //进行操作,并且设置超时时间
            jedis.setex(key, timeout,val);
        } catch (Exception e) {
            e.printStackTrace();
        }finally {
            this.closeJedis(jedis);
        }
    }

    /**
     * 从redis中取值
     * @param key
     * @return
     */
    public String get(String key){
        Jedis jedis = null;
        try {
            jedis = this.getJedis();
            return jedis.get(key);
        } catch (Exception e) {
            e.printStackTrace();
        }finally {
            this.closeJedis(jedis);
        }
        return null;
    }
}

六、面试题

1、Redis持久化配置

Redis 提供了两种不同级别的持久化方式:RDB和AOF,可以通过修改redis.conf来进行配置.

两种方式使用的场景有所不同,但是只能选择其中一种:

RDB 持久化可以在指定的时间间隔内生成数据集的时间点快照,默认开启该模式.

AOF 持久化记录服务器执行的所有写操作命令,并在服务器启动时,通过重新执行这些命令来还原数据集,默认关闭该模式。

RDB用于大量数据进行缓存时;而数据量不多时我们可以使用AOF

image-20201215002851852

2、淘汰策略

为什么要淘汰:

淘汰一些数据,达到redis数据都是有效的,节约内存资源。选择合适的淘汰策略进行淘汰

①、从设置了过期时间的数据中挑选最少使用的数据进行淘汰

②、从设置了过期时间的数据中挑选即将过期的数据进行淘汰

③、从所有数据中挑选最近最少使用的数据进行淘汰

④、驱逐数据(内存满了后,之后的数据就不会放到缓存中)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值