SpringBoot 整合 Redis

  • 环境准备
    • 引入依赖
    • 配置文件
  • StringRedisTemplate 基本使用
    • Key 常用操作
    • String 常用操作
    • List 常用操作
    • Set 常用操作
    • ZSet 常用操作
    • Hash 常用操作
    • Key 的绑定操作 Bound
  • RedisTemplate 基本使用
    • RedisTemplate 基本操作
    • RedisTemplate 与 StringRedisTemplate 数据互不相通
  • Redis 应用场景

Spring Boot Data(数据) Redis 中提供了 RedisTemplate 和 StringRedisTemplate;

StringRedisTemplateRedisTemplate 的子类,两个方法基本一致,不同之处在于 操作的数据类型不同

  • RedisTemplate 两个泛型都是 Object,意味着存储的 key 和 value 都可以是一个对象
  • StringRedisTemplate 两个泛型都是 String,意味着存储的 的 key 和 value 都只能是字符串。

注:使用 RedisTemplate 默认是将对象序列化到 Redis 中,所以 放入的对象必须实现对象序列化接口

注:两者的 数据是不共通的;也就是说 StringRedisTemplate 只能管理 StringRedisTemplate 里面的数据,RedisTemplate 只能管理 RedisTemplate 中的数据。

环境准备

引入依赖

<dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-data-redis</artifactId>
</dependency>

配置文件

# 连接有redis服务的主机
spring.redis.host=localhost
spring.redis.port=6379
spring.redis.database=0

StringRedisTemplate 基本使用

API 是学不完的,掌握一些基本操作,其他操作有需要再查询即可!

StringRedisTemplate.opsForValue();   // 操作字符串
StringRedisTemplate.opsForHash();   // 操作hash
StringRedisTemplate.opsForList();   // 操作list
StringRedisTemplate.opsForSet();  // 操作set
StringRedisTemplate.opsForZSet();   // 操作有序set

通过@Autowired注解的方式注入 StringRedisTemplate 对象:

@Autowired
private StringRedisTemplate stringRedisTemplate;  // key, value 都是字符串

Key 常用操作

删除一个 key:

stringRedisTemplate.delete("name"); // 删除一个key

删除当前 redis 库中所有键值对:

// 删除当前redis库中所有键值对
Set<String> keys = stringRedisTemplate.keys("*"); // 查询出所有的键
stringRedisTemplate.delete(keys);

判断某个 key 是否存在,判断 key 所对应值的类型:

Boolean hasKey = stringRedisTemplate.hasKey("name"); // 判断某个key是否存在
DataType type = stringRedisTemplate.type("name"); // 判断key对应的值的类型

获取 key 超时时间(-1 永不超时,-2 key不存在,>=0 过期时间)

Long expire = stringRedisTemplate.getExpire("name");

在 redis 中随机获取一个 key:

String randomKey = stringRedisTemplate.randomKey();

修改 key 的名字,要求 key 必须存在,不存在则抛出异常:

stringRedisTemplate.rename("name", "newname");
// stringRedisTemplate.renameIfAbsent("age", "newname");

将指定 key 移动到 指定库:

stringRedisTemplate.move("newname", 1);

String 常用操作

所有字符串的操作都是通过 StringRedisTemplate.opsForValue(); 实现。

设置一个 key value:

stringRedisTemplate.opsForValue().set("name", "振宇"); // set 用来设置一个key value

获取一个 key 对应 value:

String value = stringRedisTemplate.opsForValue().get("name");

设置一个 key 超时时间

// key:code  value:2537  超时时间:120s
stringRedisTemplate.opsForValue().set("code", "2537", 120, TimeUnit.SECONDS);

往指定键的值后面 追加 字符串:

stringRedisTemplate.opsForValue().append("name", "他是一个好人!");

List 常用操作

所有 List 的操作都是通过 StringRedisTemplate.opsForList(); 实现。

从左边往列表中放入一个元素:

stringRedisTemplate.opsForList().leftPush("lists", "振宇");

从左边往列表中放入多个元素(两种方法):

stringRedisTemplate.opsForList().leftPushAll("lists", "张三", "李四", "王五");
List<String> names = new ArrayList<>();
names.add("xiaoming");
names.add("xiaosan");
stringRedisTemplate.opsForList().leftPushAll("lists", names);

遍历整个 List:

List<String> stringList = stringRedisTemplate.opsForList().range("lists", 0, -1);// 遍历list
stringList.forEach(v -> System.out.println("value = " + v));

