目录

  • Redis简介
  • Redis的部署
  • 在Spring Boot中的使用
  • Redis缓存实战
  • 寻找组织
  • 程序员经典必备枕头书免费送

Redis简介

Redis 是一个开源的使用 ANSI C 语言编写、遵守 BSD 协议、支持网络、可基于内存亦可持久化的日志型、Key-Value 数据库,并提供多种语言的 API非关系型数据库(NoSQL)

Redis的特性

  1. Redis的所有操作都是原子性的,意思就是要么成功执行要么失败完全不执行。单个操作是原子性的。多个操作也支持事务,即原子性,通过MULTI和EXEC指令包起来。
  2. 性能极高 – Redis能读的速度是110000次/s,写的速度是81000次/s 。丰富的数据类型 – Redis支持二进制案例的 Strings, Lists, Hashes, Sets 及 Ordered Sets 数据类型操作。
  3. 原子 – Redis的所有操作都是原子性的,意思就是要么成功执行要么失败完全不执行。单个操作是原子性的。多个操作也支持事务,即原子性,通过MULTI和EXEC指令包起来。
  4. 丰富的特性 – Redis还支持 publish/subscribe, 通知, key 过期等等特性。

Redis的应用

  1. 会话缓存
  2. 数据缓存
  3. 排行榜/计数器
  4. 消息队列

Redis的数据类型

  • String: 字符串
  • Hash: 散列
  • List: 列表
  • Set: 集合
  • Sorted Set: 有序集合

Redis的部署

PS: 我这里是基于Mac环境,Windows环境下的同学可以安装Linux虚拟机同步进行操作。

  1. 官网下载 Stable(稳定)版本
  2. 找到下载的文件,解压并编译
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  # IPport: 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:

说明删除成功~

原创文章,文笔有限,才疏学浅,文中若有不正之处,万望告知。

源码地址

Github
Gitee

记得顺手点个star,您的肯定是对我写作最大的动力!

??~

寻找组织

QQ群:645860262
QQ:2148715557

程序员经典必备枕头书免费送

Vi的技术博客公号为了反馈广大读者对我的支持,特将在近期举办无套路包邮送书活动(活动规则为公号粉丝到达500人,目前445)
扫码关注即可参与即将开始的抽奖活动,敬请期待(全是精心挑选的哟?)

转载于:https://www.cnblogs.com/viyoung/p/10576137.html

Spring Boot 2.x(十四):整合Redis,看这一篇就够了相关推荐

  1. Spring Boot(十三):整合Redis哨兵,集群模式实践

    前面的两篇文章(Redis的持久化方案, 一文掌握Redis的三种集群方案)分别介绍了Redis的持久化与集群方案 -- 包括主从复制模式.哨兵模式.Cluster模式,其中主从复制模式由于不能自动做 ...

  2. Spring Boot教程(十四)快速入门

    快速入门 本章主要目标完成Spring Boot基础项目的构建,并且实现一个简单的Http请求处理,通过这个例子对Spring Boot有一个初步的了解,并体验其结构简单.开发快速的特性. 系统要求: ...

  3. Spring Boot 教学 学习 讲义笔记 【入门到精通一篇就够了】(上)

    目录 初识Spring Boot Spring boot 入门 系统要求 Maven配置文件 HelloWorld项目 创建maven工程 引入依赖 创建主程序 编写业务 运行&测试 设置配置 ...

  4. 《Redis篇》01.Redis看这一篇就够了

    陈老老老板 说明:在整体的复习一遍知识,边复习边总结,基础真的重要,需要注意的地方都标红了,还有资源的分享. 一起加油.本篇有对Redis知识的阐述,和使用IDEA操作Redis 视频链接:黑马Red ...

  5. Redis看这一篇就够了

    大数据时代NoSQL开始大行其道,其中常用于缓存的Redis可谓风头正盛,是大小公司技术架构中必不可少的一种中间件,也是职场技术同仁们必知必会的一种技术.本场Chat将从各个方面对Redis进行全面的 ...

  6. 企业级 Spring Boot 教程 (十四)用restTemplate消费服务

    构架工程 创建一个springboot工程,去消费RESTFUL的服务.这个服务是 http: ///gturnquist-quoters.cfapps.io/api/random ,它会随机返回Js ...

  7. 学习Spring Boot:(十四)spring-shiro的密码加密

    前言 前面配置了怎么使用 shiro ,这次研究下怎么使用spring shiro的密码加密,并且需要在新增.更新用户的时候,实现生成盐,加密后的密码进行入库操作. 正文 配置凭证匹配器 @Beanp ...

  8. vue项目整合UEditor看这一篇就够了

    前言 vue整合UEditor的需求,在整合过程中遇到不少问题,关于这方面在网上的资料也不少,但是没有一个能解决问题,在开发的过程中,几乎所有的问题能出现的都遇到了,比如图片上传提示没有后端服务配置, ...

  9. Spring Boot Ajax实例(十六)

    这篇博文主要用于新手学习Spring Boot,同时也记录自己学习的过程- 文章内容主要来源于易百教程 本文将展示如何使用jQuery.ajax将HTML表单请求发送到Spring REST API并 ...

  10. Spring Boot教程(二十):Spring Boot使用String Task定时任务

    一.JAVA常见的几种定时任务比较 Timer:jdk自带的java.util.Timer类,这个类允许你调度一个java.util.TimerTask任务.使用这种方式可以让程序按照某一个频度执行, ...

最新文章

  1. 前端必须会的基本知识题目
  2. 人人都应该知道的身体小窍门!
  3. 简明 Python 编程规范v2
  4. ALV DataChange EVENT
  5. Codeforces 427 D. Match amp; Catch
  6. 意大利终于付出了代价
  7. stats | 使用(偏)自相关函数判断ARMA模型的阶数
  8. (Builder)创建者模式
  9. 深度融合 | 当推荐系统遇见知识图谱(三)
  10. Spring集成CXF发布WebService并在客户端调用
  11. 初学线段树(poj3264+poj2777)
  12. 两个时间相减(vb.net)
  13. 视觉平衡与物理平衡_简单聊聊摄影“视觉平衡”那些事
  14. 忍者神龟java_忍者神龟-邪恶重生
  15. 行政组织理论-阶段测评3
  16. 在Windows Xp上实现Ubuntu主题风格!
  17. spotfire Document Property
  18. 小学-知识与能力【5】
  19. c语言怎么让程序换页,c语言编程系统,如何换页显示?
  20. UVALive 4126 Password Suspects(AC自动机+dp)

热门文章

  1. 一行代码让纯文本编辑器秒变 Markdown 编辑器
  2. 创建一个简单tcp服务器需要的流程
  3. 2017 Chinese Multi-University Training, BeihangU Contest
  4. 国产数据库助力民航核心交易系统
  5. 银行卡号每隔4位插入空格
  6. Codeforces D546:Soldier and Number Game
  7. ssh无密码登录设置
  8. 医学图像填洞处理-image fill holes
  9. 客户机容易随机出现自动重启、游戏卡问题?不妨优化下BIOS中节能技术!
  10. Windows Phone开发(6):处理屏幕方向的改变 转:http://blog.csdn.net/tcjiaan/article/details/7273107...