文章目录
- 前言
- 一、什么是nosql
- 二、见的nosql框架有哪些?
- 三、[Redis简介及特点](http://www.redis.cn/?accessToken=eyJhbGciOiJIUzI1NiIsImtpZCI6ImRlZmF1bHQiLCJ0eXAiOiJKV1QifQ.eyJhdWQiOiJhY2Nlc3NfcmVzb3VyY2UiLCJleHAiOjE2NDAzMDU4MTUsImciOiJ2SFBkS3AzNjNQS3lSWDY4IiwiaWF0IjoxNjQwMzA1NTE1LCJ1c2VySWQiOjczNDQ2MjA2fQ.U5LzUd-vVBCGlO8okfTDGT2fn4Xc7_FyV7WuQQBuvfU)
- 四、Redis常用命令
- 五、java操作Redis
前言
一、什么是nosql
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 规模的服务。因此,它可以 容错地 存储 海量稀疏 的数据。
Redis
Redis 是一个使用 ANSI C语言 编写的 开源、支持网络、基于内存、可选持久性 的 键值(key value)对存储 数据库。Redis 是目前最流行的 键值对存储 数据库之一。
Memcached
Memcached 是一个 开放源代码、高性能、分配的 内存对象缓存系统。用于加速动态 web 应用程序,减轻关系型数据库负载。它可以应对 任意多个连接,使用 非阻塞的网络 IO。由于它的工作机制是在内存中开辟一块空间,然后建立一个 Hash 表,Memcached 自管理这些 Hash 表。Memcached 简单而强大。它简单的设计促进 迅速部署,易于发现所面临的问题,解决了很多 大型数据缓存。
MongoDB
MongoDB 是一个基于 分布式文件存储 的数据库。由 C++ 语言编写。旨在为 WEB 应用提供可扩展的 高性能 数据存储解决方案。MongoDB 是一个介于 关系数据库 和 非关系数据库 之间的产品,是非关系数据库当中功能 最丰富,最像关系数据库的 Nosql。
三、Redis简介及特点
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)赞助。
2.特点
- 速度快
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相关的命令
2.和server相关的命令
info 显示所有信息
3.和key相关的命令
keys 查找所有匹配给定模式的键 (* 统配所有字符 ?统配任一字符)
del 删除指定key(一个或者多个)
exists 查询一个或者多个key是否存在
expire 设置一个key过期的秒数
type 获取key的存储类型
rename 将一个key重命名
move 移动一个key到另一个库中
ttl 获取一个key的有效秒数(永不过期-1)
randomkey 返回一个随机key
4.五种数据类型相关命令
4.1字符串·Strings
字符串是Redis中最基本的数据类型,它能够存储任何类型的字符串
(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对
应用场景:
比如我们可以Hash数据结构来存储用户信息,商品信息等等。
4.3列表类型 lists
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)却可以重复。
4.6 地理空间 geospatial
五、java操作Redis
jedis是redis官网指定的 redis的java链接工具
-
重启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>
- 测试