保留截取的指定区间的 List:

stringRedisTemplate.opsForList().trim("lists", 1, 3);

Set 常用操作

所有 Set 的操作都是通过 StringRedisTemplate.opsForSet(); 实现。

创建 Set 并放入多个元素:

stringRedisTemplate.opsForSet().add("sets", "张三", "张三", "李四", "振宇"); // 创建set 并放入多个元素

查看 Set 中所有成员:

Set<String> sets = stringRedisTemplate.opsForSet().members("sets");
sets.forEach(value -> System.out.println("value = " + value));

获取 Set 中元素个数:

Long size = stringRedisTemplate.opsForSet().size("sets");

ZSet 常用操作

所有 ZSet 的操作都是通过 StringRedisTemplate.opsForZSet(); 实现。

创建 ZSet 并放入元素:

stringRedisTemplate.opsForZSet().add("zsets", "小黑", 20);

指定范围进行查询:

// 遍历所有元素
Set<String> zsets = stringRedisTemplate.opsForZSet().range("zsets", 0, -1);
zsets.forEach(value-> System.out.println(value));

获取指定元素以及分数(可以指定分数范围):

// 获取分数范围在 0 -1000 之间的元素 并排序
Set<ZSetOperations.TypedTuple<String>> zsets1 = stringRedisTemplate.opsForZSet().rangeByScoreWithScores("zsets", 0, 1000);
zsets1.forEach(typedTuple ->{System.out.println("value = " + typedTuple.getValue() + ", score = " + typedTuple.getScore());
});

Hash 常用操作

所有 Hash 的操作都是通过 StringRedisTemplate.opsForHash(); 实现。

往指定 Hash 中放入一个 key,value:

stringRedisTemplate.opsForHash().put("maps", "name", "zhangsan");

往指定 Hash 中放入多个 key,value:

 Map<String, String> map = new HashMap<>();
map.put("age", "12");
map.put("bir", "2012-12-12");
stringRedisTemplate.opsForHash().putAll("maps", map); // 放入多个key, value

获取指定 Hash 中某个 key 的 value:

String value = (String) stringRedisTemplate.opsForHash().get("maps", "name");

获取指定 Hash 中多个 key 的 value:

List<Object> values = stringRedisTemplate.opsForHash().multiGet("maps", Arrays.asList("name", "age"));
values.forEach(value -> System.out.println(value));

获取指定 Hash 中所有 key,获取所有 value:

Set<Object> keys = stringRedisTemplate.opsForHash().keys("maps"); // 获取所有keys
List<Object> vals = stringRedisTemplate.opsForHash().values("maps"); // 获取所有values

Key 的绑定操作 Bound

Spring Data 为了方便我们对 redis 进行更友好的操作,提供了 bound api 简化操作。

如果日后对某一个 key 的操作极其频繁,可以将这个 key 绑定到对应 redistemplate 中,可以简化操作。

  • boundValueOps 用来对 String 值绑定 key
  • boundListOps 用来对 List 值绑定 key
  • boundSetOps 用来对 Set 值绑定 key
  • boundZSetOps 用来对 ZSet 值绑定 key
  • boundHashOps 用来对 Hash 值绑定 key

原本代码可能需要这么写:

stringRedisTemplate.opsForValue().set("name", "zhangsan");
stringRedisTemplate.opsForValue().append("name", "是一个好人");
String s = stringRedisTemplate.opsForValue().get("name");
System.out.println(s);

绑定后只需要这么写:

BoundValueOperations<String, String> nameValueOperations = stringRedisTemplate.boundValueOps("name");nameValueOperations.set("zhangsan");
nameValueOperations.append("是一个好人");
String name = nameValueOperations.get();

对 List 进行绑定:

BoundListOperations<String, String> listsOperations = stringRedisTemplate.boundListOps("lists");
listsOperations.leftPushAll("张三", "李四", "小陈");
List<String> lists = listsOperations.range(0, -1);
lists.forEach(list-> System.out.println(list));

redis 中每个数据类型都可以进行绑定,与上面同理。

RedisTemplate 基本使用

RedisTemplate 的用法和 StringRedisTemplate 基本一样,我们关注他们的不同之处!

RedisTemplateStringRedisTemplate 的区别主要在于他们使用的序列化类:

  • RedisTemplate 使用的是 JdkSerializationRedisSerializer,存入数据时,会将数据先序列化成字节数组,然后再存入 Redis 数据库。;
  • StringRedisTemplate 使用的是 StringRedisSerializer

