简介
完全开源免费的,用C语言编写的,是一个高性能的(key/value)分布式内存数据库,基于内存运行,并支持持久化的NoSQL数据库。
优势
- 性能极高 – Redis能读的速度是110000次/s,写的速度是81000次/s 。
- 丰富的数据类型 – Redis支持二进制案例的 Strings, Lists, Hashes, Sets 及 Ordered Sets 数据类型操作。
- 原子 – Redis的所有操作都是原子性的,意思就是要么成功执行要么失败完全不执行。单个操作是原子性的。多个操作也支持事务,即原子性,通过MULTI和EXEC指令包起来。
- 丰富的特性 – Redis还支持 publish/subscribe, 通知, key 过期等等特性。。
- Redis支持数据的备份,即master-slave模式的数据备份。
- Redis支持数据的持久化,可以将内存中的数据保存在磁盘中,重启的时候可以再次加载进行使用。
应用场景
- 热点数据缓存: 由于 Redis 访问速度块、支持的数据类型比较丰富,所以 Redis 很适合用来存储热点数据
- 限时业务实现: expire 命令设置 key 的生存时间,到时间后自动删除 key。收集验证码、优惠活动等业务场景。
- 计数器实现: incrby 命令可以实现原子性的递增,所以可以运用于高并发的秒杀活动、分布式序列号的生成。比如限制一个手机号发多少条短信、一个接口一分钟限制多少请求、一个接口一天限制调用多少次等等。
- 排行榜实现: 借助 SortedSet 进行热点数据的排序。例如:下单量最多的用户排行榜,最热门的帖子(回复最多)等。
- 布式锁实现: 利用 Redis 的 setnx 命令进行。后面会有详细的实现介绍。
- 队列机制实现: Redis 有 list push 和 list pop 这样的命令,所以能够很方便的执行队列操作。
与java整合
- maven坐标
<dependency>
<groupId>redis.clients</groupId>
<artifactId>jedis</artifactId>
<version>3.2.0</version>
<scope>test</scope>
</dependency>
- 连接Redis
public class JedisPoolUtil {
public static volatile JedisPool jedisPool = null;
/**
* 创建连接池
* @return
*/
public static JedisPool getJedisPoolInstance() {
if (null == jedisPool) {
synchronized (JedisPoolUtil.class) {
if (null == jedisPool) {
JedisPoolConfig poolConfig = new JedisPoolConfig();
//逐出连接的最小空闲时间 默认1800000毫秒(30分钟)
poolConfig.setMinEvictableIdleTimeMillis(30000);
////最大空闲连接数, 默认8个
poolConfig.setMaxIdle(8);
//最大连接数, 默认8个
poolConfig.setMaxTotal(8);
//最小空闲连接数, 默认0
poolConfig.setMinIdle(0);
jedisPool = new JedisPool(poolConfig, "192.168.100.110", 6379);
}
}
}
return jedisPool;
}
/**
* 获取Jedis实例
*
* @return
*/
public static Jedis getJedis() {
if (jedisPool != null) {
return jedisPool.getResource();
} else {
Jedis jedis = getJedisPoolInstance().getResource();
return jedis;
}
}
/**
* 释放资源
* @param jedis
*/
public static void close(final Jedis jedis) {
if (jedis != null) {
jedis.close();
}
}
}
数据类型 redis命令大全:http://doc.redisfans.com/
-
String(字符串)
String是简单的 key-value 键值对,value 不仅可以是 String,也可以是数字。它是Redis最基本的数据类型,一个redis中字符串value最多可以是512M。
-
Hash(哈希)
Redis hash 是一个键值对集合,对应Value内部实际就是一个HashMap,Hash特别适合用于存储对象。
-
List(列表)
Redis 列表是简单的字符串列表,按照插入顺序排序。你可以添加一个元素导列表的头部(左边)或者尾部(右边)。底层实现为一个双向链表,即可以支持反向查找和遍历,更方便操作,不过带来了部分额外的内存开销,Redis内部的很多实现,包括发送缓冲队列等也都是用的这个数据结构。
-
Set(集合)
Redis的Set是String类型的无序集合,它的内部实现是一个 value永远为null的HashMap,实际就是通过计算hash的方式来快速排重的,这也是set能提供判断一个成员是否在集合内的原因。
-
zset(有序集合)
Redis zset 和 set 一样也是String类型元素的集合,且不允许重复的成员,不同的是每个元素都会关联一个double类型的分数,用来排序。
@Test
public void setZset(){
Jedis jedis = JedisPoolUtil.getJedis();
jedis.zadd("runoobkey",1,"redis");
jedis.zadd("runoobkey",4,"mongodb");
jedis.zadd("runoobkey",6,"mysql");
jedis.zadd("runoobkey",3,"mysql11");
jedis.zadd("runoobkey",7,"mongodb111");
jedis.zadd("runoobkey",0,"redis1313");
}
@Test
public void getString(){
Jedis jedis = JedisPoolUtil.getJedis();
jedis.zrange("runoobkey", 0, 5).forEach(item ->{
System.out.println(item);
});
- 发布订阅
事务
Redis事务是一个单独的隔离操作:事务中的所有命令都会序列化、按顺序地执行。事务在执行的过程中,不会被其他客户端发送来的命令请求所打断。
Redis的事务不保证原子性,单条命令是原子执行。在Redsi的事务中,任意命令执行失败,事务不会回滚,其他命令还是会倍执行
Redis事务的三个阶段:1、开始事务,2、命令入队,3、执行事务
这里需要注意一下WATCH的这个命令,类似与乐观锁。必须在事务开启之前执行(MULTI)、可以执行多次。WATCH监听的key如果在事务执行期间更改了值,那事务是不会执行成功的。