SpringBoot(十)_springboot集成Redis
Redis 介绍
Redis是一款开源的使用ANSI C语言编写、遵守BSD协议、支持网络、可基于内存也可持久化的日志型、Key-Value高性能数据库。
数据模型
Redis 数据模型不仅与关系数据库管理系统(RDBMS)不同,也不同于任何简单的 NoSQL 键-值数据存储。Redis 数据类型类似于编程语言的基础数据类型,所以开发人员感觉很自然。每个数据类型都支持适用于其类型的操作。受支持的数据类型包括:
- string(字符串)
- hash(哈希)
- list(列表)
- set(集合)
- zset(sorted set:有序集合)
关键优势
Redis 的优势包括它的速度、它对富数据类型的支持、它的操作的原子性,以及它的通用性:
- 读速度为110000次/s,写速度为81000次/s,性能极高。
- 丰富的数据类型,Redis 对大多数开发人员已知道的大多数数据类型提供了原生支持,这使得各种问题得以轻松解决。
- 原子性,因为所有 Redis 操作都是原子性的,所以多个客户端会并发地访问一个 Redis 服务器,获取相同的更新值。
- 丰富的特性,Redis 是一个多效用工具,有非常多的应用场景,包括缓存、消息队列(Redis 原生支持发布/订阅)、短期应用程序数据(如 Web 会话、Web 页面命中计数)等。
springboot集成Redis
1、创建集成redis的springboot项目
我直接用idea创建一个新的工程,在创建的时候,直接集成Redis,如下图

