1 NoSQL
介绍
NoSQL,泛指非关系型的数据库,NoSQL即Not-Only SQL,它可以作为关系型数据库的良好补充。
为什么学习NoSQL?
互联网产品的特点:
高并发、高性能、高可用、海量数据
传统的关系数据库就出现了性能和扩展的瓶颈,非关系型数据库应时而生,解决了互联网三高和海量数据的问题
NoSQL和关系型数据库是互补关系,在各自的应用场景都有自己特点,一般情况下我们使用关系数据库来持久化数据,对一切热点数据通过Nosql来作为缓存
主流产品
分类 | 特点 | 代表产品 |
---|---|---|
键值存储 | 数据一般存在内存中,读写速度快(10w/s),适合作为缓存服务 当成map即可 | redis |
文档型数据库 | 数据结构要求不严格,适合存储结构不确定或者价值较低的数据 | mongodb |
列存储数据库 | 查找速度快,更容易进行分布式扩展,适合作为文件存储服务 | Hbase |
图形数据库 | 使用“图结构”进行存储,适合做社交网络计算等等 | Neo4j |
2 Redis介绍
Redis(Remote Dictionary Server)是用C语言开发的一个开源的高性能键值对数据库。它的所有数据都是保存在内存中的,这也就决定了其读写速度之快,是其它硬盘保存数据的系统所无法匹敌的。
官方曾经给出过一组测试数据,50个并发执行100000个请求: 读的速度是110000次/s,写的速度是81000次/s
3 Redis安装和使用
-
下载
Reids官网地址:http://redis.io
中文网地址:https://www.redis.net.cn/- 安装
windows版本解压缩即可
- 安装
-
目录(windows版)
redis.windows.conf:配置文件
redis-cli.exe:redis的客户端
redis-server.exe:redis服务器端 -
启动
- 方式1 :
- 先双击服务器端 redis-server.exe
- 再双击客户端 redis-cli.exe
- 方式2:在当前解压后的目录下 cmd进入dos窗口
- 先启动服务器端 redis-server.exe redis.windows.conf
- 再启动客户端 redis-cli.exe
redis服务器默认的端口号:6379
- 方式1 :
-
关闭
- 建议在客户端使用:shutdown
- 也可以直接点 x
4 Redis数据结构【重点】
redis存储的是:key-value格式的数据,其中key是字符串类型,value支持五种数据类型(存到数据库中都是字符串)
- string
- hash (map)
- list (linkedlist)
- set (无序唯一)
- zset (sorted set 有序set)
三 redis命令操作
1 字符串(string)
添加 : set 键名 值
查询 : get 键名
删除 : del 键名
新增且设置时间 : setex 键名 秒数 值
查看剩余存活时间 : ttl 键名
- 正整数 : 剩余时间
- -1 : 永不过时
- -2 : 不存在
扩展:
- incr 键名 :自增
- decr 键名 :自减
2 哈希(hash)
value是一个map
添加 : hset 键名 字段 值
查询 : hget 键名 字段
删除 : hdel 键名 字段
扩展命令:
- hmset 键名 子键1 子值1 子键2 子值2 :一次性给键设置多个子键和值
- hmget 键名 子键1 子键2 :一次获取多个子键的值
- hgetall 键名 :获取所有的子键和值
3 列表(list)
LinkedList 有序
添加
- lpush 键名 值1 值2 值3 … 从左边开始一个一个的往前面上加
- rpush 键名 值1 值2 值3 … 从右边开始一个一个的往末尾上加
查询 : lrange 键名 开始索引 结束索引
- lrange 键名 0 -1 :查询所有
删除 :
- lpop 键名 : 返回且移除左边的第一个元素
- rpop 键名 : 返回且移除右边的第一个元素
扩展命令:
- llen 键名 :获取集合的长度
4 集合(set)
唯一无序
添加 : sadd 键名 值1 值2 值3
删除:srem 键名 值1 值2
查询
- smembers 键名 : 查询所有
- sismember 键名 值 : 判断该值是否存在
扩展命令:
- 长度 : scard 键名
- 集合运算 :
- sunion 键1 键2 :并集 我有加你有
- sdiff 键1 键2 :差集 我有你没有
- sinter 键1 键2 :交集 我有你也有
- 也可以将他们的运行结果放入一个新集合中
- sxxxstore 新集合 键1 键2
- 例如: sunionstore s3 s1 s2 将s1和s2的并集放入s3中
5 有序集合(zset)
有序
添加 : zadd 键名 分数1 值1 分数2 值2
查询 : zrange 键名 开始索引 结束索引 [withscores]
查询某一个键的分数 : zscore 键名 值
删除 : zrem 键名 值1 值2
6 通用命令
del 键名 : 删除指定key
keys * :查询当去数据库下所有的key
type 键名 : 查询该键的类型
exists 键名 : 查询该键是否存在当前的数据库中
扩展命令:
- 一个redis实例包含16个数据库,默认使用的索引为0的数据库 : select 索引
- 建议大家开发项目的时候 一个项目用一个实例
- flushdb : 清除当前数据库中所有的内容
- flushall : 清除当前实例中所有数据库中的内容
四 redis持久化
Redis的高性能是由于其将所有数据都存储在了内存中,为了使Redis在重启之后仍能保证数据不丢失,需要将数据从内存中同步到硬盘中,这一过程就是持久化。Redis支持两种方式的持久化(RDB和AOF),可以同时使用。
-
RDB(快照方式):默认方式.文件名称:dump.rdb
rdb默认的快照规则:
save 900 1 当15分钟之内有1个key发生变化就拍照
save 300 10 当300秒之内有10个key发生变化就拍照
save 60 10000 当60秒之内有1w个key发生变化就拍照
重启服务器后,默认是从rdb文件中恢复数据到内存中
-
AOF(追加命令到文件中),需要手动开启的,文件名称:appendonly.aof
appendfsync always 每执行一个命令,就会把命令追加到文件中,和关系型数据库相似
appendfsync everysec 每一秒钟,把所有的操作命令追加到文件中
appendfsync no 不同步,等同于rdb
启动的时候需要指定配置文件启动
修改配置文件redis.windows.conf中
appendonly no
将他的值改成yes,重启服务器就生效,虽然开启了aof,但是rdb依然能用.只不过是,当服务器重启的时候,从aof文件将数据恢复到内存中.
当我们正常关闭redis服务器的时候,他会通过不同的方式将内存中的数据保存到硬盘文件中.再次启动的时候,会去文件中把数据恢复到内存中.
若我们把redis作为缓存使用,建议使用rdb方式,高效; 若数据需要不时的持久化,建议使用aof方式.
缓存是允许有数据丢失.
1 什么是Jedis
Redis不仅是使用命令来操作,现在基本上主流的语言都有客户端支持,比如java、C、C#、C++、php、Node.js、Go等。
在官方网站里列一些Java的客户端,有Jedis、Redisson、Jredis、JDBC-Redis、等其中官方推荐使用Jedis和Redisson。 在企业中用的最多的就是Jedis
jedis对redis 相当于 jdbc对关系型数据库
2 快速入门
步骤分析
<!--jedis-->
<dependency>
<groupId>redis.clients</groupId>
<artifactId>jedis</artifactId>
<version>2.9.0</version>
</dependency>
@Test
public void helloJedis(){
//1.创建jedis对象
Jedis jedis = new Jedis("127.0.0.1", 6379);
//2.操作redis数据库
jedis.set("jedis","hi");
String result = jedis.get("jedis");
System.out.println(result);
//3.释放资源
jedis.close();
}
常用API
方法 | 解释 |
---|---|
new Jedis(host, port) | 创建jedis对象,参数host是redis服务器地址,参数port是redis服务端口 |
set(key,value) | 设置字符串类型的数据 |
get(key) | 获得字符串类型的数据 |
hset(key,field,value) | 设置哈希类型的数据 |
hget(key,field) | 获得哈希类型的数据 |
lpush(key,values) | 设置列表类型的数据 |
lpop(key) | 列表左面弹栈 |
rpop(key) | 列表右面弹栈 |
del(key) | 删除指定的key |
setex(key,秒数,value) | 设置一个key且设置存活时间 |
3 连接池
jedis连接资源的创建与销毁是很消耗程序性能,所以jedis为我们提供了jedis的池化技术。
步骤分析
@Test
public void helloJedisPool(){
//0.创建连接池的配置对象
JedisPoolConfig config = new JedisPoolConfig();
config.setMaxTotal(10);//最大连接数
config.setMaxIdle(2);//最大的空闲连接数量
config.setMaxWaitMillis(2000);//最大的等待获取连接的时间
//1.创建连接池对象
JedisPool pool = new JedisPool(config,"127.0.0.1",6379);
//2.从连接池中获取连接
Jedis jedis = pool.getResource();
//3.操作redis数据库
System.out.println(jedis.get("jedis"));
System.out.println(jedis.get("hhhh"));
//4.释放资源
jedis.close();
}
4 抽取工具类
jedis.properties
redis.host=127.0.0.1
redis.port=6379
redis.maxTotal=50
redis.maxIdle=10
JedisUtils
public class JedisUtils {
//提供一个连接池变量
private static JedisPool pool;
//在静态代码块中进行初始化操作
static{
//加载配置文件
ResourceBundle bundle = ResourceBundle.getBundle("jedis");
//创建配置对象
JedisPoolConfig config = new JedisPoolConfig();
config.setMaxTotal(Integer.parseInt(bundle.getString("redis.maxTotal")));
config.setMaxIdle(Integer.parseInt(bundle.getString("redis.maxIdle")));
//初始化连接池
pool = new JedisPool(config,bundle.getString("redis.host"),Integer.parseInt(bundle.getString("redis.port")));
}
//提供获取jedis的方法
public static Jedis getJedis(){
return pool.getResource();
}
}