当前位置:   article > 正文

Spring Boot中集成Redis详解_springboot集成redis主从架构

springboot集成redis主从架构

一、Redis 介绍

1、什么是 Redis

Redis(Remote Dictionary Server)是一个开源的高性能键值对存储数据库,属于非关系型数据库(NoSQL)。它通过在内存中存储数据来提供快速的读写访问,并使用磁盘持久化来保证数据的可靠性。

Redis 提供了丰富的数据结构支持,包括字符串(String)、哈希(Hash)、列表(List)、集合(Set)、有序集合(Sorted Set)等。这些数据结构非常灵活,能够满足各种实际应用场景的需求。

2、Redis 的主要特点包括

  1. 快速读写:Redis 的数据都存储在内存中,使得它具有非常高的读写性能。它还使用了一些优化技术,如异步和多线程,以提高性能。

  2. 持久化:Redis 提供了两种方式来持久化数据,即快照(snapshot)和日志(append-only file)。快照是将数据写入磁盘,而日志则是记录每个写操作,用以恢复数据。

  3. 分布式:Redis 支持分布式部署,可以通过集群(Cluster)、主从复制(Master-Slave)等方式来扩展容量和提高可用性。

  4. 数据类型丰富:除了基本的键值对存储,Redis 还提供了丰富的数据结构,如哈希(Hash)、列表(List)、集合(Set)、有序集合(Sorted Set)等,使得它能够适应各种不同的数据需求。

  5. 支持事务:Redis 支持事务操作,允许一系列命令按顺序执行,并且在执行期间不会被其他客户端的命令打断。

  6. 可扩展性:Redis 可以通过增加更多的节点来扩展容量和吞吐量,以满足大规模业务的需求。

Redis 可以用于广泛的应用场景,如缓存、消息队列、计数器、排行榜、实时发布/订阅等。其简单、高效和灵活的特性使其成为流行的数据存储解决方案。

3、Redis 的应用场景

  • 排行榜

  • 计数器

  • 限速器

  • 分布式锁

  • 分布式会话

  • 热点数据缓存

4、Redis 与其它 Key-Value 的区别

  • Redis 支持数据的备份,即 master - slave 模式的数据备份。

  • Redis 支持数据的持久化,可以将内存中的数据保存在磁盘中,重启的时候可以再次加载进行使用。

  • Redis 不仅仅支持简单的 key - value 类型的数据,同时还提供 list、set、zset、hash 等数据结构的存储。

二、SpringBoot 操作 Redis

1、Maven 引入相关依赖

引入 SpringBoot 和 Redis 依赖,由于 SpringBoot 2.x + 版本后是用 lettuce 作为连接池,所以需要引入 commons-pool2 依赖。

  1. <?xml version="1.0" encoding="UTF-8"?>
  2. <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  3. xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">
  4. <modelVersion>4.0.0</modelVersion>
  5. <parent>
  6. <groupId>org.springframework.boot</groupId>
  7. <artifactId>spring-boot-starter-parent</artifactId>
  8. <version>2.3.4.RELEASE</version>
  9. </parent>
  10. <groupId>com.demo</groupId>
  11. <artifactId>springboot-redis-example</artifactId>
  12. <version>0.0.1</version>
  13. <name>springboot-redis-example</name>
  14. <description>Demo project for Spring Boot Redis</description>
  15. <properties>
  16. <java.version>1.8</java.version>
  17. </properties>
  18. <dependencies>
  19. <dependency>
  20. <groupId>org.springframework.boot</groupId>
  21. <artifactId>spring-boot-starter-web</artifactId>
  22. </dependency>
  23. <dependency>
  24. <groupId>org.springframework.boot</groupId>
  25. <artifactId>spring-boot-starter-data-redis</artifactId>
  26. </dependency>
  27. <dependency>
  28. <groupId>org.apache.commons</groupId>
  29. <artifactId>commons-pool2</artifactId>
  30. </dependency>
  31. <dependency>
  32. <groupId>org.projectlombok</groupId>
  33. <artifactId>lombok</artifactId>
  34. </dependency>
  35. </dependencies>
  36. <build>
  37. <plugins>
  38. <plugin>
  39. <groupId>org.springframework.boot</groupId>
  40. <artifactId>spring-boot-maven-plugin</artifactId>
  41. </plugin>
  42. </plugins>
  43. </build>
  44. </project>

