Redis概述
Redis 是一个由C语言开发的高性能且开源的的 Nosql(非关系型数据库),数据可以存储在内存或磁盘中。Redis 是以 key-value 形式存储数据,和传统的关系型数据库不一样。redis严格上不是一种数据库,应该是一种数据结构化存储方法的集合。
数据类型
Redis支持的数据结构类型有以下5种:
- String: 字符串
- List: 列表(有序可重复)
- Set: 集合(无序不可重复)
- Hash: 散列(value由map(key-value)形式存储 )
- Sorted Set: 有序不重复集合
Redis的优势
- 数据保存在内存(存取速度快,并发能力强)
- 支持持久化,数据安全性高
- 支持多种数据类型的存储
- 补偿了memcached的不足,对关系型数据库起到很好的补充作用。
- 支持多种语言客户端
- Redis支持集群(支持高并发、海量数据)
Redis发布/订阅
订阅给定的一个或多个频道的信息
SUBSCRIBE channel1 channel2...
将信息 message 发送到指定的频道 channel
PUBLISH channel message
新开一个客户端订阅tv频道
再开一个客户端窗口,发布消息到tv频道
订阅tv频道的客户端可以收到nihao!消息
Jedis操作Redis
Jedis是java操作Redis的客户端之一,使用Jedis其实很简单。只需要将核心jar包(jedis-3.6.0.jar )以及依赖jar包导入,即可使用Jedis 注意:不同版本jedis.jar包可能会依赖不同jar包,需要将依赖的jar也一并导入
代码示例:Jedis中的方法与Redis命令操作基本一致,很容易上手
@Test
public void test2(){
//创建jedis连接池配置对象
JedisPoolConfig config = new JedisPoolConfig();
//最大空闲数
config.setMaxIdle(2);
//最大连接数
config.setMaxTotal(10);
//创建连接超时
config.setMaxWaitMillis(1*1000);
//获取连接时测试连接是否畅通
config.setTestOnBorrow(true);
//创建连接池的核心对象
JedisPool jedisPool = new JedisPool(config,"127.0.0.1",6379,1000,"admin");
//获取jedis资源
Jedis jedis = jedisPool.getResource();
jedis.set("username","luobiao");
String username = jedis.get("username");
Set<String> keys = jedis.keys("*");
for (String key : keys) {
System.out.println(key);
}
System.out.println(username);
jedis.close();
}
Redis持久化策略
Redis有两种持久化策略:
- RDB 策略(默认开启状态):原理是把数据存储到文件中
- AOF 策略:原理是记录Redis存储数据的命令到更新日志文件中,一旦启动Redis的时候,就会去加载该文件中的命令
两种策略的优缺点:
- RDB:读取效率高,但是如果不满足它的持久化条件,数据很容易丢失
- AOF:数据不容易丢失,读取效率相比RDB低很多
graph LR
id1[服务器启动] --> id2[执行载入程序]
-->condition{是否已开启AOF持久化}
condition-- 是 --> AOF[载入AOF文件]
condition-- 否 --> RDB[载入RDB文件]
Redis淘汰策略
当内存到一定极限的时候,需要淘汰一些数据,达到redis数据都是有效的。
Redis提供了以下6种淘汰策略:
- volatile-lru:从已设置过期时间的数据集中挑选最近最少使用的数据淘汰。
- volatile-ttl:从已设置过期时间的数据集中挑选将要过期的数据淘汰。
- volatile-random:从已设置过期时间的数据集中任意选择数据淘汰。
- allkeys-lru:从数据集中挑选最近最少使用的数据淘汰。
- allkeys-random:从数据集中任意选择数据淘汰。
- no-enviction(驱逐):禁止驱逐数据。