当前位置:   article > 正文

Redis客户端之Redisson(一)介绍_redissonclient

redissonclient

目录

一、Redisson介绍

1、背景:

2、介绍:

二、SpringBoot集成Redission:

1、pom:

 2、配置类:

 (1)Redis单例模式

(2)Redis哨兵模式

   (3)Redis集群模式

(4)主从模式 

3、集成demo:

三、使用(API)方法:

1、String字符串

 2、List

 3、Set

4、Hash

5、SortedSet(ZSET) 

6、二进制流存储

 7、队列

8、限流器

9、可重入锁

10、发布订阅

 11、 布隆过滤器


一、Redisson介绍
1、背景:

Redisson - 是一个高级的分布式协调Redis客服端,能帮助用户在分布式环境中轻松实现一些Java的对象。Redisson、Jedis、Lettuce 是三个常用的操作 Redis 的客户端,Jedis、Lettuce 的 API 更侧重对 Reids 数据库的 CRUD(增删改查);而 Redisson API 侧重于分布式开发,提供了多种分布式Java对象和服务,包括分布式锁、分布式集合、分布式对象、分布式限流器、可重入锁等。

2、介绍:

Redisson是一个在Redis的基础上实现的Java内存数据网格(In-Memory Data Grid),它充分利用了Redis键值数据库提供的一系列优势,基于Java实用工具包中常用接口,为使用者提供了一系列具有分布式特性的常用工具类,让使用Redis更加简单、便捷,从而让使用者能够将更多精力集中到业务逻辑处理上。

 也就是说Redisson不仅仅是一个Redis客户端,它是一个以内存 Redis 服务器作为后端的处理 Java 对象,它还实现了很多具有分布式特性的常用工具类。比如分布式锁、布隆过滤器等。下图是官网提供的Redisson可以做的事情。

二、SpringBoot集成Redission:
1、pom:
  1. <dependency>
  2. <groupId>org.redisson</groupId>
  3. <artifactId>redisson</artifactId>
  4. <version>3.15.5</version>
  5. </dependency>
  6. <dependency>
  7. <groupId>org.redisson</groupId>
  8. <artifactId>redisson-spring-boot-starter</artifactId>
  9. <version>3.15.5</version>
  10. </dependency>

redison-spring-boot-starter依赖于与最新版本的spring-boot兼容的redison-spring数据模块。降级redison弹簧数据模块(如有必要),以支持以前的spring Boot版本:

redisson-spring-data module nameSpring Boot version
redisson-spring-data-161.3.y
redisson-spring-data-171.4.y
redisson-spring-data-181.5.y
redisson-spring-data-2x2.x.y
redisson-spring-data-3x3.x.y
 2、配置类:

支持Redis多种连接模式,这里以RedissonClient工具为例

 (1)Redis单例模式
  1. #单机模式
  2. #Redis url should start with redis:// or rediss:// (for SSL connection)
  3. my.redisson.address = redis://127.0.0.1:6379
  4. my.redisson.password = wtyy
  1. import org.redisson.Redisson;
  2. import org.redisson.api.RedissonClient;
  3. import org.redisson.config.Config;
  4. import org.springframework.beans.factory.annotation.Value;
  5. import org.springframework.context.annotation.Bean;
  6. import org.springframework.context.annotation.Configuration;
  7. @Configuration
  8. public class RedissionConfig {
  9. @Value("${my.redisson.address}")
  10. private String address;
  11. @Value("${my.redisson.password}")
  12. private String password;
  13. /**
  14. * 所有对Redisson的使用都是通过RedissonClient对象
  15. */
  16. @Bean(destroyMethod = "shutdown")
  17. public RedissonClient redissonClient(){
  18. // 创建配置 指定redis地址及节点信息
  19. Config config = new Config();
  20. config.useSingleServer().setAddress(address);
  21. //.setPassword(password);
  22. // 根据config创建出RedissonClient实例
  23. RedissonClient redissonClient = Redisson.create(config);
  24. return redissonClient;
  25. }
  26. }