2、配置文件中添加相关参数

Redis 有多重部署方式,所以连接 Redis 又有多种方式,下面介绍下如何配置 单机哨兵集群 的连接参数,需要将这些参数配置到 SpringBoot 的 application 配置文件中。

Redis 单机配置:

  1. spring:
  2. redis:
  3. database: 0 #数据库
  4. ssl: false #是否开启ssl
  5. timeout: 1000 #超时时间,单位为毫秒
  6. host: 127.0.0.1 #Reids主机地址
  7. port: 6379 #Redis端口号
  8. lettuce: #使用 lettuce 连接池
  9. pool:
  10. max-active: 20 #连接池最大连接数(使用负值表示没有限制)
  11. max-wait: -1 #连接池最大阻塞等待时间(使用负值表示没有限制)
  12. min-idle: 0 #连接池中的最大空闲连接
  13. max-idle: 10 #连接池中的最小空闲连接

Redis 哨兵配置: 

  1. spring:
  2. redis:
  3. sentinel: #哨兵配置
  4. master: my-master #Redis服务器名称
  5. nodes: #Redis哨兵地址
  6. - 192.168.2.11:6379
  7. - 192.168.2.12:6379
  8. - 192.168.2.13:6379
  9. database: 0 #Redis 索引(0~15,默认为0
  10. timeout: 1000 #Redis 连接的超时时间
  11. password: 123456 #Redis 密码,如果没有就默认不配置此参数
  12. lettuce: #使用 lettuce 连接池
  13. pool:
  14. max-active: 20 #连接池最大连接数(使用负值表示没有限制)
  15. max-wait: -1 #连接池最大阻塞等待时间(使用负值表示没有限制)
  16. min-idle: 0 #连接池中的最大空闲连接
  17. max-idle: 10 #连接池中的最小空闲连接

Redis 集群配置:

  1. spring:
  2. redis:
  3. database: 0 #Redis 索引(0~15,默认为0
  4. timeout: 1000 #Redis 连接的超时时间
  5. password: 123456 #Redis 密码,如果没有就默认不配置此参数
  6. cluster: #Redis 集群配置
  7. max-redirects: 5 #Redis 命令执行时最多转发次数
  8. nodes: #Redis 集群地址
  9. - 192.168.2.11:6379
  10. - 192.168.2.12:6379
  11. - 192.168.2.13:6379
  12. - 192.168.2.11:6380
  13. - 192.168.2.12:6380
  14. - 192.168.2.13:6380
  15. lettuce: #使用 lettuce 连接池
  16. pool:
  17. max-active: 20 #连接池最大连接数(使用负值表示没有限制)
  18. max-wait: -1 #连接池最大阻塞等待时间(使用负值表示没有限制)
  19. min-idle: 0 #连接池中的最大空闲连接
  20. max-idle: 10 #连接池中的最小空闲连接

3、配置 RedisTemplate 中序列化参数

在 RedisTemplate 默认是使用的 Java 字符串序列化,该序列化存入 Redis 并不能够提供可读性,比较流行的做法是替换成 Jackson 序列化,以 JSON 方式进行存储。

  1. import org.springframework.context.annotation.Bean;
  2. import org.springframework.context.annotation.Configuration;
  3. import org.springframework.data.redis.connection.RedisConnectionFactory;
  4. import org.springframework.data.redis.core.RedisTemplate;
  5. import org.springframework.data.redis.serializer.*;
  6. /**
  7. * Redis 配置
  8. */
  9. @Configuration
  10. public class RedisConfig {
  11. /**
  12. * Redis 序列化配置
  13. */
  14. @Bean
  15. public RedisTemplate<String, Object> redisTemplate(RedisConnectionFactory connectionFactory) {
  16. RedisTemplate<String, Object> redisTemplate = new RedisTemplate<>();
  17. redisTemplate.setConnectionFactory(connectionFactory);
  18. // 使用GenericJackson2JsonRedisSerializer替换默认序列化
  19. GenericJackson2JsonRedisSerializer jackson2JsonRedisSerializer = new GenericJackson2JsonRedisSerializer();
  20. // 设置 Key 和 Value 的序列化规则
  21. redisTemplate.setKeySerializer(new StringRedisSerializer());
  22. redisTemplate.setValueSerializer(jackson2JsonRedisSerializer);
  23. redisTemplate.setHashKeySerializer(new StringRedisSerializer());
  24. redisTemplate.setHashValueSerializer(jackson2JsonRedisSerializer);
  25. // 初始化 RedisTemplate 序列化完成
  26. redisTemplate.afterPropertiesSet();
  27. return redisTemplate;
  28. }
  29. }

