Redis
将一些常用的且不常改变且不敏感的数据放入redis(缓存).可以减少和关系型数据库的交互.提供程序的效率 。
1 NoSql
NoSQL,泛指非关系型的数据库,NoSQL即Not-Only SQL,它可以作为关系型数据库的良好补充。
互联网特点:高并发、高性能、高可用、海量数据
传统的关系数据库就出现了性能和扩展的瓶颈,非关系型数据库应时而生,解决了互联网三高和海量数据的问题
NoSQL和关系型数据库是互补关系,在各自的应用场景都有自己特点,一般情况下我们使用关系数据库来持久化数据,对一切热点数据通过Nosql来作为缓存。
主流产品
Redis介绍
Redis(Remote Dictionary Server)是用C语言开发的一个开源的高性能键值对数据库。它的所有数据都是保存在内存中的,这也就决定了其读写速度之快,是其它硬盘保存数据的系统所无法匹敌的。
官方曾经给出过一组测试数据,50个并发执行100000个请求: 读的速度是110000次/s,写的速度是81000次/s。
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
Redis数据结构(重点)
redis存储的是:key-value格式的数据,其中key是字符串类型,value支持五种数据类型(存储在库中的都是字符串)
1.string
2.hash(map)
3.list(linkedlist)
4.set(无序唯一)
5.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键名:返回且移除右边第一个元素
扩展: - lien 键名:获取集合长度
4 集合(set)
唯一无序
添加:sadd 键名 值1 值2 值3
删除:srem 键名 值1 值2
查询
- smembers 键名:查询所有
- sismember 键名 值:判断该值是否存在 (0:不存在,1:存在)
扩展命令: - 长度 : 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 键名 值
删除:zren 键名 值1 值2
通用命令
- del 键名 : 删除指定key
- keys * :查询当去数据库下所有的key
- type 键名 : 查询该键的类型
- exists 键名 : 查询该键是否存在当前的数据库中
- 扩展命令:
- 一个redis实例包含16个数据库,默认使用的索引为0的数据库 : select 索引
- 建议大家开发项目的时候 一个项目用一个实例
- flushdb : 清除当前数据库中所有的内容
- flushall : 清除当前实例中所有数据库中的内容
- 一个redis实例包含16个数据库,默认使用的索引为0的数据库 : select 索引
Redis持久化(RDB和AOF)
Redis的高性能是由于其将所有数据都存储在了内存中,为了使Redis在重启之后仍能保证数据不丢失,需要将数据从内存中同步到硬盘中,这一过程就是持久化。Redis支持两种方式的持久化(RDB和AOF),可以同时使用。
- RDB(快照方式):默认方式.
采用快照的形式以二进制的方式将数据保存在文件中,将文件名称:dump.rdb
redis安装目录的etc目录下,编辑redis.conf
rdb默认的快照规则:
save 900 1 当15分钟之内有1个key发生变化就拍照
save 300 10 当300秒之内有10个key发生变化就拍照
save 60 10000 当60秒之内有1w个key发生变化就拍照
重启服务器后,默认是从rdb文件中恢复数据到内存中
由于RDB并不能做到实时备份,假如服务器宕机,容易导致数据丢失,于是就有了AOF方式的持久化。
- AOF(追加命令到文件中) 需要在redis.conf中进行配置。追加数据的文件名称为:appendonly.aof
# appendfsync always 每执行一个命令,就会把命令追加到文件中,和关系型数据库相似
appendfsync everysec 每一秒钟,把所有的操作命令追加到文件中
# appendfsync no 不同步,等同于rdb
启动的时候需要指定配置文件启动
改配置文件redis.windows.conf中 appendonly no
将他的值改成yes,重启服务器就生效,
虽然开启了aof,但是rdb依然能用.只不过是,当服务器重启的时候,从aof文件将数据恢复到内存中.
若需要使用aof方式的话,得使用指定配置文件的方式启动redis服务器
当我们正常关闭redis服务器的时候,他会通过不同的方式将内存中的数据保存到硬盘文件中.再次启动的时候,会去文件中把数据恢复到内存中。
若我们把redis作为缓存使用,建议使用rdb方式,高效; 若数据需要不时的持久化,建议使用aof方式。
缓存是允许有数据丢失。
Redis客户端安装和使用
Jedis简介
Redis不仅是使用命令来操作,现在基本上主流的语言都有客户端支持,比如java、C、C#、C++、php、
Node.js、Go等。
在官方网站里列一些Java的客户端,有Jedis、Redisson、Jredis、JDBC-Redis、等其中官方推荐使用Jedis和Redisson。 在企业中用的最多的就是Jedis ,github下载地址:https://github.com/xetorthio/jedis
jedis对redis 相当于 jdbc对关系型数据库
快速入门
步骤分析
- 导入jedis依赖
- 创建一个Jedis对象(连接对象)
- new Jedis(String host,int port)
- 执行jedis中方法(发送命令)
- 释放资源
常用Api
<!--jedis-->
<dependency>
<groupId>redis.clients</groupId>
<artifactId>jedis</artifactId>
<version>2.9.0</version>
</dependency>
@Test
public void testHelloJedis(){
Jedis jedis = new Jedis("127.0.0.1", 6379);
jedis.set("jedis","hello");
String value = jedis.get("jedis");
System.out.println("jedis对应的值"+value);//hello
System.out.println("tom对应的值"+jedis.get("tom") );//null
jedis.close();
}
连接池
jedis连接资源的创建与销毁是很消耗程序性能,所以jedis为我们提供了jedis的池化技术
步骤分析
- 创建连接池的配置对象JedisPoolConfing,给连接池配置一些信息
- 使用指定的配置再创建jedis连接池的JedisPool对象
- 从pool中获取jedis
- 使用jedis
- 使用完成后别忘记归还jedis
jedis.properties
host=127.0.0.1
port=6379
##最大连接数
maxTotal=50
##最大空闲连接数
maxIdle=10
JedisUtils
public class JedisUtils {
private static JedisPool pool;
//使用静态代码块初始化pool
static{
//加载配置文件
/*
//之前的方式
InputStream is = JedisUtils.class.getClassLoader().getResourceAsStream("jedis.properties");
Properties prop = new Properties();
prop.load(is);
*/
//换种方式
ResourceBundle bundle = ResourceBundle.getBundle("jedis");//直接加载到properties配置文件.
//创建pool配置对象
JedisPoolConfig config = new JedisPoolConfig();
//设置最大连接数
config.setMaxTotal(Integer.parseInt(bundle.getString("maxTotal")));
//设置最大空闲连接数
config.setMaxIdle(Integer.parseInt(bundle.getString("maxIdle")));
//初始化pool对象
pool = new JedisPool(config,bundle.getString("host"),Integer.parseInt(bundle.getString("port")));
}
//提供一个获取jedis方法
public static Jedis getResource(){
return pool.getResource();
}
public static void main(String[] args) {
Jedis jedis = getResource();
System.out.println(jedis.get("jedis"));
jedis.close();
}
}
有个RedisInsight的工具,是Redis官方出品的关于Redis的可视化工具。可用于设计开发。大家有兴趣可以看一下。