本文共 8812 字,大约阅读时间需要 29 分钟。
在本文中,我们将通过实际案例,详细介绍Jedis库的使用方法,并涵盖Redis数据库的多种操作类型,包括字符串、JSON、哈希、列表、集合等。同时,我们还将探讨如何利用RedisTemplate在Spring Boot项目中高效进行操作,以及如何设计和实现一些实用的系统功能,如单点登录和投票系统。
Jedis jedis = new Jedis("192.168.126.130", 6379);jedis.auth("123456"); 说明:
Jedis类是与Redis建立连接的入口。auth(String password)方法用于进行Redis身份验证,如果Redis设置了密码,必须调用此方法传入密码。// 存储字符串数据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):用于对键值对的值进行递增操作。String count = jedis.get("count");Long num = jedis.strlen("content"); 说明:
get(String key):用于获取存储的键值。strLen(String key):用于获取字符串键值的长度。Mapmap = 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中。String jsonStr = jedis.get("user");Map obj = gson.fromJson(jsonStr, Map.class);System.out.println(obj); 说明:
fromJson():将JSON字符串转换为Java对象。Map:用于存储解析后的数据结构。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):用于从哈希中获取字段值。// 存储队列数据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):从列表中取出指定数量的元素。// 存储朋友圈点赞jedis.sadd("count", "1", "1", "2");// 获取所有成员Set set = jedis.smembers("count");System.out.println(set); 说明:
sadd(String key, String... values):将值添加到集合中。smembers(String key):获取集合中的所有成员。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: redis: host: 192.168.64.129 port: 6379
@SpringBootApplicationpublic class RedisApplication { public static void main(String[] args) { SpringApplication.run(RedisApplication.class, args); }} @Autowiredprivate RedisTemplatestringRedisTemplate;@Testvoid 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():获取用于操作字符串值的操作。在分布式系统中,单点登录(SSO)是一种通过一个认证服务器为用户提供身份验证的机制。在本系统中,Redis将用于存储用户的会话信息,包括用户ID和登录时间等。
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):对指定活动投票,确保每个用户只能投一次票。投票系统用于在活动开始前,用户对活动进行支持力度的调查。通过Redis集合存储用户的投票记录,确保每个用户只能投一次票。
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():检查用户是否已经参与投票。秒杀队列系统用于高效处理大量的抢购请求。通过Redis队列存储抢购请求,确保先进先出的处理方式,保证公平性。
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/