4、使用 RedisTemplate 操作 Redis

Redis 基本操作

  1. import lombok.extern.slf4j.Slf4j;
  2. import org.springframework.beans.factory.annotation.Autowired;
  3. import org.springframework.data.redis.connection.DataType;
  4. import org.springframework.data.redis.core.RedisTemplate;
  5. import org.springframework.stereotype.Service;
  6. import java.util.Arrays;
  7. import java.util.concurrent.TimeUnit;
  8. @Slf4j
  9. @Service
  10. public class RedisBase {
  11. @Autowired
  12. private RedisTemplate<String, Object> redisTemplate;
  13. /**
  14. * 指定 key 的过期时间
  15. *
  16. * @param key 键
  17. * @param time 时间(秒)
  18. */
  19. public void expire(String key, long time) {
  20. redisTemplate.expire(key, time, TimeUnit.SECONDS);
  21. }
  22. /**
  23. * 根据 key 获取过期时间(-1 即为永不过期)
  24. *
  25. * @param key 键
  26. * @return 过期时间
  27. */
  28. public Long ttl(String key) {
  29. return redisTemplate.getExpire(key, TimeUnit.SECONDS);
  30. }
  31. /**
  32. * 判断 key 是否存在
  33. *
  34. * @param key 键
  35. * @return 如果存在 key 则返回 true,否则返回 false
  36. */
  37. public Boolean exists(String key) {
  38. return redisTemplate.hasKey(key);
  39. }
  40. /**
  41. * 删除 key
  42. *
  43. * @param key 键
  44. */
  45. public Long del(String... key) {
  46. if (key == null || key.length < 1) {
  47. return 0L;
  48. }
  49. return redisTemplate.delete(Arrays.asList(key));
  50. }
  51. /**
  52. * 获取 Key 的类型
  53. *
  54. * @param key 键
  55. */
  56. public String type(String key) {
  57. DataType dataType = redisTemplate.type(key);
  58. assert dataType != null;
  59. return dataType.code();
  60. }
  61. }

Redis 批量操作

  1. import lombok.extern.slf4j.Slf4j;
  2. import org.springframework.beans.factory.annotation.Autowired;
  3. import org.springframework.data.redis.core.RedisTemplate;
  4. import org.springframework.stereotype.Service;
  5. import java.util.List;
  6. import java.util.Map;
  7. @Slf4j
  8. @Service
  9. public class RedisBatch {
  10. @Autowired
  11. private RedisTemplate<String, Object> redisTemplate;
  12. /**
  13. * 批量设置值
  14. *
  15. * @param map 要插入的 key value 集合
  16. */
  17. public void barchSet(Map<String, Object> map) {
  18. redisTemplate.opsForValue().multiSet(map);
  19. }
  20. /**
  21. * 批量获取值
  22. *
  23. * @param list 查询的 Key 列表
  24. * @return value 列表
  25. */
  26. public List<Object> batchGet(List<String> list) {
  27. return redisTemplate.opsForValue().multiGet(list);
  28. }
  29. }

