一、Redis安装

Windows下redis安装

输入如下指令:

  1. redis-server.exe redis.windows.conf

出现如下图就表明redis启动成功啦

二、集成redis

现在正式步骤搞起来。

👉 项目结构图

image.png

👉 引入依赖

  1. <!--junit-->
  2. <dependency>
  3. <groupId>junit</groupId>
  4. <artifactId>junit</artifactId>
  5. <version>4.12</version>
  6. <scope>test</scope>
  7. </dependency>
  8. <!--redis-->
  9. <!-- 整合redis -->
  10. <dependency>
  11. <groupId>org.springframework.boot</groupId>
  12. <artifactId>spring-boot-starter-data-redis</artifactId>
  13. <exclusions>
  14. <exclusion>
  15. <groupId>io.lettuce</groupId>
  16. <artifactId>lettuce-core</artifactId>
  17. </exclusion>
  18. </exclusions>
  19. </dependency>
  20. <dependency>
  21. <groupId>redis.clients</groupId>
  22. <artifactId>jedis</artifactId>
  23. </dependency>
  24. <dependency>
  25. <groupId>com.alibaba</groupId>
  26. <artifactId>fastjson</artifactId>
  27. <version>1.2.68</version>
  28. </dependency>

👉 编写配置文件

这里我把配置文件放在了resource/config目录下面,主要是觉得方便当然配置在appliation.yml文件也是可以哒

具体放置位置如下图所示:
image.png

  1. #Master的name
  2. redis.name=king
  3. #Matser的ip地址
  4. redis.host=127.0.0.1
  5. #端口号
  6. redis.port=6380
  7. #如果有密码
  8. redis.password=123456
  9. #客户端超时时间单位是毫秒 默认是2000
  10. redis.timeout=10000
  11. #最大空闲数
  12. redis.maxIdle=10
  13. #连接池的最大数据库连接数。设为0表示无限制,如果是jedis 2.4以后用redis.maxTotal
  14. #redis.maxActive=600
  15. #控制一个pool可分配多少个jedis实例,用来替换上面的redis.maxActive,如果是jedis 2.4以后用该属性
  16. redis.maxTotal=300
  17. #最大建立连接等待时间。如果超过此时间将接到异常。设为-1表示无限制。
  18. redis.maxWaitMillis=3000
  19. #连接的最小空闲时间 默认1800000毫秒(30分钟)
  20. redis.minEvictableIdleTimeMillis=300000
  21. #每次释放连接的最大数目,默认3
  22. redis.numTestsPerEvictionRun=1024
  23. #逐出扫描的时间间隔(毫秒) 如果为负数,则不运行逐出线程, 默认-1
  24. redis.timeBetweenEvictionRunsMillis=30000
  25. #是否在从池中取出连接前进行检验,如果检验失败,则从池中去除连接并尝试取出另一个
  26. redis.testOnBorrow=true
  27. #在空闲时检查有效性, 默认false
  28. redis.testWhileIdle=true
  29. #redis集群配置
  30. spring.redis.cluster.nodes=127.0.0.1:6380,127.0.0.1:6381,127.0.0.1:6379
  31. #重定向的最大次数 (意义:重定向的最大数量,比如第一台挂了,连第二台,第二台挂了连第三台,这个重新连接的最大数量)
  32. spring.redis.cluster.max-redirects=3
  33. #哨兵模式
  34. redis.sentinel.nodes=10.122.34.111:26379,10.122.36.111:26379

