• SpringBoot整合redis的基本操作


    SpringBoot整合Redis

    1.RedisTemplate与StringRedisTemplate的区别

    在Redis里面,为了确保数据的安全性以及放便快速存储,任何类型的数据,在Redis内部都是采用二进制的方式存储的,这就导致,当我们存入一个字符串时,可能最终取出的结果会乱掉:

    我们在存取的时候,这样的效果显然是不想看到的,如何解决?

    SpringBoot给我们提供了两种方式:

    • 可以看到StringRedisTemplate继承RedisTemplate

    其实他们的区别在于使用的序列化方式不一样,StringRedisTemplate使用的是序列化为String的序列化方式,RedisTemplate使用的是JDK的序列化方式,使用起来不太友好

    • StringRedisTemplate:序列化为String的方式

    • RedisTemplate:序列化方式是JDK的序列化方式

    2.Redis命令与StringRedisTemplate方法对应

    方法返回值对应操作
    opsForValue()ValueOperations操作String
    opsForHash()HashOperations操作hash
    opsForSet()SetOperations操作set
    opsForList()ListOperations操作list
    opsForZSet()ZSetOperations操作有序set

    除此之外,还有一些与Key相关的操作,可直接通过RedisTemplate对象去调用。

    3.Key相关的操作

    Redis命令StringRedisTemplate/RedisTemplate说明
    KEYS* KEYS 星key星 KEYS 星key KEYS key星redisTemplate.keys(key);获取所有key,模糊查询key(支持通配符*)
    EXPIRE key 10redisTemplate.expire(key,time,TimeUnit.SECONDS);指定key缓存失效时间
    EXPIREAT key 1293840000redisTemplate.expireAt(key, date);指定key缓存到期时间
    TTL keyredisTemplate.getExpire(key, TimeUnit.SECONDS);根据key获取过期时间
    EXISTS keyredisTemplate.hasKey(key);判断key是否存在
    EXISTS key1 key2 key3redisTemplate.countExistingKeys(Arrays.asList(key));检查key存在的数量
    DEL keyredisTemplate.delete(key);删除指定key缓存
    DEL key1 key2 key3redisTemplate.delete(Arrays.asList(keys));批量删除key

    4.String相关的操作

    redisTemplate.opsForValue(); // 操作字符串

    Redis命令StringRedisTemplate/RedisTemplate说明
    SET key valueset(key,value)设置普通缓存
    SET key value timeset(key,value,time)设置缓存过期时间
    GET keyget(key)获取普通缓存
    INCE keyincrement(key, delta)递增,可设置增量
    DECR keyincrement(key, -delta)递减
    SETNX key valuesetIfAbsent(key,value)将 key 的值设为 value ,当且仅当 key 不存在
    SETEX key valuesetIfPresent(key,value)判断当前的键的值是否为v,是的话不作操作,不是的话进行替换。如果没有这个键也不会做任何操作
    GETSET key valuegetAndSet(key, value)key存在设置新值,并返回旧值

    5.Hash相关的操作

    redisTemplate.opsForHash(); //操作hash类型

    更多操作Redis命令StringRedisTemplate/RedisTemplate说明
    HMSET key key1 value1 key2 value2putAll(key, map)设置缓存
    HSET key item valueput(key, item, value)向一张hash表中放入数据,如果不存在将创建
    HGET key itemget(key, item)获取缓存,字段值
    HMGET keyentries(key)获取hashKey对应的所有键值
    HVALSvalues(key)获取hashKey对应的所有键值
    HEXISTS key itemhasKey(key, item)判断hash表中是否有该项的值
    HINCRBY key item byincrement(key, item, by)hash递增 如果不存在,就会创建一个 并把新增后的
    HLENlengthOfValue(key,hashkey)获取指定hash键指定键值的长度

    6.List相关的操作

    redisTemplate.opsForList(); //操作List类型

    操作Redis命令StringRedisTemplate/RedisTemplate说明
    RPUSH key valuerightPush(key, value)将list放入缓存,从右边添加
    LPUSH key valueleftPush(key, value)将list放入缓存,从左边添加
    LRANGE key 0 -1range(key, start, end)获取list缓存指定范围的内容
    LLEN keysize(key)获取list缓存的长度
    LINDEX key indexindex(key, index)通过索引 获取list中的值
    LSET key index valueset(key, index, value)根据索引修改list中的某条数据
    LREM key count valueremove(key, count, value)移除N个值为value
    leftPop(key)该函数用于移除上面我们抽象的容器中的最左边的一个元素。
    rightPop(key)该函数用于移除上面我们抽象的容器中的最右边的一个元素。

    7.Set相关的操作

    redisTemplate.opsForSet(); //操作Set类型

    操作Redis命令StringRedisTemplate/RedisTemplate说明
    SMEMBEredisTemplate keymemberedisTemplate(key)根据key获取Set中的所有值
    SISMEMBER key valueisMember(key, value)根据value从一个set中查询,是否存在
    SADD key value1 value2add(key, values)将数据放入set缓存
    SCARD keysize(key)获取set缓存的长度
    SREM key value1 value2remove(key, values)移除值为value的
    SDIFF key1, key2difference(key1, key2)求两个key对应的set的差集(不包括右边的)
    SINTER key1, key2intersect(key1, key2)求两个key对应的set的交集
    SUNION key1, key2set.union(key1, key2)求两个key对应的set的并集

    8.ZSet相关的操作

    redisTemplate.opsForZSet(); //操作ZSet(有序集合)类型

    9.示例操作

    1. package com.kang.redis.controller;
    2. import lombok.extern.slf4j.Slf4j;
    3. import org.springframework.beans.factory.annotation.Autowired;
    4. import org.springframework.data.redis.core.SetOperations;
    5. import org.springframework.data.redis.core.StringRedisTemplate;
    6. import org.springframework.data.redis.core.ValueOperations;
    7. import org.springframework.data.redis.core.ZSetOperations;
    8. import org.springframework.web.bind.annotation.GetMapping;
    9. import org.springframework.web.bind.annotation.RestController;
    10. import java.util.List;
    11. import java.util.Map;
    12. import java.util.concurrent.TimeUnit;
    13. /**
    14. * @Author Emperor Kang
    15. * @ClassName RedisController
    16. * @Description TODO
    17. * @Date 2022/8/11 14:36
    18. * @Version 1.0
    19. * @Motto 让营地比你来时更干净
    20. */
    21. @RestController
    22. @Slf4j
    23. public class RedisController {
    24. public static final String key1 = "student#03";
    25. public static final String key2 = "student#04";
    26. public static final String key = "student#05";
    27. @Autowired
    28. private StringRedisTemplate redisTemplate;
    29. @GetMapping("/string")
    30. public void redisForString() throws InterruptedException {
    31. test1();
    32. test2();
    33. test3();
    34. test4();
    35. }
    36. @GetMapping("/hashmap")
    37. public void redisForHashMap() throws InterruptedException {
    38. test5();
    39. test6();
    40. test7();
    41. }
    42. @GetMapping("/list")
    43. public void redisForList() throws InterruptedException {
    44. test8();
    45. }
    46. @GetMapping("/set")
    47. public void redisForSet() throws InterruptedException {
    48. test9();
    49. }
    50. @GetMapping("/ZSet")
    51. public void redisForZSet() throws InterruptedException {
    52. test10();
    53. }
    54. /**
    55. * 操作ZSet
    56. */
    57. private void test10() {
    58. //添加周星星同学成绩
    59. redisTemplate.opsForZSet().add(key,"语文",98);
    60. redisTemplate.opsForZSet().add(key,"数学",87);
    61. redisTemplate.opsForZSet().add(key,"英语",75);
    62. //获取分数最高的成绩
    63. ZSetOperations.TypedTuple values = redisTemplate.opsForZSet().popMax(key);
    64. //打印值
    65. log.info("周星星最好成绩科目是:"+values.getValue());
    66. log.info("周星星最好成绩:"+values.getScore());
    67. log.info("======================================================================");
    68. }
    69. /**
    70. * 操作set
    71. */
    72. private void test9() {
    73. SetOperations set = redisTemplate.opsForSet();
    74. set.add(key1,"a");
    75. set.add(key1,"b");
    76. set.add(key1,"c");
    77. set.add(key2,"b");
    78. set.add(key2,"c");
    79. set.add(key2,"d");
    80. System.out.println("key1 = " + set.members(key1));
    81. System.out.println("key2 = " + set.members(key2));
    82. log.info("set.difference(key1,key2) = " + set.difference(key1, key2));
    83. log.info("set.intersect(key1,key2) = " + set.intersect(key1, key2));
    84. log.info("set.union(key1,key2) = " + set.union(key1, key2));
    85. log.info("======================================================================");
    86. }
    87. /**
    88. * 操作list
    89. */
    90. private void test8() {
    91. redisTemplate.opsForList().leftPush(key,"周星星");
    92. redisTemplate.opsForList().leftPush(key, "张敏");
    93. redisTemplate.opsForList().leftPush(key, "李大锤");
    94. String value = redisTemplate.opsForList().rightPop(key);
    95. String value2 = redisTemplate.opsForList().leftPop(key);
    96. log.info("从list的右边获取数据:{}",value);
    97. log.info("从list的左边获取数据:{}",value2);
    98. log.info("当前list的长度为:{}",redisTemplate.opsForList().size(key));
    99. log.info("======================================================================");
    100. }
    101. /**
    102. * 获取长度
    103. */
    104. private void test7() {
    105. Long length = redisTemplate.opsForHash().lengthOfValue(key, "id");
    106. log.info("获取map中指定值的长度:{}",length);
    107. log.info("======================================================================");
    108. }
    109. /**
    110. * 获取所有的值
    111. */
    112. private void test6() {
    113. List values = redisTemplate.opsForHash().values(key);
    114. log.info("获取map中所有的值:{}",values);
    115. log.info("======================================================================");
    116. }
    117. /**
    118. * 操作hashmap
    119. */
    120. private void test5() {
    121. redisTemplate.opsForHash().put(key,"id","001");
    122. redisTemplate.opsForHash().put(key,"name","张三");
    123. redisTemplate.opsForHash().put(key,"age","18");
    124. redisTemplate.opsForHash().put(key,"sex","男");
    125. Map entries = redisTemplate.opsForHash().entries(key);
    126. log.info("获取所有的键值对:{}",entries);
    127. log.info("======================================================================");
    128. }
    129. /**
    130. * 不带过期时间
    131. */
    132. private void test1() {
    133. redisTemplate.opsForValue().set("name","看看有什么不好呢");
    134. String name = redisTemplate.opsForValue().get("name");
    135. log.info("name:{}",name);
    136. log.info("======================================================================");
    137. }
    138. /**
    139. * 带过期时间
    140. * @throws InterruptedException
    141. */
    142. private void test2() throws InterruptedException {
    143. redisTemplate.opsForValue().set("name","我不看",5, TimeUnit.SECONDS);
    144. String name = redisTemplate.opsForValue().get("name");
    145. log.info("第1次获取name:{}",name);
    146. Thread.sleep(6000);
    147. String name2 = redisTemplate.opsForValue().get("name");
    148. log.info("第2次获取name:{}",name2);
    149. log.info("======================================================================");
    150. }
    151. /**
    152. * ValueOperations
    153. */
    154. private void test3() {
    155. ValueOperations value = redisTemplate.opsForValue();
    156. log.info("ValueOperations.get()={}",value.get("p1"));
    157. log.info("======================================================================");
    158. }
    159. /**
    160. * 将 key 的值设为 value ,当且仅当 key 不存在
    161. */
    162. private void test4() {
    163. Boolean aBoolean = redisTemplate.opsForValue().setIfAbsent("name", "看看有什么不好呢");
    164. Boolean aBoolean1 = redisTemplate.opsForValue().setIfAbsent("name", "我不看");
    165. System.out.println("aBoolean = " + aBoolean);
    166. System.out.println("aBoolean1 = " + aBoolean1);
    167. log.info("======================================================================");
    168. }
    169. }
    170. 10.RedisTemplate使用String序列化配置

      1. package com.kang.redis.config;
      2. import org.springframework.context.annotation.Bean;
      3. import org.springframework.context.annotation.Configuration;
      4. import org.springframework.data.redis.connection.RedisConnectionFactory;
      5. import org.springframework.data.redis.core.RedisTemplate;
      6. import org.springframework.data.redis.serializer.RedisSerializer;
      7. /**
      8. * @Author Emperor Kang
      9. * @ClassName RedisConfig
      10. * @Description redis配置类
      11. * @Date 2022/8/11 11:17
      12. * @Version 1.0
      13. * @Motto 让营地比你来时更干净
      14. */
      15. @Configuration
      16. public class RedisConfig {
      17. @Bean
      18. public RedisTemplate redisTemplate(RedisConnectionFactory redisConnectionFactory) {
      19. RedisTemplate redisTemplate = new RedisTemplate<>();
      20. redisTemplate.setConnectionFactory(redisConnectionFactory);
      21. redisTemplate.setKeySerializer(RedisSerializer.string());
      22. redisTemplate.setValueSerializer(RedisSerializer.string());
      23. redisTemplate.setHashKeySerializer(RedisSerializer.string());
      24. redisTemplate.setHashValueSerializer(RedisSerializer.string());
      25. redisTemplate.afterPropertiesSet();
      26. return redisTemplate;
      27. }
      28. }

    171. 相关阅读:
      Lua位或操作
      nvidia-docker安装
      27.4 Java集合之Map学习
      Springboot3中aop几个通知注解执行的先后顺序
      【Linux】VMware下载和安装
      蓝桥杯 使用sort排序(c++)
      (一)shell编程
      nginx安装(离线安装,新增--with-http_ssl_module、--with-stream模块,离线升级)
      5G终端标识SUPI,SUCI及IMSI解析
      iNFTnews|Web3正在重新定义粉丝的意义
    172. 原文地址:https://blog.csdn.net/LuckFairyLuckBaby/article/details/126287371