当前位置:   article > 正文

Java操作redis常见类型数据存储

Java操作redis常见类型数据存储

目录

一、Java连接Redis

1.1 导入pom依赖

1.2 建立连接

二、Java使用Redis

2.1 字符串 String

2.2 哈希 Hash

2.3 列表 List

2.4 集合 Set

2.5 有序集合 Sorted Set 

三、Redis的实际应用场景


一、Java连接Redis

        redis与mysq都是数据库,java操作redis其实跟操作mysql的过程是差不多的,首先都是导入依赖、建立连接,只是方式不同,redis是非关系数据库而mysql是关系数据库。

什么是关系数据库与非关系数据库?

        关系数据库 是一种基于关系模型的数据库系统,其中数据以表格形式组织,并使用 SQL(Structured Query Language)进行查询和管理。在关系数据库中,数据由多个表格组成,每个表格包含多个行和列,每行代表一个记录,每列代表一个属性。关系数据库中的表格之间可以建立关系,通过这些关系可以实现数据的联合查询和更新。关系数据库最常见的例子是MySQL、Oracle和SQL Server等。

        非关系数据库(NoSQL)是相对于传统的关系数据库而言的,它采用了非关系数据模型来存储和处理数据。非关系数据库通常不使用表格,而是使用其他形式的数据结构,例如键值对、文档、图形等,以便更好地处理大量非结构化数据。NoSQL数据库通常具有较高的可扩展性、灵活性和性能,并且能够处理复杂的数据处理任务。非关系数据库最常见的例子是MongoDB、Cassandra和Redis等。

1.1 导入pom依赖

在maven项目中导入redis依赖

  1. <!--redis-->
  2. <dependency>
  3. <groupId>redis.clients</groupId>
  4. <artifactId>jedis</artifactId>
  5. <version>2.9.0</version>
  6. </dependency>

1.2 建立连接

首先的启动redis,Linux版与windos版启动redis方式详情文章 http://t.csdnimg.cn/UBt3Z

本次为了方便就使用了本机进行测试使用redis

  1. package text;
  2. import redis.clients.jedis.Jedis;
  3. /**
  4. * @author 云村小威
  5. * @create 2023-11-04 22:20
  6. */
  7. public class demo1 {
  8. public static void main(String[] args) {
  9. Jedis jedis = new Jedis("localhost", 6379);
  10. jedis.auth("123456");
  11. System.out.println(jedis.ping());
  12. }
  13. }

二、Java使用Redis

        Redis支持五种基本的数据类型:字符串(string),哈希(hash),列表(list),集合(set)和有序集合(sorted set,也被称为zset)。这些数据类型在数据库中都以key-value的形式保存,所有的key都是字符串类型的。

        具体来说,Redis的字符串是二进制安全的,这意味着他们可以包含任何数据,比如图片或者JSON。哈希是一个键值对的集合,适合用于存储对象。列表是简单的字符串列表,按插入顺序排序,适用于队列和栈等场景。集合是一个无序的字符串集合,用于存储不重复的数据。有序集合和集合类似,但每个元素都关联了一个分数,根据这个分数进行排序,适用于排行榜等场景。

此外,从Redis 5.0.5版本开始,还增加了两种数据类型:位图和地理位置。位图是一种压缩的字符串表示形式,可以节省空间;地理位置则用于存储地理坐标信息。

2.1 字符串 String

  1. package text;
  2. import redis.clients.jedis.Jedis;
  3. /**
  4. * @author 云村小威
  5. * @create 2023-11-04 22:20
  6. */
  7. public class demo1 {
  8. public static void main(String[] args) {
  9. Jedis jedis = new Jedis("localhost", 6379);
  10. jedis.auth("123456");
  11. System.out.println(jedis.ping());
  12. //string:set get del sexex ttl
  13. jedis.select(3);//指定数据库
  14. //添加数据
  15. jedis.set("string_name", "云村小威");
  16. //get key 获取
  17. System.out.println(jedis.get("string_name"));
  18. //type key 查看类型
  19. System.out.println(jedis.type("string_name"));
  20. //keys * 或 keys key 查看所有或者指定的key
  21. System.out.println(jedis.keys("*"));
  22. //SETEX KEY_NAME TIMEOUT VALUE 给键值对设置过期时间
  23. jedis.setex("string_test", 100, "ready");
  24. //ttl key 获取键值对剩余的存活时间
  25. System.out.println(jedis.ttl("string_test"));
  26. }
  27. }

