博客
关于我
18-Java中操作redis实践
阅读量:796 次
发布时间:2023-03-22

本文共 8812 字,大约阅读时间需要 29 分钟。

Jedis库与Redis操作实践指南

在本文中,我们将通过实际案例,详细介绍Jedis库的使用方法,并涵盖Redis数据库的多种操作类型,包括字符串、JSON、哈希、列表、集合等。同时,我们还将探讨如何利用RedisTemplate在Spring Boot项目中高效进行操作,以及如何设计和实现一些实用的系统功能,如单点登录和投票系统。

一、基础操作:连接与存储

1. 连接Redis

Jedis jedis = new Jedis("192.168.126.130", 6379);
jedis.auth("123456");

说明:

  • Jedis类是与Redis建立连接的入口。
  • auth(String password)方法用于进行Redis身份验证,如果Redis设置了密码,必须调用此方法传入密码。

2. 存储数据

// 存储字符串数据
jedis.set("count", "1");
jedis.set("id", "10001");
jedis.set("content", "aaaaaaaadfas");
// 更新数据
jedis.expire("id", 1); // 设置键的有效时长为1秒
jedis.incr("count"); // 递增操作

说明:

  • set(String key, String value):用于存储键值对。
  • expire(String key, long seconds):用于设置键的有效时间,单位为秒。
  • incr(String key):用于对键值对的值进行递增操作。

3. 获取数据

String count = jedis.get("count");
Long num = jedis.strlen("content");

说明:

  • get(String key):用于获取存储的键值。
  • strLen(String key):用于获取字符串键值的长度。

二、JSON数据操作

1. 构建JSON对象并存储

Map
map = new HashMap<>();
map.put("id", 100);
map.put("title", "spring 认证");
map.put("content", "very good");
Gson gson = new Gson();
String jsonStr = gson.toJson(map);
Jedis jedis = new Jedis("192.168.126.128", 6379);
jedis.set("user", jsonStr);

说明:

  • HashMap:用于存储需要转换为JSON的数据。
  • Gson:一个强大的JSON处理库,用于将Java对象转换为JSON格式。
  • toJson():将Java对象转换为JSON字符串。
  • set():将JSON字符串存储到Redis中。

2. 读取JSON数据

String jsonStr = jedis.get("user");
Map
obj = gson.fromJson(jsonStr, Map.class);
System.out.println(obj);

说明:

  • fromJson():将JSON字符串转换为Java对象。
  • Map:用于存储解析后的数据结构。

三、高级数据结构操作:哈希、列表、集合

1. 哈希操作

Jedis jedis = new Jedis("192.168.126.128", 6379);
// 存储博客信息
jedis.hset("article", "id", "1");
jedis.hset("article", "title", "mybatis");
jedis.hset("article", "content", "framework");
// 获取博客信息
String id = jedis.hget("article", "id");
String title = jedis.hget("article", "title");
String content = jedis.hget("article", "content");
System.out.println(id + "/" + title + "/" + content);

说明:

  • hset(String key, String field, Object value):用于向哈希中添加字段值对。
  • hget(String key, String field):用于从哈希中获取字段值。

2. 列表操作

// 存储队列数据
jedis.rpush("list1", "A", "B", "C");
// 获取队列长度
Long n = jedis.llen("list1");
// 取出队列数据
List list = jedis.lpop("list1", n.intValue());
System.out.println(list);

说明:

  • rpush(String key, String... values):用于将值添加到列表的右端。
  • llen(String key):获取列表的长度。
  • lpop(String key, Long count):从列表中取出指定数量的元素。

3. 集合操作

// 存储朋友圈点赞
jedis.sadd("count", "1", "1", "2");
// 获取所有成员
Set set = jedis.smembers("count");
System.out.println(set);

说明:

  • sadd(String key, String... values):将值添加到集合中。
  • smembers(String key):获取集合中的所有成员。

四、连接池优化

1. 定义连接池配置

JedisPoolConfig config = new JedisPoolConfig();
config.setMaxTotal(1000); // 最大连接数
config.setMaxIdle(60); // 最大空闲时间
JedisPool jedisPool = new JedisPool(config, "192.168.126.130", 6379);
// 获取连接
Jedis resource = jedisPool.getResource();
resource.auth("123456");
resource.set("class", "cgb2004");
resource.close();
// 关闭连接池
jedisPool.close();