👉配置类RedisConfig

  1. package com.gome.redis.config;
  2. import com.alibaba.fastjson.support.spring.GenericFastJsonRedisSerializer;
  3. import com.gome.redis.util.RedisUtil;
  4. import org.springframework.beans.factory.annotation.Autowired;
  5. import org.springframework.beans.factory.annotation.Qualifier;
  6. import org.springframework.beans.factory.annotation.Value;
  7. import org.springframework.boot.context.properties.ConfigurationProperties;
  8. import org.springframework.context.annotation.Bean;
  9. import org.springframework.context.annotation.Configuration;
  10. import org.springframework.context.annotation.PropertySource;
  11. import org.springframework.data.redis.connection.*;
  12. import org.springframework.data.redis.connection.jedis.JedisConnectionFactory;
  13. import org.springframework.data.redis.core.RedisTemplate;
  14. import org.springframework.data.redis.serializer.GenericJackson2JsonRedisSerializer;
  15. import org.springframework.data.redis.serializer.GenericToStringSerializer;
  16. import org.springframework.data.redis.serializer.StringRedisSerializer;
  17. import redis.clients.jedis.JedisPoolConfig;
  18. import javax.annotation.PostConstruct;
  19. import java.util.HashSet;
  20. import java.util.Set;
  21. @Configuration
  22. @PropertySource("classpath:config/redis.properties")
  23. //@ConfigurationProperties(prefix =redis )
  24. public class RedisConfig {
  25. @Value("${redis.name}")
  26. private String hostName;
  27. @Value("${redis.host}")
  28. private String host;
  29. @Value("${redis.port}")
  30. private int port;
  31. @Value("${redis.password}")
  32. private String password;
  33. @Value("${redis.timeout}")
  34. private int timeout;
  35. @Value("${redis.maxIdle}")
  36. private Integer maxIdle;
  37. @Value("${redis.maxTotal}")
  38. private Integer maxTotal;
  39. @Value("${redis.maxWaitMillis}")
  40. private Integer maxWaitMillis;
  41. @Value("${redis.minEvictableIdleTimeMillis}")
  42. private Integer minEvictableIdleTimeMillis;
  43. @Value("${redis.numTestsPerEvictionRun}")
  44. private Integer numTestsPerEvictionRun;
  45. @Value("${redis.timeBetweenEvictionRunsMillis}")
  46. private long timeBetweenEvictionRunsMillis;
  47. @Value("${redis.testOnBorrow}")
  48. private boolean testOnBorrow;
  49. @Value("${redis.testWhileIdle}")
  50. private boolean testWhileIdle;
  51. @Value("${spring.redis.cluster.nodes}")
  52. private String clusterNodes;
  53. @Value("${spring.redis.cluster.max-redirects}")
  54. private Integer mmaxRedirectsac;
  55. @Value("${redis.sentinel.nodes}")
  56. private String sentinelHosts;
  57. @PostConstruct
  58. public void init(){
  59. System.out.println(host);
  60. System.out.println(port);
  61. }
  62. /**
  63. * JedisPoolConfig 连接池
  64. *
  65. * @return
  66. */
  67. @Bean(name="jedis.pool.config")
  68. public JedisPoolConfig jedisPoolConfig() {
  69. JedisPoolConfig jedisPoolConfig = new JedisPoolConfig();
  70. // 最大空闲数
  71. jedisPoolConfig.setMaxIdle(maxIdle);
  72. // 连接池的最大数据库连接数
  73. jedisPoolConfig.setMaxTotal(maxTotal);
  74. // 最大建立连接等待时间
  75. jedisPoolConfig.setMaxWaitMillis(maxWaitMillis);
  76. // 逐出连接的最小空闲时间 默认1800000毫秒(30分钟)
  77. jedisPoolConfig.setMinEvictableIdleTimeMillis(minEvictableIdleTimeMillis);
  78. // 每次逐出检查时 逐出的最大数目 如果为负数就是 : 1/abs(n), 默认3
  79. jedisPoolConfig.setNumTestsPerEvictionRun(numTestsPerEvictionRun);
  80. // 逐出扫描的时间间隔(毫秒) 如果为负数,则不运行逐出线程, 默认-1
  81. jedisPoolConfig.setTimeBetweenEvictionRunsMillis(timeBetweenEvictionRunsMillis);
  82. // 是否在从池中取出连接前进行检验,如果检验失败,则从池中去除连接并尝试取出另一个
  83. jedisPoolConfig.setTestOnBorrow(testOnBorrow);
  84. // 在空闲时检查有效性, 默认false
  85. jedisPoolConfig.setTestWhileIdle(testWhileIdle);
  86. return jedisPoolConfig;
  87. }
  88. /**
  89. * redis单机配置
  90. * @return
  91. */
  92. @Bean("redis.standalone.config")
  93. public RedisStandaloneConfiguration redisStandaloneConfiguration(){
  94. RedisStandaloneConfiguration config = new RedisStandaloneConfiguration();
  95. config.setDatabase(0);
  96. config.setHostName(host);
  97. config.setPort(port);
  98. config.setPassword(password);
  99. return config;
  100. }
  101. /**
  102. * 集群redis配置
  103. * @return
  104. */
  105. /*@Bean("redis.cluster.config")
  106. public RedisClusterConfiguration redisClusterConfiguration(){
  107. RedisClusterConfiguration redisClusterConfiguration = new RedisClusterConfiguration();
  108. String[] serverHost=clusterNodes.split(",");
  109. if (serverHost.length<1){
  110. throw new RuntimeException("请您设置redis服务器配置信息");
  111. }
  112. Set<RedisNode> ipNode = new HashSet<>();
  113. for (String ipAndPorts : serverHost) {
  114. String[] ipAndPost=ipAndPorts.split(":");
  115. ipNode.add(new RedisNode(ipAndPost[0].trim(), Integer.valueOf(ipAndPost[1])));
  116. }
  117. redisClusterConfiguration.setClusterNodes(ipNode);
  118. redisClusterConfiguration.setPassword(password);
  119. redisClusterConfiguration.setMaxRedirects(mmaxRedirectsac);
  120. return redisClusterConfiguration;
  121. }
  122. */
  123. /*@Bean("redis.sentine.congif")
  124. public RedisSentinelConfiguration sentinelConfiguration(){
  125. RedisSentinelConfiguration redisSentinelConfiguration = new RedisSentinelConfiguration();
  126. //配置matser的名称
  127. RedisNode redisNode = new RedisNode(host, port);
  128. redisNode.setName(hostName);
  129. redisSentinelConfiguration.master(redisNode);
  130. //配置redis的哨兵sentinel
  131. String[] senHost=sentinelHosts.split(",");
  132. if (senHost.length <1) {
  133. throw new RuntimeException("请您设置redis服务器配置信息");
  134. }
  135. Set<RedisNode> redisNodeSet = new HashSet<>();
  136. for (String s : senHost) {
  137. String[] ipAndPost=s.split(":");
  138. redisNodeSet.add(new RedisNode(ipAndPost[0].trim(), Integer.valueOf(ipAndPost[1])));
  139. }
  140. redisSentinelConfiguration.setSentinels(redisNodeSet);
  141. return redisSentinelConfiguration;
  142. }*/
  143. /**
  144. * 单机版 factory
  145. * @return
  146. */
  147. @Bean(name = "jedis.standalone.factory")
  148. public JedisConnectionFactory JedisStandaloneConnectionFactory(RedisStandaloneConfiguration config) {
  149. return new JedisConnectionFactory(config);
  150. }
  151. /**
  152. * 集群版 factory
  153. * @param config
  154. * @param jedisPoolConfig
  155. * @return
  156. */
  157. /*@Bean(name = "jedis.cluster.factory")
  158. public JedisConnectionFactory JedisClusterConnectionFactory(RedisClusterConfiguration config,JedisPoolConfig jedisPoolConfig) {
  159. return new JedisConnectionFactory(config,jedisPoolConfig);
  160. }*/
  161. /**
  162. * 哨兵
  163. * @param config
  164. * @param jedisPoolConfig
  165. * @return
  166. */
  167. /*@Bean(name = "jedis.sentine.factory")
  168. public JedisConnectionFactory JedisSentineConnectionFactory(RedisSentinelConfiguration config,JedisPoolConfig jedisPoolConfig) {
  169. return new JedisConnectionFactory(config,jedisPoolConfig);
  170. }*/
  171. /**
  172. * 实例化 RedisTemplate 对象
  173. * 使用单机版 @Qualifier("jedis.standalone.factory");使用集群版 @Qualifier("jedis.cluster.factory")
  174. * @return
  175. */
  176. @Bean(name = "redis.template")
  177. @Autowired
  178. public RedisTemplate<String, Object> functionDomainRedisTemplate(@Qualifier("jedis.standalone.factory") JedisConnectionFactory jedisConnectionFactory) {
  179. RedisTemplate<String, Object> redisTemplate = new RedisTemplate<>();
  180. initDomainRedisTemplate(redisTemplate, jedisConnectionFactory);
  181. return redisTemplate;
  182. }
  183. /**
  184. * 设置数据存入 redis 的序列化方式,并开启事务
  185. *
  186. * @param redisTemplate
  187. * @param factory
  188. */
  189. private void initDomainRedisTemplate(RedisTemplate<String, Object> redisTemplate, JedisConnectionFactory factory) {
  190. // 使用 GenericFastJsonRedisSerializer 替换默认序列化
  191. GenericFastJsonRedisSerializer genericFastJsonRedisSerializer = new GenericFastJsonRedisSerializer();
  192. // 设置key和value的序列化规则
  193. redisTemplate.setKeySerializer(new GenericToStringSerializer<>(Object.class));
  194. redisTemplate.setValueSerializer(genericFastJsonRedisSerializer);
  195. // 设置hashKey和hashValue的序列化规则
  196. redisTemplate.setHashKeySerializer(new GenericToStringSerializer<>(Object.class));
  197. redisTemplate.setHashValueSerializer(genericFastJsonRedisSerializer);
  198. // 开启事务
  199. redisTemplate.setEnableTransactionSupport(true);
  200. redisTemplate.setConnectionFactory(factory);
  201. //调用后初始化方法,没有它将抛出异常
  202. redisTemplate.afterPropertiesSet();
  203. }
  204. /**
  205. * 注入封装RedisTemplate
  206. *
  207. * @return RedisUtil
  208. * @throws
  209. * @Title: redisUtil
  210. * @autor lpl
  211. * @date 2017年12月21日
  212. */
  213. @Bean(name = "redisUtil")
  214. public RedisUtil redisUtil(RedisTemplate<String, Object> redisTemplate) {
  215. RedisUtil redisUtil = new RedisUtil();
  216. redisUtil.setRedisTemplate(redisTemplate);
  217. return redisUtil;
  218. }
  219. }

