当前位置:   article > 正文

reids自定义RedisTemplate以及乱码问题解决

reids自定义RedisTemplate以及乱码问题解决

一,乱码问题解决序列化方式 (所有的对象都需要序列化不然会报错)

        1,使用 ObjectMapper().writeValueAsString(*);

        

  1. void textChanged() throws JsonProcessingException {
  2. User user = new User("张三", 22);
  3. String s = new ObjectMapper().writeValueAsString(user);
  4. redisTemplate.opsForValue().set("user",s);
  5. }

        2,所有pojo实现 Serializable接口

  1. @AllArgsConstructor
  2. @Data
  3. @NoArgsConstructor
  4. @Component
  5. public class User implements Serializable {
  6. private String userName;
  7. private int age;
  8. }

        3,自定义序列化,企业开发中可以直接使用

        

  1. package com.example.config;
  2. import com.fasterxml.jackson.annotation.JsonAutoDetect;
  3. import com.fasterxml.jackson.annotation.PropertyAccessor;
  4. import com.fasterxml.jackson.databind.ObjectMapper;
  5. import org.springframework.boot.autoconfigure.condition.ConditionalOnMissingBean;
  6. import org.springframework.context.annotation.Bean;
  7. import org.springframework.context.annotation.Configuration;
  8. import org.springframework.data.redis.connection.RedisConnectionFactory;
  9. import org.springframework.data.redis.core.RedisTemplate;
  10. import org.springframework.data.redis.serializer.Jackson2JsonRedisSerializer;
  11. import org.springframework.data.redis.serializer.StringRedisSerializer;
  12. import java.net.UnknownHostException;
  13. @Configuration
  14. public class RedisConfig {
  15. //编写自己的redsiTemplate
  16. @Bean
  17. @SuppressWarnings("all")
  18. public RedisTemplate<String, Object> redisTemplate(RedisConnectionFactory factory) {
  19. RedisTemplate<String, Object> template = new RedisTemplate<String, Object>();
  20. template.setConnectionFactory(factory);
  21. // 序列化配置 解析任意对象
  22. Jackson2JsonRedisSerializer jackson2JsonRedisSerializer = new Jackson2JsonRedisSerializer(Object.class);
  23. // json序列化利用ObjectMapper进行转义
  24. ObjectMapper om = new ObjectMapper();
  25. om.setVisibility(PropertyAccessor.ALL, JsonAutoDetect.Visibility.ANY);
  26. om.enableDefaultTyping(ObjectMapper.DefaultTyping.NON_FINAL);
  27. jackson2JsonRedisSerializer.setObjectMapper(om);
  28. // 2.序列化String类型
  29. StringRedisSerializer stringRedisSerializer = new StringRedisSerializer();
  30. // key采用String的序列化方式
  31. template.setKeySerializer(stringRedisSerializer);
  32. // hash的key也采用String的序列化方式
  33. template.setHashKeySerializer(stringRedisSerializer);
  34. // value序列化方式采用jackson
  35. template.setValueSerializer(jackson2JsonRedisSerializer);
  36. // hash的value序列化方式采用jackson
  37. template.setHashValueSerializer(jackson2JsonRedisSerializer);
  38. template.afterPropertiesSet();
  39. return template;
  40. }
  41. }

我要保证使用到了我们自定义的RedisTemplate 使用添加注解 当可以点进去 即为成功!

@Qualifier("redisTemplate")
  1. @Autowired
  2. @Qualifier("redisTemplate")
  3. private RedisTemplate redisTemplate;

这样一来,只要实体类进行了序列化,我们存什么都不会有乱码的担忧了。

一 自定义Redis工具类

