关键词:
Redis简介
Redis 是一个开源的使用 ANSI C 语言编写、遵守 BSD 协议、支持网络、可基于内存亦可持久化的日志型、Key-Value 数据库,并提供多种语言的 API的非关系型数据库(NoSQL)。
Redis的特性
- Redis的所有操作都是原子性的,意思就是要么成功执行要么失败完全不执行。单个操作是原子性的。多个操作也支持事务,即原子性,通过MULTI和EXEC指令包起来。
- 性能极高 – Redis能读的速度是110000次/s,写的速度是81000次/s 。丰富的数据类型 – Redis支持二进制案例的 Strings, Lists, Hashes, Sets 及 Ordered Sets 数据类型操作。
- 原子 – Redis的所有操作都是原子性的,意思就是要么成功执行要么失败完全不执行。单个操作是原子性的。多个操作也支持事务,即原子性,通过MULTI和EXEC指令包起来。
- 丰富的特性 – Redis还支持 publish/subscribe, 通知, key 过期等等特性。
Redis的应用
- 会话缓存
- 数据缓存
- 排行榜/计数器
- 消息队列
Redis的数据类型
- String: 字符串
- Hash: 散列
- List: 列表
- Set: 集合
- Sorted Set: 有序集合
Redis的部署
PS: 我这里是基于Mac环境,Windows环境下的同学可以安装Linux虚拟机同步进行操作。
- 官网下载 Stable(稳定)版本
- 找到下载的文件,解压并编译
tar -zxvf redis-5.0.4.tar.gz
mv redis-5.0.4 /usr/local/
cd /usr/local/redis-5.0.4/
make test
执行到这里,最好先执行一遍make test,确保编译可以通过,需要大概三分钟。
到这个就说明测试通过了。我们接着往下执行
make
cd src/
make install
执行到这里安装就算是告一段落了,接下来我们进行redis的一些配置:
vim ../redis.conf
找到136行左右的daemonize
将其属性改为yes,可以让redis在后台运行,然后找到500行左右的requirepass
,后面输入我们需要设置的密码,这样就可以通过密码来访问redis了。
然后我们通过指定配置文件的方式来启动redis
./redis-server ../redis.conf
执行完事儿之后,查看是否执行成功:
ps -ef | grep redis
可以看到,我们的redis已经启动成功了,然后通过rdm来访问一下:
大功告成,现在万事俱备,只欠东风。我们下面来看一下在Spring Boot中怎么使用redis吧。
在Spring Boot中的使用
Spring Boot给我们提供了现成的spring-boot-starter-data-redis
,我们只需要在pom文件中将之导入即可。
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-redis</artifactId>
</dependency>
<!-- 创建连接池 -->
<dependency>
<groupId>org.apache.commons</groupId>
<artifactId>commons-pool2</artifactId>
</dependency>
然后,我们需要在配置文件中配置一些有关redis的信息:
spring:
redis:
host: 127.0.0.1 # IP
port: 6379 # 端口号
password: 123456 # 密码
lettuce:
pool:
max-active: 8 # 连接池最大连接数
max-wait: -1ms # 连接池最大阻塞等待时间(使用负值表示没有限制)
min-idle: 0 # 连接池中的最小空闲连接
max-idle: 8 # 连接池中的最大空闲连接
接下来,我们需要对我们所需要的Redis的操作给封装到一个接口中,方便我们去调用,这里我基于接口,抽象类,实现类的结构实现了一套Redis的方法,需要的同学可以去GitHub上下载(子项目名称:viboot-rds),GitHub的地址在文末。这里仅仅贴出接口的部分方法。
package com.itframe.dao;
import java.util.List;
import java.util.Map;
import java.util.Set;
/**
*
*/
public interface RedisDao {
/**
* 判断缓存中是否有对应的value
*
* @param key
* @return boolean
*/
public boolean existsKey(Object key);
/**
* 根据key获取key列表(key值可为模糊匹配---taskInfo:taskDetail:* <---> *代表任意字符)
*
* @param pattern
* @return Set<Object>
*/
public Set<Object> keys(Object pattern);
/**
* 根据key删除对应的value
*
* @param key
*/
public boolean delete(Object key);
/**
* 根据key获取个数
*
* @param key
*/
public int count(Object key);
/**
* 批量删除对应的value
*
* @param keys
*/
public void delete(String[] keys);
/**
* 批量删除key(key值可为模糊匹配---taskInfo:taskDetail:* <---> *代表任意字符)
*
* @param pattern
*/
public long deletePattern(Object pattern);
/**
* 批量删除对应的value
*
* @param keys
*/
public long delete(Set<Object> keys);
/**
* 写入缓存(操作字符串)
*
* @param key
* @param value
* @return boolean
*/
public boolean vSet(Object key, Object value);
/**
* 写入缓存设置时效时间(操作字符串)
*
* @param key
* @param value
* @return boolean
*/
public boolean vSet(Object key, Object value, Long expireTime);
/**
* 更新写入缓存设置时效时间(操作字符串)
*
* @param key
* @return boolean
*/
public boolean vSetUpdate(Object key, Long expireTime);
/**
* 读取缓存(操作字符串)
*
* @param key
* @return Object
*/
public Object vGet(Object key);
/**
* 哈希 添加(操作hash)
*
* @param key
* @param hashKey
* @param value
*/
public void hmSet(Object key, Object hashKey, Object value);
/**
* 哈希 添加(操作hash)
*
* @param key
* @param map
*/
public void hmSetAll(Object key, Map<Object, Object> map);
/**
* 哈希获取数据(操作hash)
*
* @param key
* @return Map<Object, Object>
*/
public Map<Object, Object> hmGet(Object key);
/**
* 哈希获取数据(操作hash)
*
* @param key
* @param hashKey
* @return Object
*/
public Object hmGet(Object key, Object hashKey);
/**
* 哈希删除数据(操作hash)
*
* @param key
* @param hashKey
* @return Object
*/
public Object hmDel(Object key, Object hashKey);
}
在抽象类中我们进行了RedisTemplate
的初始化以及序列化:
public abstract class AbstractBaseRedisDao<K, V> {
@Resource(name = "redisTemplate")
protected RedisTemplate<K, V> redisTemplate;
/**
* 设置redisTemplate
*
* @param redisTemplate
*/
public void setRedisTemplate(RedisTemplate<K, V> redisTemplate) {
this.redisTemplate = redisTemplate;
}
/**
* 获取 RedisSerializer
*/
protected RedisSerializer<String> getRedisSerializer() {
return redisTemplate.getStringSerializer();
}
}
在实现类中我们通过操作RestTemplate来实现接口中的方法~
Redis缓存实战
首先,我们如果想在Spring Boot项目中启用缓存,需要在启动类上加上注解@EnableCaching
,这个是重点,要记住了!
首先介绍一下注解三剑客:@Cacheable
,@CachePut
,@CacheEvict
。
@Cacheable
:主要针对方法配置,能够根据方法的请求参数对其进行缓存,常用于查询操作@CachePut
:主要针对方法配置,能够根据方法的请求参数对其进行缓存,常用于修改操作@CacheEvict
:清空缓存,主要用于删除操作。
下面我们来看一下用法:
/**
* value: 缓存的名称
* key: 缓存的键
* return 缓存的值
*/
@Override
@Cacheable(value = "users", key = "#id")
public UserDO findOne(Long id) {
// 如果我们第二次访问的时候,控制台没有打印出这句话说明是从缓存中取出
log.info("From MYSQL");
return userMapper.get(id);
}
@Override
@CachePut(value = "users", key = "#userDO.id")
public UserDO update(UserDO userDO) {
// 执行之后,再次访问findOne的时候,应当没有打印出“From MySQL”,且返回的是我们修改后的值,说明这一步缓存成功
if (userMapper.update(userDO) > 0) {
return userMapper.get(userDO.getId());
}
return null;
}
@Override
@CacheEvict(value = "users", key = "#id")
public int delete(Long id) {
// 执行之后去rdm中查看即可
return userMapper.delete(id);
}
测试1
第一次访问findOne
第二次访问findOne:
仍然是刚刚的结果,但是控制台没有打印出任何东西,说明缓存成功
测试2
调用update后再次调用findOne:
可以看出信息已被修改且未访问数据库
测试3
访问delete,查看rdm:
说明删除成功~
原创文章,文笔有限,才疏学浅,文中若有不正之处,万望告知。
源码地址
记得顺手点个star,您的肯定是对我写作最大的动力!
????~
寻找组织
QQ群:645860262
QQ:2148715557
程序员经典必备枕头书免费送
Vi的技术博客公号为了反馈广大读者对我的支持,特将在近期举办无套路,包邮送书活动(活动规则为公号粉丝到达500人,目前445)
扫码关注即可参与即将开始的抽奖活动,敬请期待(全是精心挑选的哟??)
springboot2.x整合redis
#准备工作配置application.ymlspring:thymeleaf:#thymeleafcache:falsedatasource:#datasourcedriver-class-name:com.mysql.cj.jdbc.Driverurl:jdbc:mysql://localhost:3306/mp?useUnicode=true&characterEncoding=utf 查看详情
springboot2.x整合redis
pom文件<!--springboot中的redis依赖--><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-data-redis</artifactId></dependency>配置#R 查看详情
springboot2.x版本整合redis(单机/集群)(使用lettuce)
在springboot1.x系列中,其中使用的是jedis,但是到了springboot2.x其中使用的是Lettuce。此处springboot2.x,所以使用的是Lettuce。关于jedis跟lettuce的区别:Lettuce和Jedis的定位都是Redis的client,所以他们当然可以直接连接redisserver。Jedis在实现... 查看详情
springboot2.x整合redis以及连接哨兵模式/集群模式
依赖:<!--spirngboot版本为2.x--><!--加载springbootredis包,springboot2.0中直接使用jedis或者lettuce配置连接池,默认为lettuce连接池,这里使用jedis连接池--><!--加载springbootredis包--><dependency> <groupId>org.spr 查看详情
springboot2.x+shiro+redis整合填坑redis只做缓存的情况
...pringBoot+shiro已经集成完毕,如果没有集成,先查阅之前的Springboot2.0集成shiro权限管理2、redis已经安装完成3、redis客户端使用Lettuce,这也是sprinboot2.0后默认的,与jedis的区别,自行百度4、json使用springboot默认的一、依赖<dependency&... 查看详情
springboot2.x以上整合shiro1.7.1和redis的一些注意事项(代码片段)
因为之前用的shiro版本一直是1.4.0,后来我们老大跟我说版本太低了,不安全,叫我升级到1.7.1。升级后发现有些配置很不一样的,需要注意一下。一、pom.xml<parent><groupId>org.springframework.boot</groupId><ar... 查看详情
springboot2.x以上整合shiro1.7.1和redis的一些注意事项(代码片段)
因为之前用的shiro版本一直是1.4.0,后来我们老大跟我说版本太低了,不安全,叫我升级到1.7.1。升级后发现有些配置很不一样的,需要注意一下。一、pom.xml<parent><groupId>org.springframework.boot</groupId><ar... 查看详情
springboot(二十四)整合redis
缓存现在几乎是所有中大型网站都在用的必杀技,合理的利用缓存不仅能够提升网站访问速度,还能大大降低数据库的压力。Redis提供了键过期功能,也提供了灵活的键淘汰策略,所以,现在Redis用在缓存的场合非常多。之前有... 查看详情
springboot2.x+maven+mybatis+shiro+redis
...的一哥们的springboot1.X整合shiro和redis的demo,我用的是springboot2.X,改了下,添加了druid和swagger2,部分,公司屏蔽git,只能上传csdn备份。那位哥们的原文找不到了,sorry。部署resource/sql/shiro.sql 查看详情
springboot2.x-springboot整合amqp之rabbitmq
文章目录SpringBoot2.X-SpringBoot整合AMQP之RabbitMQRabbitMQ简介引入依赖编写配置编写接口启用Rabbit注解消息监听消息测试SpringBoot2.X-SpringBoot整合AMQP之RabbitMQSpringBoot2整合RabbitMQ案例。RabbitMQ简介简介RabbitMQ是一个由erlang开发的AMQP(AdvanvedMess... 查看详情
springboot整合redis(代码片段)
一、SpringBoot对Redis的支持Spring对Redis的支持是使用SpringDataRedis来实现的,一般使用Jedis或者lettuce(默认),Java客户端在 org.springframework.boot.autoconfigure.data.redis(SpringBoot2.x) 中redis的自动配置 AutoConfigureData 查看详情
springboot2.x最佳实践《一》之springboot2.x初体验
SpringBoot2.X最佳实践前言本系列文章,从零基础接触 SpringBoot2.x新版本,基础入门使用,热部署,到整合各个主流框架Redis4.x,消息队列AciveMQ,RocketMQ等,搜索框架ElasticSearch5.6版本,到web-flux反应式编程,到Actuator监控应用信息... 查看详情
springboot整合redis
...层:spring-dataSpringdata和springboot是齐名的项目!说明:在SpringBoot2.x之后,原来使用的jedis被替换为了lettuce?Jedis:采用的直连,多个线程操作的话,是不安全的,如果想要避免不安全的,使用jedispool连接池!更像BIO模式Lettuce:采... 查看详情
springboot2.x整合rocketmq4.x
开发生产者代码第一步:创建很普通的SpringBoot项目第二步:加入相关依赖<dependency><groupId>org.apache.rocketmq</groupId><artifactId>rocketmq-client</artifactId><version>4.3.0</version></ 查看详情
springboot2.x集成单节点redis
Springboot2.x集成单节点Redis说明在Springboot1.x版本中,默认使用Jedis客户端来操作Redis,而在Springboot2.x版本中,默认使用Lettuce客户端来操作Redis。Springboot提供了RedisTemplate来统一封装了对Redis操作,开发者只需要使用RedisTemplate就可以... 查看详情
springboot2.x整合solr6.x(代码片段)
第一步:pom.xml添加相关jar包依赖<projectxmlns="http://maven.apache.org/POM/4.0.0"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.a 查看详情
springboot2.x整合prometheus+grafana附源码(代码片段)
图文并茂,新手入门教程,建议收藏SpringBoot2.x整合Prometheus+Grafana【附源码】附源码+视频[toc]工程简介总体框架图简介PrometheusPrometheus,是一个开源的系统监控和告警的工具包,其采用Pull方式采集时间序列的度量数据(也支持push... 查看详情
springboot2.x集成redis哨兵模式
Springboot2.x集成Redis哨兵模式说明Redis哨兵模式是Redis高可用方案的一种实现方式,通过哨兵来自动实现故障转移,从而保证高可用。准备条件pom.xml中引入相关jar<!--集成Redis--><dependency><groupId>org.springframework.boot</group... 查看详情