NoSql和Redis

时间:2021-12-10 05:06:10

1.NoSQL

a)       指一些非关系型的数据库.读写性能高,存储会有过期,数据存放于内存中

b)       分类

                     i.            键值数据库

                   ii.            列存储数据库

                  iii.            文档型数据库
redis和memcached是key-value的Nosql,主要用来做缓存的

2.Redis

a)       高性能的开源的菲关系型数据库,数据保存在内存里面或者磁盘里面

b)       Redis 是以key-value形式存储,和传统的关系型数据库不一样。不一定遵循传统数据库的一些基本要求,比如说,不遵循sql标准,事务,表结构等等,redis严格上不是一种数据库,应该是一种数据结构化存储方法的集合。数据结构:数组,list,set,map等redis提供了一下操作方法,我们使用这些方法就可以对存入字符串,组织成各种类型数据库结构(string,list,set,map等).

c)        Redis数据库的优势

                     i.            数据存储:存放在内存,还支持持久化.-存取速度快,并发能力强,数据安全性高
还支持集群(主从同步) (支持高并发,海量数据), 数据可以主服务器向任意数量从的从服务器上同步,从服务器可以是关联其他从服务器的主服务器。

                   ii.            它支持的存储值的类型

  1. String,list,set,sorted set,hash
  2. 支持集群(支持主从同步)
  3. 支持持久化

d)       使用场景

                     i.            缓存: 对于经常查询的数据,将其放到Redis里面,会提高查询效率,减少数据库压力

                   ii.            计数器引用:微信点赞数量

                  iii.            实时攻防系统

                  iv.             

e)       Redis服务器的安装

                     i.            启动Redis服务

  1. 手动启动:在安装目录下启动双击双击redis-service.exe
  2. Cmd启动:

                   ii.            Redis客户端操作Redis

  1. 对value为字符串(String) 操作

a)       设置单个键值:set

b)       设置多个键值:mset

  1. 对key的操作

a)       Keys:获取所有的key列表

b)       Del key:删除key值

c)        expire key xx //设置key的过期时间(xx秒后过期)

d)       ttl key:查看key 的过期时间

e)       flushall:清除Redis数据库的所有数据

f)        flushdb  :清除当前库的数据,Redis默认是16个数据库0,1….15

  1. 对list集合的操作
    rdis怎么实现栈(FILO)和队列(FIFO)???
    list控制同一边进,同一边出就是栈
    list控制一边进一边出就是队列
  2. 对Set集合的操作
  3. 对SortedSet(有序集合)的操作
  4. 对hash类型的操作
  5. Redis设置密码

a)       通过命令设置密码
CONFIG SET 命令可以动态地调整 Redis 服务器的配置而无须重启,重启后失效

CONFIG SET requirepass 123456 //将密码设置为123456

CONFIG SET requirepass "" //清除密码

AUTH 123456  //输入密码进行认证

b)       修改Redis的配置文件设置密码
在配置文件redis.widows.conf中增加一行代码

requirepass 123456

将密码123456设置到配置文件中,redis启动时加载该文件,即可启用密码

3.Java操作Redis服务器使用Jedis客户端

a)       Jedis简单操作
导入jedis的包
@Test
public void test()throws Exception{
    //创建连接Redis服务器
   
String host ="127.0.0.1";
    int port = 6379;
    int timeout = 1000;//超时时间,1秒超时
   
Jedis jedis = new Jedis(host,port,timeout);
//密码认证
    jedis.auth("admin");
    //执行操作,设置key和value值.
   
jedis.set("yhptest","yhptest dbl!");
    System.out.println(jedis.get("yhptest"));
    //关闭连接
   
jedis.close();
}

b)       连接池配置

                     i.            通过jedis连接池,简单操作Redis数据库
