NoSQL(not only sql不仅仅是sql),泛指非关系型的数据库。随着互联网web2.0网站的兴起,传统的关系数据库(基于磁盘IO)在处理web2.0网站,特别是超大规模(功能特别多)和高并发的SNS类型(微信,QQ,抖音,快手,虎牙等等)的web2.0纯动态网站已经显得力不从心,出现了很多难以克服的问题,而非关系型的数据库则由于其本身的特点(基于内存)得到了非常迅速的发展。NoSQL数据库的产生就是为了解决大规模数据集合多重数据种类带来的挑战,尤其是大数据应用难题
HBase 是一个开源的 非关系型分布式数据库(NoSQL),它参考了 谷歌 的 BigTable 建模,实现的编程语言为 Java。它是 Apache 软件基金会的 Hadoop 项目的一部分,运行于 HDFS 文件系统之上,为 Hadoop 提供类似于 BigTable 规模的服务。因此,它可以 容错地 存储 海量稀疏 的数据。
Redis 是一个使用 ANSI C语言 编写的 开源、支持网络、基于内存、可选持久性 的 键值(key value)对存储 数据库。Redis 是目前最流行的 键值对存储 数据库之一。
Memcached 是一个 开放源代码、高性能、分配的 内存对象缓存系统。用于加速动态 web 应用程序,减轻关系型数据库负载。它可以应对 任意多个连接,使用 非阻塞的网络 IO。由于它的工作机制是在内存中开辟一块空间,然后建立一个 Hash 表,Memcached 自管理这些 Hash 表。Memcached 简单而强大。它简单的设计促进 迅速部署,易于发现所面临的问题,解决了很多 大型数据缓存。
MongoDB 是一个基于 分布式文件存储 的数据库。由 C++ 语言编写。旨在为 WEB 应用提供可扩展的 高性能 数据存储解决方案。MongoDB 是一个介于 关系数据库 和 非关系数据库 之间的产品,是非关系数据库当中功能 最丰富,最像关系数据库的 NoSQL。
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能读的速度是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)数据库,不能够持久化。
支持多种语言
先要安装gcc-c++
yum install -y gcc-c++ 注意如果是新版本的redis gcc也需要是5版本以上的
启动
进入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 .
shutdown nos|save 完全退出
http://www.redis.net.cn/order/
http://www.redis.cn/commands.html
info keyspace 显示每个库中key 信息
info cpu
dbsize 返回当前数据库里面的key的数量
flushdb 清空当前数据库
flushall 清空所有数据库
shutdown 关闭服务
nil ===null‘’
keys 查找所有匹配给定模式的键 (* 统配所有字符 ?统配任一字符)
del 删除指定key(一个或者多个)
exists 查询一个或者多个key是否存在
expire 设置一个key过期的秒数
type 获取key的存储类型
rename 将一个key重命名
move 移动一个key到另一个库中
ttl 获取一个key的有效秒数(永不过期-1)
randomkey 返回一个随机key
字符串是Redis中最基本的数据类型,它能够存储任何类型的字符串
(set get mset mget incr decr )
应用场景
常规计数 人数 验证码,分布式锁(setnx+expire 或者 set key value EX 5 NX del key)等
在多线程同时执行一个业务时修改某一个变量时,保证同一时刻只有一个线程执行,叫做锁
当业务使用集群技术,让同一个业务放在不同的服务器上,每个服务器上都多个线程,保证所有服务器同一个时刻,只有一个线程执行业务,叫分布式锁
1,使用setnx 在key不存在时设置值,实现加锁,其他线程无法在创建该key的锁
2,设置成功的,就等于拿到了锁,执行业务
3,执行业务之后,使用del删除锁
4,为了防止执行业务过程中出现异常,第3步没有执行,第1步执行完毕时, 使用expire 设置过期时间,防止出现死锁等现象,让多个请求等待)
散列类型相当于Java中的HashMap,他的值是一个字典,保存很多key,value对
应用场景:
比如我们可以Hash数据结构来存储用户信息,商品信息等等。
列表类型(list)用于存储一个有序的字符串列表,常用的操作是向队列两端添加元素或者获得列表的某一片段
Redis 的 Set 是 String 类型的无序集合。集合成员是唯一的,这就意味着集合中不能出现重复的数据。
集合对象的编码可以是 intset 或者 hashtable。
Redis 中集合是通过哈希表实现的,所以添加,删除,查找的复杂度都是 O(1)。
集合中最大的成员数为 232 - 1 (4294967295, 每个集合可存储40多亿个成员)。
在微博应用中,可以将一个用户所有的关注人存在一个集合中,将其所有粉丝存在一个集合。Redis可以非常方便的实现如共同关注、共同粉丝、共同喜好等功能。sinterstore
sinter
(集合中每个元素都是不同的)
有序集合类型与集合类型的区别就是他是有序的
Redis 有序集合和集合一样也是string类型元素的集合,且不允许重复的成员。
不同的是每个元素都会关联一个double类型的分数。redis正是通过分数来为集合中的成员进行从小到大的排序。有序集合的成员是唯一的,但分数(scyore)却可以重复。
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>