(2)Redis哨兵模式
  1. my.redisson.sentinel.schema=
  2. my.redisson.sentinel.address = redis://xxx.xx.xxx1:19601,redis://xxx.xx.xxx2:19601,redis://xxx.xx.xxx3:19601
  3. my.redisson.sentinel.password = N5WAXX4z9qw
  4. my.redisson.sentinel.master = master-test
  5. my.redisson.sentinel.database = 10
  1. import org.redisson.Redisson;
  2. import org.redisson.api.RedissonClient;
  3. import org.redisson.config.Config;
  4. import org.springframework.beans.factory.annotation.Value;
  5. import org.springframework.context.annotation.Bean;
  6. import org.springframework.context.annotation.Configuration;
  7. @Configuration
  8. public class RedissionConfig {
  9. @Value("${my.redisson.sentinel.address}")
  10. private String address;
  11. @Value("${my.redisson.sentinel.password}")
  12. private String password;
  13. @Value("${my.redisson.sentinel.master}")
  14. private String master;
  15. @Value("${my.redisson.sentinel.database}")
  16. private Integer dataBase;
  17. @Value("${my.redisson.sentinel.schema}")
  18. private String schema;
  19. /**
  20. * 所有对Redisson的使用都是通过RedissonClient对象
  21. */
  22. @Bean(destroyMethod = "shutdown")
  23. public RedissonClient redissonClient(){
  24. Config config = new Config();
  25. config.useSentinelServers()
  26. .setScanInterval(2000) // cluster state scan interval in milliseconds
  27. .addSentinelAddress(address.split(","))
  28. .setCheckSentinelsList(false)
  29. .setMasterName(master)
  30. .setPassword(password)
  31. .setDatabase(dataBase);
  32. RedissonClient redissonClient = Redisson.create(config);
  33. return redissonClient;
  34. }
  35. }
   (3)Redis集群模式
  1. Config config = new Config();
  2. config.useClusterServers()
  3. .setScanInterval(2000) // cluster state scan interval in milliseconds
  4. .addNodeAddress("redis://127.0.0.1:7000", "redis://127.0.0.1:7001")
  5. .addNodeAddress("redis://127.0.0.1:7002");
  6. RedissonClient redisson = Redisson.create(config);
(4)主从模式 
  1. Config config = new Config();
  2. config.useMasterSlaveServers()
  3. .setMasterAddress("redis://127.0.0.1:6379")
  4. .addSlaveAddress("redis://127.0.0.1:6389", "redis://127.0.0.1:6332", "redis://127.0.0.1:6419")
  5. .addSlaveAddress("redis://127.0.0.1:6399");
  6. RedissonClient redisson = Redisson.create(config);
3、集成demo:

(1)pom:

  1. <parent>
  2. <groupId>org.springframework.boot</groupId>
  3. <artifactId>spring-boot-starter-parent</artifactId>
  4. <version>2.1.8.RELEASE</version>
  5. <relativePath/>
  6. </parent>
  7. <dependencies>
  8. <dependency>
  9. <groupId>org.springframework.boot</groupId>
  10. <artifactId>spring-boot-starter-actuator</artifactId>
  11. </dependency>
  12. <dependency>
  13. <groupId>org.springframework.boot</groupId>
  14. <artifactId>spring-boot-starter-web</artifactId>
  15. </dependency>
  16. <!--<dependency>-->
  17. <!--<groupId>org.redisson</groupId>-->
  18. <!--<artifactId>redisson-spring-boot-starter</artifactId>-->
  19. <!--<version>3.23.5</version>-->
  20. <!--</dependency>-->
  21. <dependency>
  22. <groupId>org.redisson</groupId>
  23. <artifactId>redisson</artifactId>
  24. <version>3.15.0</version>
  25. </dependency>
  26. </dependencies>