2.2 哈希 Hash

  1. //Hash
  2. jedis.select(4);//指定数据库
  3. //hset key field1 value1 [field2 value2] 同时将多个field-value设置到哈希表key中
  4. jedis.hset("hash_user", "name", "云村小威");
  5. jedis.hset("hash_user", "sex", "男");
  6. jedis.hset("hash_user", "age", "18");
  7. //hget key field 获取指定的字段值
  8. System.out.println(jedis.hget("hash_user", "sex"));
  9. //hdel key field 删除指定的字段值
  10. jedis.hdel("hash_user", "sex");
  11. //hgetall key 查询指定key的所有字段
  12. Map<String, String> hash_user_map = jedis.hgetAll("hash_user");
  13. System.out.println(hash_user_map);
  14. //hexists key field 查询指定key中的字段是否存在
  15. Boolean hash_user = jedis.hexists("hash_user", "sex");
  16. System.out.println(hash_user);
  17. //hlen key 获取指定key中的长度
  18. Long hash_user_len = jedis.hlen("hash_user");
  19. System.out.println(hash_user_len);

优化后:

  1. public void setHashMap(Jedis jedis, String key, Map<String, String> map) {
  2. if (map != null && map.size() > 0) {
  3. Set<String> keys = map.keySet();
  4. for (String k : keys) {
  5. jedis.hset(key, k, map.get(k));
  6. }
  7. }
  8. }
  1. Map map = new HashMap<>();
  2. map.put("name", "云村小威");
  3. map.put("sex", "男");
  4. map.put("age", "18");
  5. setHashMap(jedis, "user", map);

2.3 列表 List

  1. jedis.select(4);//指定数据库
  2. //lpush key value1 value2 value3 将一个或多个值插入到列表头部
  3. jedis.lpush("List_hobby", "sing", "jump", "rap", "basketball");
  4. //llen key 获取列表的长度
  5. System.out.println(jedis.llen("List_hobby"));
  6. //lindex key index 根据索引获取列表中的元素
  7. System.out.println(jedis.lindex("List_hobby", 2));
  8. //lrange key start sop 查看指定范围内的元素
  9. System.out.println(jedis.lrange("List_hobby", 0, 3));

2.4 集合 Set

  1. //sadd key value1 [value2] 向集合添加一个或多个元素
  2. jedis.sadd("set_user", "老六", "老五", "老七", "老八");
  3. //scard key 获取集合中的元素数量
  4. System.out.println(jedis.scard("set_user"));
  5. //exists key 是否存在
  6. System.out.println(jedis.exists("set_user"));

2.5 有序集合 Sorted Set 

  1. // -1 表示最后一个成员, -2 表示倒数第二个成员,以此类推。
  2. jedis.zadd("mysort", 1.0, "飞鸟集");
  3. jedis.zadd("mysort", 2.0, "牧羊少年的奇幻之旅");
  4. jedis.zadd("mysort", 3.0, "皮囊");
  5. jedis.zadd("mysort", 4.0, "我与地坛");
  6. Map<String, Double> map = new HashMap<>();
  7. map.put("mutouliu", 5.0);
  8. jedis.zadd("mysort", map);
  9. //正序排列
  10. Set<String> mysort = jedis.zrange("mysort", 0, -1);
  11. System.out.println(mysort);
  12. //倒序排列
  13. Set<String> mysort1 = jedis.zrange("mysort", -1, 0);
  14. System.out.println(mysort1);
  15. //命令用于计算集合中元素的数量
  16. System.out.println(jedis.zcard("mysort"));
  17. //命令用于计算有序集合中指定分数区间的成员数量
  18. System.out.println(jedis.zcount("mysort", 0, 4));
  19. //命令在计算有序集合中指定字典区间内成员数量。
  20. System.out.println(jedis.zlexcount("mysort", "-", "+"));

 

三、Redis的实际应用场景

