当前位置: 首页 > news >正文

在Java中操作Redis(详细-->从环境配置到代码实现)

在Java中操作Redis

文章目录

  • 在Java中操作Redis
    • 1、介绍
    • 2、Jedis
    • 3、Spring Data Redis
      • 3.1、对String的操作
      • 3.2、对哈希类型数据的操作
      • 3.3、对list的操作
      • 3.4、对set类型的操作
      • 3.5、对 ZSet类型的数据(有序集合)
      • 3.6、通用类型的操作

1、介绍

Redis 的Java客户端很多,官方推荐的有三种:

  • Jedis

  • Lettuce

  • Redisson

Spring对Redis客户端进行了整合,提供了Spring Data Redis,在Spring Boot项目中还提供了对应的Starter,即spring-boot-starter-data-redis

2、Jedis

Jedis的maven坐标:

     <!--redis--><dependency><groupId>redis.clients</groupId><artifactId>jedis</artifactId><version>2.8.0</version></dependency>

使用Jedis操作Redis的步骤:

  1. 获取连接
  2. 执行操作关闭连接
  3. 关闭连接

编写一个测试类测试redis:

package com.mannor.jedisdemo;import org.junit.jupiter.api.Test;
import org.springframework.boot.test.context.SpringBootTest;
import redis.clients.jedis.Jedis;@SpringBootTest
class JedisDemoApplicationTests {@Testvoid contextLoads() {//1. 获取连接Jedis jedis = new Jedis("localhost", 6379);//2. 执行操作关闭连接jedis.set("name", "mannor");//3. 关闭连接jedis.close();}
}

在此之前,需要将Redis服务启动起来redis-server.exe

程序运行前:

image-20230812220121965

测试项目运行后:

image-20230812220213860

测试其他:

package com.mannor.jedisdemo;import org.junit.jupiter.api.Test;
import org.springframework.boot.test.context.SpringBootTest;
import redis.clients.jedis.Jedis;import java.util.Set;@SpringBootTest
class JedisDemoApplicationTests {/*** 使用jedis操作Redis*/@Testvoid contextLoads() {//1. 获取连接Jedis jedis = new Jedis("localhost", 6379);//2. 执行操作关闭连接jedis.set("name", "mannor");//设置String name = jedis.get("name");//获取System.out.println(name);jedis.del("name");//删除jedis.hset("myhash","addr","beijing");//设置哈希表值String hget = jedis.hget("myhash", "addr");//获取哈希表System.out.println(hget);Set<String> keys = jedis.keys("*");//获取所有Redis的数据for(String key:keys){System.out.println(key);}//3. 关闭连接jedis.close();}}

测试项目源码:上述测试项目的源码

3、Spring Data Redis

在Spring Boot项目中,可以使用Spring Data Redis来简化Redis操作,maven坐标:

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

Spring Data Redis中提供了一个高度封装的类: RedisTemplate,针对jedis客户端中大量api进行了归类封装,将同一类型操作封装为operation接口,具体分类如下:

  • ValueOperations:简单K-V操作
  • SetOperations:set类型数据操作
  • ZSetOperations:zset类型数据操作
  • HashOperations:针对map类型的数据操作
  • ListOperations:针对list类型的数据操作

yml配置文件:

spring:application:name: springdataredis_demo#Redis相关配置redis:host: localhostport: 6379#password: 123456database: 0 #操作的是0号数据库(redis存在0-15号数据库(默认),在命令中使用select来切换)jedis:#Redis连接池配置pool:max-active: 8 #最大连接数max-wait: 1ms #连接池最大阻塞等待时间 max-idle: 4 #连接池中的最大空闲连接min-idle: 0 #连接池中的最小空闲连接

在获取到RedisTemplate对象执行下列语句:

redisTemplate.opsForValue().set("city","beijing");

输出:image-20230812225658840

原因:RedisTemplate在操作Redis数据库的时候,将key做了一个序列化,上述结果就是序列化的结果,为了解决这个问题就要配置一个配置类:

package com.itheima.config;import org.springframework.cache.annotation.CachingConfigurerSupport;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.data.redis.connection.RedisConnectionFactory;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.data.redis.serializer.StringRedisSerializer;/*** Redis配置类*/
@Configuration
public class RedisConfig extends CachingConfigurerSupport {@Beanpublic RedisTemplate<Object, Object> redisTemplate(RedisConnectionFactory connectionFactory) {RedisTemplate<Object, Object> redisTemplate = new RedisTemplate<>();//默认的Key序列化器为:JdkSerializationRedisSerializerredisTemplate.setKeySerializer(new StringRedisSerializer());redisTemplate.setHashKeySerializer(new StringRedisSerializer());redisTemplate.setConnectionFactory(connectionFactory);return redisTemplate;}
}

对于接下类的在java中对Redis的操作,我们可以参照Redis中的常用命令

3.1、对String的操作

(ValueOperations接口)示例:

@SpringBootTest
class SpringDataRedisApplicationTests {@Autowiredprivate RedisTemplate redisTemplate;/*** 操作String类型的数据*/@Testvoid contextLoads() {//redisTemplate.opsForValue().set("mannor" ,"rediaz");String mannor = (String) redisTemplate.opsForValue().get("mannor");System.out.println(mannor);redisTemplate.opsForValue().set("k1", "v1", 10L, TimeUnit.SECONDS);Boolean aBoolean = redisTemplate.opsForValue().setIfAbsent("mannor1", "mannor");System.out.println(aBoolean);}
}

3.2、对哈希类型数据的操作

@SpringBootTest
class SpringDataRedisApplicationTests {@Autowiredprivate RedisTemplate redisTemplate;/*** 操作hash类型的数据*/@Testpublic void hashTest() {HashOperations hashOperations = redisTemplate.opsForHash();//存hashOperations.put("002", "name", "zhangsan");hashOperations.put("002", "age", "20");hashOperations.put("002", "addr", "beijing");//取Object age = hashOperations.get("002", "age");
//        System.out.println((String) age);//获取所有字段Set keys = hashOperations.keys("002");for (Object key : keys) {
//            System.out.println(key);}//获得hash结构中的所有值List values = hashOperations.values("002");for (Object value : values) {System.out.println(value);}}}

3.3、对list的操作

