IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> Java知识库 -> Java使用RedisTemplate操作Redis -> 正文阅读

[Java知识库]Java使用RedisTemplate操作Redis

Java使用RedisTemplate操作Redis

1.RedisTemplate 的介绍

  • RedisTemplate方式是SpringBoot集成Redis的客户端方式,在使用时与Jedis的区别是是否使用使用RedisTemplage的时候一定要配置对象的序列化和反序列化方式。
  • 我们的代码中使用的序列化与反序列化是由 FastJSON 提供的

2.SpringBoot 项目使用 RedisTemplate

2.1 配置依赖

<dependency>
    <groupId>org.projectlombok</groupId>
    <artifactId>lombok</artifactId>
    <optional>true</optional>
</dependency>
<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-data-redis</artifactId>
</dependency>
<dependency>
    <groupId>com.alibaba</groupId>
    <artifactId>fastjson</artifactId>
    <version>1.2.3</version>
</dependency>

2.2 SpringBoot 配置文件

# 应用名称
spring:
  application:
    name: springbootredis
  redis:
    host: 192.168.159.133
    port: 6379
    database: 0
    jedis:
      pool:
        max-active: 10
        max-idle: 5
        min-idle: 0
        max-wait: 60000

2.3 业务层代码注入 RedisTemplate 对象

// 注入 RedisTemplate
@Autowired
private RedisTemplate<String, String> redisTemplate;

2.4 String 类型操作

/**
 * String 类型操作
 */
public void StringMethod(){
    // 查询所有
    System.out.println("=========[查询所有]=========");
    Set<String> keys = redisTemplate.keys("jedis*");
    for (String key : keys) {
        System.out.println("键:" + key + ", 键的类型:" + redisTemplate.opsForValue().get(key) + ", 值:" + redisTemplate.opsForValue().get(key));
    }
    // 设置键值对
    System.out.println("=========[设置键值对]=========");
    redisTemplate.opsForValue().set("jedis1", "1");
    redisTemplate.opsForValue().set("jedis2", "2");
    redisTemplate.opsForValue().set("jedis3", "3");
    keys = redisTemplate.keys("jedis*");
    for (String key : keys) {
        System.out.println("键:" + key + ", 键的类型:" + redisTemplate.opsForValue().get(key) + ", 值:" + redisTemplate.opsForValue().get(key));
    }
    // 设置有效期限的键,获取 ttl 值
    System.out.println("=========[设置有效期限的键,获取 ttl 值]=========");
    redisTemplate.opsForValue().set("expire1", "ttl key");
    redisTemplate.expire("expire1", 60, TimeUnit.SECONDS);
    try {
        Thread.sleep(5000); // 休眠 5 秒钟
    } catch (Exception e){
        System.out.println(e.getMessage());
    }
    System.out.println("休眠 5 秒钟之后,ttl 值为:" + redisTemplate.getExpire("expire1"));
    // 同时设置多个键值对,并获取
    System.out.println("=========[同时设置多个键值对,并获取]=========");
    Map<String, String> stringStringMap = new LinkedHashMap<>();
    stringStringMap.put("java-1", "6");
    stringStringMap.put("java-2", "8");
    stringStringMap.put("java-3", "10");
    redisTemplate.opsForValue().multiSet(stringStringMap);
    List<String> multiGet = redisTemplate.opsForValue().multiGet(stringStringMap.keySet());
    System.out.println("同时获取多个键的值:" + multiGet.toString());
    // 对 数值型的 键值对进行增减操作
    System.out.println("=========[对 数值型的 键值对进行增减操作]=========");
    redisTemplate.opsForValue().increment("java-1", 3L);
    redisTemplate.opsForValue().decrement("java-3", 5L);
    multiGet = redisTemplate.opsForValue().multiGet(stringStringMap.keySet());
    System.out.println("同时获取多个键的值:" + multiGet.toString());
    // 返回旧的数据,更新新的数据
    System.out.println("=========[返回旧的数据,更新新的数据]=========");
    String andSet = redisTemplate.opsForValue().getAndSet("java-2", "new-value");
    System.out.println("java-2 键的原来的值:" + andSet + ", 新的值:" + redisTemplate.opsForValue().get("java-2"));
    // 对值进行字符串操作
    System.out.println("=========[对值进行字符串操作]=========");
    redisTemplate.opsForValue().append("java-2", "-aaa");
    System.out.println("java-2 键的原来的值:" + andSet + ", 新的值:" + redisTemplate.opsForValue().get("java-2"));
    // 删除元素
    System.out.println("=========[删除元素]=========");
    Set<String> keys1 = redisTemplate.keys("*");
    redisTemplate.delete(keys1);
}

