秒杀——集成redis

迷南。 2022-05-09 12:28 297阅读 0赞

首先第一步肯定是导入依赖啊

70

jedis就是集成了redis的一些命令操作,封装了redis的java客户端。提供了连接池管理。一般不直接使用jedis,而是在其上在封装一层,作为业务的使用,我们也是自己在其上封装了,下面你就会看到。

fastjson是序列化的一个包,它可以把我们的java对象转换成我们的一个json对象放入redis中

然后在配置文件中添加基本配置

70 1

然后开始写代码咯

首先我们要写一个配置类,Redisconfig来读取配置文件中的配置

  1. package com.yy.miaosha.redis;
  2. import org.springframework.boot.context.properties.ConfigurationProperties;
  3. import org.springframework.stereotype.Component;
  4. @Component
  5. @ConfigurationProperties(prefix="redis") //读取前缀为redis的配置信息,将这些信息注入到下面属性参数中
  6. public class RedisConfig {
  7. private String host;
  8. private int port;
  9. private int timeout;//秒
  10. private String password;
  11. private int poolMaxTotal;
  12. private int poolMaxIdle;
  13. private int poolMaxWait;//秒
  14. //getter和setter方法在这里省略
  15. }

然后我们再创建一个JedisPool的工厂类,利用上面的RedisConfig获得的配置信息,传入到JedisPoolConfig创建的实例中,然后通过这个实例和RedisConfig获得的配置信息来创建JedisPool

  1. package com.yy.miaosha.redis;
  2. import org.springframework.beans.factory.annotation.Autowired;
  3. import org.springframework.context.annotation.Bean;
  4. import org.springframework.stereotype.Service;
  5. import redis.clients.jedis.JedisPool;
  6. import redis.clients.jedis.JedisPoolConfig;
  7. @Service
  8. public class RedisPoolFactory {
  9. @Autowired
  10. RedisConfig redisConfig;
  11. //在方法上打上注解 @Bean即表示声明该方法返回的实例是受 Spring 管理的 Bean。
  12. @Bean
  13. public JedisPool JedisPoolFactory() {
  14. JedisPoolConfig poolConfig = new JedisPoolConfig();
  15. poolConfig.setMaxIdle(redisConfig.getPoolMaxIdle());
  16. poolConfig.setMaxTotal(redisConfig.getPoolMaxTotal());
  17. poolConfig.setMaxWaitMillis(redisConfig.getPoolMaxWait() * 1000);
  18. JedisPool jp = new JedisPool(poolConfig, redisConfig.getHost(), redisConfig.getPort(),
  19. redisConfig.getTimeout()*1000, redisConfig.getPassword(), 0);
  20. return jp;
  21. }
  22. }

注意:JedisPoolFactory上必须加@Bean注解,否则在启动时,下面代码中注入的JedisPool会找不到,会爆出下图错误

70 2

