当前位置:   article > 正文

SpringBoot整合redis_spring boot整合redis csdn

spring boot整合redis csdn

目录

SpringBoot整合redis

1、集成jedis

2、集成lettuce

3、集成RedisTemplate

4、redis解决乱码问题

5、springboot连接redis集群


SpringBoot整合redis

1、集成jedis

1、添加依赖

  1. <dependency>
  2. <groupId>redis.clients</groupId>
  3. <artifactId>jedis</artifactId>
  4. <version>5.0.2</version>
  5. </dependency>

 示例:

  1. public class JdeisTest {
  2. public static void main(String[] args) {
  3. //连接redis
  4. Jedis jedis = new Jedis("192.168.200.129",6379);
  5. //密码
  6. jedis.auth("123456");
  7. System.out.println(jedis.ping());
  8. //keys
  9. Set<String> keys = jedis.keys("*");
  10. System.out.println(keys);
  11. //string
  12. jedis.set("jedis","hello-jedis");
  13. System.out.println(jedis.get("jedis"));
  14. jedis.expire("jedis",10L);
  15. //list
  16. jedis.lpush("list","list1","list2","list3","list4","list5");
  17. List<String> list = jedis.lrange("list", 0, -1);
  18. for (String s : list) {
  19. System.out.println(s);
  20. }
  21. //set
  22. jedis.sadd("set","set1");
  23. jedis.sadd("set","set2");
  24. jedis.sadd("set","set3");
  25. Set<String> set = jedis.smembers("set");
  26. for (String s : set) {
  27. System.out.println(s);
  28. }
  29. //从存储在键处的设置值中删除指定成员
  30. long set1 = jedis.srem("set", "1");
  31. //hash
  32. jedis.hset("hash","username","lisi");
  33. System.out.println(jedis.hget("hash","username"));
  34. Map map = new HashMap();
  35. map.put("age","20");
  36. map.put("address","杭州");
  37. jedis.hmset("hash2", map);
  38. List<String> hash = jedis.hmget("hash2","age","address");
  39. for (String s : hash) {
  40. System.out.println(s);
  41. }
  42. //zset
  43. jedis.zadd("zset",10d,"zset1");
  44. jedis.zadd("zset",10d,"zset2");
  45. List<String> zset = jedis.zrange("zset", 0, -1);
  46. for (String member : zset) {
  47. System.out.println(member);
  48. }
  49. }
  50. }

 结果:

优点:

  1. 简单易用:Jedis提供了简洁的API,使得与Redis进行交互变得简单和直观。
  2. 良好的性能:Jedis是一个轻量级的框架,它使用直接的、高效的Redis协议与数据库进行通信,具有较低的延迟和较高的吞吐量。
  3. 多样的功能:Jedis支持Redis的各种功能,如字符串操作、哈希表、列表、集合、有序集合等等,可以满足大部分的应用需求。
  4. 支持连接池:Jedis提供了连接池的支持,可以管理和复用多个Redis连接,提高资源利用率和性能。
  5. 开源社区支持:Jedis是一个开源项目,拥有活跃的开源社区,用户可以从社区中获取支持、解决问题以及共享经验。

缺点:

  1. 异步操作限制:Jedis在执行命令时是同步的,即发送命令后会阻塞等待结果返回,这在某些场景下可能会影响性能。虽然Jedis提供了异步操作的支持,但是相对于其他异步框架来说,其功能有限。
  2. 单线程模型:Jedis基于Redis的单线程模型,这意味着在处理大量并发请求时,Jedis可能会受到性能瓶颈的限制。然而,对于大多数应用场景来说,Redis的单线程模型已经足够满足需求。
  3. 功能相对较少:尽管Jedis支持Redis的核心功能,但是一些高级特性(如事务、发布订阅)的支持相对有限。如果需要使用更复杂的功能,可能需要使用其他Redis客户端或者直接使用Redis的原生命令。