在这里插入图片描述

2.5 List 类型操作

/**
 * List 类型操作
 */
public void ListMethod(){
    // 从左侧和右侧 添加元素
    System.out.println("=========[从左侧和右侧 添加元素]=========");
    List<String> nameList = new LinkedList<>();
    nameList.add("Mike");
    nameList.add("Peter");
    nameList.add("Jack");
    redisTemplate.opsForList().leftPushAll("list-java-1", nameList); // 左侧 push
    nameList.clear();
    nameList.add("aaa");
    nameList.add("bbb");
    nameList.add("ccc");
    redisTemplate.opsForList().rightPushAll("list-java-1", nameList); // 右侧 push
    // 根据索引获取元素
    System.out.println("=========[根据索引获取元素]=========");
    String index = redisTemplate.opsForList().index("list-java-1", 1);
    System.out.println("索引为 1 的元素为:" + index);
    // 获取所有元素
    System.out.println("=========[获取所有元素]=========");
    List<String> range = redisTemplate.opsForList().range("list-java-1", 0, -1);
    System.out.println("所有元素:" + range.toString());
    // 删除指定数量的某元素
    System.out.println("=========[删除指定数量的某元素]=========");
    redisTemplate.opsForList().remove("list-java-1", 2, "Mike");
    range = redisTemplate.opsForList().range("list-java-1", 0, -1);
    System.out.println("元素数量:" + redisTemplate.opsForList().size("list-java-1") + ", 所有元素:" + range.toString());
    // 删除全部元素
    System.out.println("=========[删除全部元素]=========");
    redisTemplate.opsForList().trim("list-java-1", 0, 0);
    redisTemplate.opsForList().leftPop("list-java-1");
    range = redisTemplate.opsForList().range("list-java-1", 0, -1);
    System.out.println("元素数量:" + redisTemplate.opsForList().size("list-java-1") + ", 所有元素:" + range.toString());
}

在这里插入图片描述

2.6 Set 集合类型方法

/**
 * Set 集合类型方法
 */
public void SetMethod(){
    // 添加元素
    System.out.println("=========[添加元素]=========");
    redisTemplate.opsForSet().add("set-java-1", "Mike", "Peter", "Jack", "Mike", "Smith");
    redisTemplate.opsForSet().add("set-java-2", "Peter", "Jordan", "Amy", "Smith", "Wof");
    // 查询元素
    System.out.println("=========[查询元素]=========");
    Set<String> members = redisTemplate.opsForSet().members("set-java-1");
    Set<String> members2 = redisTemplate.opsForSet().members("set-java-2");
    System.out.println("元素数量:" + redisTemplate.opsForSet().size("set-java-1") + ", set-java-1 的所有元素:" + members.toString());
    System.out.println("元素数量:" + redisTemplate.opsForSet().size("set-java-2") + ", set-java-2 的所有元素:" + members2.toString());
    // 判断元素是否在 set 中
    System.out.println("=========[判断元素是否在 set 中]=========");
    System.out.println(redisTemplate.opsForSet().isMember("set-java-1", "Mike")? "Mike 存在": "Mike 不存在");
    System.out.println(redisTemplate.opsForSet().isMember("set-java-2", "Jorge")? "Jorge 存在": "Jorge 不存在");
    // 交集,并集,差集的计算
    System.out.println("=========[交集,并集,差集的计算]=========");
    Set<String> intersect = redisTemplate.opsForSet().intersect("set-java-1", "set-java-2");
    Set<String> union = redisTemplate.opsForSet().union("set-java-1", "set-java-2");
    Set<String> difference = redisTemplate.opsForSet().difference("set-java-1", "set-java-2");
    System.out.println("交集:" + intersect.toString());
    System.out.println("并集:" + union.toString());
    System.out.println("差集:" + difference.toString());
    // 删除元素
    System.out.println("=========[删除元素]=========");
    redisTemplate.opsForSet().remove("set-java-1", "Mike");
    redisTemplate.opsForSet().move("set-java-1", "set-java-2", "Jack");
    redisTemplate.opsForSet().pop("set-java-1", redisTemplate.opsForSet().size("set-java-1"));
    redisTemplate.opsForSet().pop("set-java-2", redisTemplate.opsForSet().size("set-java-2"));
}

