Redis是key-value存储的非关系型数据库。Spring Data Redis包含了多个模板实现,用来完成Redis数据库的数据存取功能。

1、如何连接Redis?

Spring Data Redis提供了JedisConnectFactory连接工厂(不止这一个)

  1. <bean id="jedisConnectionFactory" class="org.springframework.data.redis.connection.jedis.JedisConnectionFactory">
  2. <property name="hostName" value="192.168.1.106"></property>
  3. </bean>

2、使用模板

  Spring Data Redis提供了RedisTemplate 和 StringRedisTemplate模板。模板封装了对redis的操作,提供了较高级的数据访问方案。从名字可以看出后者只关注字符串类型,当redis的key和value都是字符串时候建议使用StringRedisTemplate。

RedisTemplate的很多功能以子API的形式提供,他们区分了单个值和集合值得场景。

  1. package com.cn.util;
  2. import org.springframework.beans.factory.annotation.Autowired;
  3. import org.springframework.data.redis.core.RedisTemplate;
  4. import org.springframework.stereotype.Component;
  5. import java.util.List;
  6. import java.util.Set;
  7. @Component
  8. public class JedisUtil {
  9. @Autowired
  10. private RedisTemplate<String, Object> redisTemplate;
  11. //字符串
  12. public void setStr(String key, Object value){
  13. redisTemplate.opsForValue().set(key, value);
  14. }
  15. public Object getStr(String key){
  16. return redisTemplate.opsForValue().get(key);
  17. }
  18. //list集合
  19. public void lpush(String key, Object value){
  20. redisTemplate.opsForList().leftPush(key, value);
  21. }
  22. public Object lpop(String key){
  23. return redisTemplate.opsForList().leftPop(key);
  24. }
  25. public List<Object> lrange(String key, long start , long end){
  26. return redisTemplate.opsForList().range(key, start, end);
  27. }
  28. //set集合
  29. public void addSet(String key, String value){
  30. redisTemplate.opsForSet().add(key, value);
  31. }
  32. public Set<Object> getSet(String key){
  33. return redisTemplate.opsForSet().members(key);
  34. }
  35. //hash集合
  36. public void hset(String key, String key1, String value){
  37. redisTemplate.opsForHash().put(key, key1, value);
  38. }
  39. public Object hget(String key, String key1){
  40. return redisTemplate.opsForHash().get(key, key1);
  41. }
  42. public Set<Object> getKeys(String key){
  43. return redisTemplate.opsForHash().keys(key);
  44. }
  45. }

测试类

  1. @RunWith(SpringJUnit4ClassRunner.class)
  2. @ContextConfiguration(locations = {"classpath:springMvc.xml", "classpath:spring-source.xml"})
  3. public class JedisUtilTest {
  4. @Autowired
  5. private JedisUtil jedisUtil;
  6. @Test
  7. public void setStr() throws Exception {
  8. jedisUtil.setStr("shoudu","beijing");
  9. }
  10. @Test
  11. public void getStr() throws Exception {
  12. Object obj=jedisUtil.getStr("shoudu");
  13. System.out.println(obj);
  14. }
  15. @Test
  16. public void lpush() throws Exception {
  17. jedisUtil.lpush("testlist",new User("ii","ll"));
  18. }
  19. @Test
  20. public void lpop() throws Exception {
  21. Object obj= jedisUtil.lpop("testlist");
  22. System.out.println(obj);
  23. }
  24. @Test
  25. public void lrange() throws Exception {
  26. List<Object> list=jedisUtil.lrange("testlist", 0 , -1);
  27. System.out.println(list);
  28. }
  29. @Test
  30. public void addSet() throws Exception {
  31. jedisUtil.addSet("testset", "jj2");
  32. }
  33. @Test
  34. public void getSet() throws Exception {
  35. Object obj = jedisUtil.getSet("testset");
  36. System.out.println(obj);
  37. }
  38. @Test
  39. public void hset() throws Exception {
  40. jedisUtil.hset("testhash", "name", "liming");
  41. }
  42. @Test
  43. public void hget() throws Exception {
  44. Object obj=jedisUtil.hget("testhash","name");
  45. System.out.println(obj);
  46. }
  47. @Test
  48. public void getKeys() throws Exception {
  49. Set<Object> keys=jedisUtil.getKeys("testhash");
  50. System.out.println(keys);
  51. }
  52. @Test
  53. public void muchOps() throws Exception{
  54. BoundHashOperations<String, String, Object> boundHashOperations=
  55. jedisUtil.redisTemplate.boundHashOps("testhash");
  56. String str=boundHashOperations.getKey();
  57. System.out.println(str);
  58. Object obj=boundHashOperations.get("name");
  59. System.out.println(obj);
  60. boundValueOperations.put("age",123);
  61. boundValueOperations.put("school","beida");
  62. Set<String> keys=boundHashOperations.keys();
  63. System.out.println(keys);
  64. }
  65. }

  以上测试方法,仅仅测试了每种redis数据类型的部分方法。注意,最后muchOps()测试方法,redisTemplate提供绑定key(此处为hash类型的key,其它类型类似)的方式执行操作,整个方法中仅仅一个地方使用了key,即jedisUtil.redisTemplate.boundHashOps(“testhash”),对返回的boundValueOperations执行的所有操作都会应用到这个key上。

3、使用key和value的序列化器

当某个key-value条目保存到Redis存储时候,key和value都会使用Redis序列化器进行序列化。Spring Date Redis 提供了多个序列化器:

1)JdkSerializationRedisSerializer:POJO对象的存取场景,使用JDK本身序列化机制,将pojo类通过ObjectInputStream/ObjectOutputStream进行序列化操作,最终redis-server中将存储字节序列。是目前最常用的序列化策略。
2)StringRedisSerializer:Key或者value为字符串的场景,根据指定的charset对数据的字节序列编码成string,是“new String(bytes, charset)”和“string.getBytes(charset)”的直接封装。是最轻量级和高效的策略。
3)JacksonJsonRedisSerializer:jackson-json工具提供了javabean与json之间的转换能力,可以将pojo实例序列化成json格式存储在redis中,也可以将json格式的数据转换成pojo实例。因为jackson工具在序列化和反序列化时,需要明确指定Class类型,因此此策略封装起来稍微复杂。【需要jackson-mapper-asl工具支持】
4)OxmSerializer:提供了将javabean与xml之间的转换能力,目前可用的三方支持包括jaxb,apache-xmlbeans;redis存储的数据将是xml工具。不过使用此策略,编程将会有些难度,而且效率最低;不建议使用。【需要spring-oxm模块的支持

  • RedisTemplate中需要声明4种serializer,默认为“JdkSerializationRedisSerializer”:

    a) keySerializer :对于普通K-V操作时,key采取的序列化策略
    b) valueSerializer:value采取的序列化策略
    c) hashKeySerializer: 在hash数据结构中,hash-key的序列化策略
    d) hashValueSerializer:hash-value的序列化策略

  • StringRedisTemplate也需要申明4中serializer,但是默认为“StringRedisSerializer”;

 

版权声明:本文为shixiemayi原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://www.cnblogs.com/shixiemayi/p/9573819.html