redis一般用于存储基本不会变换的数据,然后这些数据又被多个地方使用且关联。

例如:我需要查询所有的会议状态,如果不使用redis的话我还需要通过查询到的state(0,1,2...)连表查询到所翻译的字符串(0 取消会议,1 待审核)

用到redis话,就可以将这些数据进行存储起来,如图示例:当status为0时就能查到是新增操作...

会议状态亦是如此,接下就是Redis的实际应用场景示例:

ssm项目中:利用spring自定义注解与AOP结合Redis的使用:首先在会议实体的state(会议状态)属性中使用了自定义注解,当我在controller层中调用了查询所有会议信息的方法时,通过切面结合state属性使用的自定义注解完成查询到会议信息的state字段的值时,则返回一个字符串形式的状态信息; 

1、定义会议实体

首先,我们定义一个会议实体类Meeting

  1. public class Meeting {
  2. private String name;
  3. @State(value = 1)
  4. private int state;
  5. ...
  6. // 构造方法、getter和setter方法省略
  7. }

2、定义自定义注解

接下来,我们定义一个自定义注解@State,用于标识会议状态字段。

  1. import java.lang.annotation.ElementType;
  2. import java.lang.annotation.Retention;
  3. import java.lang.annotation.RetentionPolicy;
  4. import java.lang.annotation.Target;
  5. @Target(ElementType.FIELD)
  6. @Retention(RetentionPolicy.RUNTIME)
  7. public @interface State {
  8. int value();
  9. }

3、创建切面类

然后,我们创建一个切面类MeetingAspect ,用于在查询会议信息时,根据状态字段的值进行特殊处理。

  1. import org.aspectj.lang.JoinPoint;
  2. import org.aspectj.lang.annotation.AfterReturning;
  3. import org.aspectj.lang.annotation.Aspect;
  4. import org.springframework.beans.factory.annotation.Autowired;
  5. import org.springframework.stereotype.Component;
  6. import redis.clients.jedis.Jedis;
  7. import java.util.List;
  8. @Aspect
  9. @Component
  10. public class MeetingAspect {
  11. @Autowired
  12. private Jedis jedis;
  13. @AfterReturning(pointcut = "execution(* com.example.controller.MeetingController.queryAllMeetings(..))", returning = "meetings")
  14. public void handleQueryAllMeetings(JoinPoint joinPoint, List<Meeting> meetings) {
  15. for (Meeting meeting : meetings) {
  16. if (meeting.getState() == 1) {
  17. jedis.set("待开会议", meeting.getName());
  18. }
  19. }
  20. }
  21. }

        在上面的切面类中,我们使用@AfterReturning切点拦截MeetingControllergetAllMeetings()方法的返回结果。然后,我们遍历会议列表,如果会议状态字段的值为1,将会议状态名称设置为"待开会议",并将会议名称和状态名称存储到Redis中。

请确保你已经在Spring中配置了Redis相关的配置。

4、创建控制器类

现在,我们创建一个控制器类MeetingController,用于获取所有会议信息。

  1. import org.springframework.beans.factory.annotation.Autowired;
  2. import org.springframework.web.bind.annotation.GetMapping;
  3. import org.springframework.web.bind.annotation.RestController;
  4. import java.util.ArrayList;
  5. import java.util.List;
  6. @RestController
  7. public class MeetingController {
  8. @Autowired
  9. private MeetingService meetingService;
  10. @GetMapping("/queryAllMeetings")
  11. public List<Meeting> queryAllMeetings() {
  12. return meetingService.findAll();
  13. }
  14. }

        最后,确保在Spring配置文件中进行以下配置:这样,当调用MeetingControllergetAllMeetings()方法时,切面会拦截返回结果,并根据会议状态字段的值进行特殊处理。如果会议状态字段的值为1,则将会议状态名称设置为"待开会议",并将会议名称和状态名称存储到Redis中。

请注意,以上示例仅供参考,你需要根据实际情况进行适当的修改和完善。特别是Redis相关的配置,需要根据你的实际环境和需求进行调整。

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/菜鸟追梦旅行/article/detail/491366
推荐阅读
相关标签
  

闽ICP备14008679号