2、集成lettuce

添加依赖

  1. <dependency>
  2. <groupId>io.lettuce</groupId>
  3. <artifactId>lettuce-core</artifactId>
  4. <version>6.2.6.RELEASE</version>
  5. </dependency>
  1. public class LettuceTest {
  2. public static void main(String[] args) {
  3. //使用构建器链式编程来builder我们RedisURI
  4. RedisURI uri = RedisURI.builder()
  5. .withHost("192.168.200.129")
  6. .withPort(6379).
  7. withAuthentication("default", "123456")
  8. .build();
  9. //创建连接交白
  10. RedisClient redisClient = RedisClient.create(uri);
  11. StatefulRedisConnection<String, String> connect = redisClient.connect();
  12. //通过connect 创建操作的command
  13. RedisCommands<String, String> command = connect.sync();
  14. List<String> keys = command.keys("*");
  15. System.out.println("keys:" + keys);
  16. command.set("name", "三张");
  17. System.out.println(command.get("name"));
  18. //list
  19. command.lpush("list","list1","list2","list3","list4","list5");
  20. List<String> list = command.lrange("list", 0, -1);
  21. for (String s : list) {
  22. System.out.println(s);
  23. }
  24. //set
  25. command.sadd("set","set1");
  26. command.sadd("set","set2");
  27. command.sadd("set","set3");
  28. Set<String> set = command.smembers("set");
  29. for (String s : set) {
  30. System.out.println(s);
  31. }
  32. //hash
  33. command.hset("hash","username","lisi");
  34. System.out.println(command.hget("hash","username"));
  35. Map map = new HashMap();
  36. map.put("age","20");
  37. map.put("address","杭州");
  38. command.hmset("hash2", map);
  39. List<KeyValue<String, String>> hmget = command.hmget("hash2", "age", "address");
  40. for (KeyValue<String, String> stringStringKeyValue : hmget) {
  41. System.out.println(stringStringKeyValue);
  42. }
  43. //zset
  44. command.zadd("zset",10d,"zset1");
  45. command.zadd("zset",10d,"zset2");
  46. List<String> zset = command.zrange("zset", 0, -1);
  47. for (String member : zset) {
  48. System.out.println(member);
  49. }
  50. //释放资源
  51. connect.close();
  52. redisClient.close();
  53. }
  54. }

优点:

  1. 异步和响应式支持:Lettuce基于Netty框架实现,提供了异步和响应式编程模型的支持。这使得在高并发环境下能够更好地利用系统资源,并提供更好的性能和扩展性。
  2. 高性能:由于基于Netty的异步非阻塞IO模型,Lettuce能够处理大量并发连接和请求,具有较低的延迟和较高的吞吐量。
  3. 集群和高可用支持:Lettuce提供了对Redis集群和高可用性(如Redis Sentinel和Redis Cluster)的全面支持,方便在分布式环境中使用Redis。
  4. 可扩展性:Lettuce支持连接池的管理和复用,可以有效地管理多个Redis连接,并且可以配置连接池的相关参数以适应不同的业务需求。
  5. 可靠性和稳定性:Lettuce通过维护TCP连接和心跳机制来保持与Redis服务器的连接,并提供自动重连功能,以应对网络中断或Redis服务器重启等异常情况。

缺点:

  1. 学习曲线较陡峭:相对于Jedis来说,Lettuce的学习曲线较陡峭,尤其是对于那些不熟悉异步和响应式编程模型的开发者来说。需要一定的时间和精力去理解和适应这种编程模型。
  2. 功能相对较少:尽管Lettuce支持Redis的核心功能,但相对于一些高级特性(如事务、发布订阅)的支持可能较为有限。在使用Lettuce时,如果需要使用这些特性,可能需要通过其他方式实现或使用Redis的原生命令。
3、集成RedisTemplate

创建一个springboot工程