说明:

  • 使用连接池可以避免每次操作都建立新的连接,显著提升性能。

五、Spring Boot中的RedisTemplate

1. 配置文件

spring:
redis:
host: 192.168.64.129
port: 6379

2. 启动类

@SpringBootApplication
public class RedisApplication {
public static void main(String[] args) {
SpringApplication.run(RedisApplication.class, args);
}
}

3. RedisTemplate操作

@Autowired
private RedisTemplate
stringRedisTemplate;
@Test
void testRedisStringOper() throws Exception {
ValueOperations
valueOperations = stringRedisTemplate.opsForValue();
valueOperations.set("ip", "192.168.174.130");
valueOperations.set("state", "1", 1, TimeUnit.SECONDS);
valueOperations.decrement("state");
Thread.sleep(2000);
String ip = valueOperations.get("ip");
String state = valueOperations.get("state");
System.out.println("ip=" + ip + ", state=" + state);
}

说明:

  • RedisTemplate 提供了对Redis数据库进行操作的便捷方法。
  • opsForValue():获取用于操作字符串值的操作。

六、实战项目:单点登录系统

1. 业务描述

在分布式系统中,单点登录(SSO)是一种通过一个认证服务器为用户提供身份验证的机制。在本系统中,Redis将用于存储用户的会话信息,包括用户ID和登录时间等。

2. 关键代码实现

public class SSODemo01 {
private static Jedis jedis = new Jedis("192.168.126.130", 6379);
static {
jedis.auth("123456");
}
public static boolean isValidSession(String token) {
if (token == null || "".equals(token)) {
return false;
}
String user = jedis.hget("session", token);
if (user == null || "".equals(user)) {
System.out.println("还没有登录");
jedis.close();
return false;
}
String expiredTime = jedis.hget("session", token + ":expired");
if (expiredTime == null || "".equals(expiredTime)) {
System.out.println("登录超时");
jedis.close();
return false;
}
Date expired = new Date(Long.parseLong(expiredTime));
if (expired.before(new Date())) {
System.out.println("登录超时");
jedis.close();
return false;
}
return true;
}
public static String login(String username, String password) {
String token = UUID.randomUUID().toString().replace("-", "");
System.out.println(token);
Calendar calendar = Calendar.getInstance();
calendar.add(Calendar.MINUTE, 30);
Map
map = new HashMap<>();
map.put(token, username);
map.put(token + ":expired", String.valueOf(calendar.getTimeInMillis()));
jedis.hset("session", map);
return token;
}
public static void main(String[] args) {
String activityId = "10001";
String user1 = "201";
String user2 = "202";
String user3 = "203";
vote(activityId, user1);
vote(activityId, user2);
vote(activityId, user3);
Long voteCount = getVoteCount(activityId);
System.out.println("投票次数: " + voteCount);
Set users = getVoteUsers(activityId);
System.out.println(users);
boolean flag = checkVote(activityId, user1);
System.out.println(user1 + ": " + (flag ? "已投过票" : "还没投票"));
}
private static void vote(String activityId, String userId) {
jedis.sadd(activityId, userId);
}
private static Long getVoteCount(String activityId) {
return jedis.scard(activityId);
}
private static Set getVoteUsers(String activityId) {
return jedis.smembers(activityId);
}
private static Boolean checkVote(String activityId, String userId) {
return jedis.sismember(activityId, userId);
}
}

说明:

  • isValidSession(String token):检查传入的会话令牌是否有效。
  • login(String username, String password):执行登录操作,生成令牌并存储会话信息。
  • vote(String activityId, String userId):对指定活动投票,确保每个用户只能投一次票。

七、投票系统

1. 业务描述

投票系统用于在活动开始前,用户对活动进行支持力度的调查。通过Redis集合存储用户的投票记录,确保每个用户只能投一次票。

2. 关键代码实现

