前言
一、什么是nosql
NoSQL(最初表示Non-SQL,后来有人转解为Not only SQL),是对不同于传统的关系数据库的数据库管理系统的统称。
NoSQL(not only sql不仅仅是sql),泛指非关系型的数据库。随着互联网web2.0网站的兴起,传统的关系数据库(基于磁盘IO)在处理web2.0网站,特别是超大规模(功能特别多)和高并发的SNS类型(微信,QQ,抖音,快手,虎牙等等)的web2.0纯动态网站已经显得力不从心,出现了很多难以克服的问题,而非关系型的数据库则由于其本身的特点(基于内存)得到了非常迅速的发展。NoSQL数据库的产生就是为了解决大规模数据集合多重数据种类带来的挑战,尤其是大数据应用难题
二、见的nosql框架有哪些?
HBase
HBase 是一个开源的 非关系型分布式数据库(NoSQL),它参考了 谷歌 的 BigTable 建模,实现的编程语言为 Java。它是 Apache 软件基金会的 Hadoop 项目的一部分,运行于 HDFS 文件系统之上,为 Hadoop 提供类似于 BigTable 规模的服务。因此,它可以 容错地 存储 海量稀疏 的数据。
HBase在列上实现了BigTable论文提到的压缩算法、内存操作和布隆过滤器。HBase的表能够作MapReduce任务的输入和输出,可以通过Java API (页面存档备份,存于互联网档案馆)来访问数据,也可以通过REST、Avro或者Thrift的API来访问。
虽然最近性能有了显著的提升,HBase 还不能直接取代SQL数据库。如今,它已经应用于多个数据驱动型网站[1][2],包括 Facebook的消息平台[3][4]。
在 Eric Brewer的CAP理论中,HBase属于CP类型的系统。
Redis
Redis 是一个使用 ANSI C语言 编写的 开源、支持网络、基于内存、可选持久性 的 键值(key value)对存储 数据库。Redis 是目前最流行的 键值对存储 数据库之一。
Memcached
Memcached 是一个 开放源代码、高性能、分配的 内存对象缓存系统。用于加速动态 web 应用程序,减轻关系型数据库负载。它可以应对 任意多个连接,使用 非阻塞的网络 IO。由于它的工作机制是在内存中开辟一块空间,然后建立一个 Hash 表,Memcached 自管理这些 Hash 表。Memcached 简单而强大。它简单的设计促进 迅速部署,易于发现所面临的问题,解决了很多 大型数据缓存。
MongoDB
MongoDB 是一个基于 分布式文件存储 的数据库。由 C++ 语言编写。旨在为 WEB 应用提供可扩展的 高性能 数据存储解决方案。MongoDB 是一个介于 关系数据库 和 非关系数据库 之间的产品,是非关系数据库当中功能 最丰富,最像关系数据库的 NoSQL。
三、Redis简介及特点
内存数据库
内存数据库是指一种将
全部内容存放在内存中
,而非传统数据库那样存放在外部存储器中的数据库。内存数据库指的是所有的数据访问控制都在内存中进行,这是与磁盘数据库相对而言的,磁盘数据库虽然也有一定的缓存机制,但都不能避免从外设到内存的交换,而这种交换过程对性能的损耗是致命的。由于内存的读写速度极快(双通道DDR3-1333可以达到9300MB/s,一般磁盘约150 MB/s),随机访问时间更是可以纳秒计(一般磁盘约10 ms,双通道DDR3-1333可以达到100ns)[1],所以这种数据库的读写性能很高,主要用在对性能要求极高的环境中,但是在服务器关闭后会立刻丢失全部储存的数据。常见的例子有MySQL的MEMORY存储引擎、eXtremeDB、FastDB、SQLite、Microsoft
SQL Server Compact等。
Redis通常将全部的数据存储在内存中。2.4版本后可配置为使用虚拟内存,一部分数据集存储在硬盘上,但这个特性废弃了。
1.简介
redis是 remote dictionary server 缩写
Redis 是一种开源(BSD 许可)、内存中数据结构存储,用作数据库、缓存和消息代理。Redis 提供了数据结构,例如字符串、散列、列表、集合、带有范围查询的排序集合、位图、超级日志、地理空间索引和流。Redis 内置复制、Lua 脚本、LRU 驱逐、事务和不同级别的磁盘持久化,并通过 Redis Sentinel 和 Redis Cluster 自动分区提供高可用性。
redis是一个开源的使用ANSI C语言编写、支持网络、可基于内存亦可持久化的日志型、Key-Value数据库,并提供多种语言的API。从2010年3月15日起,Redis的开发工作由VMware主持。从2013年5月开始,Redis的开发由Pivotal(springboot)赞助。
Redis 优良的性能可以在 Linux 系统上发挥全部性能,
所以官网只提供了 Linux 版本可以下载,并没有 Windws 版本.
,而平时开发测试使用 windows 版本也是挺方便的。现在Windows上的redis都是对原码的在封装了
2.特点
做缓存中间件
Redis 大多数时候是单线程运行的(single-threaded)(也会存在多个单线程并行类似多线程了),即同一时间只占用一个 CPU,只能有一个指令在运行,并行读写是不存在的。为什么 Redis 是单线程的,却能有很好的性能?一是 Redis 利用了多路 I/O 复用机制(select,poll,epoll等),处理客户端请求时,不会阻塞主线程(还会通过对IO的复用减少了切换销毁的资源);二是 Redis 单纯执行(大多数指令)一个指令不到 1 微秒。如此,单核 CPU 一秒就能处理 1 百万个指令(大概对应着几十万个请求吧),用不着实现多线程(网络才是瓶颈)。
- 速度快
Redis能读的速度是110000次/s,写的速度是81000次/s 。(数据存在内存中)
- 支持丰富数据类型
支持strings,lists,sets,sorted sets,hashs
-
支持事务( 原子性)
Redis的所有操作都是原子性的,意思就是要么成功执行要么失败完全不执行。单个操作是原子性的。多个操作也支持事务,即原子性,通过MULTI和EXEC指令包起来。 -
支持持久化
redis提供了不同级别的持久化方式,一种是RDB,一种AOF。
RDB(redis database):在指定的时间间隔能对数据进行快照存储(隔一段时间,把内存里的数据转存在硬盘里的文件)
AOF(append of file):每次对服务器写的操作持久化,当服务器重启的时候会重新执行这些命令来恢复原始的数据,AOF命令以redis协议追加保存每次写的操作到文件末尾.Redis还能对AOF文件进行后台重写,使得AOF文件的体积不至于过大.
memecached基于内存的nosql(not only sql)数据库,不能够持久化。 -
支持多种语言
3.安装
先要安装gcc-c++
yum install -y gcc-c++ 注意如果是新版本的redis gcc也需要是5版本以上的
- 下载redis
- 创建安装目录:mkdir /usr/redis
- 解压到上面创建目录: tar -xzvf /root/software/redis-5.0.5.tar.gz -C /usr/redis/
- 安装redis
- 进入解压的目录: cd /usr/redis/redis-5.0.5/
- 编译: make
- 安装: make install PREFIX=指定安装目录
- 通常安装在usr下 : make install PREFIX=/usr/redis
启动
-
进入bin目录 (进入安装目录 下)
cd /usr/redis/bin
./redis-server 启动
在另外一个窗口也进入该目录:
cd /usr/redis/bin
./redis-cli
或者:
/usr/redis/bin/redis-cli
ping
看到pong 说明链接成功 -
复制安装包中 redis.conf 到安装目录bin下 修改里面守护进程配置为 cp …/redis-5.0.5/redis.conf .
- 或者绝对路径复制:cp /usr/redis/redis-5.0.5/redis.conf /usr/redis/bin/
- 修改配置: vim /usr/redis/bin/redis.conf
- daemonize yes // 136行 no 该 yes
- :wq
- 使用修改后的配置,再次启动redis-server
- /usr/redis/bin/redis-server /usr/redis/bin/redis.conf
- (方法2启动方式可以redis启动,是后台运行,无需新开窗口就可以测试)
- 客户端连接,仍然是bin下的执行: ./redis-cli 回车
- 或者:
- /usr/redis/bin/redis-cli
- 使用ping 命令,如果得到 pong说明可以用
- 在客户端使用该命令退出:
- exit/quit 只退出客户端 服务端仍然在运行
-
shutdown nos|save 完全退出
四、Redis常用命令
http://www.redis.net.cn/order/
http://www.redis.cn/commands.html
1.和connection相关的命令
- ping ping服务器
- echo 回显输入字符串
- select 选择新数据库(redis默认配置16个库,可以查看配置文件,默认链接下标为0第一个库)
2.和server相关的命令
info 显示所有信息
-
info keyspace 显示每个库中key 信息
-
info cpu
-
dbsize 返回当前数据库里面的key的数量
-
flushdb 清空当前数据库
-
flushall 清空所有数据库
-
shutdown 关闭服务
nil ===null‘’
3.和key相关的命令
keys 查找所有匹配给定模式的键 (* 统配所有字符 ?统配任一字符)
- keys * 查询所有
- keys a* 查询所有以a开头的key
- keys a??? 查询所有a后面带有3个字符的key
del 删除指定key(一个或者多个)
exists 查询一个或者多个key是否存在
expire 设置一个key过期的秒数
type 获取key的存储类型
rename 将一个key重命名
move 移动一个key到另一个库中
ttl 获取一个key的有效秒数(永不过期-1)
randomkey 返回一个随机key
4.五种数据类型相关命令
4.1字符串·Strings
字符串是Redis中最基本的数据类型,它能够存储任何类型的字符串(最大 512M)
String 类型是二进制安全的 意味着 可以放String 可以包含任何数据 比如序列化对象
(set get mset mget incr decr )
应用场景
常规计数 人数 验证码,分布式锁(setnx+expire 或者 set key value EX 5 NX del key)等
在多线程同时执行一个业务时修改某一个变量时,保证同一时刻只有一个线程执行,叫做锁
当业务使用集群技术,让同一个业务放在不同的服务器上,每个服务器上都多个线程,保证所有服务器同一个时刻,只有一个线程执行业务,叫分布式锁
redis如何实现分布式锁(重要面试题setnx expire del )
1,使用setnx 在key不存在时设置值,实现加锁,其他线程无法在创建该key的锁
2,设置成功的,就等于拿到了锁,执行业务
3,执行业务之后,使用del删除锁
4,为了防止执行业务过程中出现异常,第3步没有执行,第1步执行完毕时, 使用expire 设置过期时间,防止出现死锁等现象,让多个请求等待)
4.2散列类型 hashes
散列类型相当于Java中的HashMap,他的值是一个字典,保存很多key,value对
- hset 赋值
- hget 获取
- hmset 批量赋值
- hmget 批量获取
- hgetall 获取所有
- hdel 删除
- hkeys 获取key
- hvals 直接获取值
- hlen 内容数量
- del删除key
应用场景:
比如我们可以Hash数据结构来存储用户信息,商品信息等等。
4.3列表类型 lists
列表类型(list)用于存储一个有序的字符串列表,常用的操作是向队列两端添加元素或者获得列表的某一片段
- lpush 创建
- rpush 添加
- lpop 从尾部删
- rpop 从开头删除
- llen 查询内容条数
- lindex 按下标查询
4.4集合类型 sets
Redis 的 Set 是 String 类型的无序集合。集合成员是唯一的,这就意味着集合中不能出现重复的数据。
集合对象的编码可以是 intset 或者 hashtable。
Redis 中集合是通过哈希表实现的,所以添加,删除,查找的复杂度都是 O(1)。
集合中最大的成员数为 232 - 1 (4294967295, 每个集合可存储40多亿个成员)。
在微博应用中,可以将一个用户所有的关注人存在一个集合中,将其所有粉丝存在一个集合。Redis可以非常方便的实现如共同关注、共同粉丝、共同喜好等功能。sinterstore
sinter
(集合中每个元素都是不同的)
- sadd 向集合添加一个或多个成员
- srem 移除集合中一个或多个成员
- smembers 返回集合中的所有成员
- sismember 判断 member 元素是否是集合 key 的成员
- scard 获取集合的成员数
- spop 移除并返回集合中的一个随机元素
- srandmember 返回集合中一个或多个随机数
- SINTER key1 [key2] 返回给定所有集合的交集
4.5有 序集合类型 sortedset
有序集合类型与集合类型的区别就是他是有序的
Redis 有序集合和集合一样也是string类型元素的集合,且不允许重复的成员。
不同的是每个元素都会关联一个double类型的分数。redis正是通过分数来为集合中的成员进行从小到大的排序。有序集合的成员是唯一的,但分数(scyore)却可以重复。
- zadd
- zrem
- zcard
- zcount
- zrangebyscore
在直播系统中,实时排行信息包含直播间在线用户列表,各种礼物排行榜,弹幕消息(可以理解为按消息维度的消息排行榜)地理空间等信息
4.6 地理空间 geospatial
五、java操作Redis
jedis是redis官网指定的 redis的java链接工具
-
redis.conf 配置文件,需要修改69行 bind 本机IP地址 //不能为127.0.0.1 改为虚拟机ip
-
重启redis
./redis-server redis.conf
重启redis,发现使用redis-cli无法连接 因为默认的127.0.0.1已经更改了
./bin/redis-cli -h 192.168.23.231 新的连接方法 -h h=host
-
填加 maven依赖:
<!-- https://mvnrepository.com/artifact/redis.clients/jedis -->
<dependency>
<groupId>redis.clients</groupId>
<artifactId>jedis</artifactId>
<version>2.9.0</version>
</dependency>
- 测试
参考文章
个人笔记,不同意见,望有交流
直接可以点击跳转连接