添加依赖

  1. <dependency>
  2. <groupId>org.springframework.boot</groupId>
  3. <artifactId>spring-boot-starter-data-redis-reactive</artifactId>
  4. </dependency>

配置redis文件

  1. spring:
  2. redis:
  3. port: 6379 #端口号
  4. host: 192.168.200.129 #虚拟机IP地址
  5. password: 123456 #密码
  6. database: 0 #redis默认数据库
  7. timeout: 5000

 写测试方法

  1. public class RedisTemplateTest {
  2. private static StringRedisTemplate redisTemplate;
  3. @Autowired()
  4. public void setRedisTemplate(StringRedisTemplate redisTemplate) {
  5. RedisTools.redisTemplate = redisTemplate;
  6. }
  7. public static void stringDemo() {
  8. // 设置字符串值
  9. redisTemplate.opsForValue().set("key1", "value1");
  10. // 获取字符串值
  11. String value = redisTemplate.opsForValue().get("key1");
  12. System.out.println("String value: " + value);
  13. }
  14. public static void listDemo() {
  15. // 在列表左侧插入元素
  16. redisTemplate.opsForList().leftPush("list1", "value1");
  17. redisTemplate.opsForList().leftPush("list1", "value2");
  18. // 获取列表范围内的元素
  19. List<String> values = redisTemplate.opsForList().range("list1", 0, -1);
  20. System.out.println("List values: " + values);
  21. }
  22. public static void setDemo() {
  23. // 向集合中添加元素
  24. redisTemplate.opsForSet().add("set1", "value1");
  25. redisTemplate.opsForSet().add("set1", "value2");
  26. // 获取集合所有元素
  27. Set<String> values = redisTemplate.opsForSet().members("set1");
  28. System.out.println("Set values: " + values);
  29. }
  30. public static void hashDemo() {
  31. // 设置哈希字段的值
  32. redisTemplate.opsForHash().put("hash1", "field1", "value1");
  33. redisTemplate.opsForHash().put("hash1", "field2", "value2");
  34. // 获取哈希字段的值
  35. String value = (String) redisTemplate.opsForHash().get("hash1", "field1");
  36. System.out.println("Hash value: " + value);
  37. }
  38. // 添加成员到有序集合
  39. public static void addToZSet() {
  40. // 添加成员到有序集合
  41. redisTemplate.opsForZSet().add("myset", "Alice", 90);
  42. redisTemplate.opsForZSet().add("myset", "Bob", 85);
  43. redisTemplate.opsForZSet().add("myset", "Charlie", 95);
  44. redisTemplate.opsForZSet().add("myset", "David", 80);
  45. }
  46. // 获取有序集合的成员列表
  47. public static Set<String> getZSetMembers() {
  48. return redisTemplate.opsForZSet().range("myset", 0, -1);
  49. }
  50. // 获取有序集合的成员列表及分数
  51. public static Set<ZSetOperations.TypedTuple<String>> getZSetWithScores() {
  52. return redisTemplate.opsForZSet().rangeWithScores("myset", 0, -1);
  53. }
  54. }

 写controller测试

  1. @GetMapping("/")
  2. public String index(){
  3. RedisTools.get("k1");
  4. RedisTools.stringDemo();
  5. RedisTools.listDemo();
  6. RedisTools.setDemo();
  7. RedisTools.hashDemo();
  8. RedisTools.addToZSet();
  9. Set<String> zSetMembers = RedisTools.getZSetMembers();
  10. System.out.println(zSetMembers);
  11. Set<ZSetOperations.TypedTuple<String>> zSetWithScores = ·
  12. RedisTools.getZSetWithScores();
  13. for (ZSetOperations.TypedTuple<String> tuple : zSetWithScores) {
  14. String member = tuple.getValue();
  15. double score = tuple.getScore();
  16. System.out.println("Member: " + member + ", Score: " + score);
  17. }
  18. System.out.println("------------------");
  19. }