通过@Autowired注解的方式注入 RedisTemplate 对象:

@Autowired
private RedisTemplate redisTemplate;  //存储对象

想要存入 redis 的对象必须实现序列化接口:

@Data
@AllArgsConstructor
@NoArgsConstructor
@Accessors(chain = true)
public class User implements Serializable { // 实现序列化接口private String id;private String name;private Integer age;private Date bir;
}

RedisTemplate 基本操作

往 redis 中存入一个 User 对象:

redisTemplate.setValueSerializer(new JdkSerializationRedisSerializer()); // 指定值使用对象序列化
// 往redis中存入一个User对象
redisTemplate.opsForValue().set("user", new User("21", "小黑", 23, new Date()));
// 根据值获取存入的User对象
User user = (User) redisTemplate.opsForValue().get("user");
System.out.println(user);

需要注意的是,如果通过 redis 客户端查看其中的数据,无法正常显示 key 名,如下图:

RedisTemplate 正常往 redis 中存入 String 数据与 StringRedisTemplate 用法几乎一样,但是如果存放的是 String 类型数据则更推荐 StringRedisTemplate 而不是 RedisTemplate

redisTemplate.opsForList().leftPushAll("lists", "hello", "world");
List lists = redisTemplate.opsForList().range("lists", 0, -1);
lists.forEach(list -> System.out.println(list));

RedisTemplate 与 StringRedisTemplate 数据互不相通

RedisTemplate 和 StringRedisTemplate 的数据是不相通的!

1、StringRedisTemplate 往 redis 中存入一个 String 类型的值,分别尝试获取值:

  • RedisTemplate 无法获取到;
  • StringRedisTemplate 可以获取到;
stringRedisTemplate.opsForValue().set("name", "zhenyu");Object name1 = redisTemplate.opsForValue().get("name");
System.out.println(name1); // nullString name2 = stringRedisTemplate.opsForValue().get("name");
System.out.println(name2); // zhenyu

注:如果是在客户端中操作,视为使用 StringRedisTemplate

2、RedisBuilder 往 redis 中存入一个 User 对象,分别尝试获取值:

  • RedisTemplate 可以获取到;
  • StringRedisTemplate 无法获取到;
redisTemplate.opsForValue().set("user", new User("21", "zhenyu", 23, new Date()));User user1 = (User) redisTemplate.opsForValue().get("user");
System.out.println(user1); // User(id=21, name=zhenyu, age=23, bir=Sat Jul 04 10:17:12 CST 2020)String user2 = stringRedisTemplate.opsForValue().get("user");
System.out.println(user2); // null

3、RedisTemplate 往 redis 中存入一个 String 类型的值,分别尝试获取值:

  • RedisTemplate 可以获取到;
  • StringRedisTemplate 无法获取到;
redisTemplate.opsForValue().set("name", "hello");Object name1 = redisTemplate.opsForValue().get("name");
System.out.println(name1); // helloString name2 = stringRedisTemplate.opsForValue().get("name");
System.out.println(name2); // null

Redis 应用场景

上面我们学习的只是 StringRedisTemplateRedisTemplate 的基础操作,Redis 真正实现的功能都是建立在这些基础上的,企业中 Redis 的应用场景主要有:

  1. 利用 Redis 中字符串类型完成 手机验证码存储 的实现;
  2. 利用 Redis 中字符串类型完成 具有失效性业务功能,例如淘宝的订单失效时间…
  3. 利用 Redis 实现分布式集群系统中 Session共享
  4. 利用 Redis 中 ZSet 类型(可排序的 Set 类型)实现 排行榜功能sales(zset) [商品id,商品销量]
  5. 利用 Redis 实现 分布式缓存
  6. 利用 Redis 存储认证之后 token 信息,例如微信小程序开发中获取的令牌可能会超时…
  7. 利用 Redis 解决分布式集群系统中分布式锁问题