Redis 字符串操作

  1. import lombok.extern.slf4j.Slf4j;
  2. import org.springframework.beans.factory.annotation.Autowired;
  3. import org.springframework.data.redis.core.RedisTemplate;
  4. import org.springframework.stereotype.Service;
  5. import java.util.Collection;
  6. import java.util.List;
  7. import java.util.Map;
  8. import java.util.concurrent.TimeUnit;
  9. @Slf4j
  10. @Service
  11. public class RedisString {
  12. @Autowired
  13. private RedisTemplate<String, Object> redisTemplate;
  14. /**
  15. * 获取指定 key 的值
  16. *
  17. * @param key 键
  18. * @return 返回 key 的值
  19. */
  20. public Object get(String key) {
  21. return redisTemplate.opsForValue().get(key);
  22. }
  23. /**
  24. * 获取所有一个或多个给定 key 的值
  25. *
  26. * @param list Key 集合
  27. * @return 值集合
  28. */
  29. public List<Object> mGet(Collection<String> list) {
  30. return redisTemplate.opsForValue().multiGet(list);
  31. }
  32. /**
  33. * 设置给定 key 的值(如果 key 已经存在就覆写旧值)
  34. *
  35. * @param key 键
  36. * @param value 值
  37. */
  38. public void set(String key, Object value) {
  39. redisTemplate.opsForValue().set(key, value);
  40. }
  41. /**
  42. * 同时设置一个或多个 key-value 对
  43. *
  44. * @param map 键值集合
  45. */
  46. public void set(Map<String, Object> map) {
  47. redisTemplate.opsForValue().multiSet(map);
  48. }
  49. /**
  50. * 设置给定 key 的值,并设置过期时间
  51. *
  52. * @param key 键
  53. * @param value 值
  54. * @param time 过期时间(秒)
  55. */
  56. public void set(String key, Object value, long time) {
  57. if (time > 0) {
  58. redisTemplate.opsForValue().set(key, value, time, TimeUnit.SECONDS);
  59. } else {
  60. set(key, value);
  61. }
  62. }
  63. /**
  64. * 递增
  65. *
  66. * @param key 键
  67. * @param delta 要增加几(大于0)
  68. * @return 递增后的值
  69. */
  70. public Long incr(String key, long delta) {
  71. if (delta > 0) {
  72. throw new IllegalArgumentException("递减因子必须大于0");
  73. }
  74. return redisTemplate.opsForValue().increment(key, delta);
  75. }
  76. /**
  77. * 递减
  78. *
  79. * @param key 键
  80. * @param delta 要减少几(小于0)
  81. * @return 递减后的值
  82. */
  83. public Long decr(String key, long delta) {
  84. if (delta < 0) {
  85. throw new IllegalArgumentException("递减因子必须小于0");
  86. }
  87. return redisTemplate.opsForValue().increment(key, -delta);
  88. }
  89. }

Redis 哈希操作

  1. import lombok.extern.slf4j.Slf4j;
  2. import org.springframework.beans.factory.annotation.Autowired;
  3. import org.springframework.data.redis.core.RedisTemplate;
  4. import org.springframework.stereotype.Service;
  5. import java.util.Map;
  6. @Slf4j
  7. @Service
  8. public class RedisHash {
  9. @Autowired
  10. private RedisTemplate<String, Object> redisTemplate;
  11. @Autowired
  12. private RedisBase redisBase;
  13. /**
  14. * 获取存储在哈希表中指定字段的值
  15. *
  16. * @param key 键
  17. * @param item 项
  18. * @return
  19. */
  20. public Object hGet(String key, String item) {
  21. return redisTemplate.opsForHash().get(key, item);
  22. }
  23. /**
  24. * 将哈希表 key 中的字段 field 的值设为 value(如果不存在将创建)
  25. *
  26. * @param key 键
  27. * @param item 项
  28. * @param value 值
  29. */
  30. public void hSet(String key, String item, Object value) {
  31. redisTemplate.opsForHash().put(key, item, value);
  32. }
  33. /**
  34. * 将哈希表 key 中的字段 field 的值设为 value,并设置过期时间
  35. * (如果不存在将创建,且如果已存在的hash表有时间,这里将会替换原有的时间)
  36. *
  37. * @param key 键
  38. * @param item 项
  39. * @param value 值
  40. * @param time 时间(秒)
  41. */
  42. public void hSet(String key, String item, Object value, long time) {
  43. redisTemplate.opsForHash().put(key, item, value);
  44. if (time > 0) {
  45. redisBase.expire(key, time);
  46. }
  47. }
  48. /**
  49. * 获取所有给定字段的值
  50. *
  51. * @param key 键
  52. * @return 一个包含多个给定字段关联值的表,表值的排列顺序和指定字段的请求顺序一样
  53. */
  54. public Map<Object, Object> hmGet(String key) {
  55. return redisTemplate.opsForHash().entries(key);
  56. }
  57. /**
  58. * 同时将多个“域-值”对设置到哈希表 key 中
  59. *
  60. * @param key 键
  61. * @param map 对应多个键值
  62. */
  63. public void hmSet(String key, Map<String, Object> map) {
  64. redisTemplate.opsForHash().putAll(key, map);
  65. }
  66. /**
  67. * 同时将多个“域-值”对设置到哈希表 key 中,并设置过期时间
  68. *
  69. * @param key 键
  70. * @param map 对应多个键值
  71. * @param time 时间(秒)
  72. */
  73. public void hmSet(String key, Map<String, Object> map, long time) {
  74. redisTemplate.opsForHash().putAll(key, map);
  75. if (time > 0) {
  76. redisBase.expire(key, time);
  77. }
  78. }
  79. /**
  80. * 删除一个或多个哈希表字段
  81. *
  82. * @param key 键
  83. * @param item 项(可以使多个)
  84. * @return 成功删除字段的数量
  85. */
  86. public Long hDel(String key, Object... item) {
  87. return redisTemplate.opsForHash().delete(key, item);
  88. }
  89. /**
  90. * 查看哈希表 key 中,指定的字段是否存在
  91. *
  92. * @param key 键 不能为null
  93. * @param item 项 不能为null
  94. * @return 如果存在则返回 true,不存在则返回 false
  95. */
  96. public Boolean hExists(String key, String item) {
  97. return redisTemplate.opsForHash().hasKey(key, item);
  98. }
  99. /**
  100. * 哈希证书递增或递减数(正数递增、负数递减),如果不存在,就会创建一个,并把新增后的值返回
  101. *
  102. * @param key 键
  103. * @param item 项
  104. * @param by 增加或减少的数
  105. * @return 执行操作后,哈希表中字段的值
  106. */
  107. public Double hIncrby(String key, String item, double by) {
  108. return redisTemplate.opsForHash().increment(key, item, by);
  109. }
  110. }