2.application 配置(application.yml)
spring:
redis:
# Redis 服务器地址
host: 192.168.142.128
# Redis 服务器连接端口
port: 6379
# Redis 服务器连接密码(默认为空)
password:
# Redis 数据库索引(默认为0)
database: 1
jedis:
pool:
# 连接池最大连接数(使用负值表示没有限制)
max-active: 8
# 连接池最大阻塞等待时间(使用负值表示没有限制)
max-wait: -1
# 连接池中的最大空闲连接
max-idle: 8
3、Redis 对多种数据类型的操作
这里我直接在Test类中进行操作,注入RedisTemplate
@RunWith(SpringRunner.class)
@SpringBootTest
public class RedisDemo01ApplicationTests {
@Resource
private RedisTemplate redisTemplate;
@Test
public void contextLoads() {
}
- String类型
/**
* 测试存储String
*/
@Test
public void testString(){
redisTemplate.opsForValue().set("maomao", "hello");
System.out.println(redisTemplate.opsForValue().get("maomao").toString());
}
//输出hello
- hash类型
hash set 的时候需要传入三个参数,第一个为 key,第二个为 field,第三个为存储的值。一般情况下 Key 代表一组数据,field 为 key 相关的属性,而 value 就是属性对应的值.
/**
* hash
*/
@Test
public void testHash() {
HashOperations<String, Object, Object> hash = redisTemplate.opsForHash();
hash.put("hash","hello","java");
String value=(String) hash.get("hash","hello");
System.out.println("hash value :"+value);
}
//输出 hash value :java
- list类型
Redis list 的应用场景非常多,也是 Redis 最重要的数据结构之一。 使用 List 可以轻松的实现一个队列,List 典型的应用场景就是消息队列,可以利用 list 的 PUSH 操作,将任务存在 list 中,然后工作线程再用 POP 操作将任务取出进行执行。
@Test
public void testListPop() {
String key="list";
redisTemplate.delete(key);
ListOperations<String, String> list = redisTemplate.opsForList();
list.leftPush(key,"just");
list.leftPush(key,"do");
list.leftPush(key,"it");
String value=list.leftPop(key);
System.out.println("list value :"+value);
}
//输出结果 list value :it
使用 range 来读取,range 后面的两个参数就是插入数据的位置,输入不同的参数就可以取出队列中对应的数据。
@Test
public void testListRange() {
String key="list";
redisTemplate.delete(key);
ListOperations<String, String> list = redisTemplate.opsForList();
list.rightPush(key,"just");
list.rightPush(key,"do");
list.rightPush(key,"it");
List<String> values=list.range(key,0,3);
for (String v:values){
System.out.println("list range :"+v);
}
}
//输出结果
//list range :just
//list range :do
//list range :it
- set类型
Redis set 对外提供的功能与 list 类似是一个列表的功能,特殊之处在于 set 是可以自动排重的,当需要存储一个列表数据,又不希望出现重复数据时,set 是一个很好的选择,并且 set 提供了判断某个成员是否在一个 set 集合内的重要接口,这个也是 list 所不能提供的。
@Test
public void testSet(){
String key = "set";
redisTemplate.delete(key);
SetOperations<String,String> set = redisTemplate.opsForSet();
set.add(key,"just");
set.add(key,"do");
set.add(key,"do");
set.add(key,"it");
Set<String> values = set.members(key);
for (String value:values){
System.out.println("set value :"+value);
}
}
//输出结果
//set value :just
//set value :it
//set value :do
Redis 为集合提供了求交集、并集、差集等操作,可以非常方便的使用
@Test
public void testSetMore() {
SetOperations<String, String> set = redisTemplate.opsForSet();
String key1="setMore1";
String key2="setMore2";
set.add(key1,"just");
set.add(key1,"do");
set.add(key1,"do");
set.add(key1,"it");
set.add(key2,"java");
set.add(key2,"do");
Set<String> diffs=set.difference(key1,key2);
for (String v:diffs){
System.out.println("diffs set value :"+v);
}
//输出
//diffs set value :it
//diffs set value :just
String key3="setMore3";
String key4="setMore4";
set.add(key3,"just");
set.add(key3,"do");
set.add(key3,"java");
set.add(key4,"it");
set.add(key4,"do");
set.add(key4,"hello");
Set<String> unions=set.union(key3,key4);
for (String v:unions){
System.out.println("unions value :"+v);
}
//输出
//unions value :do
//unions value :java
//unions value :just
//unions value :it
//unions value :hello
}
- zset
Redis sorted set 的使用场景与 set 类似,区别是 set 不是自动有序的,而 sorted set 可以通过用户额外提供一个优先级(score)的参数来为成员排序,并且是插入有序,即自动排序。
@Test
public void testZset(){
String key="zset";
redisTemplate.delete(key);
ZSetOperations<String, String> zset = redisTemplate.opsForZSet();
zset.add(key,"just",1);
zset.add(key,"now",5);
zset.add(key,"it",4);
zset.add(key,"do",3);
Set<String> zsets=zset.range(key,0,3);
for (String v:zsets){
System.out.println("zset value :"+v);
}
//zset value :just
//zset value :do
//zset value :it
//zset value :now
Set<String> zsetB=zset.rangeByScore(key,0,3);
for (String v:zsetB){
System.out.println("zsetB value :"+v);
}
//zsetB value :just
//zsetB value :do
}
4.Redis 其他的操作
- 超时失效
/**
* 测试超时失效
* @throws InterruptedException
*/
@Test
public void testExpire() throws InterruptedException {
ValueOperations<String, String> operations=redisTemplate.opsForValue();
operations.set("expire", "java",100,TimeUnit.MILLISECONDS);
Thread.sleep(1000);
boolean exists=redisTemplate.hasKey("expire");
if(exists){
System.out.println("exists is true");
}else{
System.out.println("exists is false");
}
}
// 输出 exists is false
- 删除数据
/**
* 删除数据
*/
@Test
public void testDelete() {
ValueOperations<String, String> operations=redisTemplate.opsForValue();
operations.set("deletekey", "springboot");
redisTemplate.delete("deletekey");
//判断key是否还在
boolean exists=redisTemplate.hasKey("deletekey");
if(exists){
System.out.println("exists is true");
}else{
System.out.println("exists is false");
}
}
//输出 exists is false
5、封装
在实际的使用过程中,不会给每一个使用的类都注入 redisTemplate 来直接使用,一般都会对业务进行简单的包装,最后提供出来对外使用. 这里就不在展示
完整代码下载:github
SpringBoot(十)_springboot集成Redis的更多相关文章
- Springboot 2.0 - 集成redis
序 最近在入门SpringBoot,然后在感慨 SpringBoot较于Spring真的方便多时,顺便记录下自己在集成redis时的一些想法. 1.从springboot官网查看redis的依赖包 & ...
- springboot 2.X 集成redis
在实际开发中,经常会引入redis中间件做缓存,这里介绍springboot2.X后如何配置redis 1 Maven中引入redis springboot官方通过spring-boot-autoco ...
- 【转载】Springboot整合 一 集成 redis
原文:http://www.ityouknow.com/springboot/2016/03/06/spring-boot-redis.html https://blog.csdn.net/plei_ ...
- SpringBoot(八)_springboot集成swagger2
swagger是一个功能强大的api框架,它的集成非常简单,不仅提供了在线文档的查阅,而且还提供了在线文档的测试. (1) 引入依赖,我们选择现在最新的版本 <dependency> &l ...
- SpringBoot(九)_springboot集成 MyBatis
MyBatis 是一款标准的 ORM 框架,被广泛的应用于各企业开发中.具体细节这里就不在叙述,大家自行查找资料进行学习下. 加载依赖 <dependency> <groupId&g ...
- Spring Boot从入门到精通(七)集成Redis实现Session共享
单点登录(SSO)是指在多个应用系统中,登录用户只需要登录验证一次就可以访问所有相互信任的应用系统,Redis Session共享是实现单点登录的一种方式.本文是通过Spring Boot框架集成Re ...
- SpringBoot进阶教程(二十九)整合Redis 发布订阅
SUBSCRIBE, UNSUBSCRIBE 和 PUBLISH 实现了 发布/订阅消息范例,发送者 (publishers) 不用编程就可以向特定的接受者发送消息 (subscribers). Ra ...
- 【springBoot】springBoot集成redis的key,value序列化的相关问题
使用的是maven工程 springBoot集成redis默认使用的是注解,在官方文档中只需要2步; 1.在pom文件中引入即可 <dependency> <groupId>o ...
- SpringBoot集成redis的key,value序列化的相关问题
使用的是maven工程 springBoot集成redis默认使用的是注解,在官方文档中只需要2步; 1.在pom文件中引入即可 <dependency> <groupId>o ...
随机推荐
- 指定路由器(DR/BDR)和非指定路由器(DROTHER)的区别
一:名词解释 DR:designated router 指定路由器. BDR:backup designated router 备份指定路由器. 二:DR/BDR出现的缘由 在广播网和NBMA网络中, ...
- Jmeter接口测试(七)用例数据分离
之前我们的用例数据都是配置在 Jmeter Http 请求中,每次需要增加,修改用例都需要打开 jmeter 重新编辑,当用例越来越多的时候,用例维护起来就越来越麻烦,有没有好的方法来解决这种情况呢? ...
- 如何让mysql按照两个或多个字段排序
我准备设计一个供求信息的表格,里边包含序号(id)(自动增量),发布日期(time),上次更新(last_time).因为考虑到避免有人不停的重复发布信息来占据前列位置所以设置了last_time这个 ...
- react-native初体验(2) — 认识路由
如果学习止步于 hello world, 那么人生也太没意思了.这次要做一个看起来真实的应用.多添加几个页面,让他们可以交互,动起来. react-native 官方推荐使用 react-naviga ...
- 《杜增强讲Unity之Tanks坦克大战》3-添加坦克
3 添加坦克 3.1 本节效果预览 3.2 另存新场景 首先打开上次的场景s1,另存为s2,放到同一个文件夹下面. 3.3 添加坦克模型 在Model文件夹下面找到Tank模型 将Tank ...
- Spring入门学习笔记(3)——事件处理类
目录 Spring中的事件处理 Spring内建事件 监听Context事件 Example 自定义Spring事件 Spring中的事件处理 ApplicationContext 是Spring的核 ...
- 关于如何准备CKA考试
最近(2019年4月)通过了CKA考试,在此分享一下考试心得. CKA全称Certified Kubernetes Administrator,是一门在线考试,全程需要向考官分享摄像头和屏幕,考试费用 ...
- Python之并发编程-多线程
目录 一.threading模块介绍二.使用说明三.进一步介绍(守护线程,锁(互斥锁.递归锁),信号量,队列,event,condition,定时器) 1.守护线程 2.锁(互斥锁.递归锁) 3.信号 ...
- PHP--面向对象的设计原则
三大特性是:封装.继承.多态 所谓封装,也就是把客观事物封装成抽象的类,并且类可以把自己的数据和方法只让可信的类或者对象操作,对不可信的进行信息隐藏. 封装是面向对象的特征之一,是对象和类概念的主要特 ...
- Scrum立会报告+燃尽图(十二月十日总第四十一次):用户推广
此作业要求参见:https://edu.cnblogs.com/campus/nenu/2018fall/homework/2484 项目地址:https://git.coding.net/zhang ...