本文记录学习在SpringBoot中使用Redis。java
Redis 是一个速度很是快的非关系数据库(Non-Relational Database),它能够存储键(Key)与 多种不一样类型的值(Value)之间的映射(Mapping),能够将存储在内存的键值对数据持久化到硬盘,可使用复制特性来扩展读性能,还可使用客户端分片来扩展写性能。Redis主要有如下几个优势:redis
1 性能极高,它每秒可执行约 100,000 个 Set 以及约 100,000 个 Get 操做;spring
2 丰富的数据类型,Redis 对大多数开发人员已知的大多数数据类型提供了原生支持,这使得各类问题得以轻松解决;数据库
3 原子性,由于全部 Redis 操做都是原子性的,因此多个客户端会并发地访问一个 Redis 服务器,获取相同的更新值;缓存
4 丰富的特性,Redis 是一个多效用工具,有很是多的应用场景,包括缓存、消息队列(Redis 原生支持发布/订阅)、短时间应用程序数据(好比 Web 会话、Web 页面命中计数)等。安全
目前咱们经常使用的Value的数据类型有String(字符串),Hash(哈希),List(列表),Set(集合),Zset(有序集合)。服务器
SpringBoot提供了对Redis的集成的模块,包是spring-boot-starter-data-redis,它依赖于 spring-data-redis 和 lettuce,lettuce是一个线程安全的redis客户端。并发
在pom.xml中引入依赖app
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-redis</artifactId>
</dependency>
在application.properties中配置Redis的链接信息spring-boot
# redis 配置
## redis数据库索引(默认0)
spring.redis.database=0
## redis 服务器地址
spring.redis.host=localhost
## redis 服务器端口
spring.redis.port=6379
## redis数据库密码(默认为空)
spring.redis.password=
## redis链接池最大链接数(使用负数表示没有显示,默认8)
spring.redis.lettuce.pool.max-active=8
## 链接池最大阻塞等待时间(使用负值表示没有限制,默认-1)
spring.redis.lettuce.pool.max-wait=-1
## 链接池中的最大空闲链接 默认 8
spring.redis.lettuce.pool.max-idle=8
## 链接池中的最小空闲链接 默认 0
spring.redis.lettuce.pool.min-idle=0
有了上边这两个步骤以后,咱们启动服务后,SpringBoot就会帮咱们链接到Redis服务器,并给咱们提供了一个RedisTemplate类供咱们使用操做Redis。咱们在须要用的地方注入RedisTemplate就能够轻松完成操做。
使用Junit作测试,在咱们的单元测试类中注入RedisTemplate
@RunWith(SpringRunner.class)
@SpringBootTest
public class RedisApplicationTests {
@Autowired
private RedisTemplate redisTemplate;
}
String字符串操做,value是一个字符串,经过delete(key)删除
@Test
public void testString() throws InterruptedException {
//字符串
ValueOperations strOps = redisTemplate.opsForValue();
strOps.set("name", "梓&艺");
System.out.println("字符串结果name:"+strOps.get("name"));
//删除key
redisTemplate.delete("name");
}
对象操做,value是一个对象
@Test
public void testObject() throws InterruptedException {
ValueOperations objOps = redisTemplate.opsForValue();
City city = new City(1, "X`A", "西安");
objOps.set("city", city);
System.out.println(objOps.get("city").toString());
redisTemplate.delete("city");
}
设置key的过时时间,在set时加上过时时间,经过hasKey(key)来判断key是否还存在
@Test
public void testExpire(){
//过时
ValueOperations objOps1 = redisTemplate.opsForValue();
City city1 = new City(1, "BJ", "北京");
objOps1.set("expire", city1, 2000, TimeUnit.MILLISECONDS);
System.out.println(objOps1.get("expire").toString());
Thread.sleep(2000);
System.out.println(redisTemplate.hasKey("expire"));
}
hash哈希操做
@Test
public void testHash() {
HashOperations hashOps = redisTemplate.opsForHash();
hashOps.put("hash","hashKey","hashValue");
System.out.println(hashOps.get("hash", "hashKey"));
}
在上边的代码中能够看出,Hash Set的时候就是在哈希表 Key 中的域(Field)的值设为 value。若是 Key 不存在,一个新的哈希表被建立并进行 Hash set 操做;若是域(Field)已经存在于哈希表中,旧值将被覆盖。
List列表操做
@Test
public void testList() {
ListOperations<String, String> listOps = redisTemplate.opsForList();
listOps.leftPush("list","梓");
listOps.leftPush("list","&");
listOps.leftPush("list","艺");
System.out.println(listOps.leftPop("list"));
}
列表操做时咱们经过 leftPush 或者 rightPush 来将数据存入列表中,经过 leftPop 或者rightPop将数据取出来,咱们能够利用它来实现一个队列。
Set集合操做
@Test
public void testSet() {
SetOperations<String, String> setOps = redisTemplate.opsForSet();
setOps.add("set","梓");
setOps.add("set","&");
setOps.add("set","&");
setOps.add("set","艺");
System.out.println(setOps.members("set"));
}
Set是一个没有顺序的集合,key相同时,若是value已经存在了,后边进入的会把前边的覆盖掉
ZSet有序集合操做
@Test
public void testZSet() {
ZSetOperations zSetOps = redisTemplate.opsForZSet();
zSetOps.add("zSet", "梓", 1);
zSetOps.add("zSet", "&", 2);
zSetOps.add("zSet", "艺", 3);
zSetOps.add("zSet", "zi", 1);
zSetOps.add("zSet", "yi", 3);
System.out.println(zSetOps.rangeByScore("zSet", 1, 3));
}
add 方法的3个参数分别是key,value,数据插入位置。ZSet中存储的数据都是有顺序的,输出时顺序按照存储时设置的从小到大,若是遇到key相同,Value和顺序同样的,后边的会把前边的覆盖掉,range方法后边的2个参数时插入的位置。如上的输出