一、 Nosql
NoSql 是非关系型数据库,Nosql产品是传统关系数据库的严格版本,通过减少用不到或很少用到的功能来提高产品的性能。
- 不i遵循SQL标准(添加insert修改updata)
- 不支持ACID
- 远超于SQL的性能
二、起源
过去,关系型数据库(sql,oracle,mysql)是持久化的唯一选择,但随着发展,关系型数据库存在以下问题。
问题1:不能满足高性能查询需求
我们使用:JAVA、Net等语言编写程序,是面向对象的。但用数据库都是关系型数据
库。存储结构是面向对象的,但是数据库确实关系的,所以在每次存储或者查询数据时,我们都需要做转换。类似Hibernate、MybatisxORM框架确实可以见简化这个过程,但是在对高性能查询需求时,这些ORM框架就捉襟见肘。
问题2:应用程序规模的变大
网络应用程序的规模变动大,需要存储更多的数据、服务更多的用户以及需求更多的计算能力。为了应对这种情形,我们需要不停的扩展。
扩展分为两类:一种是纵向扩展,即购买更好的机器、更多的磁盘、更多的内存等。另一种是横向扩展,即购买更多的机器组成集群。在巨大的规模下,纵向扩展发挥的作用不是很大。首先单机器性能提升需要巨额的开销并且有着性能的上限,在 Google 和 Facebook 这种规模下,永远不可能使用一台机器支撑所有的负载。鉴于这种情况,我们需要新的数据库,因为关系数据库并不能很好的运行在集群上。
三、NoSQL的使用
- 对数据高并发的读写
- 海量数据的读写
- 对数据高可扩展性的
秒杀活动
NoSQL不适用场景
- 需要事务支持
- 基于 sql 的结构化查询存储,处理复杂的关系,需要关系查询。
用不着 sql 的和用了 sql 也不行的情况,考虑用 NoSql
四【熟悉】常见的NoSQL及区别
1.常见的NoSQL数据库
(name:“gdjsfahgdsa,age:12)
临时性键值存储 | 永久性键值存储 | 面向文档的数据库 | 面向列的数据库 |
Memcached | Tokyo Tyrant | MangoDB | Cassandra |
Redis | Flare | CouchDB | HBase |
ROMA | HyperTable | ||
Redis |
2.区别
1.Memcached
- 很早出现的NoSql数据库
- 数据都在内存中,一般不持久化
- 支持简单的key-value模式,支持类型单一
- 一般是作为缓存数据库辅助持久化的数据库(MySQL)
2.Redis
- 几乎覆盖了Memcache的绝大部分功能
- 数据库都在内u吃那种,支持持久化,主要用作备份恢复
- 除了支持简单的Key-value模式,还支持多种数据结构的存储,比如list、set、hash、zset等
- 一般是作为缓存数据库辅助持久化的数据库
3,MongoDB
- 高性能、开源、模式自由(schema free)的文档型数据库
- 数据都在内存中, 如果内存不足,把不常用的数据保存到硬盘
- 虽然是 key-value 模式,但是对 value(尤其是 json)提供了丰富的查询功能
- 支持二进制数据及大型对象
- 可以根据数据的特点替代 RDBMS,成为独立的数据库。或者配合 RDBMS,存储特定的数
五、熟悉 Redis简介
官网文档
1.Redis简介
- Redis是一个开源的key-value存储系统。
- 和Memcached类似,它支持存储的value类型相对更多,包含string(字符串),list(链表),set(集合),zset(sorted set --有序集合)和hash(哈希类型)。
- 这些数据类型都支持push/pop、add/remove及取交集和并集和差集更丰富的操作,而这些操作都是原子性的。
- 再次基础上,Redis支持各种不同方式的排序。
- 与memcached一样,为了保证效率,数据都是缓存在内存中。
- 区别是Redis会周期性的吧更新的数据写入磁盘或者把修改操作写入最佳的记录文件。
- 并且在此基础上实现了master-slave(主从)同步。
2.端口6379
redis 的作者 Salvatore Sanfilippo(Antirez),意大利人,Antirez 现在已经 40 多岁了,依然奋斗在代码一线,为开源社区做贡献。Antirez 出生在非英语系国家,所以英语一直是他的短板。他曾经写过一篇博文,《英语伤痛 15 年》,以自己的实际经历鼓励非英语系国家的程序员突破英语障碍。或说回来,在他的另一篇博文《Redis as an LRU cache》中,写到了为什么选用 6379 端口:而 Merz 全名 Alessia Merz,是意大利的一位广告女郎,在 Antirez 看来,这个名字是愚蠢的代名词,所以就选了这个 6379.
3.redis数据结构的多样性
最新N个数据 ← 通过list实现按自燃事件排序的数据
排行榜,TOpN ← 利用zset(有序集合)
时效性的数据,比如手机验证码 ← Expire过期
计数器,秒杀 ← 原子性,自增方法INCR、DECR
去除大量数据中的重复数据 ← 利用set集合
构建队列 ← 利用list集合
发布订阅消息系统 ← pub/sub模式
4、Redis的应用场景
1、数据缓存(提高访问性能)
查询概率》》 增删改的概率
将一些数据在短时间之内不会发生变化,而且它们还要被频繁访问,为了提高用户的请求速度和降低网站的负载,降低数据库的读写次数,就把这些数据放到缓存中。
2、会话缓存
session cache,主要适用于 session 共享 (string 类型)
3、排行榜/计数器
(NGINX+lua+redis 计数器进行 IP 自动封禁)(zset)
4、消息队列
(构建实时消息系统,聊天,群聊) (list)
5· 粉丝 (set)
用于存储对象 (hash)
面试题
string :会话信息
list:消息
set:粉丝 共同好友
zset :排行榜
hash: 存储对象
六、Redis的安装及启动停止
1.下载安装weget
yum -y install wget
2.下载redis的压缩包
3.开始安装
1.安装的时候先安装redis所依赖的环境
yum -y install gcc-c++
2.开始解压redis
tar -zxvf redis-5.0.14.tar.gz
3.编译,进入rediss解压目录,执行make命令编译
4.安装
make install PREIX=/usr/redis(如果不加prefix默认安装到/usr/local下面)
5.安装成功之后查看redis在哪里安装
wihch redis-server
6.启动redis
进入安装目录下的bin下面,并启动redis
./redis-server
这样就安装成功了,不过这种启动方式需要一直打开窗口不能进行其他操作,不太方便可以按ctrl+c可以关闭窗口,解决方法修改配置文件
4.修改配置文件
1.拷贝配置文件到安装目录的bin下
cp redis.conf /usr/redis/bin
2.修改redis.conf文件
1.设置密码
requirepass zhang #配置密码 如果需要 客户端连接的话需要设置密码如果不需要链接就不要设置
先进入 刚拷贝过来的redis.conf文件中
vim redis.conf
set nu : 可以显示行号
在第294行添加requirepass 自己的密码
2.设置远程连接
在配置文件第69行
bind 127.0.0.1 改成 bind 0.0.0.0
3.关闭保护模式
在配置文件第88行将protected-mode yes 改为 protected-mode no
配置完成后exc :wq保存并退出
3.启动redis
./redis-server ./redis.conf 刷新配置文件同时启动redis
再打开一个窗口
连接redis
./redis -cli -a zhang
这样就连接上了,不过这样有点麻烦每次开启都需要切换到/usr/redis/bin下开启redis和每次都要打开两个窗口这样浪费了时间有时候还会忘记,我们可以直接配置开机自启动来解决这个问题
4.配置开机自启动
先切换目录到/lib/systemd/system后创建一个脚本文件redis.service,
vim进入脚本添加以下内容
[Unit]
Description=Redis
After=network.target
[Service]
ExecStart=/usr/redis/bin/redis-server /usr/redis/bin/redis.conf
ExecStop=/usr/redis/bin/redis-cli -h 127.0.0.1 -p 6379 -a zhang shutdown
[Install]
WantedBy=multi-user.target
刚配置的服务需要让systemctl能识别,就必须刷新配置,以下是操作systemctl的一些命令
systemctl daemon-reload 刷新配置
systemctl enable redis 开机自启
systemctl status redis redis 状态
systemctl start redis 开启 redis
systemctl stop redis 关闭 redis
systemctl disable redis 禁止开机自启
先刷新配置,设置完开机自启动后查看状态,如果出现以下情况,这是配置完文件后没有重启导致的,请重启后再查看,如变成图二就代表配置成功,这时还没成功就代表配置文件可能出错请根据提示信息查看配置文件的错误更改完成后在运行查看。
七、连接
这时就可以使用redis插件进行远程连接如Another Redis Desktop Manager软件等
1.现在虚拟机运行redis-cli 连接 redis
先进入安装目录的bin下面运行./redis-cli -h 192.168.192.34 -p 6379 -a zhang
然后用软件进行远程连接
这样就连接成功
八.Key
默认 16 个数据库,类似数组下标从 0 开始,初始默认使用 0 号库
dbsize 查看当前数据库的 key 的数量
flushdb 清空当前库
flushall 通杀全部库
keys * 获取当前库中的所有key
select 0 选择第一个库
move key 1 将当前的数据库 key 移动到某个数据库,目标库有,则不能移动
randomkey 从当前数据库中随机返回
type key 类型
del key 删除 key
exists key 判断是否存在 key
expire key 10 为给定的key设置过期时间 单位是秒
pexpire key 1000 给定的key设置过期时间 单位:毫秒
persist key 删除key的过期时间
ttl key 查看还有多少秒过期,-1 表示永不过期,-2 表示已过期
数据类型:
String:
set <key><value>添加键值对
*NX:当数据库中key不存在时,可以将key-value添加数据库
setnx <key><value>
*XX:当数据库中key存在时,可以将key-value添加数据库,与NX参数互斥
setxx <key><value>
*EX:key的超时秒数
setex<key> <time><value>
*PX:key的超时毫秒数
示例:get name
get <key>查询对应键值
getset value 将旧值替换成value 并且返回旧值
九、作业
1.java连接redis
1.先创建maven项目
2.在pom文件中添加依赖
<dependencies> <dependency> <groupId>redis.clients</groupId> <artifactId>jedis</artifactId> <version>3.2.0</version> </dependency> </dependencies>
3.创建测试类
在main方法中 创建 jedis对象填入自己虚拟机的ip地址
Jedis jedis = new Jedis("192.168.192.34");
然后根据edis的auth方法传入密码
jedis.auth("zhang");
2.添加key和value
用jedis的set方法添加key和value值
jedis.set("lianj","111"); System.out.println(jedis.get("lianj"));
3.设置过期时间
用jedis中的setex方法设置过期时间为10秒,10秒后自动消失 jedis.setex("time",10,"10秒消失");
等十秒后刷新time就会消失