(2)配置文件:

  1. server.port = 7777
  2. server.servlet.context-path=/redission
  3. #1、单机模式
  4. #Redis url should start with redis:// or rediss:// (for SSL connection)
  5. #my.redisson.address = redis://127.0.0.1:6379
  6. #my.redisson.password = wtyy
  7. #2、哨兵模式
  8. my.redisson.sentinel.schema=
  9. my.redisson.sentinel.address = redis://xxx.xx.xxx1:19601,redis://xxx.xx.xxx2:19601,redis://xxx.xx.xxx3:19601
  10. my.redisson.sentinel.password = N5WAXX4z9qw
  11. my.redisson.sentinel.master = master-test
  12. my.redisson.sentinel.database = 10
  1. import org.redisson.Redisson;
  2. import org.redisson.api.RedissonClient;
  3. import org.redisson.config.Config;
  4. import org.springframework.beans.factory.annotation.Value;
  5. import org.springframework.context.annotation.Bean;
  6. import org.springframework.context.annotation.Configuration;
  7. @Configuration
  8. public class RedissionConfig {
  9. @Value("${my.redisson.sentinel.address}")
  10. private String address;
  11. @Value("${my.redisson.sentinel.password}")
  12. private String password;
  13. @Value("${my.redisson.sentinel.master}")
  14. private String master;
  15. @Value("${my.redisson.sentinel.database}")
  16. private Integer dataBase;
  17. @Value("${my.redisson.sentinel.schema}")
  18. private String schema;
  19. /**
  20. * 所有对Redisson的使用都是通过RedissonClient对象
  21. */
  22. @Bean(destroyMethod = "shutdown")
  23. public RedissonClient redissonClient(){
  24. Config config = new Config();
  25. config.useSentinelServers()
  26. .setScanInterval(2000) // cluster state scan interval in milliseconds
  27. .addSentinelAddress(address.split(","))
  28. .setCheckSentinelsList(false)
  29. .setMasterName(master)
  30. .setPassword(password)
  31. .setDatabase(dataBase);
  32. RedissonClient redissonClient = Redisson.create(config);
  33. return redissonClient;
  34. }
  35. }

(3)controller接口:

  1. @Autowired
  2. private RedissonClient redissonClient;
  3. @RequestMapping("/setStr")
  4. public void setStr(String key,String value){
  5. redissonClient.getBucket(key).set(value);
  6. }
  7. @RequestMapping("/getStr")
  8. public String getStr(String key){
  9. return (String) redissonClient.getBucket(key).get();
  10. }

测试:

访问localhost:7777/redission/setStr?key=userName&value=李四

查看redis存储情况

访问localhost:7777/redission/getStr?key=userName  输出:李四

三、使用(API)方法:

以redissonClient客户端为例,

1、String字符串

  Redisson将Redis中的字符串数据结构封装成了RBucket,通过RedissonClient的getBucket(key)方法获取一个RBucket对象实例,通过这个实例可以设置value或设置value和有效期。并且可以操作所有类型的对象。

  1. //1、存
  2. RBucket<Object> bucket = redissonClient.getBucket(你的键名称);
  3. //设置值,过期时间为3小时
  4. bucket.set(你的value,30, TimeUnit.HOURS);
  5. //2、通过keyvalue
  6. Object name = redissonClient.getBucket(你的键名称).get();
  7. System.out.println(name);
  1. RBucket<Object> bucket = redissonClient.getBucket("myString-key");
  2. bucket.set("{\"userName\":\"test\",\"userPwd\":\"test\",\"email\":\"xxx@163.com\",\"captcha\":\"3552\"}");
  3. //
  4. redissonClient.getBucket(key).set(value);
  5. //
  6. String value = (String) redissonClient.getBucket(key).get();
 2、List
  1. RList<String> list = redissonClient.getList("users");
  2. list.add("zs");
  3. list.add("ls");
  4. System.out.println(list);
  5. //通过keyvalue
  6. List<Object> list1 = redissonClient.getList("users").get();
  7. //移除索引0位置元素
  8. list.remove(0);
 3、Set
  1. RSet<Object> set = redissonClient.getSet("users");
  2. set.add("zs");
  3. set.add("ls");
  4. //通过keyvalue
  5. RSet<Object> set1 = redissonClient.getSet("users");
4、Hash
  1. RMap<Object, Object> map = redissonClient.getMap("myFirstMap");
  2. map.put("productId2","100055301");
  3. RMap<Object, Object> map = redissonClient.getMap("userMap");
  4. map.put("zs","张三");
  5. map.put("ls","李四");
  6. map.forEach((key,value)->{
  7. System.out.println("key = "+key+" ,value = "+ value);
  8. });
  9. //通过keyvalue
  10. Object o = redissonClient.getMap("userMap").get("zs");
5、SortedSet(ZSET) 
  1. RScoredSortedSet<String> sortedSet = redissonClient.getScoredSortedSet("sortedKey-32");
  2. sortedSet.add(1.0, "zs");
  3. sortedSet.add(2.0, "lisi");
6、二进制流存储