注意:这里将单机版、集群以及哨兵的配置写在了一起。如果使用单机版则注释掉集群和哨兵的config以及factory。具体操作如上述代码。@Qualifier(“jedis.standalone.factory”)这里更改对应的factory bean对象名称即可。

👉RedisUtil

RedisUtil封装了一些常用的对redis的操作,具体代码如下所示:

  1. package com.gome.redis.util;
  2. import java.util.Collection;
  3. import java.util.List;
  4. import java.util.Map;
  5. import java.util.Set;
  6. import java.util.concurrent.TimeUnit;
  7. import org.springframework.data.redis.core.RedisTemplate;
  8. import org.springframework.util.CollectionUtils;
  9. public class RedisUtil {
  10. private RedisTemplate<String, Object> redisTemplate;
  11. public void setRedisTemplate(RedisTemplate<String, Object> redisTemplate) {
  12. this.redisTemplate = redisTemplate;
  13. }
  14. /*============================过期时间相关=================================*/
  15. /**
  16. * 指定缓存失效时间
  17. * @param key 键
  18. * @param time 时间(秒)
  19. * @return
  20. */
  21. public boolean expire(String key,long time){
  22. try {
  23. if(time>0){
  24. redisTemplate.expire(key, time, TimeUnit.SECONDS);
  25. }
  26. return true;
  27. } catch (Exception e) {
  28. e.printStackTrace();
  29. return false;
  30. }
  31. }
  32. /**
  33. * 根据key 获取过期时间
  34. * @param key 键 不能为null
  35. * @return 时间(秒) 返回0代表为永久有效
  36. */
  37. public long getExpire(String key){
  38. return redisTemplate.getExpire(key,TimeUnit.SECONDS);
  39. }
  40. /**
  41. * 判断key是否存在
  42. * @param key 键
  43. * @return true 存在 false不存在
  44. */
  45. public boolean exsit(String key){
  46. try {
  47. return redisTemplate.hasKey(key);
  48. } catch (Exception e) {
  49. e.printStackTrace();
  50. return false;
  51. }
  52. }
  53. /**
  54. * 删除缓存
  55. * @param key 可以传一个值 或多个
  56. */
  57. @SuppressWarnings("unchecked")
  58. public void del(String ... key){
  59. if(key!=null&&key.length>0){
  60. if(key.length==1){
  61. redisTemplate.delete(key[0]);
  62. }else{
  63. redisTemplate.delete((Collection<String>) CollectionUtils.arrayToList(key));
  64. }
  65. }
  66. }
  67. //============================String=============================
  68. /**
  69. * 普通缓存获取
  70. * @param key 键
  71. * @return 值
  72. */
  73. public Object get(String key){
  74. return key==null?null:redisTemplate.opsForValue().get(key);
  75. }
  76. /**
  77. * 普通缓存放入
  78. * @param key 键
  79. * @param value 值
  80. * @return true成功 false失败
  81. */
  82. public boolean set(String key,Object value) {
  83. try {
  84. redisTemplate.opsForValue().set(key, value);
  85. return true;
  86. } catch (Exception e) {
  87. e.printStackTrace();
  88. return false;
  89. }
  90. }
  91. /**
  92. * 普通缓存放入并设置时间
  93. * @param key 键
  94. * @param value 值
  95. * @param time 时间(秒) time要大于0 如果time小于等于0 将设置无限期
  96. * @return true成功 false 失败
  97. */
  98. public boolean set(String key,Object value,long time){
  99. try {
  100. if(time>0){
  101. redisTemplate.opsForValue().set(key, value, time, TimeUnit.SECONDS);
  102. }else{
  103. set(key, value);
  104. }
  105. return true;
  106. } catch (Exception e) {
  107. e.printStackTrace();
  108. return false;
  109. }
  110. }
  111. /**
  112. * key 自增
  113. * @param key
  114. * @return
  115. */
  116. public long incr(String key){
  117. return redisTemplate.opsForValue().increment(key, 1L);
  118. }
  119. /**
  120. * 递增
  121. * @param key 键
  122. * @param val 要增加几(大于0)
  123. * @return
  124. */
  125. public long incr(String key, long val){
  126. if(val<0){
  127. throw new RuntimeException("递增因子必须大于0");
  128. }
  129. return redisTemplate.opsForValue().increment(key, val);
  130. }
  131. /**
  132. * 递减
  133. * @param key 键
  134. * @param val 要减少几(小于0)
  135. * @return
  136. */
  137. public long decr(String key, long val){
  138. if(val<0){
  139. throw new RuntimeException("递减因子必须大于0");
  140. }
  141. return redisTemplate.opsForValue().increment(key, -val);
  142. }
  143. //================================hash=================================
  144. /**
  145. * HashGet
  146. * @param key 键 不能为null
  147. * @param item 项 不能为null
  148. * @return 值
  149. */
  150. public Object hget(String key,String item){
  151. return redisTemplate.opsForHash().get(key, item);
  152. }
  153. /**
  154. * 获取hashKey对应的所有键值
  155. * @param key 键
  156. * @return 对应的多个键值
  157. */
  158. public Map<Object,Object> hmget(String key){
  159. return redisTemplate.opsForHash().entries(key);
  160. }
  161. /**
  162. * HashSet
  163. * @param key 键
  164. * @param map 对应多个键值
  165. * @return true 成功 false 失败
  166. */
  167. public boolean hmset(String key, Map<String,Object> map){
  168. try {
  169. redisTemplate.opsForHash().putAll(key, map);
  170. return true;
  171. } catch (Exception e) {
  172. e.printStackTrace();
  173. return false;
  174. }
  175. }
  176. /**
  177. * HashSet 并设置时间
  178. * @param key 键
  179. * @param map 对应多个键值
  180. * @param time 时间(秒)
  181. * @return true成功 false失败
  182. */
  183. public boolean hmset(String key, Map<String,Object> map, long time){
  184. try {
  185. redisTemplate.opsForHash().putAll(key, map);
  186. if(time>0){
  187. expire(key, time);
  188. }
  189. return true;
  190. } catch (Exception e) {
  191. e.printStackTrace();
  192. return false;
  193. }
  194. }
  195. /**
  196. * 向一张hash表中放入数据,如果不存在将创建
  197. * @param key 键
  198. * @param item 项
  199. * @param value 值
  200. * @return true 成功 false失败
  201. */
  202. public boolean hset(String key,String item,Object value) {
  203. try {
  204. redisTemplate.opsForHash().put(key, item, value);
  205. return true;
  206. } catch (Exception e) {
  207. e.printStackTrace();
  208. return false;
  209. }
  210. }
  211. /**
  212. * 向一张hash表中放入数据,如果不存在将创建
  213. * @param key 键
  214. * @param item 项
  215. * @param value 值
  216. * @param time 时间(秒) 注意:如果已存在的hash表有时间,这里将会替换原有的时间
  217. * @return true 成功 false失败
  218. */
  219. public boolean hset(String key,String item,Object value,long time) {
  220. try {
  221. redisTemplate.opsForHash().put(key, item, value);
  222. if(time>0){
  223. expire(key, time);
  224. }
  225. return true;
  226. } catch (Exception e) {
  227. e.printStackTrace();
  228. return false;
  229. }
  230. }
  231. /**
  232. * 删除hash表中的值
  233. * @param key 键 不能为null
  234. * @param item 项 可以使多个 不能为null
  235. */
  236. public void hdel(String key, Object... item){
  237. redisTemplate.opsForHash().delete(key,item);
  238. }
  239. /**
  240. * 判断hash表中是否有该项的值
  241. * @param key 键 不能为null
  242. * @param item 项 不能为null
  243. * @return true 存在 false不存在
  244. */
  245. public boolean hHasKey(String key, String item){
  246. return redisTemplate.opsForHash().hasKey(key, item);
  247. }
  248. /**
  249. * hash递增 如果不存在,就会创建一个 并把新增后的值返回
  250. * @param key 键
  251. * @param item 项
  252. * @param by 要增加几(大于0)
  253. * @return
  254. */
  255. public double hincr(String key, String item,double by){
  256. return redisTemplate.opsForHash().increment(key, item, by);
  257. }
  258. /**
  259. * hash递减
  260. * @param key 键
  261. * @param item 项
  262. * @param by 要减少记(小于0)
  263. * @return
  264. */
  265. public double hdecr(String key, String item,double by){
  266. return redisTemplate.opsForHash().increment(key, item,-by);
  267. }
  268. //============================set=============================
  269. /**
  270. * 根据key获取Set中的所有值
  271. * @param key 键
  272. * @return
  273. */
  274. public Set<Object> sGet(String key){
  275. try {
  276. return redisTemplate.opsForSet().members(key);
  277. } catch (Exception e) {
  278. e.printStackTrace();
  279. return null;
  280. }
  281. }
  282. /**
  283. * 根据value从一个set中查询,是否存在
  284. * @param key 键
  285. * @param value 值
  286. * @return true 存在 false不存在
  287. */
  288. public boolean sHasKey(String key,Object value){
  289. try {
  290. return redisTemplate.opsForSet().isMember(key, value);
  291. } catch (Exception e) {
  292. e.printStackTrace();
  293. return false;
  294. }
  295. }
  296. /**
  297. * 将数据放入set缓存
  298. * @param key 键
  299. * @param values 值 可以是多个
  300. * @return 成功个数
  301. */
  302. public long sSet(String key, Object...values) {
  303. try {
  304. return redisTemplate.opsForSet().add(key, values);
  305. } catch (Exception e) {
  306. e.printStackTrace();
  307. return 0;
  308. }
  309. }
  310. /**
  311. * 将set数据放入缓存
  312. * @param key 键
  313. * @param time 时间(秒)
  314. * @param values 值 可以是多个
  315. * @return 成功个数
  316. */
  317. public long sSetAndTime(String key,long time,Object...values) {
  318. try {
  319. Long count = redisTemplate.opsForSet().add(key, values);
  320. if(time>0) expire(key, time);
  321. return count;
  322. } catch (Exception e) {
  323. e.printStackTrace();
  324. return 0;
  325. }
  326. }
  327. /**
  328. * 获取set缓存的长度
  329. * @param key 键
  330. * @return
  331. */
  332. public long sGetSetSize(String key){
  333. try {
  334. return redisTemplate.opsForSet().size(key);
  335. } catch (Exception e) {
  336. e.printStackTrace();
  337. return 0;
  338. }
  339. }
  340. /**
  341. * 移除值为value的
  342. * @param key 键
  343. * @param values 值 可以是多个
  344. * @return 移除的个数
  345. */
  346. public long setRemove(String key, Object ...values) {
  347. try {
  348. Long count = redisTemplate.opsForSet().remove(key, values);
  349. return count;
  350. } catch (Exception e) {
  351. e.printStackTrace();
  352. return 0;
  353. }
  354. }
  355. //===============================list=================================
  356. /**
  357. * 获取list缓存的内容
  358. * @param key 键
  359. * @param start 开始
  360. * @param end 结束 0 到 -1代表所有值
  361. * @return
  362. */
  363. public List<Object> lGet(String key,long start, long end){
  364. try {
  365. return redisTemplate.opsForList().range(key, start, end);
  366. } catch (Exception e) {
  367. e.printStackTrace();
  368. return null;
  369. }
  370. }
  371. /**
  372. * 获取list缓存的长度
  373. * @param key 键
  374. * @return
  375. */
  376. public long lGetListSize(String key){
  377. try {
  378. return redisTemplate.opsForList().size(key);
  379. } catch (Exception e) {
  380. e.printStackTrace();
  381. return 0;
  382. }
  383. }
  384. /**
  385. * 通过索引 获取list中的值
  386. * @param key 键
  387. * @param index 索引 index>=0时, 0 表头,1 第二个元素,依次类推;index<0时,-1,表尾,-2倒数第二个元素,依次类推
  388. * @return
  389. */
  390. public Object lGetIndex(String key,long index){
  391. try {
  392. return redisTemplate.opsForList().index(key, index);
  393. } catch (Exception e) {
  394. e.printStackTrace();
  395. return null;
  396. }
  397. }
  398. /**
  399. * 将list放入缓存
  400. * @param key 键
  401. * @param value 值
  402. * @return
  403. */
  404. public boolean lSet(String key, Object value) {
  405. try {
  406. redisTemplate.opsForList().rightPush(key, value);
  407. return true;
  408. } catch (Exception e) {
  409. e.printStackTrace();
  410. return false;
  411. }
  412. }
  413. /**
  414. * 将list放入缓存
  415. * @param key 键
  416. * @param value 值
  417. * @param time 时间(秒)
  418. * @return
  419. */
  420. public boolean lSet(String key, Object value, long time) {
  421. try {
  422. redisTemplate.opsForList().rightPush(key, value);
  423. if (time > 0) expire(key, time);
  424. return true;
  425. } catch (Exception e) {
  426. e.printStackTrace();
  427. return false;
  428. }
  429. }
  430. /**
  431. * 将list放入缓存
  432. * @param key 键
  433. * @param value 值
  434. * @return
  435. */
  436. public boolean lSet(String key, List<Object> value) {
  437. try {
  438. redisTemplate.opsForList().rightPushAll(key, value);
  439. return true;
  440. } catch (Exception e) {
  441. e.printStackTrace();
  442. return false;
  443. }
  444. }
  445. /**
  446. * 将list放入缓存
  447. * @param key 键
  448. * @param value 值
  449. * @param time 时间(秒)
  450. * @return
  451. */
  452. public boolean lSet(String key, List<Object> value, long time) {
  453. try {
  454. redisTemplate.opsForList().rightPushAll(key, value);
  455. if (time > 0) expire(key, time);
  456. return true;
  457. } catch (Exception e) {
  458. e.printStackTrace();
  459. return false;
  460. }
  461. }
  462. /**
  463. * 根据索引修改list中的某条数据
  464. * @param key 键
  465. * @param index 索引
  466. * @param value 值
  467. * @return
  468. */
  469. public boolean lUpdateIndex(String key, long index,Object value) {
  470. try {
  471. redisTemplate.opsForList().set(key, index, value);
  472. return true;
  473. } catch (Exception e) {
  474. e.printStackTrace();
  475. return false;
  476. }
  477. }
  478. /**
  479. * 移除N个值为value
  480. * @param key 键
  481. * @param count 移除多少个
  482. * @param value 值
  483. * @return 移除的个数
  484. */
  485. public long lRemove(String key,long count,Object value) {
  486. try {
  487. Long remove = redisTemplate.opsForList().remove(key, count, value);
  488. return remove;
  489. } catch (Exception e) {
  490. e.printStackTrace();
  491. return 0;
  492. }
  493. }
  494. }

👀 使用

  1. public class RedisApplicationTests extends BaseJunit {
  2. @Autowired
  3. @Qualifier("redisUtil")
  4. private RedisUtil redisUtil;
  5. @Test
  6. public void contextLoads() {
  7. boolean c = redisUtil.set("c", "1212", 10);
  8. System.out.println(redisUtil.expire("c", 50));
  9. System.out.println(redisUtil.getExpire("c"));
  10. }
  11. @Test
  12. public void isOk(){
  13. /**
  14. * 业务需求中经常有需要用到计数器的场景:譬如一个手机号一天限制发送5条短信、一个接口一分钟限制多少请求、一个接口一天限制调用多少次等等。使用Redis的Incr自增命令可以轻松实现以上需求。
  15. */
  16. String userId = "c";
  17. }
  18. /**
  19. * 是否拒绝服务
  20. * @return
  21. */
  22. private boolean denialOfService(String userId){
  23. long count = redisUtil.incr(userId);
  24. if(count<=10){
  25. return false;
  26. }
  27. return true;
  28. }

注意:BaseJunit是自己封装的一个类。具体代码如下:

  1. @RunWith(SpringRunner.class)
  2. @SpringBootTest(classes = RedisApplication.class)
  3. public class BaseJunit {
  4. }

**