目录
一、Java连接Redis
1.1 导入依赖
1.2 Redis服务器准备
1.3 建立连接
二、Java操作Redis的常见类型数据存储
2.1 String(字符串)存取值操作
2.1.1 指定存储数据的数据库与存储入库操作
2.1.2 存储数据的修改与查询
2.1.3 数据临时存储
2.2 哈希数据结构存取值操作
2.2.1 存值(新增与修改)
1. Jedis存值
2. 通过Map对象存值
2.2.2 取值(查询)
1. 获取哈希表中特定字段的值(单个查询)
2. 获取整个哈希表的内容(查询所有)
2.2.3 删除
1. 删除特定字段(单个属性删除)
2. 删除哈希表(删除所有)
2.3 列表存取值操作
2.3.1 存值
2.3.2 取值
三、Redis中项目的应用
一、Java连接Redis
Redis与MySQL都是数据库,java操作redis其实跟操作mysql的过程是一样的。
1.1 导入依赖
打开IDEA,进入Java项目,导入pom依赖,代码如下:
<dependency>
<groupId>redis.clients</groupId>
<artifactId>jedis</artifactId>
<version>2.9.0</version>
</dependency>
1.2 Redis服务器准备
导入依赖后,找到redis.bat双击启动redis(时常忘记文件位置的可以新开快捷方式置于桌面),如下:
1.3 建立连接
在java项目包下,新建一个名为redis的Package用来存放建立链接的java代码,如下:
在redis包下,新建java类,并添加以下代码,如下:
public static void main(String[] args) { // 建立链接 Jedis jedis = new Jedis("localhost",6379);//IP地址+端口号 // 设置密码 jedis.auth("123456"); // 测试链接是否成功 System.out.println(jedis.ping()); }
然后启动Demo1方法,进行测试链接是否成功,效果如下:
二、Java操作Redis的常见类型数据存储
在进行存储数据前,我们先需要将Java链接上Redis,参考第一模块,如上。
链接上Redis之后,才可进行数据存储。
2.1 String(字符串)存取值操作
2.1.1 指定存储数据的数据库与存储入库操作
代码与注释如下:
public class Demo2 { public static void main(String[] args) { // 建立链接 Jedis jedis = new Jedis("localhost",6379);//IP地址+端口号 // 设置密码 jedis.auth("123456"); // String的操作 jedis.select(1);//指定数据库 jedis.set("KISS","Kisship添加数据了");//往指定的数据库中添加数据 } }
效果如下:
2.1.2 存储数据的修改与查询
添加以下代码:
jedis.set("KISS","Kisship将原有数据修改了");//将原先存储的数据修改 System.out.println(jedis.get("KISS"));//查询
修改效果如下:
查询效果如下:
2.1.3 数据临时存储
在Demo2中加入以下代码:
jedis.setex("time",20,"设置过期时间为20秒");//为"time"键设置过期时间 System.out.println(jedis.ttl("time"));//获取键的剩余生存时间并且打印返回
代码解释:
setex
是 Redis 命令的一部分,示例的方法用于设置一个键值对,并为该键设置一个过期时间。ttl
是 Redis 命令的一部分,它用于获取键的剩余生存时间。
效果展示,如下:
还未过期前的效果:
过期后的效果:
2.2 哈希数据结构存取值操作
案例:
- 创建一个名为 "user" 的哈希表,并向其中添加三个字段:"name"、"hobby" 和 "age",并分别设置它们的值。
2.2.1 存值(新增与修改)
1. Jedis存值
新建Demo3,并添加以下代码:
public static void main(String[] args) { // 建立链接 Jedis jedis = new Jedis("localhost",6379);//IP地址+端口号 // 设置密码 jedis.auth("123456"); // 哈希数据结构的操作 // 哈希表是 Redis 中的一种数据结构,它允许你在一个键下存储多个字段和与这些字段相关联的值。 jedis.select(1);//指定数据库 // 创建一个名为 "user" 的哈希表,并向其中添加三个字段:"name"、"hobby" 和 "age",并分别设置它们的值 jedis.hset("user","name","Kissship");//姓名,将 "name" 字段设置为 "Kissship" jedis.hset("user","hobby","Play Computer games");//爱好设置 jedis.hset("user","age","18");//年龄设置 }
效果如下:
2. 通过Map对象存值
以下是具体实现代码与逻辑详解:
Demo3:
Map map = new HashMap();//创建一个名为map的HashMap对象,用于存储键值对数据 map.put("name","鸭翅牙齿");//名字 map.put("hobby","look girls");//爱好 map.put("age","17");//年龄 RedisUtils.setHashMap(jedis,"user",map);//调用自定义的工具类方法setHashMap,并传递三个参数
RedisUtils:
public class RedisUtils { //通过Java中的Map对象进行数据存储 public static void setHashMap(Jedis jedis, String Key, Map<String,String> map) { //空值检查 //首先检查传入的map对象是否为非空且包含至少一个键值对。如果map为空或不包含键值对,方法不会执行任何操作,直接返回。 if (map != null && map.size() > 0) { //遍历Map并存储数据 Set<String> keys = map.keySet();//如果map不为空且包含键值对,方法会通过map.keySet()获取所有的键(字段名)。 for (String k : keys) {//在循环中,对于每个键k,map.get(k)获取到对应的值(字段值)。 jedis.hset(Key,k,map.get(k));//将当前键值对存储到Redis } } } }
运行后的效果如下:
2.2.2 取值(查询)
1. 获取哈希表中特定字段的值(单个查询)
System.out.println(jedis.hget("user", "hobby"));//从名为"user"的哈希表中获取键为"hobby"的字段的值,并将其打印到控制台
2. 获取整个哈希表的内容(查询所有)
System.out.println(jedis.hgetAll("user"));//获取名为"user"的哈希表中的所有字段和它们的值,然后将它们打印到控制台
代码执行效果如下:
2.2.3 删除
1. 删除特定字段(单个属性删除)
Long hdel = jedis.hdel("user","age");//删除名为"user"的哈希表中的特定字段"age"及其中的值
单个删除代码执行效果如下:
2. 删除哈希表(删除所有)
jedis.del("user");//删除名为"user"的键以及与之相关的哈希表
删除所有代码执行效果如下:
2.3 列表存取值操作
在Java中操作Redis列表(list)进行取值时,通常会使用Redis的lindex
或lrange
命令,这两个命令有不同的逻辑:
使用
lindex
命令:
lindex
命令用于获取列表中指定索引位置的元素。索引从0开始,表示列表的第一个元素。- 例如,
jedis.lindex("mylist", 1)
将返回"mylist"列表中索引为1的元素。- 如果索引超出了列表的范围(即索引小于0或大于等于列表的长度),
lindex
会返回null。使用
lrange
命令:
lrange
命令用于获取列表中指定范围的元素。- 你可以指定起始索引和结束索引,从而获取这个范围内的元素,包括起始索引和结束索引。
- 例如,
jedis.lrange("mylist", 0, 2)
将返回"mylist"列表中的前3个元素,因为索引0表示第一个元素,索引2表示第三个元素。- 如果你希望获取整个列表,可以使用
jedis.lrange("mylist", 0, -1)
,其中-1表示列表的最后一个元素。
2.3.1 存值
//将七首音乐歌曲的名称依次添加到名为"music"的列表的左侧,即列表的开头。如果"music"列表之前不存在,它会被创建,然后这些值会被添加到列表中,形成一个包含这些音乐歌曲名称的有序列表。 jedis.lpush("music","《可爱女人》","《晴天》","《稻香》","《夜曲》","《东风破》","《红尘客栈》","《黑色毛衣》");
运行代码结果如下:
2.3.2 取值
//从"music"列表中获取索引为1的元素,并将其打印到控制台 System.out.println(jedis.lindex("music", 1)); //从名为"music"的列表中获取索引范围从0到5的所有元素 System.out.println(jedis.lrange("music", 0, 5));
运行代码结果如下:
三、Redis中项目的应用
Redis(Remote Dictionary Server)是一个开源的内存数据库系统,它以键值对的形式存储数据,具有高效的读写速度,特别适合于缓存和实时数据处理等场景。以下是 Redis 在不同项目中的一些常见应用:
缓存系统:
- Redis 最常见的用途之一是作为缓存系统。它可以存储热门或频繁访问的数据,从而加快读取速度,减轻后端数据库的负担。这对于网站、应用程序和服务的性能优化非常重要。
会话存储:
- Redis 可以用于存储会话信息,特别是在分布式系统中。通过将会话数据存储在 Redis 中,可以实现负载均衡、容错和扩展性,同时保证会话数据的快速访问。
消息队列:
- Redis 的列表数据结构非常适合作为消息队列的基础。发布者可以将消息推送到列表中,而订阅者可以从列表中获取消息,从而实现异步通信、任务队列等功能。
实时分析和计数:
- Redis 提供了各种数据结构(如 HyperLogLog、Bitmaps 等)和操作,可以用于实时分析和计数,例如统计网站的访问次数、用户在线状态等。
地理信息系统(Geospatial):
- Redis 支持地理信息数据结构,可以用于存储位置坐标和距离计算。这使得 Redis 在构建位置服务和地理信息系统方面非常有用。
推荐系统:
- Redis 可以用于构建推荐系统,通过存储用户喜好和商品信息,以及实时计算相似度等信息,从而为用户提供个性化的推荐。
实时分布式锁:
- Redis 提供了基于 SETNX(set if not exists)命令和 Lua 脚本等方法,可以实现分布式系统中的实时锁定机制,用于协调多个节点的操作。
实时排行榜:
- 利用 Redis 的有序集合(Sorted Sets)结构,可以实现实时排行榜功能,例如游戏中的积分排名、热门商品排名等。
持久化和数据备份:
- Redis 支持数据的持久化,可以将内存中的数据定期保存到磁盘上,以保证数据的安全性。这对于关键业务数据非常重要。
分布式锁与分布式限流:
- Redis 提供了基于 Lua 脚本的原子操作,可以实现分布式锁和限流,保证在分布式环境下的数据一致性和流量控制。
请注意,虽然 Redis 提供了强大的功能,但也需要谨慎使用。例如,需要考虑数据的一致性、持久化策略、内存消耗等方面的问题。同时,Redis 是一个基于内存的数据库,因此需要足够的内存资源来支持。
最后Java与Redis的集成以及Redis中的项目应用就到这里,祝大家在敲代码的路上一路通畅!