CENTOS7下安装REDIS
官网:https://redis.io/download
第一步:解压压缩包
[root@hd01 opt]# tar -zxf redis-5.0.14.tar.gz
[root@hd01 opt]# mv redis-5.0.14 soft/redis5
第二步:yum安装gcc依赖
[root@hd01 redis5]# yum install -y gcc
第三步:编译安装
make MALLOC=libc
[root@hd01 redis5]# make MALLOC=libc
cd src && make install
[root@hd01 redis5]# cd src
[root@hd01 src]# make install
第四部:启动redis
1.设置远程连接
[root@hd01 src]# vim ../redis.conf ```
修改为远程IP地址:192.168.100.200
2.登录
[root@hd01 src]# ./redis-server ../redis.conf
端口号:6379
//如果端口号被占用:netstat -lnp ------kill -9 ****
PS:这个界面不要关,重新打开一个新的界面
3.新的界面进入redis
[root@hd01 src]# ./redis-cli -h 192.168.100.200
192.168.100.200:6379> select 1
OK
192.168.100.200:6379[1]>
1. NoSQL数据库发展历史简介
1.1 web系统变迁历史
1.1.1 web1.0时代简介
web 1.0是以编辑为特征,网站提供给用户的内容是网站编辑进行编辑处理后提供的,用户阅读网站提供的内容
这个过程是网站到用户的单向行为
web1.0时代的代表站点为新浪,搜狐,网易三大门户
性能要求:
基本上就是一些简单的静态页面渲染,不会涉及太多复杂业务逻辑,功能简单单一,基本上服务器性能不会有太大压力
1.1.2 web2.0时代简介
更注重用户的交互作用,用户既是网站内容的消费者(浏览者),也是网站内容的制造者
加强了网站与用户之间的互动,网站内容基于用户提供(微博、天涯社区、自媒体)
网站的诸多功能也由用户参与建设,实现了网站与用户双向的交流与参与
用户在web 2.0网站系统内拥有自己的数据,并完全基于WEB,所有功能都能通过浏览器完成。
性能要求:
随着Web 2.0时代到来,用户访问量大幅提升,同时产生大量用户数据。加上后来移动设备普及,所有的互联网平台都面临了巨大的性能挑战。数据库服务器压力越来越大
如何应对数据库的压力成为的关键。不管任何应用,数据始终是核心。传统关系型数据库根本无法承载较高的并发,此时人们就开始用Redis当成缓存,来缓解数据库的压力
1.2 什么是NoSQL
NoSQL最常见的解释是“non-relational”, 很多人也说它是“Not Only SQL”
NoSQL仅仅是一个概念,泛指非关系型的数据库
区别于关系数据库,它们不保证关系数据的ACID特性
NoSQL是一项全新的数据库革命性运动,提倡运用非关系型的数据存储,相对于铺天盖地的关系型数据库运用,这一概念无疑是一种全新的思维的注入
1.3 NoSQL的特点
1.3.1 应用场景
高并发的读写
海量数据读写
高可扩展性
速度快
1.3.2 不适用场景
需要事务支持
基于sql的结构化查询存储,处理复杂的关系,需要即席查询(用户自定义查询条件的查询)
1.4 NoSQL数据库
1.4.1 memcache
很早出现的NoSql数据库
数据都在内存中,一般不持久化
支持简单的key-value模式
一般是作为缓存数据库辅助持久化的数据库
1.4.2 redis介绍
几乎覆盖了Memcached的绝大部分功能
数据都在内存中,支持持久化,主要用作备份恢复
除了支持简单的key-value模式,还支持多种数据结构的存储,比如 list、set、hash、zset等。
一般是作为缓存数据库辅助持久化的数据库
现在市面上用得非常多的一款内存数据库
1.4.3 mongoDB介绍
高性能、开源、模式自由(schema free)的文档型数据库
数据都在内存中, 如果内存不足,把不常用的数据保存到硬盘
虽然是key-value模式,但是对value(尤其是json)提供了丰富的查询功能
支持二进制数据及大型对象
可以根据数据的特点替代RDBMS ,成为独立的数据库。或者配合RDBMS,存储特定的数据。
1.4.4 列式存储HBase介绍
HBase是Hadoop项目中的数据库。它用于需要对大量的数据进行随机、实时读写操作的场景中。HBase的目标就是处理数据量非常庞大的表,可以用普通的计算机处理超过10亿行数据,还可处理有数百万列元素的数据表。
2. Redis介绍
redis官网地址:
https://redis.io/
中文网站
http://www.redis.cn/
2.1 Redis的基本介绍
Redis是当前比较热门的NoSQL系统之一
它是一个开源的、使用ANSI C语言编写的key-value存储系统(区别于MySQL的二维表格形式存储)
和Memcache类似,但很大程度补偿了Memcache的不足,Redis数据都是缓存在计算机内存中,不同的是,Memcache只能将数据缓存到内存中,无法自动定期写入硬盘,这就表示,一断电或重启,内存清空,数据丢失
2.2 Redis的应用场景
2.2.1 取最新N个数据的操作
比如典型的取网站最新文章,可以将最新的5000条评论ID放在Redis的List集合中,并将超出集合部分从数据库获取
2.2.2 排行榜应用,取TOP N操作
这个需求与上面需求的不同之处在于,前面操作以时间为权重,这个是以某个条件为权重,比如按顶的次数排序,可以 使用Redis的sorted set,将要排序的值设置成sorted set的score,将具体的数据设置成相应的value,每次只需要执行一条ZADD命令即可。
2.2.3 需要精准设定过期时间的应用
比如可以把上面说到的sorted set的score值设置成过期时间的时间戳,那么就可以简单地通过过期时间排序,定时清除过期数据了,不仅是清除Redis中的过期数据,你完全可以把Redis里这个过期时间当成是对数据库中数据的索引,用Redis来 找出哪些数据需要过期删除,然后再精准地从数据库中删除相应的记录。
2.2.4 计数器应用
Redis的命令都是原子性的,你可以轻松地利用INCR,DECR命令来构建计数器系统。
2.2.5 Uniq操作,获取某段时间所有数据排重值
这个使用Redis的set数据结构最合适了,只需要不断地将数据往set中扔就行了,set意为集合,所以会自动排重。
2.2.6 实时系统,反垃圾系统
通过上面说到的set功能,你可以知道一个终端用户是否进行了某个操作,可以找到其操作的集合并进行分析统计对比等。没有做不到,只有想不到。
2.2.7 缓存
将数据直接存放到内存中,性能优于Memcached,数据结构更多样化。
2.3 Redis的特点
高效性
Redis读取的速度是110000次/s,写的速度是81000次/s
原子性
Redis的所有操作都是原子性的,同时Redis还支持对几个操作全并后的原子性执行。
支持多种数据结构
string(字符串)
list(列表)
hash(哈希)
set(集合)
zset(有序集合)
稳定性:持久化,主从复制(集群)
其他特性:支持过期时间,支持事务,消息订阅。
3.Redis的数据类型
redis当中一共支持五种数据类型,分别是:
string字符串
list列表
set集合
hash表
zset有序集合
通过这五种不同的数据类型,可以实现各种不同的功能,也可以应用在各种不同的场景。
Redis当中各种数据类型结构如上图:
Redis当中各种数据类型的操作
https://www.runoob.com/redis/redis-keys.html
3.1 对字符串string的操作
3.2对hash列表的操作
Redis hash 是一个string类型的field和value的映射表,hash特别适合用于存储对象。
Redis 中每个 hash 可以存储 232 - 1 键值对(40多亿)
3.3 对list列表的操作
Redis列表是简单的字符串列表,按照插入顺序排序。你可以添加一个元素到列表的头部(左边)或者尾部(右边)
一个列表最多可以包含 232 - 1 个元素 (4294967295, 每个列表超过40亿个元素)。
3.4 对set集合的操作
Redis 的 Set 是 String 类型的无序集合。集合成员是唯一的,这就意味着集合中不能出现重复的数据
Redis 中集合是通过哈希表实现的,所以添加,删除,查找的复杂度都是 O(1)。
集合中最大的成员数为 232 - 1 (4294967295, 每个集合可存储40多亿个成员)。
3.5 对zset的操作
Redis有序集合和集合一样也是string类型元素的集合,且不允许重复的成员
它用来保存需要排序的数据,例如排行榜,一个班的语文成绩,一个公司的员工工资,一个论坛的帖子等。
有序集合中,每个元素都带有score(权重),以此来对元素进行排序
它有三个元素:key、member和score。以语文成绩为例,key是考试名称(期中考试、期末考试等),member是学生名字,score是成绩。
4.Java连接Redis
Redis不仅可以通过命令行进行操作,也可以通过JavaAPI操作,通过使用Java API来对Redis数据库中的各种数据类型操作。
4.1 创建maven工程并导入依赖
<dependencies>
<dependency>
<groupId>redis.clients</groupId>
<artifactId>jedis</artifactId>
<version>2.9.0</version>
</dependency>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.12</version>
<scope>test</scope>
</dependency>
<dependency>
<groupId>org.testng</groupId>
<artifactId>testng</artifactId>
<version>6.14.3</version>
<scope>test</scope>
</dependency>
</dependencies>
<build>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<version>3.0</version>
<configuration>
<source>1.8</source>
<target>1.8</target>
<encoding>UTF-8</encoding>
<!-- <verbal>true</verbal>-->
</configuration>
</plugin>
</plugins>
</build>
4.2 连接
public class jedisDemo1 {
@Test
public void demo1(){
//设置IP地址和端口
Jedis jedis = new Jedis("192.168.100.200", 6379);
//保存数据
jedis.set("name","ssy");
//获取数据
String value = jedis.get("name");
System.out.println(value);
//释放资源
jedis.close();
}
4.3连接池
public class jedisDemo1 {
@Test
public void demo2() {
//获取连接池配置对象
JedisPoolConfig config = new JedisPoolConfig();
//设置最大连接数
config.setMaxTotal(30);
//设置最大空闲连接数
config.setMaxTotal(10);
//获得连接池
JedisPool jedisPool = new JedisPool(config, "192.168.100.200", 6379);
//获得核心对象:jedis
Jedis jedis = null;
//通过连接池获得连接
jedis = jedisPool.getResource();
//设置数据
jedis.set("name", "张三");
//获取数据
String value = jedis.get("name");
System.out.println(value);
//释放资源
if (jedis != null) {
jedis.close();
}
//释放连接池
if (jedisPool != null) {
jedisPool.close();
}
}
}