SpringBoot整合Redis 之 StringRedisTemplate、RedisTemplate 基础相关推荐

  1. SpringBoot整合Redis - @Cacheable 和 RedisTemplate

    对之前网站做了一些很简单的优化,给用户列表加了一个分页功能. 分页就更好考虑加载速度,如果换一页就要等几秒,那体验感是非常差的. 因此想到了加一个redis缓存. springboot整合redis有 ...

  2. springboot整合redis,使用redisTemplate实现简易秒杀功能,使用jmeter压力测试秒杀接口

    项目结构 1.新建maven项目导入pom依赖 <parent><groupId>org.springframework.boot</groupId><art ...

  3. SpringBoot 整合 Redis 使用详解(StringRedisTemplate 和 RedisTemplate 对比分析)

    背景: 最近项目采用前后端分离的架构,单点登录系统采用Redis存储用户session信息,在这里总结下springboot整合redis的详细过程,以及部分源码分析 1.前期准备 首先保证安装好re ...

  4. Redis学习篇3_事务及其监控(锁)、Jedis、SpringBoot整合Redis、RedisTemplate的json序列化、RedisUtil工具类

    目录 事务及其监控(锁) Jedis SpringBoot整合Redis RedisTemplate 默认RedisTemplate来源 关于中文序列化问题 RedisUtil工具类 一.事务及其监控 ...

  5. RedisTemplate操作redis五大类型用法详解(springboot整合redis版本)

    1.案例说明 springboot整合redis之后,提供了操作redis的简便方式 通过通用对象redisTemplate方式操作String,Hash,List,Set SortSet五大数据类型 ...

  6. SpringBoot整合Redis缓存

    SpringBoot整合Redis缓存 一.缓存概念知识 1.是什么缓存 2.缓存的优缺点 3.为什么使用缓存 二.Redis概念知识 1.Redis简介 2.为什么用Redis作为缓存 3.Redi ...

  7. Redis学习(含 Springboot 整合 Redis)

    Redis NoSQL (not only sql) 在现代的计算系统上每天网络上都会产生庞大的数据量. 这些数据有很大一部分是由关系数据库管理系统(RDBMS)来处理. 1970年 E.F.Codd ...

  8. SpringBoot整合Redis+Redis缓存应用+Redis实现Session共享+...

    一.SpringBoot整合Redis 1.导入依赖 <!--存在Redis依赖--> <dependency><groupId>org.springframewo ...

  9. SpringBoot第九篇: springboot整合Redis

    这篇文章主要介绍springboot整合redis,至于没有接触过redis的同学可以看下这篇文章:5分钟带你入门Redis. 引入依赖: 在pom文件中添加redis依赖: <dependen ...

最新文章

  1. ggThemeAssist:鼠标调整ggplot2主题,不用再记这些代码啦!
  2. vc6 C/C++的64位整型
  3. python3 签名 sha md5
  4. Day 8: Harp.JS——现代静态web服务器
  5. (String)、toString、String.valueOf的区别
  6. hdu5823 (附带数的二进制子集)
  7. 计算机网络课程设计之电子邮件客户端程序设计与实现
  8. android kotlin log,Kotlin实现Log打印工具类
  9. [李景山php]每天TP5-20170110|thinkphp5-Model.php-3
  10. 百行征信出首招,发布授信 反欺诈 核验三款测试产品
  11. win32 汇编实现全盘文件扫描功能(杀毒程序的扫描全盘文件功能)
  12. java wsdl文件生成代码_如何用myeclipse将wsdl文件生成java代码
  13. gis怎么改鼠标滚轮缩放_鼠标滚轮缩放工具-MAPGIS滚轮助手下载V1.3免费版-西西软件下载...
  14. 【论文】论文搜集+摘要翻译
  15. STM32/CPU总线的由来和地址映射概念
  16. OpenCV中使用Eigenfaces 或 Fisherfaces进行人脸识别
  17. 如何让谷歌浏览器支持迅雷下载
  18. Delphi Thread 多线程编程(6)
  19. 游戏技术汇:莉莉丝COO张昊解剖《刀塔传奇》开发经验心得
  20. Darkmode.js实现黑暗模式

热门文章

  1. Using APIs in Your Ethereum Smart Contract with Oraclize
  2. 1.1.1 计算机网络的概念、组成、功能和分类(转载)
  3. ssis 包配置组织程序_如何停止失控的SSIS程序包
  4. tempdb数据库清理_tempdb数据库,简介和建议
  5. 使用“ Row_Number”功能和WHILE循环创建滚动平均值报告
  6. sql raiserror_SQL Server PRINT和SQL Server RAISERROR语句
  7. 6 9*9乘法口诀
  8. BZOJ 1103: [POI2007]大都市meg [DFS序 树状数组]
  9. delphi连接sql server的字符串2011-10-11 16:07
  10. Hadoop实战之三~ Hello World