使用RedisTemplate需要频繁调用.opForxxx然后才能进行对应的操作,这样使用起来代码效率低下,工作中一般不会这样使用,而是将这些常用的公共API抽取出来封装成为一个工具类,然后直接使用工具类来间接操作Redis,不但效率高并且易用。

  1. package com.demo.Utils;
  2. import org.springframework.beans.factory.annotation.Autowired;
  3. import org.springframework.data.redis.core.RedisTemplate;
  4. import org.springframework.stereotype.Component;
  5. import org.springframework.util.CollectionUtils;
  6. import java.util.List;
  7. import java.util.Map;
  8. import java.util.Set;
  9. import java.util.concurrent.TimeUnit;
  10. /**
  11. redisTemplate封装
  12. */
  13. @Component
  14. public class RedisUtils {
  15. //此写法可防止RedisTemplate 注入失败
  16. private static RedisTemplate redisTemplate;
  17. @Autowired
  18. public void setRedisTemplate(RedisTemplate redisTemplate) {
  19. RedisUtils.redisTemplate = redisTemplate;
  20. }
  21. /**
  22. 指定缓存失效时间
  23. @param key 键
  24. @param time 时间(秒)
  25. @return
  26. */
  27. public boolean expire(String key,long time){
  28. try {
  29. if(time>0){
  30. redisTemplate.expire(key, time, TimeUnit.SECONDS);
  31. }
  32. return true;
  33. } catch (Exception e) {
  34. e.printStackTrace();
  35. return false;
  36. }
  37. }
  38. /**
  39. 根据key 获取过期时间
  40. @param key 键 不能为null
  41. @return 时间(秒) 返回0代表为永久有效
  42. */
  43. public long getExpire(String key){
  44. return redisTemplate.getExpire(key,TimeUnit.SECONDS);
  45. }
  46. /**
  47. 判断key是否存在
  48. @param key 键
  49. @return true 存在 false不存在
  50. */
  51. public boolean hasKey(String key){
  52. try {
  53. return redisTemplate.hasKey(key);
  54. } catch (Exception e) {
  55. e.printStackTrace();
  56. return false;
  57. }
  58. }
  59. /**
  60. 删除缓存
  61. @param key 可以传一个值 或多个
  62. */
  63. @SuppressWarnings("unchecked")
  64. public void del(String[] key){
  65. if(key!=null&&key.length>0){
  66. if(key.length==1){
  67. redisTemplate.delete(key[0]);
  68. }else{
  69. redisTemplate.delete(CollectionUtils.arrayToList(key));
  70. }
  71. }
  72. }
  73. //String=
  74. /**
  75. 普通缓存获取
  76. @param key 键
  77. @return
  78. */
  79. public Object get(String key){
  80. return key==null?null:redisTemplate.opsForValue().get(key);
  81. }
  82. /**
  83. 普通缓存放入
  84. @param key 键
  85. @param value 值
  86. @return true成功 false失败
  87. */
  88. public static boolean set(String key,Object value) {
  89. try {
  90. redisTemplate.opsForValue().set(key, value);
  91. return true;
  92. } catch (Exception e) {
  93. e.printStackTrace();
  94. return false;
  95. }
  96. }
  97. /**
  98. 普通缓存放入并设置时间
  99. @param key 键
  100. @param value 值
  101. @param time 时间(秒) time要大于0 如果time小于等于0 将设置无限期
  102. @return true成功 false 失败
  103. */
  104. public boolean set(String key,Object value,long time){
  105. try {
  106. if(time>0){
  107. redisTemplate.opsForValue().set(key, value, time, TimeUnit.SECONDS);
  108. }else{
  109. set(key, value);
  110. }
  111. return true;
  112. } catch (Exception e) {
  113. e.printStackTrace();
  114. return false;
  115. }
  116. }
  117. /**
  118. 递增
  119. @param key 键
  120. @param delta 要增加几(大于0)
  121. @return
  122. */
  123. public long incr(String key, long delta){
  124. if(delta<0){
  125. throw new RuntimeException("递增因子必须大于0");
  126. }
  127. return redisTemplate.opsForValue().increment(key, delta);
  128. }
  129. /**
  130. 递减
  131. @param key 键
  132. @param delta 要减少几(小于0)
  133. @return
  134. */
  135. public long decr(String key, long delta){
  136. if(delta<0){
  137. throw new RuntimeException("递减因子必须大于0");
  138. }
  139. return redisTemplate.opsForValue().increment(key, -delta);
  140. }
  141. //Map=
  142. /**
  143. HashGet
  144. @param key 键 不能为null
  145. @param item 项 不能为null
  146. @return
  147. */
  148. public Object hget(String key,String item){
  149. return redisTemplate.opsForHash().get(key, item);
  150. }
  151. /**
  152. 获取hashKey对应的所有键值
  153. @param key 键
  154. @return 对应的多个键值
  155. */
  156. public Map<Object,Object> hmget(String key){
  157. return redisTemplate.opsForHash().entries(key);
  158. }
  159. /**
  160. HashSet
  161. @param key 键
  162. @param map 对应多个键值
  163. @return true 成功 false 失败
  164. */
  165. public boolean hmset(String key, Map<String,Object> map){
  166. try {
  167. redisTemplate.opsForHash().putAll(key, map);
  168. return true;
  169. } catch (Exception e) {
  170. e.printStackTrace();
  171. return false;
  172. }
  173. }
  174. /**
  175. HashSet 并设置时间
  176. @param key 键
  177. @param map 对应多个键值
  178. @param time 时间(秒)
  179. @return true成功 false失败
  180. */
  181. public boolean hmset(String key, Map<String,Object> map, long time){
  182. try {
  183. redisTemplate.opsForHash().putAll(key, map);
  184. if(time>0){
  185. expire(key, time);
  186. }
  187. return true;
  188. } catch (Exception e) {
  189. e.printStackTrace();
  190. return false;
  191. }
  192. }
  193. /**
  194. 向一张hash表中放入数据,如果不存在将创建
  195. @param key 键
  196. @param item 项
  197. @param value 值
  198. @return true 成功 false失败
  199. */
  200. public boolean hset(String key,String item,Object value) {
  201. try {
  202. redisTemplate.opsForHash().put(key, item, value);
  203. return true;
  204. } catch (Exception e) {
  205. e.printStackTrace();
  206. return false;
  207. }
  208. }
  209. /**
  210. 向一张hash表中放入数据,如果不存在将创建
  211. @param key 键
  212. @param item 项
  213. @param value 值
  214. @param time 时间(秒) 注意:如果已存在的hash表有时间,这里将会替换原有的时间
  215. @return true 成功 false失败
  216. */
  217. public boolean hset(String key,String item,Object value,long time) {
  218. try {
  219. redisTemplate.opsForHash().put(key, item, value);
  220. if(time>0){
  221. expire(key, time);
  222. }
  223. return true;
  224. } catch (Exception e) {
  225. e.printStackTrace();
  226. return false;
  227. }
  228. }
  229. /**
  230. 删除hash表中的值
  231. @param key 键 不能为null
  232. @param item 项 可以使多个 不能为null
  233. */
  234. public void hdel(String key, Object item){
  235. redisTemplate.opsForHash().delete(key,item);
  236. }
  237. /**
  238. 判断hash表中是否有该项的值
  239. @param key 键 不能为null
  240. @param item 项 不能为null
  241. @return true 存在 false不存在
  242. */
  243. public boolean hHasKey(String key, String item){
  244. return redisTemplate.opsForHash().hasKey(key, item);
  245. }
  246. /**
  247. hash递增 如果不存在,就会创建一个 并把新增后的值返回
  248. @param key 键
  249. @param item 项
  250. @param by 要增加几(大于0)
  251. @return
  252. */
  253. public double hincr(String key, String item,double by){
  254. return redisTemplate.opsForHash().increment(key, item, by);
  255. }
  256. /**
  257. hash递减
  258. @param key 键
  259. @param item 项
  260. @param by 要减少记(小于0)
  261. @return
  262. */
  263. public double hdecr(String key, String item,double by){
  264. return redisTemplate.opsForHash().increment(key, item,-by);
  265. }
  266. //set=
  267. /**
  268. 根据key获取Set中的所有值
  269. @param key 键
  270. @return
  271. */
  272. public Set sGet(String key){
  273. try {
  274. return redisTemplate.opsForSet().members(key);
  275. } catch (Exception e) {
  276. e.printStackTrace();
  277. return null;
  278. }
  279. }
  280. /**
  281. 根据value从一个set中查询,是否存在
  282. @param key 键
  283. @param value 值
  284. @return true 存在 false不存在
  285. */
  286. public boolean sHasKey(String key,Object value){
  287. try {
  288. return redisTemplate.opsForSet().isMember(key, value);
  289. } catch (Exception e) {
  290. e.printStackTrace();
  291. return false;
  292. }
  293. }
  294. /**
  295. 将数据放入set缓存
  296. @param key 键
  297. @param values 值 可以是多个
  298. @return 成功个数
  299. */
  300. public long sSet(String key, Object values) {
  301. try {
  302. return redisTemplate.opsForSet().add(key, values);
  303. } catch (Exception e) {
  304. e.printStackTrace();
  305. return 0;
  306. }
  307. }
  308. /**
  309. 将set数据放入缓存
  310. @param key 键
  311. @param time 时间(秒)
  312. @param values 值 可以是多个
  313. @return 成功个数
  314. */
  315. public long sSetAndTime(String key,long time,Object values) {
  316. try {
  317. Long count = redisTemplate.opsForSet().add(key, values);
  318. if(time>0) {
  319. expire(key, time);
  320. }
  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 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) {
  424. expire(key, time);
  425. }
  426. return true;
  427. } catch (Exception e) {
  428. e.printStackTrace();
  429. return false;
  430. }
  431. }
  432. /**
  433. 将list放入缓存
  434. @param key 键
  435. @param value 值
  436. @return
  437. */
  438. public boolean lSet(String key, List value) {
  439. try {
  440. redisTemplate.opsForList().rightPushAll(key, value);
  441. return true;
  442. } catch (Exception e) {
  443. e.printStackTrace();
  444. return false;
  445. }
  446. }
  447. /**
  448. 将list放入缓存
  449. @param key 键
  450. @param value 值
  451. @param time 时间(秒)
  452. @return
  453. */
  454. public boolean lSet(String key, List value, long time) {
  455. try {
  456. redisTemplate.opsForList().rightPushAll(key, value);
  457. if (time > 0) {
  458. expire(key, time);
  459. }
  460. return true;
  461. } catch (Exception e) {
  462. e.printStackTrace();
  463. return false;
  464. }
  465. }
  466. /**
  467. 根据索引修改list中的某条数据
  468. @param key 键
  469. @param index 索引
  470. @param value 值
  471. @return
  472. */
  473. public boolean lUpdateIndex(String key, long index,Object value) {
  474. try {
  475. redisTemplate.opsForList().set(key, index, value);
  476. return true;
  477. } catch (Exception e) {
  478. e.printStackTrace();
  479. return false;
  480. }
  481. }
  482. /**
  483. 移除N个值为value
  484. @param key 键
  485. @param count 移除多少个
  486. @param value 值
  487. @return 移除的个数
  488. */
  489. public long lRemove(String key,long count,Object value) {
  490. try {
  491. Long remove = redisTemplate.opsForList().remove(key, count, value);
  492. return remove;
  493. } catch (Exception e) {
  494. e.printStackTrace();
  495. return 0;
  496. }
  497. }
  498. }

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

闽ICP备14008679号