From 2036bf9ba258149681933824520ce88c9a64c407 Mon Sep 17 00:00:00 2001 From: whaifree Date: Mon, 14 Oct 2024 23:03:57 +0800 Subject: [PATCH] =?UTF-8?q?=E6=B7=BB=E5=8A=A0=E6=B3=9B=E5=9E=8B=E6=96=B9?= =?UTF-8?q?=E6=B3=95=E5=92=8C=E5=B9=B6=E5=8F=91=E7=BC=96=E7=A8=8B=E7=9B=B8?= =?UTF-8?q?=E5=85=B3=E4=BB=A3=E7=A0=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - 在`User`类中添加了泛型方法`test` - 新增`FanXin`类包含并发安全的`openLogicFilter`方法 - 添加了`LeetCode47`到`LeetCode501`等新类和测试方法 - 在`p1`类中添加了处理数组和字符串的静态方法 - 更新了`TestController`类,添加了事务注解 - 新增了`beibao01`到`LeetCode84_1`等类和方法 - 添加了`RedisDataTest`类用于测试Redis的Hyperloglog和Bitmap数据结构 Default Changelist fx.java LeetCode47.java LeetCode468.java LeetCode491.java LeetCode501.java p1.java TestController.java Unversioned Files D:\project\LeetCode\springDemo\.gitignore D:\project\LeetCode\ForJdk17\src\main\java\cn\whaifree\redo\redo_all_240924\beibao01.java D:\project\LeetCode\ForJdk17\src\main\java\cn\whaifree\redo\redo_all_240924\LeetCode11_2.java D:\project\LeetCode\ForJdk17\src\main\java\cn\whaifree\redo\redo_all_240924\LeetCode51.java D:\project\LeetCode\ForJdk17\src\main\java\cn\whaifree\redo\redo_all_240924\LeetCode84_1.java D:\project\LeetCode\springDemo\mvnw D:\project\LeetCode\springDemo\mvnw.cmd D:\project\LeetCode\springDemo\src\test\java\cn\whaifree\springdemo\RedisData\RedisDataTest.java --- .../java/cn/whaifree/interview/PDD/p1.java | 177 ++++++++++++++++++ .../redo/redo_all_240924/LeetCode11_2.java | 39 ++++ .../redo/redo_all_240924/LeetCode468.java | 67 +++++++ .../redo/redo_all_240924/LeetCode47.java | 56 ++++++ .../redo/redo_all_240924/LeetCode491.java | 63 +++++++ .../redo/redo_all_240924/LeetCode501.java | 69 +++++++ .../redo/redo_all_240924/LeetCode51.java | 94 ++++++++++ .../redo/redo_all_240924/LeetCode84_1.java | 56 ++++++ .../redo/redo_all_240924/beibao01.java | 49 +++++ .../main/java/cn/whaifree/tech/java/fx.java | 25 +++ .../springdemo/controller/TestController.java | 2 + .../springdemo/RedisData/RedisDataTest.java | 82 ++++++++ 12 files changed, 779 insertions(+) create mode 100644 ForJdk17/src/main/java/cn/whaifree/interview/PDD/p1.java create mode 100644 ForJdk17/src/main/java/cn/whaifree/redo/redo_all_240924/LeetCode11_2.java create mode 100644 ForJdk17/src/main/java/cn/whaifree/redo/redo_all_240924/LeetCode468.java create mode 100644 ForJdk17/src/main/java/cn/whaifree/redo/redo_all_240924/LeetCode47.java create mode 100644 ForJdk17/src/main/java/cn/whaifree/redo/redo_all_240924/LeetCode491.java create mode 100644 ForJdk17/src/main/java/cn/whaifree/redo/redo_all_240924/LeetCode501.java create mode 100644 ForJdk17/src/main/java/cn/whaifree/redo/redo_all_240924/LeetCode51.java create mode 100644 ForJdk17/src/main/java/cn/whaifree/redo/redo_all_240924/LeetCode84_1.java create mode 100644 ForJdk17/src/main/java/cn/whaifree/redo/redo_all_240924/beibao01.java create mode 100644 springDemo/src/test/java/cn/whaifree/springdemo/RedisData/RedisDataTest.java diff --git a/ForJdk17/src/main/java/cn/whaifree/interview/PDD/p1.java b/ForJdk17/src/main/java/cn/whaifree/interview/PDD/p1.java new file mode 100644 index 0000000..cd2e3cb --- /dev/null +++ b/ForJdk17/src/main/java/cn/whaifree/interview/PDD/p1.java @@ -0,0 +1,177 @@ +package cn.whaifree.interview.PDD; + +import java.util.*; + +/** + * @version 1.0 + * @Author whai文海 + * @Date 2024/10/13 14:59 + * @注释 + */ +public class p1 { + + public static void main(String[] args) { + Scanner in = new Scanner(System.in); + // 注意 hasNext 和 hasNextLine 的区别 + + int i = in.nextInt(); + int[] nums = new int[i]; + for (int j = 0; j < i; j++) { + nums[j] = in.nextInt(); + } + System.out.println(method(nums)); + } + + public static int method(int[] nums) { + int res = 0; + int pro = nums[0]; + while (pro % 10 == 0) { + res++; + pro /= 10; + } + for (int i = 1; i < nums.length; i++) { + pro *= nums[i]; + while (pro % 10 == 0) { + res++; + pro /= 10; + } + } + return res; + } + +} + +class p2{ + + public static void main(String[] args) { + + /** + * abcd + * abzc + * b + * zyxwvutsrqponmlkjihgfedcba + * abcdefghijklmnopqrstuvx + * + * 5 + * abc + * abz + * azyxwvutsrqponmlkjihgfedcb + * zyxwvutsrqponmlkjihgfedcba + * abcdefghijklmnopqrstuvwzyx + * + */ +// next("zyxwvutsrqponmlkjihgfedcba"); + + next("abc"); + + next("abcdefghijklmnopqrstuvwzyx"); + +// Scanner in = new Scanner(System.in); +// // 注意 hasNext 和 hasNextLine 的区别 +// while (in.hasNextInt()) { // 注意 while 处理多个 case +// int i = in.nextInt(); +// for (int i1 = 0; i1 < i; i1++) { +// String next = in.next(); +// System.out.println(); +// } +// } + } + + + public static void next(String s) { + char[] charArray = s.toCharArray(); + int i = charArray.length - 2; + while (i >= 0 && charArray[i] >= charArray[i + 1]) { + i--; + } + if (i >= 0) { + int j = charArray.length - 1; + while (j >= 0 && charArray[i] > charArray[j]) { + j--; + } + swap(charArray, i, j); + } +// reverse(charArray, i + 1, charArray.length - 1); + + + System.out.println(new String(Arrays.copyOf(charArray, i + 1))); + + } + + + public static void reverse(char[] chars, int x, int y) { + while (x < y) { + swap(chars, x++, y--); + } + } + + public static void swap(char[] chars, int x, int y) { + char tmp = chars[x]; + chars[x] = chars[y]; + chars[y] = tmp; + } + +} + +class p3{ + public static void main(String[] args) { + + Scanner in = new Scanner(System.in); + // 注意 hasNext 和 hasNextLine 的区别 + while (in.hasNextInt()) { + int i = in.nextInt(); + for (int i1 = 0; i1 < i; i1++) { + int count = in.nextInt(); + int split = in.nextInt(); + long[] ints = new long[count]; + for (int j = 0; j < count; j++) { + ints[j] = in.nextLong(); + } + System.out.println(in(ints, split) ? "True" : "False"); + } + } + + } + + + /** + * 长度为n的数组,划分为k个子串 + * 调整子串的顺序,组成一个新的数组 + * 判断数组和划分数k,能否得到一个递增的序列 + * @param nums + * @param split + */ + public static boolean in(long[] nums, int split) { + List spl = new LinkedList<>(); + int left = 0; + int right = 1; + while (right < nums.length) { + if (nums[right - 1] > nums[right]) { + spl.add(new int[]{left, right - 1}); + left = right; + } + right++; + } + spl.add(new int[]{left, right - 1}); + if (spl.size() > split) { + return false; + } + + Collections.sort(spl, new Comparator() { + @Override + public int compare(int[] o1, int[] o2) { + return (int) (nums[o1[0]] - nums[o2[0]]) > 0 ? 1 : -1; + } + }); + // Comparison method violates its general contract + for (int i = 1; i < spl.size(); i++) { + int[] before = spl.get(i - 1); + int[] me = spl.get(i); + if (nums[before[1]] > nums[me[0]]) { + return false; + } + } + + return true; + } +} diff --git a/ForJdk17/src/main/java/cn/whaifree/redo/redo_all_240924/LeetCode11_2.java b/ForJdk17/src/main/java/cn/whaifree/redo/redo_all_240924/LeetCode11_2.java new file mode 100644 index 0000000..cb15d0f --- /dev/null +++ b/ForJdk17/src/main/java/cn/whaifree/redo/redo_all_240924/LeetCode11_2.java @@ -0,0 +1,39 @@ +package cn.whaifree.redo.redo_all_240924; + +import org.junit.Test; + +/** + * @version 1.0 + * @Author whai文海 + * @Date 2024/10/14 15:48 + * @注释 + */ +public class LeetCode11_2 { + @Test + public void test() { + int[] height = {1, 8, 6, 2, 5, 4, 8, 3, 7}; + Solution solution = new Solution(); + int result = solution.maxArea(height); + System.out.println(result); + } + + class Solution { + public int maxArea(int[] height) { + + int left = 0; + int right = height.length - 1; + int maxSize = 0; + while (left < right) { + maxSize = Math.max(maxSize, (right - left) * Math.min(height[left], height[right])); + if (height[left] < height[right]) { + left++; + }else { + right--; + } + } + return maxSize; + } + + + } +} diff --git a/ForJdk17/src/main/java/cn/whaifree/redo/redo_all_240924/LeetCode468.java b/ForJdk17/src/main/java/cn/whaifree/redo/redo_all_240924/LeetCode468.java new file mode 100644 index 0000000..289851f --- /dev/null +++ b/ForJdk17/src/main/java/cn/whaifree/redo/redo_all_240924/LeetCode468.java @@ -0,0 +1,67 @@ +package cn.whaifree.redo.redo_all_240924; + +import org.junit.Test; + +/** + * @version 1.0 + * @Author whai文海 + * @Date 2024/10/13 11:39 + * @注释 + */ +public class LeetCode468 { + @Test + public void test() { + System.out.println(Integer.parseInt("b", 16)); + System.out.println(new Solution().validIPAddress("2001:0db8:85a3:0000:0:8A2E:0370:733a")); + } + + class Solution { + public String validIPAddress(String queryIP) { + int i = queryIP.indexOf("."); + if (i == -1) { + return isV6(queryIP)? "IPv6" : "Neither"; + }else { + return isV4(queryIP)? "IPv4" : "Neither"; + } + } + public boolean isV4(String queryIp){ + try { + String[] split = queryIp.split("\\.", -1); + if (split.length != 4) { + return false; + } + for (String s : split) { + if (s.length() > 1 && s.startsWith("0")) { + return false; + } + int i = Integer.parseInt(s); + if (i < 0 || i > 255) { + return false; + } + } + } catch (Exception e) { + return false; + } + return true; + } + + public boolean isV6(String queryIp){ + try { + String[] split = queryIp.split(":", -1); + if (split.length != 8) { + return false; + } + for (String s : split) { + int i = Integer.parseInt(s, 16); + if (s.length() > 4) { + return false; + } + } + } catch (Exception e) { + return false; + } + return true; + } + } + +} diff --git a/ForJdk17/src/main/java/cn/whaifree/redo/redo_all_240924/LeetCode47.java b/ForJdk17/src/main/java/cn/whaifree/redo/redo_all_240924/LeetCode47.java new file mode 100644 index 0000000..67ec1f8 --- /dev/null +++ b/ForJdk17/src/main/java/cn/whaifree/redo/redo_all_240924/LeetCode47.java @@ -0,0 +1,56 @@ +package cn.whaifree.redo.redo_all_240924; + +import org.junit.Test; + +import java.util.ArrayList; +import java.util.HashSet; +import java.util.List; + +/** + * @version 1.0 + * @Author whai文海 + * @Date 2024/10/13 14:32 + * @注释 + */ +public class LeetCode47 { + @Test + public void test() { + int[] nums = {1,1,2}; + List> res = new Solution().permuteUnique(nums); + for (List re : res) { + System.out.println(re); + } + } + + class Solution { + List> res = new ArrayList<>(); + List temp = new ArrayList<>(); + boolean[] used = null; + public List> permuteUnique(int[] nums) { + used = new boolean[nums.length]; + back(nums); + return res; + } + + public void back(int[] nums) { + if (temp.size() == nums.length) { + res.add(new ArrayList<>(temp)); + return; + } + + + HashSet set = new HashSet<>(); + for (int i = 0; i < nums.length; i++) { + if (used[i]||set.contains(nums[i])) { + continue; + } + set.add(nums[i]); + used[i] = true; + temp.add(nums[i]); + back(nums); + temp.remove(temp.size() - 1); + used[i] = false; + } + } + } +} diff --git a/ForJdk17/src/main/java/cn/whaifree/redo/redo_all_240924/LeetCode491.java b/ForJdk17/src/main/java/cn/whaifree/redo/redo_all_240924/LeetCode491.java new file mode 100644 index 0000000..5f92e65 --- /dev/null +++ b/ForJdk17/src/main/java/cn/whaifree/redo/redo_all_240924/LeetCode491.java @@ -0,0 +1,63 @@ +package cn.whaifree.redo.redo_all_240924; + +import org.junit.Test; + +import java.util.ArrayList; +import java.util.HashSet; +import java.util.List; + +/** + * @version 1.0 + * @Author whai文海 + * @Date 2024/10/13 14:10 + * @注释 + */ +public class LeetCode491 { + @Test + public void test() { + int[] nums = {4, 6, 7, 7}; + System.out.println(new Solution().findSubsequences(nums)); + } + + class Solution { + + List> res = new ArrayList<>(); + List path = new ArrayList<>(); + + public List> findSubsequences(int[] nums) { + backTracking(nums, 0); + return res; + } + + + /** + * 递增 + * + * @param nums + * @param start + */ + public void backTracking(int[] nums, int start) { + if (path.size() >= 2) { + res.add(new ArrayList<>(path)); + } + if (start > nums.length) { + return; + } + + HashSet set = new HashSet<>(); + for (int i = start; i < nums.length; i++) { + if (!path.isEmpty() && nums[i] < path.get(path.size() - 1)) { + continue; + } + if (set.contains(nums[i])) { + continue; + } + set.add(nums[i]); + path.add(nums[i]); + backTracking(nums, i + 1); + path.remove(path.size()-1); + } + + } + } +} diff --git a/ForJdk17/src/main/java/cn/whaifree/redo/redo_all_240924/LeetCode501.java b/ForJdk17/src/main/java/cn/whaifree/redo/redo_all_240924/LeetCode501.java new file mode 100644 index 0000000..9077be6 --- /dev/null +++ b/ForJdk17/src/main/java/cn/whaifree/redo/redo_all_240924/LeetCode501.java @@ -0,0 +1,69 @@ +package cn.whaifree.redo.redo_all_240924; + +import cn.whaifree.leetCode.model.TreeNode; +import org.junit.Test; + +import java.util.ArrayList; +import java.util.Arrays; +import java.util.List; + +/** + * @version 1.0 + * @Author whai文海 + * @Date 2024/10/13 12:22 + * @注释 + */ +public class LeetCode501 { + @Test + public void test() { + TreeNode treeNode = TreeNode.constructTreeByArray(1, 0, 2, 2, 2); + int[] res = new Solution().findMode(treeNode); + System.out.println(Arrays.toString(res)); + } + + class Solution { + + int now = 0; + int nowValue = 0; + int max = 0; + List list = null; + + public int[] findMode(TreeNode root) { + list = new ArrayList<>(); + in(root); + int[] res = new int[list.size()]; + for (int i = 0; i < list.size(); i++) { + res[i] = list.get(i); + } + return res; + } + + public void in(TreeNode root) { + if (root == null) { + return; + } + in(root.left); + + if (nowValue == root.val) { + now++; + }else { + nowValue = root.val; + now = 1; + } + + if (now > max) { + max = now; + list.clear(); + list.add(root.val); + } else if (now == max) { + list.add(root.val); + } + + + in(root.right); + } + + + } + +} diff --git a/ForJdk17/src/main/java/cn/whaifree/redo/redo_all_240924/LeetCode51.java b/ForJdk17/src/main/java/cn/whaifree/redo/redo_all_240924/LeetCode51.java new file mode 100644 index 0000000..ceb4502 --- /dev/null +++ b/ForJdk17/src/main/java/cn/whaifree/redo/redo_all_240924/LeetCode51.java @@ -0,0 +1,94 @@ +package cn.whaifree.redo.redo_all_240924; + +import org.junit.Test; + +import java.util.ArrayList; +import java.util.LinkedList; +import java.util.List; + +/** + * @version 1.0 + * @Author whai文海 + * @Date 2024/10/14 14:44 + * @注释 + */ +public class LeetCode51 { + @Test + public void test() { + System.out.println(new Solution().solveNQueens(4)); + } + + + class Solution { + + boolean[][] map = null; + List> res = new ArrayList<>(); + + public List> solveNQueens(int n) { + map = new boolean[n][n]; + back(0); + return res; + } + + + public void back(int row) { + if (row == map.length) { + List path = new ArrayList<>(); + for (int i = 0; i < map.length; i++) { + StringBuilder sb = new StringBuilder(); + for (int j = 0; j < map.length; j++) { + if (map[i][j]) { + sb.append("Q"); + } else { + sb.append("."); + } + } + path.add(sb.toString()); + } + res.add(new LinkedList<>(path)); + return; + } + + for (int i = 0; i < map.length; i++) { + if (isValid(row, i)) { + map[row][i] = true; + back(row + 1); + map[row][i] = false; + } + } + } + + public boolean isValid(int x, int y) { + int n = map.length; + // 上边 + for (int i = x; i >= 0; i--) { + if (map[i][y]) { + return false; + } + } + // 左 + for (int j = y; j >= 0; j--) { + if (map[x][j]) { + return false; + } + } + // 左上45 + for (int i = 1; i < n; i++) { + if (x - i >= 0 && y - i >= 0 && map[x - i][y - i]) { + return false; + } + } + // 右上 + for (int i = 1; i < n; i++) { + if (x - i >= 0 && y + i < n && map[x - i][y + i]) { + return false; + } + } + + + return true; + } + } + + +} diff --git a/ForJdk17/src/main/java/cn/whaifree/redo/redo_all_240924/LeetCode84_1.java b/ForJdk17/src/main/java/cn/whaifree/redo/redo_all_240924/LeetCode84_1.java new file mode 100644 index 0000000..d92e823 --- /dev/null +++ b/ForJdk17/src/main/java/cn/whaifree/redo/redo_all_240924/LeetCode84_1.java @@ -0,0 +1,56 @@ +package cn.whaifree.redo.redo_all_240924; + +import org.junit.Test; + +/** + * @version 1.0 + * @Author whai文海 + * @Date 2024/10/14 15:57 + * @注释 + */ +public class LeetCode84_1 { + @Test + public void test() { + int[] heights = {2,1,2}; + Solution solution = new Solution(); + int max = solution.largestRectangleArea(heights); + System.out.println(max); + } + + class Solution { + /** + * 前后遍历,找到每个位置左右第一个小于他的 + * @param heights + * @return + */ + public int largestRectangleArea(int[] heights) { + int[] tmp = heights; + + int[] right = new int[tmp.length]; + int[] left = new int[tmp.length]; + left[0] = -1; + + for (int i = 0; i < tmp.length ; i++) { + int index = i - 1; + while (index >= 0 && tmp[index] >= tmp[i]) { + index = left[index]; + } + left[i] = index; + } + right[tmp.length - 1] = tmp.length; + for (int i = tmp.length - 2; i >= 0; i--) { + int index = i + 1; + while (index < tmp.length && tmp[index] >= tmp[i]) { + index = right[index]; + } + right[i] = index; + } + + int max = 0; + for (int i = 0; i < tmp.length; i++) { + max = Math.max(max, (right[i] - left[i] - 1) * tmp[i]); + } + return max; + } + } +} diff --git a/ForJdk17/src/main/java/cn/whaifree/redo/redo_all_240924/beibao01.java b/ForJdk17/src/main/java/cn/whaifree/redo/redo_all_240924/beibao01.java new file mode 100644 index 0000000..9178404 --- /dev/null +++ b/ForJdk17/src/main/java/cn/whaifree/redo/redo_all_240924/beibao01.java @@ -0,0 +1,49 @@ +package cn.whaifree.redo.redo_all_240924; + +/** + * @version 1.0 + * @Author whai文海 + * @Date 2024/10/14 15:26 + * @注释 + */ +public class beibao01 { + + + public static void main(String[] args) { + + int[] values = {2, 3, 1, 5, 4, 3}; + int[] weight = {2, 3, 1, 5, 2, 2}; + int pkgSize = 6; + int result = bei(values, weight, pkgSize); + System.out.println(result); + } + + + /** + * 6 1 + * 2 2 3 1 5 2 weight + * 2 3 1 5 4 3 value + * + * @param values + * @param weight + * @param pkgSize + * @return + */ + public static int bei(int[] values, int[] weight, int pkgSize) { + int[][] dp = new int[values.length][pkgSize + 1]; + for (int i = weight[0]; i <= pkgSize; i++) { + dp[0][i] = values[0]; + } + + for (int i = 1; i < values.length; i++) { + for (int j = 0; j <= pkgSize; j++) { + if (j > weight[i]) { + dp[i][j] = Math.max(dp[i - 1][j], dp[i - 1][j - weight[i]] + values[i]); + }else { + dp[i][j] = dp[i - 1][j]; // 放不进去 + } + } + } + return dp[values.length - 1][pkgSize]; + } +} diff --git a/ForJdk17/src/main/java/cn/whaifree/tech/java/fx.java b/ForJdk17/src/main/java/cn/whaifree/tech/java/fx.java index e8d9c65..f7c3d93 100644 --- a/ForJdk17/src/main/java/cn/whaifree/tech/java/fx.java +++ b/ForJdk17/src/main/java/cn/whaifree/tech/java/fx.java @@ -1,5 +1,8 @@ package cn.whaifree.tech.java; +import java.util.Map; +import java.util.concurrent.ConcurrentHashMap; + /** * @version 1.0 * @Author whai文海 @@ -14,6 +17,9 @@ public class fx { class User { // ,是并列的关系 + public T test(User user) { + return (T) user; + } } @@ -32,4 +38,23 @@ public class fx { public void method() { new Book(); } + + + +} + +class FanXin{ + + class RaffleEntity { + } + + interface ILogicFilter { + } + + public Map> logicFilterMap = new ConcurrentHashMap<>(); + + public Map> openLogicFilter() { + return logicFilterMap; + } + } diff --git a/springDemo/src/main/java/cn/whaifree/springdemo/controller/TestController.java b/springDemo/src/main/java/cn/whaifree/springdemo/controller/TestController.java index 388a970..d1af2a6 100644 --- a/springDemo/src/main/java/cn/whaifree/springdemo/controller/TestController.java +++ b/springDemo/src/main/java/cn/whaifree/springdemo/controller/TestController.java @@ -2,6 +2,7 @@ package cn.whaifree.springdemo.controller; import cn.whaifree.springdemo.aspect.annotation.RateLimiter; import cn.whaifree.springdemo.constant.LimitType; +import org.springframework.transaction.annotation.Transactional; import org.springframework.web.bind.annotation.PostMapping; import org.springframework.web.bind.annotation.RequestBody; import org.springframework.web.bind.annotation.RestController; @@ -33,6 +34,7 @@ public class TestController { */ @PostMapping("addContainer") @RateLimiter(key = "addContainer:", limitType = LimitType.USER, time = 5, count = 1) // 10s只能1次 + @Transactional(rollbackFor = Exception.class) public String addContainerInstanceToCluster(@RequestBody List instances, int userId) { // 导入容器节点到集群中 return addToCluster(instances, "clusterId", userId); diff --git a/springDemo/src/test/java/cn/whaifree/springdemo/RedisData/RedisDataTest.java b/springDemo/src/test/java/cn/whaifree/springdemo/RedisData/RedisDataTest.java new file mode 100644 index 0000000..fec8377 --- /dev/null +++ b/springDemo/src/test/java/cn/whaifree/springdemo/RedisData/RedisDataTest.java @@ -0,0 +1,82 @@ +package cn.whaifree.springdemo.RedisData; + +import jakarta.annotation.Resource; +import lombok.extern.slf4j.Slf4j; +import org.junit.jupiter.api.Test; +import org.springframework.boot.test.context.SpringBootTest; +import org.springframework.data.redis.connection.BitFieldSubCommands; +import org.springframework.data.redis.core.RedisTemplate; + +/** + * @version 1.0 + * @Author whai文海 + * @Date 2024/10/14 22:06 + * @注释 + */ +@SpringBootTest +@Slf4j +public class RedisDataTest { + + @Resource + private RedisTemplate redisTemplate; + + @Test + public void testHyperloglog() { + String day1 = "visituser:article1:20211014"; + redisTemplate.opsForHyperLogLog().add(day1, "user1"); + redisTemplate.opsForHyperLogLog().add(day1, "user2"); + redisTemplate.opsForHyperLogLog().add(day1, "user3"); + redisTemplate.opsForHyperLogLog().add(day1, "user4"); + redisTemplate.opsForHyperLogLog().add(day1, "user5"); + // 获取值 + long count = redisTemplate.opsForHyperLogLog().size(day1); + log.info("count day1:{}", count);//5 第一天有5个人访问这个文章 + + String day2 = "visituser:article1:20211015"; + redisTemplate.opsForHyperLogLog().add(day2, "user1"); + redisTemplate.opsForHyperLogLog().add(day2, "user2"); + redisTemplate.opsForHyperLogLog().add(day2, "user3"); + redisTemplate.opsForHyperLogLog().add(day2, "user4"); + redisTemplate.opsForHyperLogLog().add(day2, "user6"); + + long count2 = redisTemplate.opsForHyperLogLog().size(day2); + log.info("count day2:{}", count2); //5 + + + Long union = redisTemplate.opsForHyperLogLog().union(day1, day2); + log.info("union:{}", union);// 这个文章两天内的,有6个人访问 + } + + @Test + public void testBitMap() { + + // 定义一个字符串变量key,用于存储Redis中存储位图的键 + String key = "bitmap:article1"; + + // 在Redis位图中,将key对应的值的第1个位设置为true,这里用于记录文章1的阅读状态 + redisTemplate.opsForValue().setBit(key, 1, true); + // 同样在Redis位图中,将key对应的值的第2个位设置为true,这里用于记录文章2的阅读状态 + redisTemplate.opsForValue().setBit(key, 2, true); + + // 检查Redis位图中key对应的值的第1个位是否为true,打印结果 + System.out.println(redisTemplate.opsForValue().getBit(key, 1)); + + + + + + + // 创建BitFieldSubCommands对象,用于执行更复杂的位图操作 + BitFieldSubCommands subCommands = BitFieldSubCommands.create(); + // 添加一个指令到subCommands中,获取第11个位(从0开始计数)的64位整型值 + subCommands.get(BitFieldSubCommands.BitFieldType.INT_64).valueAt(11); + // 添加一个指令到subCommands中,将第11个位设置为64位整型值1 + subCommands.set(BitFieldSubCommands.BitFieldType.INT_64).to(11); + // 执行subCommands中所有位图操作指令 + redisTemplate.opsForValue().bitField(key, subCommands); + // 获取Redis位图中key对应的值的第11个位,检查其是否为true + System.out.println(redisTemplate.opsForValue().getBit(key, 11)); + + } + +}