Redis 列表操作

  1. import lombok.extern.slf4j.Slf4j;
  2. import org.springframework.beans.factory.annotation.Autowired;
  3. import org.springframework.data.redis.core.RedisTemplate;
  4. import org.springframework.stereotype.Service;
  5. import java.util.List;
  6. @Slf4j
  7. @Service
  8. public class RedisList {
  9. @Autowired
  10. private RedisTemplate<String, Object> redisTemplate;
  11. @Autowired
  12. private RedisBase redisBase;
  13. /**
  14. * 获取列表指定范围内的元素,正数则表示正向查找,负数则倒叙查找
  15. *
  16. * @param key 键
  17. * @param start 开始
  18. * @param end 结束
  19. * @return boolean
  20. * @see <a href="https://redis.io/commands/lrange">Redis Documentation: LRANGE</a>
  21. */
  22. public List<Object> lRange(String key, long start, long end) {
  23. return redisTemplate.opsForList().range(key, start, end);
  24. }
  25. /**
  26. * 获取列表长度
  27. *
  28. * @param key 键
  29. * @return 列表长度
  30. */
  31. public Long lLen(String key) {
  32. return redisTemplate.opsForList().size(key);
  33. }
  34. /**
  35. * 通过索引获取列表中的元素
  36. *
  37. * @param key 键
  38. * @param index 索引(index>=0时,0 表头,1 第二个元素,依次类推;index<0时,-1,表尾,-2倒数第二个元素,依次类推)
  39. * @return 列表中的元素
  40. */
  41. public Object lIndex(String key, long index) {
  42. return redisTemplate.opsForList().index(key, index);
  43. }
  44. /**
  45. * 在列表前端添加一个值
  46. *
  47. * @param key 键
  48. * @param value 值
  49. * @return 返回列表当前长度
  50. */
  51. public Long lPush(String key, Object value) {
  52. return redisTemplate.opsForList().rightPush(key, value);
  53. }
  54. /**
  55. * 在列表前端添加一个值,并设置过期时间
  56. *
  57. * @param key 键
  58. * @param value 值
  59. * @param time 时间(秒)
  60. * @return 返回列表当前长度
  61. */
  62. public Long lPush(String key, Object value, long time) {
  63. Long size = redisTemplate.opsForList().leftPush(key, value);
  64. if (time > 0) {
  65. redisBase.expire(key, time);
  66. }
  67. return size;
  68. }
  69. /**
  70. * 在列表前端添加多个值
  71. *
  72. * @param key 键
  73. * @param value 值
  74. * @return 返回列表当前长度
  75. */
  76. public Long lPush(String key, List<Object> value) {
  77. return redisTemplate.opsForList().leftPushAll(key, value);
  78. }
  79. /**
  80. * 在列表前端添加多个值,并设置过期时间
  81. *
  82. * @param key 键
  83. * @param value 值
  84. * @param time 时间(秒)
  85. * @return 返回列表当前长度
  86. */
  87. public Long lPush(String key, List<Object> value, long time) {
  88. Long size = redisTemplate.opsForList().leftPushAll(key, value);
  89. if (time > 0) {
  90. redisBase.expire(key, time);
  91. }
  92. return size;
  93. }
  94. /**
  95. * 在列末尾端添加一个值
  96. *
  97. * @param key 键
  98. * @param value 值
  99. * @return 返回列表当前长度
  100. */
  101. public Long rPush(String key, Object value) {
  102. return redisTemplate.opsForList().rightPush(key, value);
  103. }
  104. /**
  105. * 在列表末尾添加一个值,并设置过期时间
  106. *
  107. * @param key 键
  108. * @param value 值
  109. * @param time 时间(秒)
  110. * @return 返回列表当前长度
  111. */
  112. public Long rPush(String key, Object value, long time) {
  113. Long size = redisTemplate.opsForList().leftPush(key, value);
  114. if (time > 0) {
  115. redisBase.expire(key, time);
  116. }
  117. return size;
  118. }
  119. /**
  120. * 在列表末尾添加多个值
  121. *
  122. * @param key 键
  123. * @param value 值
  124. * @return 返回列表当前长度
  125. */
  126. public Long rPush(String key, List<Object> value) {
  127. return redisTemplate.opsForList().rightPushAll(key, value);
  128. }
  129. /**
  130. * 在列表末尾添加多个值,并设置过期时间
  131. *
  132. * @param key 键
  133. * @param value 值
  134. * @param time 时间(秒)
  135. * @return 返回列表当前长度
  136. */
  137. public Long rPush(String key, List<Object> value, long time) {
  138. Long size = redisTemplate.opsForList().rightPushAll(key, value);
  139. if (time > 0) {
  140. redisBase.expire(key, time);
  141. }
  142. return size;
  143. }
  144. /**
  145. * 通过索引设置列表元素的值
  146. *
  147. * @param key 键
  148. * @param index 索引
  149. * @param value 值
  150. */
  151. public void lSet(String key, long index, Object value) {
  152. redisTemplate.opsForList().set(key, index, value);
  153. }
  154. /**
  155. * 移除列表元素
  156. *
  157. * @param key 键
  158. * @param count 移除数量("负数"则从列表倒叙查找删除 count 个对应的值; "整数"则从列表正序查找删除 count 个对应的值;)
  159. * @param value 值
  160. * @return 成功移除的个数
  161. */
  162. public Long lRem(String key, long count, Object value) {
  163. return redisTemplate.opsForList().remove(key, count, value);
  164. }
  165. }