启动项目:访问8080

4、redis解决乱码问题

当我们使用redisTemplate,保存对象时会出现乱码的现象

解决方案1、创建使用StringRedisTemplate 对象

解决方案2、我们自己定义RedisTemplate模板

  1. @Configuration
  2. public class RedisConfig {
  3. @Bean
  4. public RedisTemplate<String, Object> redisTemplate(RedisConnectionFactory redisConnectionFactory) throws UnknownHostException {
  5. // 将template 泛型设置为 <String, Object>
  6. RedisTemplate<String, Object> template = new RedisTemplate();
  7. // 连接工厂,不必修改
  8. template.setConnectionFactory(redisConnectionFactory);
  9. /*
  10. * 序列化设置
  11. */
  12. // key、hash的key 采用 String序列化方式
  13. template.setKeySerializer(RedisSerializer.string());
  14. template.setHashKeySerializer(RedisSerializer.string());
  15. // value、hash的value 采用 Jackson 序列化方式
  16. template.setValueSerializer(RedisSerializer.json());
  17. template.setHashValueSerializer(RedisSerializer.json());
  18. template.afterPropertiesSet();
  19. return template;
  20. }
  21. }

 注:如果使用java代码设置的中文值,在redis-cli中查看是中文乱码
1、如果是这种乱码:

"\"bbbb\xe5\x9f\xba\xe5\xb0\xbc\xe5\xa4\xaa\xe7\xbe\x8e\""

那么解决办法是,启动redis-cli的时候,后面加“–raw”后缀,就可以了  

5、springboot连接redis集群

1、添加依赖

  1. <dependency>
  2. <groupId>org.springframework.boot</groupId>
  3. <artifactId>spring-boot-starter-data-redis</artifactId>
  4. </dependency>
  5. <dependency>
  6. <groupId>io.lettuce</groupId>
  7. <artifactId>lettuce-core</artifactId>
  8. </dependency>

2、修改yml文件

  1. spring:
  2. redis:
  3. password: 123456 #密码
  4. cluster:
  5. max-redirects: 3
  6. nodes: 192.168.111.185:6381,192.168.111.185:6382,192.168.111.184:6383,192.168.111.184:6384
  7. lettuce:
  8. pool:
  9. max-active: 8
  10. max-wait: -1ms
  11. max-idle: 8
  12. min-idle: 0
  • spring.redis.password: 这是连接Redis所需的密码。

  • spring.redis.cluster.max-redirects: 这是Redis Cluster在执行命令时的最大重定向次数。默认值是3

  • spring.redis.cluster.nodes: 这是Redis Cluster的节点信息。在这个例子中,有四个节点,分别是192.168.111.185:6381192.168.111.185:6382192.168.111.184:6383192.168.111.184:6384。每个节点由IP地址和端口号组成,用逗号分隔。

  • spring.redis.lettuce.pool.max-active: 这是Lettuce连接池的最大活动连接数。默认值是8

  • spring.redis.lettuce.pool.max-wait: 这是Lettuce连接池中获取连接时的最大等待时间。默认值是-1ms,表示无限等待。

  • spring.redis.lettuce.pool.max-idle: 这是Lettuce连接池的最大空闲连接数。默认值是8

  • spring.redis.lettuce.pool.min-idle: 这是Lettuce连接池的最小空闲连接数。默认值是0

 3、启动项目测试

注意:当有一个主机宕机时,springboot会报错

原因:SpringBoot客户端没有动态感知到RedisCluster的最新集群信息

解决方案:刷新节点集群拓扑动态感应

yml添加一下配置

  1. #支持集群拓扑动态感应刷新,自适应拓扑刷新是否使用所有可用的更新,默认false关团
  2. spring.redis.lettuce.cluster.refresh.adaptive=true
  3. #定时刷新
  4. spring.redis.lettuce.cluster.refresh.period=2000

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

闽ICP备14008679号