import redis.clients.jedis.Jedis;
import java.util.Set;
public class VoteDemo01 {
private static Jedis jedis = new Jedis("192.168.126.130", 6379);
static {
jedis.auth("123456");
}
public static void vote(String activityId, String userId) {
jedis.sadd(activityId, userId);
}
public static Long getVoteCount(String activityId) {
return jedis.scard(activityId);
}
public static Set getVoteUsers(String activityId) {
return jedis.smembers(activityId);
}
public static Boolean checkVote(String activityId, String userId) {
return jedis.sismember(activityId, userId);
}
public static void main(String[] args) {
String activityId = "10001";
String user1 = "201";
String user2 = "202";
String user3 = "203";
vote(activityId, user1);
vote(activityId, user2);
vote(activityId, user3);
Long voteCount = getVoteCount(activityId);
System.out.println("投票次数: " + voteCount);
Set users = getVoteUsers(activityId);
System.out.println(users);
boolean flag = checkVote(activityId, user1);
System.out.println(user1 + ": " + (flag ? "已投过票" : "还没投票"));
}
}

说明:

  • sadd():将用户ID添加到活动的集合中,表示用户投票。
  • scard():获取集合的基数,表示投票次数。
  • smembers():获取集合中的所有成员,表示参与投票的用户。
  • sismember():检查用户是否已经参与投票。

八、秒杀队列系统

1. 业务描述

秒杀队列系统用于高效处理大量的抢购请求。通过Redis队列存储抢购请求,确保先进先出的处理方式,保证公平性。

2. 关键代码实现

import redis.clients.jedis.Jedis;
public class Sc杀队列 {
private static Jedis jedis = new Jedis("192.168.126.130", 6379);
static {
jedis.auth("123456");
}
public static void main(String[] args) {
// 示例数据
String goodsId = "10000";
String userId = "201";
// 将商品抢购请求加入队列
jedis.rpush("seckill_queue", "商品ID: " + goodsId + ", 用户ID: " + userId);
// 获取队列长度
Long queueLength = jedis.llen("seckill_queue");
System.out.println("队列长度: " + queueLength);
// 从队列中取出商品抢购请求
List list = jedis.lpop("seckill_queue");
System.out.println("取出的商品信息: " + list);
}
}

说明:

  • rpush():将元素添加到列表的右端。
  • llen():获取列表的长度。
  • lpop():从列表中取出第一个元素。

结语

通过本文的实践指南,读者可以逐步掌握Jedis库的使用方法,并通过Redis数据库实现各种常见的数据存储和操作功能。在实际项目中,可以根据具体需求选择合适的数据结构和操作方法,以确保系统的高效性和可靠性。

转载地址:http://spqfk.baihongyu.com/

你可能感兴趣的文章
Objective-C实现mergesort归并排序算法(附完整源码)
查看>>
Objective-C实现miller rabin米勒-拉宾素性检验算法(附完整源码)
查看>>
Objective-C实现Miller-Rabin素性测试程序(附完整源码)
查看>>
Objective-C实现MinhashLSH算法(附完整源码)
查看>>
Objective-C实现MinHeap最小堆算法(附完整源码)
查看>>
Objective-C实现multilayer perceptron classifier多层感知器分类器算法(附完整源码)
查看>>
Objective-C实现n body simulationn体模拟算法(附完整源码)
查看>>
Objective-C实现naive string search字符串搜索算法(附完整源码)
查看>>
Objective-C实现natural sort自然排序算法(附完整源码)
查看>>
Objective-C实现nested brackets嵌套括号算法(附完整源码)
查看>>
Objective-C实现nevilles method多项式插值算法(附完整源码)
查看>>
Objective-C实现newtons second law of motion牛顿第二运动定律算法(附完整源码)
查看>>
Objective-C实现newton_raphson牛顿拉夫森算法(附完整源码)
查看>>
Objective-C实现NLP中文分词(附完整源码)
查看>>
Objective-C实现NLP中文分词(附完整源码)
查看>>
Objective-C实现not gate非门算法(附完整源码)
查看>>
Objective-C实现NumberOfIslands岛屿的个数算法(附完整源码)
查看>>
Objective-C实现n皇后问题算法(附完整源码)
查看>>
Objective-C实现OCR文字识别(附完整源码)
查看>>
Objective-C实现odd even sort奇偶排序算法(附完整源码)
查看>>