{"id":18854812,"url":"https://github.com/noear/redisx","last_synced_at":"2025-07-07T20:04:26.874Z","repository":{"id":57745187,"uuid":"416577840","full_name":"noear/redisx","owner":"noear","description":"noear::一个轻量的redisx客户端","archived":false,"fork":false,"pushed_at":"2025-03-12T12:06:34.000Z","size":262,"stargazers_count":6,"open_issues_count":0,"forks_count":0,"subscribers_count":2,"default_branch":"main","last_synced_at":"2025-03-28T00:03:01.497Z","etag":null,"topics":[],"latest_commit_sha":null,"homepage":"","language":"Java","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"apache-2.0","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/noear.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null}},"created_at":"2021-10-13T03:36:49.000Z","updated_at":"2025-03-12T12:05:37.000Z","dependencies_parsed_at":"2023-02-14T06:45:58.874Z","dependency_job_id":"5fb2d86b-4e7a-45b2-aeea-6e554f6df1e3","html_url":"https://github.com/noear/redisx","commit_stats":null,"previous_names":[],"tags_count":6,"template":false,"template_full_name":null,"repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/noear%2Fredisx","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/noear%2Fredisx/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/noear%2Fredisx/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/noear%2Fredisx/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/noear","download_url":"https://codeload.github.com/noear/redisx/tar.gz/refs/heads/main","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":248867606,"owners_count":21174748,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":[],"created_at":"2024-11-08T03:51:52.603Z","updated_at":"2025-07-07T20:04:26.855Z","avatar_url":"https://github.com/noear.png","language":"Java","funding_links":[],"categories":[],"sub_categories":[],"readme":"\n[![Maven Central](https://img.shields.io/maven-central/v/org.noear/redisx.svg)](https://mvnrepository.com/search?q=g:org.noear%20AND%20redisx)\n[![Apache 2.0](https://img.shields.io/:license-Apache2-blue.svg)](https://license.coscl.org.cn/Apache2/)\n[![JDK-8+](https://img.shields.io/badge/JDK-8+-green.svg)](https://www.oracle.com/java/technologies/javase/javase-jdk8-downloads.html)\n[![QQ交流群](https://img.shields.io/badge/QQ交流群-22200020-orange)](https://jq.qq.com/?_wv=1027\u0026k=kjB5JNiC)\n\n# RedisX\n\n一个轻量级的 redis client ，基于 jedis 进行的友好封装。（就这样描述先...）\n\n\n## 快速入门\n\n### 1.配置\n\n```xml\n\u003cdependency\u003e\n    \u003cgroupId\u003eorg.noear\u003c/groupId\u003e\n    \u003cartifactId\u003eredisx\u003c/artifactId\u003e\n    \u003cversion\u003e1.7.0\u003c/version\u003e\n\u003c/dependency\u003e\n```\n\n```yaml\ntest.rd1:\n  server: localhost:6379\n  db: 1\n  password: 123456\n```\n\n\n可配置属性参考:\n\n\n| 属性                  | 示例                   | 说明                                       |\n|---------------------|----------------------|------------------------------------------|\n| server              | \"localhost:6379\"     | 地址，\"localhost:6379,localhost:6380\" -集群模式 |\n| db                  | 1                    | 库号，集群模式无效                                |\n| password            | \"123456\"             | 密码                                       |\n| user                | \"user\"               | 账号，redis 6.x 新加                          |\n| maxTotal            | 200                  | 最大连接数                                    |\n| maxIdle             | 200                  | 最大空闲数                                    |\n| maxWaitMillis       | 3000                 | 最大建立连接等待时间                               |\n| maxAttempts         | 5                    | 最大重试，集群模式有效                              |\n| connectionTimeout   | 3000                 | 连接超时                                     |\n| socketTimeoutMillis | 2000                 | Socket超时                                 |\n| serializer          | \"xxx.SerializerImpl\" | 指定自定义序列化实现（一般不指定，用默认的）       |\n\n\n\n### 2.bean 构建演示\n\n* 用 solon 构建实例\n\n```java\n@Configuration\npublic class Config {\n    @Bean\n    public RedisClient redisClient(@Inject(\"${test.rd1}\") RedisClient client) {\n        return client;\n    }\n}\n```\n\n* 手动构建实例\n\n```java\npublic class App {\n    public static void main(String[] args){\n        Properties props = new Properties();\n        props.put(\"server\", \"localhost:6379\");\n        props.put(\"password\",\"123456\");\n        \n        RedisClient client = new RedisClient(props);\n    }\n}\n```\n\n\n### 3.基础会话接口操作\n\n```java\n@SolonTest(DemoApp.class)\npublic class DemoTest {\n    @Inject\n    RedisClient client;\n\n    @Test\n    public void test() {\n        //写操作:: key().expire().xxx()\n        client.open(session -\u003e {\n            session.key(\"order:1\").expire(10).set(\"hello\");\n        });\n\n        //读操作:: key().xxx();\n        String tmp = client.openAndGet(session -\u003e session.key(\"order:1\").get());\n        assert tmp != null;\n\n        //写操作:: key().expire().xxx()\n        client.open(session -\u003e {\n            session.key(\"user:1\").expire(10)\n                    .hashSet(\"name\", \"noear\")\n                    .hashSet(\"sex\", \"1\");\n        });\n\n        //延时操作:: key().delay()\n        client.open(session -\u003e {\n            session.key(\"user_link:1\").delay(10);\n        });\n\n        assert true;\n    }\n}\n```\n\n## 领域增强对象接口\n\n领域增强对象，是由基础会话接口封装而成\n\n### RedisBucket - 存储桶\n\n```java\n@SolonTest(DemoApp.class)\npublic class DemoTest {\n    @Inject\n    RedisClient client;\n\n    @Test\n    public void test_bucket() throws Exception {\n        //--- bucket 使用\n        RedisBucket bucket = client.getBucket();\n\n        //存储\n        bucket.store(\"item:1\", \"hello\", 2);\n\n        //获取\n        assert \"hello\".equals(bucket.get(\"item:1\"));\n\n        //延时\n        bucket.delay(\"item:1\", 1);\n\n        Thread.sleep(4 * 1000);\n\n        //4秒后已过时\n        assert \"hello\".equals(bucket.get(\"item:1\")) == false;\n    }\n\n    @Test\n    public void test_bucket2() throws Exception {\n        //--- bucket 带序列化的使用\n        RedisBucket bucket = client.getBucket();\n\n        UserDo userDo = new UserDo();\n        userDo.id = 1212;\n        userDo.name = \"noear\";\n        userDo.create_lat = 12.111111;\n        userDo.create_lng = 121239123.12;\n        userDo.create_time = new Date();\n\n\n        UserDo userDo2 = bucket.getOrStoreAndSerialize(\"userex:1212\", 2, () -\u003e userDo);\n\n        UserDo userDo3 =bucket.getAndDeserialize(\"userex:1212\", UserDo.class);\n\n        assert userDo2 != null;\n        assert userDo3 != null;\n\n        assert userDo2.id == userDo3.id;\n        assert userDo2.create_time.getTime() == userDo3.create_time.getTime();\n\n\n        //移除一批匹配模式的主键\n        bucket.removeByPattern(\"item:\");\n    }\n}\n\n//实体要实现 Serializable 接口\npublic class UserDo implements Serializable {\n    public long id;\n    public String name;\n    public double create_lng;\n    public double create_lat;\n    public Date create_time;\n}\n```\n\n\n### RedisHash - 哈希表(兼容标准Map接口)\n\n```java\n@SolonTest(DemoApp.class)\npublic class DemoTest {\n    @Inject\n    RedisClient client;\n\n    @Test\n    public void test_hash() {\n        //--- hash 使用\n        RedisHash redisHash = client.getHash(\"user:121\");\n\n        redisHash.put(\"id\", 1);\n        redisHash.put(\"name\", \"demo\");\n\n        OrderDo orderDo = new OrderDo();\n        orderDo.id = 10001;\n        orderDo.traceId = \"demo\";\n        orderDo.note = \"test demo\";\n        redisHash.putAndSerialize(\"order\", orderDo);\n\n        assert redisHash.getAsInt(\"id\") == 1;\n\n        OrderDo orderDo1 = redisHash.getAndDeserialize(\"order\", OrderDo.class);\n        assert orderDo1.id == orderDo.id;\n\n        assert redisHash.size() == 3;\n    }\n}\n\n//实体要实现 Serializable 接口\npublic class OrderDo implements Serializable {\n    public int id;\n    public String traceId;\n    public String note;\n}\n```\n\n\n### RedisId - Id生成器\n\n```java\n@SolonTest(DemoApp.class)\npublic class DemoTest {\n    @Inject\n    RedisClient client;\n\n    @Test\n    public void test_id() {\n        //--- id 使用\n        RedisId redisId = client.getId(\"id:user\");\n\n        long user_id = 10000 + redisId.generate();\n        long order_id = 1000000 + redisId.generate();\n\n        assert user_id \u003e 10000;\n        assert order_id \u003e 1000000;\n    }\n}\n```\n\n\n### RedisLock - 分布式锁\n\n```java\n@SolonTest(DemoApp.class)\npublic class DemoTest {\n    @Inject\n    RedisClient client;\n\n    @Test\n    public void test_lock() {\n        //--- lock 使用\n        if (client.getLock(\"user:121212\").tryLock()) {\n            assert true;\n            //业务处理\n        } else {\n            assert false;\n            //提示：请不要频繁提交\n        }\n    }\n}\n```\n\n\n### RedisAtomic - 原子数字\n\n```java\n@SolonTest(DemoApp.class)\npublic class DemoTest {\n    @Inject\n    RedisClient client;\n\n    @Test\n    public void test_atomic() {\n        //--- atomic 使用\n        RedisAtomic atomic = client.getAtomic(\"user_count\");\n\n        long num = atomic.get();\n\n        atomic.increment();\n        atomic.incrementBy(2);\n\n        assert atomic.get() == (num + 3);\n    }\n}\n```\n\n### RedisList - 列表\n\n```java\n@SolonTest(DemoApp.class)\npublic class DemoTest {\n    @Inject\n    RedisClient client;\n\n    @Test\n    public void test_list() {\n        //--- list 使用\n        RedisList list = client.getList(\"list:test\");\n        list.clear();\n\n        list.add(\"1\");\n        list.add(\"2\");\n\n        assert \"1\".equals(list.get(0));\n        assert \"2\".equals(list.get(1));\n        assert list.get(2) == null;\n\n        list.add(\"3\");\n        list.add(\"4\");\n\n        assert \"3\".equals(list.get(2));\n        assert \"4\".equals(list.get(3));\n\n        list.removeAt(3);\n        assert list.get(3) == null;\n\n        for (String item : list.getAll()) {\n            System.out.println(\"test_list: \" + item);\n        }\n    }\n}\n```\n\n\n\n### RedisQueue - 队列\n\n```java\n@SolonTest(DemoApp.class)\npublic class DemoTest {\n    @Inject\n    RedisClient client;\n\n    @Test\n    public void test_queue() {\n        //--- queue 使用\n        RedisQueue queue = client.getQueue(\"queue:test\");\n        queue.clear();\n\n        queue.add(\"1\");\n        queue.add(\"2\");\n\n        assert \"1\".equals(queue.pop());\n        assert \"2\".equals(queue.pop());\n        assert queue.pop() == null;\n\n        queue.add(\"3\");\n        queue.add(\"4\");\n\n        assert \"3\".equals(queue.peek());\n        assert \"3\".equals(queue.peek());\n\n        queue.popAll(item -\u003e {\n            System.out.println(\"test_queue: \" + item);\n        });\n    }\n}\n```\n\n\n### RedisBus - 总线\n\n```java\n@SolonTest(DemoApp.class)\npublic class DemoTest {\n    @Inject\n    RedisClient client;\n\n    @Test\n    public void test_bus() {\n        //--- bus 使用\n        RedisBus bus = client.getBus();\n\n        //发消息 （如果没有订阅者，好像消息会白发）\n        new Thread(() -\u003e {\n            while (true) {\n                try {\n                    Thread.sleep(100);\n                    bus.publish(\"topic:test\", \"event-\" + System.currentTimeMillis());\n                } catch (Exception e) {\n                    e.printStackTrace();\n                }\n            }\n        }).start();\n\n        //异步订阅消息\n        bus.subscribeFuture((topic, message) -\u003e {\n            System.out.println(topic + \" = \" + message);\n        }, \"topic:test\");\n    }\n}\n```","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fnoear%2Fredisx","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fnoear%2Fredisx","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fnoear%2Fredisx/lists"}