NoSQL-Redis基本使用


NoSQL的概念

什么是NoSQL

NoSQL(不仅仅是SQL not only SQL),泛指非关系型的数据库。随着互联网wen2.0网站的兴起,传统的关系数据库在处理web2.0网站,特别是超大规模和高并发的SNS类型的web2.0纯动态网站已经显得力不从心,出现了很多难以克服的问题,而非关系型的数据库则由于其本身的特点得到了非常迅速的发展。NoSQL数据库的产生就是为了解决大规模数据集合多重数据种类带来的挑战,尤其是大数据应用难题;

  • NoSQL它是非关系型数据库
  • NoSQL 解决网站里面 大数据和高并发的问题(SNS社交网络上面/电商/12306)

Nosql数据库的分类(特点)

key-value(键值对形式)型 nosql数据库 – 典型代码 redis

列式存储型, 文档型 ,图表型(了解)
在这里插入图片描述

Redis的认识

Redis概念

  • Redis 是一个高性能的 开源的、C语言写的Nosql(非关系型数据库),数据保存可以存储在内存中或者磁盘

  • Redis 是以key-value形式存储,和传统的关系型数据库不一样。不一定遵循传统数据库的一些基本要求,比如说,不遵循sql标准,事务,表结构等等,redis严格上不是一种数据库,应该是一种==数据结构化存储方法的集合==。–数组 list set map

    • 数据结构:数组,list,set,map

    • Redis 主要key-value结构形式存储,redis底层支持各种类型的数据存储结构

      包括 list set map(hash) string等

Redis特点(优势)

  1. 数据保存在内存,存取速度快,并发能力强
  2. 支持的类型相对较多 :包括String(字符串),list(链表),set(集合),zset(sorted set – 有序集合)和hash(哈希类型)
  3. 支持磁盘存储 – 完成持久化操作(aof rdb)
  4. 支持数据的过期 --设置过期时间 expire
  5. 支持集群(主从同步)操作 – 数据可以从主服务器向任意数量从的从服务器上同步,从服务器可以是关联其他从服务器的主服务器
  6. 支持订阅和发布
  7. redis的出现,很大程度补偿了memcached这类key/value存储的不足,在部分场合可以对关系数据库(如MySQL)起到很好的补充作用。
  8. 它提供了Java,C/C++,C#,PHP,JavaScript等客户端,使用很方便

Redis 和 Memcache的比较

MySQL Redis Memcached
类型 关系型 非关系型 非关系型
存储位置 磁盘 磁盘和内存 内存
存储过期 不支持 支持 支持
读取性能 非常高 非常高

>>>>>>>>>面试题

Redis 和 Memcache的区别

不同点

  1. 存储方式不同,Memcache 是把数据全部存在内存中,数据不能超过内存的大小,断电后数据库会挂掉。Redis 有部分存在硬盘上,这样能保证数据的持久性。

  2. 数据支持的类型不同 memcahe 对数据类型支持相对简单,redis 有复杂的数据类型。

  3. 使用底层模型不同 它们之间底层实现方式 以及与客户端之间通信的应用协议不一样。Redis 直接自己构建了 VM 机制 ,因为一般的系统调用系统函数的话,会浪费一定的时间去移动和请求。

  4. 支持的 value 大小不一样 redis 最大可以达到 1GB,而 memcache 只有 1MB。

相同点

memcache和redis 都是 key-value 非关系型数据

Redis使用场景

  1. redis使用最多的地方 就是缓存 --(内存最多)

  2. 可以处理大数据量的计数问题 --(微博转发 点赞)

  3. 实时的攻防系统

  4. 有效期应用 – 优惠劵

  5. 自动去重应用 – set

  6. 队列的结构 – (FIFO) (list存储) -->消息队列(RabbitMQ) --地铁

  7. 消息订阅和发布

Redis 使用

安装

直接下载下来解压

https://github.com/microsoftarchive/redis/releases