Redis 集合操作

  1. import lombok.extern.slf4j.Slf4j;
  2. import org.springframework.beans.factory.annotation.Autowired;
  3. import org.springframework.data.redis.core.RedisTemplate;
  4. import org.springframework.stereotype.Service;
  5. import java.util.Set;
  6. @Slf4j
  7. @Service
  8. public class RedisSet {
  9. @Autowired
  10. private RedisTemplate<String, Object> redisTemplate;
  11. @Autowired
  12. private RedisBase redisBase;
  13. /**
  14. * 返回集合中的所有成员
  15. *
  16. * @param key 键
  17. * @return 集合中的所有成员
  18. */
  19. public Set<Object> sMembers(String key) {
  20. return redisTemplate.opsForSet().members(key);
  21. }
  22. /**
  23. * 判断 member 元素是否是集合 key 的成员
  24. *
  25. * @param key 键
  26. * @param value 值
  27. * @return 如果存在则返回 true 否则返回 false
  28. */
  29. public Boolean sisMember(String key, Object value) {
  30. return redisTemplate.opsForSet().isMember(key, value);
  31. }
  32. /**
  33. * 向集合添加一个或多个成员
  34. *
  35. * @param key 键
  36. * @param values 值
  37. * @return 添加成功元素的个数
  38. */
  39. public Long sAdd(String key, Object... values) {
  40. return redisTemplate.opsForSet().add(key, values);
  41. }
  42. /**
  43. * 向集合添加一个或多个成员,并设置过期时间
  44. *
  45. * @param key 键
  46. * @param time 时间(秒)
  47. * @param values 值(可以是多个)
  48. * @return 添加成功元素的个数
  49. */
  50. public Long sAdd(String key, long time, Object... values) {
  51. Long count = redisTemplate.opsForSet().add(key, values);
  52. if (time > 0) {
  53. redisBase.expire(key, time);
  54. }
  55. return count;
  56. }
  57. /**
  58. * 获取集合的成员数
  59. *
  60. * @param key 键
  61. * @return 返回集合中元素的数量
  62. */
  63. public Long sCard(String key) {
  64. return redisTemplate.opsForSet().size(key);
  65. }
  66. /**
  67. * 移除集合中一个或多个成员
  68. *
  69. * @param key 键
  70. * @param values 值 可以是多个
  71. * @return 移除的个数
  72. */
  73. public Long sRem(String key, Object... values) {
  74. return redisTemplate.opsForSet().remove(key, values);
  75. }
  76. }