在这里插入图片描述

2.7 Sort Set 类型方法(有序集合)

/**
 * Sort Set 类型方法(有序集合)
 */
public void SortSetMethod(){
    // 添加元素
    System.out.println("=========[添加元素]=========");
    redisTemplate.opsForZSet().add("sortset-java-1", "不及格", 59.0);
    redisTemplate.opsForZSet().add("sortset-java-1", "及格", 69.0);
    redisTemplate.opsForZSet().add("sortset-java-1", "中等", 79.0);
    redisTemplate.opsForZSet().add("sortset-java-1", "良好", 89.0);
    redisTemplate.opsForZSet().add("sortset-java-1", "优秀", 99.0);
    redisTemplate.opsForZSet().add("sortset-java-1", "满分", 100.0);
    // 查询元素
    System.out.println("=========[查询元素]=========");
    System.out.println("元素总数为:" + redisTemplate.opsForZSet().size("sortset-java-1"));
    System.out.println("优秀分数为:" + redisTemplate.opsForZSet().score("sortset-java-1", "优秀"));
    System.out.println("及格人数为:" + redisTemplate.opsForZSet().count("sortset-java-1", 60, 100) + ", 上面的档次有:" + redisTemplate.opsForZSet().rangeByScore("sortset-java-1", 60, 100).toString());
    System.out.println("中等人数为:" + redisTemplate.opsForZSet().count("sortset-java-1", 70, 100) + ", 上面的档次有:" + redisTemplate.opsForZSet().rangeByScore("sortset-java-1", 70, 100).toString());
    System.out.println("良好人数为:" + redisTemplate.opsForZSet().count("sortset-java-1", 80, 100) + ", 上面的档次有:" + redisTemplate.opsForZSet().rangeByScore("sortset-java-1", 80, 100).toString());
    System.out.println("优秀人数为:" + redisTemplate.opsForZSet().count("sortset-java-1", 90, 100) + ", 上面的档次有:" + redisTemplate.opsForZSet().rangeByScore("sortset-java-1", 90, 100).toString());
    // 删除元素
    System.out.println("=========[删除元素]=========");
    redisTemplate.opsForZSet().remove("sortset-java-1", "不及格"); // 单独删除一个元素
    redisTemplate.opsForZSet().removeRangeByScore("sortset-java-1", 60, 100); // 删除分数段的所有元素
}

在这里插入图片描述

2.8 Hash 类型方法

/**
 * Hash 类型方法
 */