文件夹中的文件说明

在这里插入图片描述

启动Redis服务

带配置文件启动

reids-server.exe redis.windows.conf

连接到redis进行操作

cmd>{%redis%}/redis-cli -h ip地址 -p 端口号

ip 默认为本地 -p 默认6379

cmd>{%redis%}/redis-cli

Redis的使用

String操作(重要)

设置值和获取值

set key value

get key

同时设置一个或多个 key-value 对

mset

返回所有(一个或多个)给定 key 的值

mget

在这里插入图片描述

将 key 中储存的数字值增1(key不存在,则初始化为0,再加1)

incr key

将 key 中储存的数字值减1(key不存在,则初始化为0,再减1)

decr key

自定义自增数量和自减数目

incrBy / decrBy

在这里插入图片描述

key操作(重要)

获取所有key列表

keys *

删除key

del key

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

expire key second

查看key的过期时间

ttl key

清空整个redis服务器数据,所有的数据库全部清空

flushall

清除当前库,redis中默认有16个数据库,名称分别为0,1,2…15

在这里插入图片描述

list操作(重要)

list集合可以看成是一个左右排列的队列(列表)

将一个或多个值 value 插入到列表 key 的表头(最左边/最右边)

lpush key value / rpush key value

移除并返回列表 key 的头(最左边/最右边)元素

lpop key / rpop key

返回列表 key 中指定区间内的元素,查询所有的stop为-1即可

lrange key start stop

根据count值移除列表key中与参数 value 相等的元素 count > 0 : 从表头开始向表尾搜索,移除与 value 相等的元素,数量为 count 。count < 0 : 从表尾开始向表头搜索,移除与 value 相等的元素,数量为 count 的绝对值。count = 0 : 移除表中所有与 value 相等的值

lrem key count value

在这里插入图片描述
返回列表 key 中,下标为 index 的元素

lindex key index

对一个列表进行修剪

ltrim key start stop

Quene(list)

存放都是字符串,由redis组织成各种数据结构

redis怎么实现栈(FILO)和队列(FIFO)

list控制同一边进,同一边出就是栈

list控制一边进,另一边出就是队列.

set操作(重要)

set集合是一个无序的不含重复值的队列

将一个或多个 member 元素加入到集合 key 当中,已经存在于集合的 member 元素将被忽略

sadd key member

移除集合 key 中的一个或多个 member 元素,不存在的 member 元素会被忽略

srem key member

返回集合 key 中的所有成员

smembers key

在这里插入图片描述

hash操作(重要)

添加一个name=>value键值对到key这个hash类型

hset key name value

获取hash类型的name键对应的值

hget key name

批量添加name=>value键值对到key这个hash类型

hmset key name1 key1 name2 key2

批量获取hash类型的键对应的值

hmget key name1 name2

返回哈希表 key 中的所有键

hkeys

返回哈希表 key 中的所有值

hvals

返回哈希表 key 中,所有的键和值

hgetall

Redis 订阅 事务(了解)

设置密码

–通过配置文件操作(掌握)

  1. 通过命令动态调整密码

    CONFIG SET 命令可以动态地调整 Redis 服务器的配置而无须重启,重启后失效
    CONFIG SET requirepass 123456 //将密码设置为123456
    CONFIG SET requirepass "" //清除密码
    AUTH 123456  //输入密码进行认证
    

在这里插入图片描述

  1. 在配置文件redis.widows.conf中增加一行代码
在配置文件redis.widows.conf中增加一行代码
requirepass 123456
将密码123456设置到配置文件中,redis启动时加载该文件,即可启用密码

在这里插入图片描述

java代码操作Redis(重要)

jar包

在这里插入图片描述

springboot (连接方式 – 只需要做配置) jedis

简单操作

 String host = "127.0.0.1";
 int port = 6379;
 int timeout = 1000;
 Jedis jedis = new Jedis(host, port, timeout);
 String set = jedis.set("name", "一一");
 System.out.println(jedis.get("name"));
 jedis.close();