Redis 有序集合操作

  1. import lombok.extern.slf4j.Slf4j;
  2. import org.springframework.beans.factory.annotation.Autowired;
  3. import org.springframework.data.redis.core.RedisTemplate;
  4. import org.springframework.data.redis.core.ZSetOperations;
  5. import org.springframework.stereotype.Service;
  6. import java.util.Set;
  7. @Slf4j
  8. @Service
  9. public class RedisSortSet {
  10. @Autowired
  11. private RedisTemplate<String, Object> redisTemplate;
  12. /**
  13. * 向有序集合添加成员
  14. *
  15. * @param key 键
  16. * @param value 值
  17. * @param score 分数
  18. * @return 添加成功元素的个数
  19. */
  20. public Boolean zAdd(String key, Object value, double score) {
  21. return redisTemplate.opsForZSet().add(key, value, score);
  22. }
  23. /**
  24. * 向有序集合添加多个成员
  25. *
  26. * @param key 键
  27. * @param set 值
  28. * @return 添加成功元素的个数
  29. */
  30. public Long zAdd(String key, Set<ZSetOperations.TypedTuple<Object>> set) {
  31. return redisTemplate.opsForZSet().add(key, set);
  32. }
  33. /**
  34. * 移除有序集合中的一个或多个成员
  35. *
  36. * @param key 键
  37. * @param values 值
  38. */
  39. public Long zRem(String key, Object... values) {
  40. return redisTemplate.opsForZSet().remove(key, values);
  41. }
  42. /**
  43. * 有序集合操作分数的加/减
  44. *
  45. * @param key 键
  46. * @param value 值
  47. * @param score 分数
  48. * @return 成员的新分数值
  49. */
  50. public Double zincrby(String key, String value, double score) {
  51. return redisTemplate.opsForZSet().incrementScore(key, value, score);
  52. }
  53. /**
  54. * 返回有序集中,成员的分数值
  55. *
  56. * @param key 键
  57. * @param value 值
  58. * @return 成员的分数值
  59. */
  60. public Double zScore(String key, String value) {
  61. return redisTemplate.opsForZSet().score(key, value);
  62. }
  63. /**
  64. * 返回有序集合中指定成员的索引
  65. *
  66. * @param key 键
  67. * @param value 值
  68. * @return 成员的索引
  69. */
  70. public Long zRank(String key, String value) {
  71. return redisTemplate.opsForZSet().rank(key, value);
  72. }
  73. /**
  74. * 获取有序集合的成员数(集合长度)
  75. *
  76. * @param key 键
  77. * @return 成员总数
  78. */
  79. public Long zCard(String key) {
  80. return redisTemplate.opsForZSet().zCard(key);
  81. }
  82. /**
  83. * 通过索引区间返回有序集合指定区间内的成员(按分数从小到大排序)
  84. *
  85. * @param key 键
  86. * @param start 开始数(0 表示有序集第一个成员,以 1 表示有序集第二个成员,以此类推)
  87. * @param end 结束数(-1 表示最后一个成员,-2 表示倒数第二个成员,以此类推)
  88. * @return 指定区间内,带有分数值(可选)的有序集成员的列表
  89. */
  90. public Set<Object> zrange(String key, int start, int end) {
  91. return redisTemplate.opsForZSet().range(key, start, end);
  92. }
  93. /**
  94. * 通过索引区间返回有序集合指定区间内的成员 & 分数
  95. *
  96. * @param key 键
  97. * @param start 开始数(0 表示有序集第一个成员,以 1 表示有序集第二个成员,以此类推)
  98. * @param end 结束数(-1 表示最后一个成员,-2 表示倒数第二个成员,以此类推)
  99. * @return 指定区间内,带有分数值(可选)的有序集成员的列表
  100. */
  101. public Set<ZSetOperations.TypedTuple<Object>> zRange(String key, int start, int end) {
  102. return redisTemplate.opsForZSet().rangeWithScores(key, start, end);
  103. }
  104. /**
  105. * 返回有序集中指定区间内的成员,通过索引,分数从高到低
  106. *
  107. * @param key 键
  108. * @param start 开始
  109. * @param end 结束
  110. * @return 指定区间内的成员
  111. */
  112. public Set<Object> zRevRange(String key, int start, int end) {
  113. return redisTemplate.opsForZSet().reverseRange(key, start, end);
  114. }
  115. /**
  116. * 通过分数返回有序集合指定区间内的成员
  117. *
  118. * @param key 键
  119. * @param min 最小
  120. * @param max 最大
  121. * @return 指定区间内的成员
  122. */
  123. public Set<Object> zRangeByScore(String key, int min, int max) {
  124. return redisTemplate.opsForZSet().rangeByScore(key, min, max);
  125. }
  126. }

