• 20:第三章:开发通行证服务:3:在程序中,打通redis服务器;(仅仅是打通redis服务器,不涉及具体的业务开发)


    说明:

    (1)本篇博客需要注意的点:

              ● 本篇博客仅仅是打通redis服务(也就是我们的程序,可以操作redis服务器),不涉及【redis服务,在项目中的具体应用】,也不涉及【具体业务的开发】;

              ● 其中遇到了一款不错的redis图形化工具:rdm(Redis Desktop Manager)工具,感觉不错;

              ● redis服务,作为一个第三方的“工具”,我们把其写在了【imooc-news-dev-common】通用工程中;

    (2)有关Redis的内容,如有需要可以参考【(13)Linux基础】、【(14)Redis】专栏中的内容;

    目录

    一:我们这个项目,为什么需要用到redis;

    二:安装redis、redis简介;

    三:在项目中,整合redis,打通redis服务器;

    1.在【imooc-news-dev-common】通用工程中,引入redis等相关依赖;

    2.在【imooc-news-dev-common】通用工程中,创建一个操作redis的工具类;

    3.在【imooc-news-dev-user】这个(实际需要使用到redis的)用户微服务中,在application*.yml配置文件中去配置redis服务的url、密码等信息;

    4.在【imooc-news-dev-user】这个(实际需要使用redis的)用户微服务中,在HelloController中,编写代码,以测试“我们的程序,是否可以连上redis”;

    5.测试;


    一:我们这个项目,为什么需要用到redis;

    (1)生成验证码后,验证码是需要发给用户的;;;用户把收到的验证码在前端输入,就会进入后端验证;;;即,在后端,我们要把这个原生的验证码进行存储;;;而,对于分布式微服务项目,我们一般会存放在redis中(而不会像单体应用中那样,存在session中);


    二:安装redis、redis简介;

    如有需要可以参考【(13)Linux基础】、【(14)Redis】专栏中的内容;

    同时,在【Spring Boot电商项目31:商品分类模块十:利用Redis缓存加速响应;】这个Spring Boot项目中,也用到过redis;

    我们这儿,就使用在【Redis入门二:Linux系统下安装Redis;】中,创建的那台虚拟机中安装的redis了;

    (1)把下载的包,上传到Linux系统,似乎可以借助FileZill工具;(自己没用过,自己用的是Xftp)

    (2)命令行工具,也可以使用SecureCRT;(自己没用过,自己用的是Xshell)

    (3)可以使用【rdm(Redis Desktop Manager)工具】这款redis可视化工具,来辅助开发;

              ● rdm的下载安装,可以参考【Redis Desktop Manager(Redis可视化工具)安装及使用教程】;


    三:在项目中,整合redis,打通redis服务器;

    1.在【imooc-news-dev-common】通用工程中,引入redis等相关依赖;

    1. <!-- 引入 redis 依赖 -->
    2. <dependency>
    3. <groupId>org.springframework.boot</groupId>
    4. <artifactId>spring-boot-starter-data-redis</artifactId>
    5. <!--<version>2.1.5.RELEASE</version>-->
    6. </dependency>
    7. <!--okhttp依赖.作用是,服务与服务之间发送rest请求-->
    8. <dependency>
    9. <groupId>com.squareup.okhttp3</groupId>
    10. <artifactId>okhttp</artifactId>
    11. </dependency>
    12. <!-- jackson三件套 -->
    13. <dependency>
    14. <groupId>com.fasterxml.jackson.core</groupId>
    15. <artifactId>jackson-core</artifactId>
    16. </dependency>
    17. <dependency>
    18. <groupId>com.fasterxml.jackson.core</groupId>
    19. <artifactId>jackson-annotations</artifactId>
    20. </dependency>
    21. <dependency>
    22. <groupId>com.fasterxml.jackson.core</groupId>
    23. <artifactId>jackson-databind</artifactId>
    24. </dependency>
    25. <!-- apache 工具类
    26. 【commons-codec】是apache提供的数据的编码/解码组件,可以使用【Commons Codec】来实现MD5的;
    27. 【commons-lang3】是Apache提供的一个java.lang包的增强版本,Lang3为java.lang API提供了许多帮助程序实用程序,特别是字符串操作方法,基本数值方法,对象反射,并发,创建和序列化以及系统属性。
    28. 【commons-fileupload】是一款apache提供的文件上传组件;
    29. -->
    30. <dependency>
    31. <groupId>commons-codec</groupId>
    32. <artifactId>commons-codec</artifactId>
    33. </dependency>
    34. <dependency>
    35. <groupId>org.apache.commons</groupId>
    36. <artifactId>commons-lang3</artifactId>
    37. </dependency>
    38. <dependency>
    39. <groupId>commons-fileupload</groupId>
    40. <artifactId>commons-fileupload</artifactId>
    41. </dependency>
    42. <!-- google 工具类 -->
    43. <dependency>
    44. <groupId>com.google.guava</groupId>
    45. <artifactId>guava</artifactId>
    46. </dependency>
    47. <!-- joda-time 时间工具,一个时间工具类 -->
    48. <dependency>
    49. <groupId>joda-time</groupId>
    50. <artifactId>joda-time</artifactId>
    51. </dependency>

    说明: 

    (1)对这些依赖,如果有不清楚的,可以参考【9:第二章:架构后端项目:5:【聚合工程】简介;创建顶级父工程;】;

    (2)还是那句话,根据我们的分布式微服务项目,各个module的分工和关系;;;edis服务,作为一个第三方的“工具”,我们把其写在了【imooc-news-dev-common】通用工程中;

    2.在【imooc-news-dev-common】通用工程中,创建一个操作redis的工具类;

    RedisOperator工具类:

    1. package com.imooc.utils;
    2. import org.springframework.beans.factory.annotation.Autowired;
    3. import org.springframework.dao.DataAccessException;
    4. import org.springframework.data.redis.connection.RedisConnection;
    5. import org.springframework.data.redis.connection.StringRedisConnection;
    6. import org.springframework.data.redis.core.RedisCallback;
    7. import org.springframework.data.redis.core.StringRedisTemplate;
    8. import org.springframework.stereotype.Component;
    9. import java.util.List;
    10. import java.util.Map;
    11. import java.util.Set;
    12. import java.util.concurrent.TimeUnit;
    13. /**
    14. * @Title: Redis 工具类
    15. * @author 风间影月
    16. */
    17. @Component
    18. public class RedisOperator {
    19. @Autowired
    20. private StringRedisTemplate redisTemplate;
    21. // Key(键),简单的key-value操作
    22. /**
    23. * 判断key是否存在
    24. * @param key
    25. * @return
    26. */
    27. public boolean keyIsExist(String key) {
    28. return redisTemplate.hasKey(key);
    29. }
    30. /**
    31. * 实现命令:TTL key,以秒为单位,返回给定 key的剩余生存时间(TTL, time to live)。
    32. *
    33. * @param key
    34. * @return
    35. */
    36. public long ttl(String key) {
    37. return redisTemplate.getExpire(key);
    38. }
    39. /**
    40. * 实现命令:expire 设置过期时间,单位秒
    41. *
    42. * @param key
    43. * @return
    44. */
    45. public void expire(String key, long timeout) {
    46. redisTemplate.expire(key, timeout, TimeUnit.SECONDS);
    47. }
    48. /**
    49. * 实现命令:increment key,增加key一次
    50. *
    51. * @param key
    52. * @return
    53. */
    54. public long increment(String key, long delta) {
    55. return redisTemplate.opsForValue().increment(key, delta);
    56. }
    57. /**
    58. * 实现命令:decrement key,减少key一次
    59. *
    60. * @param key
    61. * @return
    62. */
    63. public long decrement(String key, long delta) {
    64. return redisTemplate.opsForValue().decrement(key, delta);
    65. }
    66. /**
    67. * 实现命令:KEYS pattern,查找所有符合给定模式 pattern的 key
    68. */
    69. public Set<String> keys(String pattern) {
    70. return redisTemplate.keys(pattern);
    71. }
    72. /**
    73. * 实现命令:DEL key,删除一个key
    74. *
    75. * @param key
    76. */
    77. public void del(String key) {
    78. redisTemplate.delete(key);
    79. }
    80. // String(字符串)
    81. /**
    82. * 实现命令:SET key value,设置一个key-value(将字符串值 value关联到 key)
    83. *
    84. * @param key
    85. * @param value
    86. */
    87. public void set(String key, String value) {
    88. redisTemplate.opsForValue().set(key, value);
    89. }
    90. /**
    91. * 实现命令:SET key value EX seconds,设置key-value和超时时间(秒)
    92. *
    93. * @param key
    94. * @param value
    95. * @param timeout
    96. * (以秒为单位)
    97. */
    98. public void set(String key, String value, long timeout) {
    99. redisTemplate.opsForValue().set(key, value, timeout, TimeUnit.SECONDS);
    100. }
    101. /**
    102. * 如果key不存在,则设置,如果存在,则报错
    103. * @param key
    104. * @param value
    105. */
    106. public void setnx60s(String key, String value) {
    107. redisTemplate.opsForValue().setIfAbsent(key, value, 60, TimeUnit.SECONDS);
    108. }
    109. /**
    110. * 如果key不存在,则设置,如果存在,则报错
    111. * @param key
    112. * @param value
    113. */
    114. public void setnx(String key, String value) {
    115. redisTemplate.opsForValue().setIfAbsent(key, value);
    116. }
    117. /**
    118. * 实现命令:GET key,返回 key所关联的字符串值。
    119. *
    120. * @param key
    121. * @return value
    122. */
    123. public String get(String key) {
    124. return (String)redisTemplate.opsForValue().get(key);
    125. }
    126. /**
    127. * 批量查询,对应mget
    128. * @param keys
    129. * @return
    130. */
    131. public List<String> mget(List<String> keys) {
    132. return redisTemplate.opsForValue().multiGet(keys);
    133. }
    134. /**
    135. * 批量查询,管道pipeline
    136. * @param keys
    137. * @return
    138. */
    139. public List<Object> batchGet(List<String> keys) {
    140. // nginx -> keepalive
    141. // redis -> pipeline
    142. List<Object> result = redisTemplate.executePipelined(new RedisCallback<String>() {
    143. @Override
    144. public String doInRedis(RedisConnection connection) throws DataAccessException {
    145. StringRedisConnection src = (StringRedisConnection)connection;
    146. for (String k : keys) {
    147. src.get(k);
    148. }
    149. return null;
    150. }
    151. });
    152. return result;
    153. }
    154. // Hash(哈希表)
    155. /**
    156. * 实现命令:HSET key field value,将哈希表 key中的域 field的值设为 value
    157. *
    158. * @param key
    159. * @param field
    160. * @param value
    161. */
    162. public void hset(String key, String field, Object value) {
    163. redisTemplate.opsForHash().put(key, field, value);
    164. }
    165. /**
    166. * 实现命令:HGET key field,返回哈希表 key中给定域 field的值
    167. *
    168. * @param key
    169. * @param field
    170. * @return
    171. */
    172. public String hget(String key, String field) {
    173. return (String) redisTemplate.opsForHash().get(key, field);
    174. }
    175. /**
    176. * 实现命令:HDEL key field [field ...],删除哈希表 key 中的一个或多个指定域,不存在的域将被忽略。
    177. *
    178. * @param key
    179. * @param fields
    180. */
    181. public void hdel(String key, Object... fields) {
    182. redisTemplate.opsForHash().delete(key, fields);
    183. }
    184. /**
    185. * 实现命令:HGETALL key,返回哈希表 key中,所有的域和值。
    186. *
    187. * @param key
    188. * @return
    189. */
    190. public Map<Object, Object> hgetall(String key) {
    191. return redisTemplate.opsForHash().entries(key);
    192. }
    193. // List(列表)
    194. /**
    195. * 实现命令:LPUSH key value,将一个值 value插入到列表 key的表头
    196. *
    197. * @param key
    198. * @param value
    199. * @return 执行 LPUSH命令后,列表的长度。
    200. */
    201. public long lpush(String key, String value) {
    202. return redisTemplate.opsForList().leftPush(key, value);
    203. }
    204. /**
    205. * 实现命令:LPOP key,移除并返回列表 key的头元素。
    206. *
    207. * @param key
    208. * @return 列表key的头元素。
    209. */
    210. public String lpop(String key) {
    211. return (String)redisTemplate.opsForList().leftPop(key);
    212. }
    213. /**
    214. * 实现命令:RPUSH key value,将一个值 value插入到列表 key的表尾(最右边)。
    215. *
    216. * @param key
    217. * @param value
    218. * @return 执行 LPUSH命令后,列表的长度。
    219. */
    220. public long rpush(String key, String value) {
    221. return redisTemplate.opsForList().rightPush(key, value);
    222. }
    223. }

    说明:

    (1)这个工具类,不是我写的;;里面定义了很多操作redis的方法;可以大略的瞅一瞅;

    (2)有关java操作redis的内容,如有需要可以先参考下【(14)Redis】专栏中的内容;

    3.在【imooc-news-dev-user】这个(实际需要使用到redis的)用户微服务中,在application*.yml配置文件中去配置redis服务的url、密码等信息;

    4.在【imooc-news-dev-user】这个(实际需要使用redis的)用户微服务中,在HelloController中,编写代码,以测试“我们的程序,是否可以连上redis”;

    5.测试;

    (1)首先,整个项目全局install一下;

    (2)然后,启动【user】的主启动类;

    (3)然后,访问【user】的【"/redis"】接口;

    至此,我们的redis就好了,也就是我们的项目是可以连接到redis服务器了;

  • 相关阅读:
    C++进阶之继承详解
    十九 两周记(11.14-11.27)
    在X11图形环境下开启/关闭勿扰模式及其背后机制
    链表反转类算法题
    分割等和子集
    03-迭代器生成器
    微信公众号h5写一个全局调用微信分享功能
    Linux 查看日志
    Linux中的日志
    Google I/O 2023 - Dart 3 发布,快来看看有什么更新吧
  • 原文地址:https://blog.csdn.net/csucsgoat/article/details/125466931