    @Autowiredprivate RedisTemplate redisTemplate;/*** 操作list类型的数据*/@Testpublic void listTest() {ListOperations listOperations = redisTemplate.opsForList();//存listOperations.leftPush("list", "00");listOperations.leftPushAll("list", "01", "02", "03");//取值List list = listOperations.range("list", 0, -1);for (Object val : list) {System.out.println(val);}System.out.println("------------------------------------------------------------");//获取长度来遍历Long size = listOperations.size("list");for (int i = 0; i < size; i++) {//出队列String element = (String) listOperations.rightPop("list");System.out.println(element);}

3.4、对set类型的操作

    @Autowiredprivate RedisTemplate redisTemplate;/*** 操作Set类型的数据*/@Testpublic void testSet() {SetOperations setOperations = redisTemplate.opsForSet();//存值setOperations.add("myset", "a", "b", "c", "a");//取值Set<String> myset = setOperations.members("myset");for (String o : myset) {System.out.println(o);}//删除成员setOperations.remove("myset", "a", "b");//取值myset = setOperations.members("myset");for (String o : myset) {System.out.println(o);}}

3.5、对 ZSet类型的数据(有序集合)

    @Autowiredprivate RedisTemplate redisTemplate;/** * 操作ZSet类型的数据*/
@Test
public void testZset() {ZSetOperations zSetOperations = redisTemplate.opsForZSet();//存值zSetOperations.add("myZset", "a", 10.0);zSetOperations.add("myZset", "b", 11.0);zSetOperations.add("myZset", "c", 12.0);zSetOperations.add("myZset", "a", 13.0);//取值Set<String> myZset = zSetOperations.range("myZset", 0, -1);for (String s : myZset) {System.out.println(s);}//修改分数zSetOperations.incrementScore("myZset", "b", 20.0);//取值myZset = zSetOperations.range("myZset", 0, -1);for (String s : myZset) {System.out.println(s);}//删除成员zSetOperations.remove("myZset", "a", "b");//取值myZset = zSetOperations.range("myZset", 0, -1);for (String s : myZset) {System.out.println(s);}
}

3.6、通用类型的操作

     @Autowiredprivate RedisTemplate redisTemplate;/*** 通用操作,针对不同的数据类型都可以操作*/@Testpublic void testCommon() {//获取Redis中所有的keySet<String> keys = redisTemplate.keys("*");for (String key : keys) {System.out.println(key);}//判断某个key是否存在Boolean itcast = redisTemplate.hasKey("itcast");System.out.println(itcast);//删除指定keyredisTemplate.delete("myZset");//获取指定key对应的value的数据类型DataType dataType = redisTemplate.type("myset");System.out.println(dataType.name());}

测试项目源代码:https://gitee.com/rediaz/note-management/tree/master/Regis/SpringDataRedis

http://www.lryc.cn/news/123193.html

相关文章:

  • 分布式作业调度框架——ElasticJob
  • react如何实现数据渲染
  • 在Java中如何使用List集合实现分页,以及模糊查询后分页
  • 【JAVA】包装类、正则表达式、Arrays类、Lambda表达式
  • Java中的Maven Assembly插件是什么?
  • SpringBoot禁用Swagger3
  • 小红书Java后端2023-8-6笔试
  • metaRTC7 demo mac/ios编译指南
  • systemd-journal 占用内存的问题
  • Java # Spring(2)
  • 2021年03月 C/C++(二级)真题解析#中国电子学会#全国青少年软件编程等级考试
  • 应用程序运行报错:First section must be [net] or [network]:No such file or directory
  • 【ECMAScript】ES6-ES11学习笔记
  • K8S MetalLB LoadBalancer
  • kubernetes二进制部署2之 CNI 网络组件部署
  • docker通用镜像方法,程序更新时不用重新构建镜像
  • Spring Cloud构建微服务断路器介绍
  • [国产MCU]-BL602开发实例-OLED-SSD1306驱动与U8g2移植
  • AWS asg(Auto Scaling Group)部署时报错Error: Termination Reason: Client.InternalError
  • Redis—过期删除策略和内存淘汰策略
  • 连续两年增收不增利,比亚迪电子靠新能源汽车业务再次起飞?
  • echarts3d柱状图
  • 使用webpack插件webpack-dev-server 出现Cannot GET/的解决办法
  • 老网工必备好物,分享15个网络监控神器
  • 拒绝摆烂!C语言练习打卡第一天
  • Spring 使用注解开发、代理模式、AOP
  • 考公-判断推理-逻辑判断-翻译推理
  • 关于MPU6050的VLOGIC引脚作用
  • 对约瑟夫问题的进一步思考
  • 程序员如何优雅的提升软件开发效率?