5、Redis 操作 Controller

这里写个简单的 Controller 类,简单的调用 Redis 字符串服务操作,内容如下:

  1. import com.example.service.RedisBatch;
  2. import com.example.service.RedisString;
  3. import org.springframework.beans.factory.annotation.Autowired;
  4. import org.springframework.web.bind.annotation.GetMapping;
  5. import org.springframework.web.bind.annotation.RequestParam;
  6. import org.springframework.web.bind.annotation.RestController;
  7. import java.util.ArrayList;
  8. import java.util.HashMap;
  9. import java.util.List;
  10. import java.util.Map;
  11. @RestController
  12. public class RedisController {
  13. @Autowired
  14. private RedisBatch redisBatch;
  15. @Autowired
  16. private RedisString redisString;
  17. /**
  18. * 存值
  19. *
  20. * @param key 键
  21. * @param value 值
  22. * @return 存储结果
  23. */
  24. @GetMapping("/set")
  25. public String redisStringSet(@RequestParam String key, @RequestParam String value) {
  26. redisString.set(key, value);
  27. return "存储成功";
  28. }
  29. /**
  30. * 取值
  31. *
  32. * @param key 键
  33. * @return
  34. */
  35. @GetMapping("/get")
  36. public Object redisStringGet(@RequestParam String key) {
  37. return redisString.get(key);
  38. }
  39. /**
  40. * 批量存值
  41. */
  42. @GetMapping("/batch/set")
  43. public void redisBatchSet() {
  44. Map<String, Object> map = new HashMap<>(3);
  45. map.put("test1", "value1");
  46. map.put("test2", "value2");
  47. map.put("test3", "value3");
  48. redisBatch.barchSet(map);
  49. }
  50. /**
  51. * 批量取值
  52. *
  53. * @return 值列表
  54. */
  55. @GetMapping("/batch/get")
  56. public List<Object> redisBatchGet() {
  57. // 批量取值,如果某个 key 不存在,则值为 null
  58. List<String> list = new ArrayList<>(3);
  59. list.add("test1");
  60. list.add("test2");
  61. list.add("test3");
  62. return redisBatch.batchGet(list);
  63. }
  64. }

6、SpringBoot 启动类

SpringBoot 的启动类,内容如下:

  1. import org.springframework.boot.SpringApplication;
  2. import org.springframework.boot.autoconfigure.SpringBootApplication;
  3. @SpringBootApplication
  4. public class Application {
  5. public static void main(String[] args) {
  6. SpringApplication.run(Application.class, args);
  7. }
  8. }
声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/秋刀鱼在做梦/article/detail/776179
推荐阅读
相关标签
  

闽ICP备14008679号