public void HashMethod(){
    // 模拟从数据库中读取大量用户数据,缓存到 redis 中
    List<User> userList = new LinkedList<>();
    userList.add(new User(2022090101, "Mike", 21, "Beijing"));
    userList.add(new User(2022090102, "Peter", 24, "Shanghai"));
    userList.add(new User(2022090103, "Jack", 22, "Shenzhen"));
    userList.add(new User(2022090104, "云梦", 22, "Dalian"));
    userList.add(new User(2022090105, "归遥", 20, "Hangzhou"));
    // 将数据库中读取出来的数据进行处理,构建为 map
    Map<String, String> userMap = new LinkedHashMap<>();
    for (User user: userList){
        userMap.put(String.valueOf(user.getId()), JSON.toJSONString(user));
    }
    // 增加数据(进行序列化)
    System.out.println("============[增加数据(进行序列化)]===========");
    redisTemplate.opsForHash().putAll("hash-java-1", userMap);
    // 获取所有的键,值
    System.out.println("============[获取所有的键,值]===========");
    Set<Object> keys = redisTemplate.opsForHash().keys("hash-java-1");
    List<Object> values = redisTemplate.opsForHash().values("hash-java-1");
    System.out.println("所有的键:" + keys.toString());
    System.out.println("所有的值:" + values.toString());
    // 判断某个键是否存在
    System.out.println("============[判断某个键是否存在]===========");
    Boolean aBoolean = redisTemplate.opsForHash().hasKey("hash-java-1", "2022090101");
    System.out.println("2022090101 是否存在:" + aBoolean);
    aBoolean = redisTemplate.opsForHash().hasKey("hash-java-1", "2022090109");
    System.out.println("2022090109 是否存在:" + aBoolean);
    // 获取并修改某个键对应的值
    System.out.println("============[获取并修改某个键对应的值]===========");
    if (redisTemplate.opsForHash().hasKey("hash-java-1", "2022090101")){
        String userString = (String)redisTemplate.opsForHash().get("hash-java-1", "2022090101");
        User user = JSON.parseObject(userString, User.class);
        System.out.println("2022090101 对应的数据为:" + user.toString());
        user.setAge(30);
        user.setAddress("Guangzhou");
        redisTemplate.opsForHash().put("hash-java-1", "2022090101", JSON.toJSONString(user));
    } else {
        System.out.println("2022090101 对应的数据为 null");
    }
    // 获取所有键值对
    System.out.println("============[获取所有键值对]===========");
    Map<Object, Object> entries = redisTemplate.opsForHash().entries("hash-java-1");
    System.out.println("元素数量:" + entries.size());
    Set<Map.Entry<Object, Object>> entries1 = entries.entrySet();
    for (Map.Entry<Object, Object> entry: entries1){
        System.out.println("键:" + entry.getKey() + ", 值:" + entry.getValue());
    }
    // 删除元素
    System.out.println("============[删除元素]===========");
    redisTemplate.opsForHash().keys("hash-java-1").forEach(key -> redisTemplate.opsForHash().delete("hash-java-1", key));
}

在这里插入图片描述

2.9 事务

/**
 * 事务
 */
public void MultiMethod(){
    // 模拟转账操作(模拟 Mike,Jack用户各有 100 元)
    redisTemplate.opsForValue().set("Mike", "100");
    redisTemplate.opsForValue().set("Jack", "100");
    // 进行转账操作(转账 20 元)
    int transfer = 20;
    String mike = redisTemplate.opsForValue().get("Mike");
    redisTemplate.setEnableTransactionSupport(true); // 开启事务支持
    redisTemplate.watch(List.of("Mike", "Jack")); // 开启监听
    redisTemplate.multi(); // 开启事务
    try{
        // 判断余额是否足够
        if (Integer.parseInt(mike) >= transfer){
            redisTemplate.opsForValue().decrement("Mike", (long) transfer); // 转出
            redisTemplate.opsForValue().increment("Jack", (long) transfer); // 转入
            redisTemplate.exec(); // 提交事务
            System.out.println("双方转账成功");
        }else {
            System.out.println("Mike 账户余额不足,转账失败");
        }
    }catch (Exception e){
        System.out.println("转账过程中出现异常:" + e.getMessage());
        redisTemplate.discard(); // 回滚
    } finally {
        System.out.println("转账后双方余额:Mike:" + redisTemplate.opsForValue().get("Mike") + ", Jack: " + redisTemplate.opsForValue().get("Jack"));
        // 删除测试数据
        redisTemplate.delete(List.of("Mike", "Jack"));
    }
}

在这里插入图片描述

3.总结

以上就是 RedisTemplate 操作 Redis 的相关代码

  Java知识库 最新文章
计算距离春节还有多长时间
系统开发系列 之WebService(spring框架+ma
springBoot+Cache(自定义有效时间配置)
SpringBoot整合mybatis实现增删改查、分页查
spring教程
SpringBoot+Vue实现美食交流网站的设计与实
虚拟机内存结构以及虚拟机中销毁和新建对象
SpringMVC---原理
小李同学: Java如何按多个字段分组
打印票据--java
上一篇文章      下一篇文章      查看所有文章
加:2022-06-25 17:56:45  更:2022-06-25 17:58:07 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/23 17:17:48-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码