最后我们来写RedisService类,我们在此类中定义对redis中的各种操作

  1. package com.yy.miaosha.redis;
  2. import com.alibaba.fastjson.JSON;
  3. import org.springframework.beans.factory.annotation.Autowired;
  4. import org.springframework.stereotype.Service;
  5. import redis.clients.jedis.Jedis;
  6. import redis.clients.jedis.JedisPool;
  7. @Service
  8. public class RedisService {
  9. @Autowired
  10. JedisPool jedisPool;
  11. /**
  12. * 获取当个对象
  13. * */
  14. public <T> T get(KeyPrefix prefix, String key, Class<T> clazz) {
  15. Jedis jedis = null;
  16. try {
  17. jedis = jedisPool.getResource();
  18. //生成真正的key
  19. String realKey = prefix.getPrefix() + key;
  20. String str = jedis.get(realKey); //get出来的是String类型
  21. T t = stringToBean(str, clazz); //将字符串转换为一个bean对象
  22. return t;
  23. }finally {
  24. //最后要释放连接池
  25. returnToPool(jedis);
  26. }
  27. }
  28. /**
  29. * 设置对象
  30. * */
  31. public <T> boolean set(KeyPrefix prefix, String key, T value) {
  32. Jedis jedis = null;
  33. try {
  34. jedis = jedisPool.getResource();
  35. //存入到redis中的value必须是string类型
  36. String str = beanToString(value);
  37. if(str == null || str.length() <= 0) {
  38. return false;
  39. }
  40. //生成真正的key
  41. String realKey = prefix.getPrefix() + key;
  42. int seconds = prefix.expireSeconds();
  43. if(seconds <= 0) {
  44. //永不过期
  45. jedis.set(realKey, str);
  46. }else {
  47. //过期时间为seconds
  48. jedis.setex(realKey, seconds, str);
  49. }
  50. return true;
  51. }finally {
  52. returnToPool(jedis);
  53. }
  54. }
  55. /**
  56. * 判断key是否存在
  57. * */
  58. public <T> boolean exists(KeyPrefix prefix, String key) {
  59. Jedis jedis = null;
  60. try {
  61. jedis = jedisPool.getResource();
  62. //生成真正的key
  63. String realKey = prefix.getPrefix() + key;
  64. return jedis.exists(realKey);
  65. }finally {
  66. returnToPool(jedis);
  67. }
  68. }
  69. /**
  70. * 删除
  71. * */
  72. public boolean delete(KeyPrefix prefix, String key) {
  73. Jedis jedis = null;
  74. try {
  75. jedis = jedisPool.getResource();
  76. //生成真正的key
  77. String realKey = prefix.getPrefix() + key;
  78. long ret = jedis.del(key);
  79. return ret > 0;
  80. }finally {
  81. returnToPool(jedis);
  82. }
  83. }
  84. /**
  85. * 增加值
  86. * */
  87. public <T> Long incr(KeyPrefix prefix, String key) {
  88. Jedis jedis = null;
  89. try {
  90. jedis = jedisPool.getResource();
  91. //生成真正的key
  92. String realKey = prefix.getPrefix() + key;
  93. return jedis.incr(realKey);
  94. }finally {
  95. returnToPool(jedis);
  96. }
  97. }
  98. /**
  99. * 减少值
  100. * */
  101. public <T> Long decr(KeyPrefix prefix, String key) {
  102. Jedis jedis = null;
  103. try {
  104. jedis = jedisPool.getResource();
  105. //生成真正的key
  106. String realKey = prefix.getPrefix() + key;
  107. return jedis.decr(realKey);
  108. }finally {
  109. returnToPool(jedis);
  110. }
  111. }
  112. public static <T> String beanToString(T value) {
  113. if(value == null) {
  114. return null;
  115. }
  116. Class<?> clazz = value.getClass();
  117. if(clazz == int.class || clazz == Integer.class) {
  118. return ""+value;
  119. }else if(clazz == String.class) {
  120. return (String)value;
  121. }else if(clazz == long.class || clazz == Long.class) {
  122. return ""+value;
  123. }else {
  124. //fastjason中的方法
  125. return JSON.toJSONString(value);
  126. }
  127. }
  128. /**
  129. * 将字符串转换为一个bean对象
  130. */
  131. @SuppressWarnings("unchecked")
  132. public static <T> T stringToBean(String str, Class<T> clazz) {
  133. if(str == null || str.length() <= 0 || clazz == null) {
  134. return null;
  135. }
  136. if(clazz == int.class || clazz == Integer.class) {
  137. return (T)Integer.valueOf(str);
  138. }else if(clazz == String.class) {
  139. return (T)str;
  140. }else if(clazz == long.class || clazz == Long.class) {
  141. return (T)Long.valueOf(str);
  142. }else {
  143. //fastjason中的方法
  144. return JSON.toJavaObject(JSON.parseObject(str), clazz);
  145. }
  146. }
  147. //jedis用完了就要返回给jedisPool
  148. private void returnToPool(Jedis jedis) {
  149. if(jedis != null) {
  150. jedis.close();
  151. }
  152. }
  153. }

其中要注意的是,RedisService中的增删改的方法都是调用了jedis自己原生的方法

注意,jedis将一个对象转变成String放入redis中,从redis中拿出String同样需要转回成原对象,所以上面代码对应为stringToBean(String str, Class clazz) 和 beanToString(T value)

这样我们就写完了,最后我们可以写个controller然后试试是否成功

70 3

发表评论

表情:
评论列表 (有 0 条评论,297人围观)

还没有评论,来说两句吧...

相关阅读

    相关 Redis实现商品

    随着互联网的发展和消费者的需求越来越高,商品的销售也变得越来越激烈。而对于商家来说,最直观的解决方式即为促销活动。然而,促销活动也会引发一定的风险。如果处理得不当,可能会出现“

    相关 ——集成redis

    首先第一步肯定是导入依赖啊 ![70][] jedis就是集成了redis的一些命令操作,封装了redis的java客户端。提供了连接池管理。一般不直接使用jedis,而是

    相关 Redis实现功能

    在实际生活中,秒杀功能是比较常见的,如12306抢票、电商系统的秒杀活动等。所谓秒杀,从应用业务角度来看,是指在短时间内多个用户“争抢”某个资源,这里的资源在大部分秒杀场景里是