/思想:如果创建一个对象后需要为他设置很多值,还不如先创建它配置对象并做完配置,然后再通过配置对象创建它
//1 创建jedispool配置对象
//2 做配置-四个
//3 创建jedispool
//4 通过jedispool获取连接
//5 执行操作
// 6 释放连接
// 7 摧毁连接池-如果是真正项目中它应该是一个受spring管理的单例
@Test
public void test()throws Exception{
    //1 创建jedispool配置对象
   
JedisPoolConfig config = new JedisPoolConfig();
    //2 做配置-四个
   
config.setMaxIdle(2);
    config.setMaxTotal(10);
    config.setMaxWaitMillis(1*1000); //创建连接超时
   
config.setTestOnBorrow(true);//获取连接是测试连接是否畅通
    //3 创建jedispool
    //1*1000 获取连接超时时间
   
JedisPool pool = new JedisPool(config,
            "127.0.0.1",6379,1*1000,"admin");
    //4 通过jedispool获取连接
   
Jedis jedis = pool.getResource();
    //5 执行操作
   
jedis.set("jedispooltest","dbldblddzt.....");
    System.out.println(jedis.get("jedispooltest"));
    // 6 释放连接
   
jedis.close(); //底层做了兼容,如果是连接池操作就是释放,如果是连接操作就是关闭
    // 7 摧毁连接池-如果是真正项目中它应该是一个受spring管理的单例
   
pool.destroy();
}
总结:先创建Jedis连接池配置对象,然后创建连接池,创建连接池的时候传入连接池配置对象,redis存放的ip地址,Redis端口号,设置连接超时时间和操作Redis的用户,连接池获取到jedis对象,jedis对象操作服务器.关闭连接池和jedis对象

c)        Jedis数据结构的操作

                     i.            Key值操作

                   ii.            String操作

                  iii.            List操作

                  iv.            Set操作

                   v.            Hash操作

                  vi.            事务处理

                 vii.            排序

  1. 数字集合是通过调用desc和asc方法排序
  2. 字符串字母是通过调用alpha方法进行参数排序.
  3. Redis持久化配置

a)       两种持久化的方式

                     i.            RDB和AOF,可以通过修改Redis的conf配置文件进行配置

                   ii.            服务器启动执行载入程序à判断是否开启了AOF的持久化,开启了就载入AOF的文件,未开启就载入RDB的文件

                  iii.            RDB模式

  1. RDB模式可以在指定的时间间隔内生成数据集的时间点快照,默认是开启RDB模式的,
  2. 如何关闭默认开启的RDB持久化方式:在Redis.conf文件里面将在指定时间生成数据集的时间快照进行一个注释,如果中途突然断电,无法持久化到磁盘
    save ""

  # save 900 1   //至少在900秒的时间段内至少有一次改变存储同步一次

  # save xxx

  # save 60 10000

     iv.            AOF模式

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

a)       appendonly yes         //yes 开启,no 关闭

# appendfsync always //每次有新命令写时就执行一次fsync 同步

#这里我们启用 everysec

appendfsync everysec //每秒 fsync同步 一次

# appendfsync no      //从不fsync(交给操作系统来处理,可能很久才执行一次fsync),它的参数请大家看redis.conf配置文件详解

     v.            小结:Redis是怎么保存数据的.

  1. redis为了考虑效率,保存数据在内容中.并且考虑数据安全性,还做数据持久化,如果满足保存策略,就会把内存的数据保存到数据rdb文件,还来不及保存那部分数据存放到aof更新日志中。在加载时,把两个数据做一个并集.
  2. Redis的淘汰策略:选择合适的数据进行淘汰

volatile-lru:从已设置过期时间的数据集(server.db[i].expires)中挑选最近最少使用的数据淘汰

volatile-ttl:从已设置过期时间的数据集(server.db[i].expires)中挑选将要过期的数据淘汰

volatile-random:从已设置过期时间的数据集(server.db[i].expires)中任意选择数据淘汰

allkeys-lru:从数据集(server.db[i].dict)中挑选最近最少使用的数据淘汰

allkeys-random:从数据集(server.db[i].dict)中任意选择数据淘汰

no-enviction(驱逐):禁止驱逐数据

redis 确定驱逐某个键值对后,会删除这个数据并,并将这个数据变更消息发布到本地(AOF 持久化)和从机(主从连接)。