连接池配置

在这里插入图片描述

如果创建一个对象后需要为他设置很多值,还不如先创建它配置对象并做完配置,然后再通过配置对象创建它

//1 创建jedispool配置对象
//2 做配置-四个
//3 创建jedispool
//4 通过jedispool获取连接
//5 执行操作
//6 释放连接
//7 摧毁连接池-如果是真正项目中它应该是一个受spring管理的单例

//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 resource = pool.getResource();

//5 执行操作
String s = resource.set("name", "这是一个测试");
System.out.println(resource.get("name"));

对key 操作

//查询所有的key   keys *
Set<String> keys = resource.keys("*");
System.out.println(keys);

对String操作 存值和取值

String s1 = resource.set("name", "一一");
System.out.println(resource.get("name"));

清空数据库

resource.flushDB();

对list集合操作

resource.lpush("stu","{name:yiyi}","{name:erer}","{name:sasa}" );
//0, -1  表示全部
List<String> stu = resource.lrange("stu", 0, -1);
System.out.println(stu);

对set集合操作

resource.sadd("stu","{name:yiyi}","{name:erer}","{name:sasa}" );
Set<String> stu = resource.smembers("stu");
System.out.println(stu);

对hash(map)集合操作

HashMap map = new HashMap();
map.put("name","yiyi");
map.put("age","18");
map.put("sex","true");
resource.hmset("user1",map);

List<String> hmget = resource.hmget("user1", "name", "age", "sex");
System.out.println(hmget);

sort排序操作 对数字

resource.lpush("num", "2","1","6","4","8","3");
System.out.println(resource.sort("num"));

SortingParams sortingParams = new SortingParams();
sortingParams.desc();
System.out.println(resource.sort("num", sortingParams));

字母的排序 根据ASCII码 (根据首字母)

resource.lpush("area","Chengdu","Changsha","Wuhan","Guangzhou");
SortingParams sortingParams1 = new SortingParams();
sortingParams1.alpha();
System.out.println(resource.sort("area", sortingParams1));

事务操作

Transaction multi = resource.multi();
multi.set("name","yiyi");
multi.set("age","21");
multi.incr("name");
multi.incr("age");
List<Object> results = multi.exec();
System.out.println(results);

资源释放

// 6 释放连接
jedis.close(); //底层做了兼容,如果是连接池操作就是释放,如果是连接操作就是关闭
// 7 摧毁连接池-如果是真正项目中它应该是一个受spring管理的单例
pool.destroy();

Redis持久化(重要)

为什么需要持久化?

​ 防止数据丢失

怎么持久化?

​ 磁盘存储 和 内存磁盘

简介

在这里插入图片描述

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

在这里插入图片描述

RDB模式

RDB 持久化可以在指定的 时间间隔内 生成数据集的时间点快照,默认开启该模式.
如何关闭 rdb 模式:
save ""
# save 900 1        //至少在900秒的时间段内至少有一次改变存储同步一次
# save xxx
# save 60 10000

AOF追加模式

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

如何开启aof模式:

appendonly yes //yes 开启,no 关闭

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

#这里我们启用 everysec

appendfsync everysec //每秒 fsync 一次

# appendfsync no //从不fsync(交给操作系统来处理,可能很久才执行一次fsync)

其它的参数请大家看redis.conf配置文件详解

淘汰策略

为什么要淘汰数据

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

怎么淘汰

什么时候才淘汰数据: --》

内存到一定极限的时候,这个时候,需要淘汰数据

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

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

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

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

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

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

  6. no-enviction(驱逐):禁止驱逐数据 --永存 热点数据

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

redis 数据淘汰策略与配置

发布了54 篇原创文章 · 获赞 9 · 访问量 860

猜你喜欢

转载自blog.csdn.net/qq_40629521/article/details/103997457
今日推荐