提供了InputStream接口和OutputStream接口的实现

  1. //====================操作流来存储对象====================
  2. RBinaryStream stream = redissonClient.getBinaryStream("stream");
  3. stream.set("name is ".getBytes());
  4. OutputStream outputStream = stream.getOutputStream();
  5. outputStream.write("victory".getBytes());
  6. InputStream inputStream = stream.getInputStream();
  7. ByteArrayOutputStream result = new ByteArrayOutputStream();
  8. byte[] bytes = new byte[1024];
  9. int length;
  10. while ((length = inputStream.read(bytes)) != -1) {
  11. result.write(bytes, 0, length);
  12. }
  13. System.out.println(result.toString());
 7、队列
  1. RQueue<String> queue = redissonClient.getQueue("queue");
  2. //存值
  3. queue.add("zs");
  4. queue.add("ls");
  5. //取值
  6. String item = queue.poll();
  7. System.out.println(item);
  8. //
  9. RQueue<Object> queue1 = redissonClient.getQueue("queue");
8、限流器

   基于Redis的分布式限流器可以用来在分布式环境下现在请求方的调用频率。既适用于不同Redisson实例下的多线程限流,也适用于相同Redisson实例下的多线程限流。该算法不保证公平性。

  1. RRateLimiter rateLimiter = redissonClient.getRateLimiter("rateLimiter");
  2. //创建限流器,最大流速:每1秒钟产生20个令牌
  3. rateLimiter.trySetRate(RateType.OVERALL, 20, 1, RateIntervalUnit.SECONDS);
  4. for (int i = 0; i < 10; i++) {
  5. new Thread(new Runnable() {
  6. int i = 0;
  7. @Override
  8. public void run() {
  9. while(true) {
  10. rateLimiter.acquire(1);
  11. System.out.println(Thread.currentThread() + "-" + System.currentTimeMillis() + "-" + i++);
  12. }
  13. }
  14. }).start();
  15. }
9、可重入锁
  1. RLock lock = redissonClient.getLock("lock");
  2. for (int i = 0; i < 5; i++) {
  3. new Thread(() -> {
  4. lock.lock();
  5. try {
  6. System.out.println(Thread.currentThread() + "-" + System.currentTimeMillis() + "-" + "获取了锁");
  7. Thread.sleep(500);
  8. } catch (InterruptedException e) {
  9. e.printStackTrace();
  10. } finally {
  11. lock.unlock();
  12. }
  13. }).start();
  14. }
10、发布订阅

Redisson的分布式话题 RTopic 对象实现了发布、订阅的机制。 

  1. //====================操作topic执行发布操作====================
  2. RTopic topic1 = redissonClient.getTopic("topic",new SerializationCodec());
  3. topic1.publish(new Message(1L,"victory",18));
  4. //====================操作topic执行订阅操作====================
  5. Thread.sleep(5000);
  6. RTopic topic = redissonClient1.getTopic("topic", new SerializationCodec());
  7. topic.addListener(Message.class, new MessageListener<Message>() {
  8. @Override
  9. public void onMessage(CharSequence channel, Message msg) {
  10. System.out.println("onMessage:=========" + channel + "; Thread:========= " + Thread.currentThread().toString());
  11. System.out.println(" name : " + msg.getName() + " age : " + msg.getAge());
  12. LoggerFactory.getLogger(RedissonDemo.class).info("Redisson接收到消息",msg);
  13. }
  14. });
 11、 布隆过滤器
  1. RBloomFilter<String> bloomFilter = redissonClient.getBloomFilter("bloom-filter");
  2. // 初始化布隆过滤器,初始化预期插入的数据量为200,期望误差率为0.01
  3. bloomFilter.tryInit(200, 0.01);
  4. //插入数据
  5. bloomFilter.add("丁胜利");
  6. bloomFilter.add("丁向前");
  7. bloomFilter.add("胜利丁");
  8. //判断是否包含
  9. boolean victory = bloomFilter.contains("丁胜利");
  10. boolean forward = bloomFilter.contains("向前丁");
  11. System.out.println(victory); //true
  12. System.out.println(forward); //false

Redisson自定义序列化_redisson 序列化_yzh_1346983557的博客-CSDN博客

redis存取的数据一定是可序列化的,而可序列化方式可以自定义。如果不同客户端设置的可序列化方式不一样,会导致读取不一致的问题。常见的序列化方式有几下几种

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/代码探险家/article/detail/816779
推荐阅读
相关标签
  

闽ICP备14008679号