一、介绍

这是Spring组件中一个简单的操作Redis的工具。 暂无其他介绍,直接用吧。

RedisTemplate和StringRedisTemplate的区别

  1. 两者的关系是StringRedisTemplate继承RedisTemplate。
    2. 两者的数据是不共通的;也就是说StringRedisTemplate只能管理StringRedisTemplate里面的数据,RedisTemplate只能管理RedisTemplate中的数据。
    3. SDR默认采用的序列化策略有两种,一种是String的序列化策略,一种是JDK的序列化策略。
    StringRedisTemplate默认采用的是String的序列化策略,保存的key和value都是采用此策略序列化保存的。
    RedisTemplate默认采用的是JDK的序列化策略,保存的key和value都是采用此策略序列化保存的。
    RedisTemplate使用的序列类在在操作数据的时候,比如说存入数据会将数据先序列化成字节数组然后在存入Redis数据库,这个时候打开Redis查看的时候,你会看到你的数据不是以可读的形式展现的,而是以字节数组显示,类似下面
    SpringDataRedis 入门 - 图1
    当然从Redis获取数据的时候也会默认将数据当做字节数组转化,这样就会导致一个问题,当需要获取的数据不是以字节数组存在redis当中而是正常的可读的字符串的时候,比如说下面这种形式的数据
    SpringDataRedis 入门 - 图2

    二、使用

    1. <dependency>
    2. <groupId>org.springframework.boot</groupId>
    3. <artifactId>spring-boot-starter-data-redis</artifactId>
    4. </dependency>

    1、操作 String 类型

    1. @SpringBootTest
    2. public class TestString {
    3. @Autowired
    4. private StringRedisTemplate redisTemplate;
    5. /**
    6. * set key value
    7. */
    8. @Test
    9. public void setValue() {
    10. // set username king
    11. redisTemplate.opsForValue().set("username", "king");
    12. redisTemplate.opsForValue().set("address", "USA");
    13. }
    14. /**
    15. * 设置值并添加超时时间
    16. * set key value
    17. * expire key value
    18. */
    19. @Test
    20. public void setValueWithExpire() {
    21. // set address china
    22. // expire address 5 ex 5
    23. redisTemplate.opsForValue().set("address", "china", 5, TimeUnit.SECONDS);
    24. }
    25. /**
    26. * 不存在则set
    27. * SET if Not eXists
    28. */
    29. @Test
    30. public void setIfNotExists() {
    31. // set username king ex 10 nx
    32. Boolean aBoolean = redisTemplate.opsForValue().setIfAbsent("username", "king", 10, TimeUnit.SECONDS);
    33. System.out.println(aBoolean);
    34. }
    35. /**
    36. * 如果存在则set
    37. * SET if eXists
    38. */
    39. @Test
    40. public void setIfExists() {
    41. // set username danyang ex 10 xx
    42. Boolean aBoolean = redisTemplate.opsForValue().setIfPresent("username", "danyang", 10, TimeUnit.SECONDS);
    43. System.out.println(aBoolean);
    44. }
    45. /**
    46. * 获取名字
    47. * get key
    48. */
    49. @Test
    50. public void getValue() {
    51. // get username
    52. String name = redisTemplate.boundValueOps("username").get();
    53. String name2 = redisTemplate.opsForValue().get("username");
    54. System.out.println(name);
    55. System.out.println(name2);
    56. }
    57. /**
    58. * 删除值
    59. * del key
    60. */
    61. @Test
    62. public void delValue() {
    63. // del username
    64. Boolean aBoolean = redisTemplate.opsForValue().getOperations().delete("username");
    65. System.out.println(aBoolean);
    66. Boolean aBoolean1 = redisTemplate.delete("address");
    67. System.out.println(aBoolean1);
    68. }
    69. }

    2、操作 Hash 类型

    redisTemplate.boundHashOps,需要先绑定数据类型 hash

    1. @SpringBootTest
    2. public class TestHash {
    3. @Autowired
    4. private StringRedisTemplate redisTemplate;
    5. /**
    6. * 添加
    7. * hset key field value
    8. */
    9. @Test
    10. public void put() {
    11. // hset info name 唐僧
    12. redisTemplate.boundHashOps("info").put("name", "唐僧");
    13. // name会覆盖上面的唐僧
    14. Map<String, String> map = new HashMap<>();
    15. map.put("name", "孙悟空");
    16. map.put("address", "china");
    17. map.put("age", "10");
    18. redisTemplate.boundHashOps("info").putAll(map);
    19. }
    20. /**
    21. * 设置超时时间
    22. */
    23. @Test
    24. public void expire() {
    25. // hset info name 唐僧
    26. redisTemplate.boundHashOps("info").put("name", "唐僧");
    27. redisTemplate.boundHashOps("info").expire(20, TimeUnit.SECONDS);
    28. }
    29. /**
    30. * 添加
    31. * hset key field value
    32. */
    33. @Test
    34. public void get() {
    35. // hset info name 唐僧
    36. Object object = redisTemplate.boundHashOps("info").get("name");
    37. System.out.println(object);
    38. }
    39. /**
    40. * 添加
    41. * hdel key field
    42. */
    43. @Test
    44. public void del() {
    45. // hdel key field
    46. Long delete = redisTemplate.boundHashOps("info").delete("name");
    47. System.out.println(delete);
    48. }
    49. /**
    50. * 获取所有key
    51. * hkeys key
    52. */
    53. @Test
    54. public void hkeys() {
    55. // hkeys key
    56. Set<Object> info = redisTemplate.boundHashOps("info").keys();
    57. System.out.println(info);
    58. Long info1 = redisTemplate.boundHashOps("info").size();
    59. }
    60. /**
    61. * 获取所有value
    62. * hvals key
    63. */
    64. @Test
    65. public void hvals() {
    66. // hkeys key
    67. List<Object> info = redisTemplate.boundHashOps("info").values();
    68. System.out.println(info);
    69. }
    70. /**
    71. * 不存在则 put
    72. * hexists key field
    73. */
    74. @Test
    75. public void putIfAbsent() {
    76. // hexists info name
    77. Boolean aBoolean = redisTemplate.boundHashOps("info").putIfAbsent("name", "king");
    78. System.out.println(aBoolean);
    79. }
    80. /**
    81. * 获取多个key的值
    82. * hmget key field field1
    83. */
    84. @Test
    85. public void multiGet() {
    86. // hmget key name address
    87. List<Object> keys = new ArrayList<>(Arrays.asList("name", "address"));
    88. List info = redisTemplate.boundHashOps("info").multiGet(keys);
    89. System.out.println(info);
    90. }
    91. }

    3、操作 List 类型

    redisTemplate.boundListOps,需要先绑定数据类型 List

    1. @SpringBootTest
    2. public class TestList {
    3. @Autowired
    4. private StringRedisTemplate redisTemplate;
    5. /**
    6. * 左添加
    7. */
    8. @Test
    9. public void leftPush() {
    10. // lpush address 1 2 3 4
    11. redisTemplate.boundListOps("address").leftPush("china");
    12. redisTemplate.boundListOps("address").leftPush("japan");
    13. redisTemplate.boundListOps("address").leftPush("usa");
    14. redisTemplate.boundListOps("address").leftPushAll("aa","bb","cc");
    15. }
    16. /**
    17. * 右添加
    18. */
    19. @Test
    20. public void rightPush() {
    21. // rpush address 1 2 3 4
    22. redisTemplate.boundListOps("address").rightPush("dd");
    23. redisTemplate.boundListOps("address").rightPushAll("11","22","33");
    24. }
    25. /**
    26. * 查看指定范围的数据
    27. * 如果是
    28. */
    29. @Test
    30. public void rang() {
    31. // lrange key 0 0
    32. List<String> address = redisTemplate.boundListOps("address").range(0, 0);
    33. // lrange key 0 -1 返回所有
    34. List<String> all = redisTemplate.boundListOps("address").range(0, -1);
    35. System.out.println(address);
    36. System.out.println(all);
    37. }
    38. /**
    39. * 左弹出,一次一个
    40. */
    41. @Test
    42. public void leftPop() {
    43. // lpop key value
    44. String address = redisTemplate.boundListOps("address").leftPop();
    45. System.out.println(address);
    46. }
    47. /**
    48. * 右弹出,一次一个
    49. */
    50. @Test
    51. public void rightPop() {
    52. // rpop key value
    53. String address = redisTemplate.boundListOps("address").leftPop();
    54. System.out.println(address);
    55. }
    56. /**
    57. * 根据位置查找某个值
    58. */
    59. @Test
    60. public void searchByIndex() {
    61. String address = redisTemplate.boundListOps("address").index(1);
    62. System.out.println(address);
    63. }
    64. /**
    65. * 删除指定缓存
    66. */
    67. @Test
    68. public void delete() {
    69. // lrem key count value
    70. redisTemplate.boundListOps("address").remove(1, "china");
    71. }
    72. }

    4、操作 Set 类型

    redisTemplate.boundSetOps,需要先绑定数据类型 set

    1. @SpringBootTest
    2. public class TestSet {
    3. @Autowired
    4. private StringRedisTemplate redisTemplate;
    5. /**
    6. * 新建,set自动去重
    7. * sadd key value
    8. */
    9. @Test
    10. public void add() {
    11. // sadd key value
    12. redisTemplate.boundSetOps("name").add("king", "super");
    13. redisTemplate.boundSetOps("name").add("pig");
    14. redisTemplate.boundSetOps("address").add("china", "usa");
    15. }
    16. /**
    17. * 取出所有值
    18. */
    19. @Test
    20. public void members() {
    21. Set<String> name = redisTemplate.boundSetOps("name").members();
    22. System.out.println(name);
    23. }
    24. /**
    25. * 判断元素 king 是否在集合set(name)中
    26. * sismember key value
    27. */
    28. @Test
    29. public void sismember() {
    30. // sismember name king
    31. Boolean aBoolean = redisTemplate.boundSetOps("name").isMember("king");
    32. System.out.println(aBoolean);
    33. }
    34. /**
    35. * 删除所有值
    36. * srem key value
    37. */
    38. @Test
    39. public void deleteValue() {
    40. // srem name pig
    41. redisTemplate.boundSetOps("name").remove("pig");
    42. }
    43. /**
    44. * 获取集合中的元素数量
    45. * scard key
    46. */
    47. @Test
    48. public void scard() {
    49. // scard
    50. Long size = redisTemplate.boundSetOps("name").size();
    51. System.out.println(size);
    52. }
    53. /**
    54. * 随机获取集合中元素的count数
    55. * srandmember key count
    56. */
    57. @Test
    58. public void srandmember() {
    59. redisTemplate.boundSetOps("name").getOperations().discard();
    60. }
    61. }

    5、操作 ZSet 类型

    redisTemplate.boundZSetOps,需要先绑定数据类型 zset

    1. @SpringBootTest
    2. public class TestZset {
    3. @Autowired
    4. private StringRedisTemplate redisTemplate;
    5. /**
    6. * 添加元素
    7. * zadd key [NX|XX] [CH] [INCR] score member [score member ...]
    8. */
    9. @Test
    10. public void add() {
    11. // zadd name 1000 "king"
    12. redisTemplate.boundZSetOps("name").add("king", 1000);
    13. redisTemplate.boundZSetOps("name").add("supking", 2000);
    14. redisTemplate.boundZSetOps("name").add("zhangsan", 1500);
    15. }
    16. /**
    17. * 返回分数在min到max之间的元素个数
    18. */
    19. @Test
    20. public void count() {
    21. // zcount key min max
    22. Long count = redisTemplate.boundZSetOps("name").count(1000, 1800);
    23. System.out.println(count);
    24. }
    25. /**
    26. * 获取集合中元素的个数
    27. */
    28. @Test
    29. public void zcard() {
    30. // zcard name
    31. Long count = redisTemplate.boundZSetOps("name").zCard();
    32. System.out.println(count);
    33. }
    34. /**
    35. * 返回 分数在[mix,max]之间(闭区间) 的元素
    36. */
    37. @Test
    38. public void rangeByScoreAndReverse() {
    39. // zrangebyscore name 1000 1800(从小到大)
    40. Set<String> strings = redisTemplate.boundZSetOps("name").rangeByScore(1000, 2000);
    41. // 从大到小
    42. Set<String> strings1 = redisTemplate.boundZSetOps("name").reverseRangeByScore(1000, 2000);
    43. System.out.println(strings);
    44. System.out.println(strings1);
    45. }
    46. /**
    47. * 查询 位置在 0,1的元素
    48. * 顺序反转
    49. */
    50. @Test
    51. public void rangeAndReverse() {
    52. // zrange name 0 1 (分数从小到大)
    53. Set<String> strings = redisTemplate.boundZSetOps("name").range(0, 1);
    54. System.out.println(strings);
    55. // 顺序反转(分数 从大到小)
    56. Set<String> strings1 = redisTemplate.boundZSetOps("name").reverseRange(0, 1);
    57. System.out.println(strings1);
    58. }
    59. /**
    60. * 指定移除元素
    61. */
    62. @Test
    63. public void remove() {
    64. // zrem name king
    65. Long remove = redisTemplate.boundZSetOps("name").remove("king");
    66. System.out.println(remove);
    67. }
    68. /**
    69. * 增加分数
    70. */
    71. @Test
    72. public void addScore() {
    73. // zadd name INCR 2000 king
    74. Double aDouble = redisTemplate.boundZSetOps("name").incrementScore("king", 2000);
    75. System.out.println(aDouble);
    76. }
    77. }