RedisTemplate及其相关方法

本文涉及的产品
云原生内存数据库 Tair,内存型 2GB
云数据库 Redis 版,社区版 2GB
推荐场景:
搭建游戏排行榜
云数据库 Redis 版,经济版 1GB 1个月
简介: RedisTemplate及其相关方法

1、Spring封装了RedisTemplate对象来进行对Redis的各种操作,它支持所有的Redis原生的api。RedisTemplate位于spring-data-redis包下。RedisTemplate提供了redis各种操作、异常处理及序列化,支持发布订阅,并对spring 3.1 cache进行了实现。

pom文件中引入相关依赖:

<!-- redis 缓存操作 -->
<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-data-redis</artifactId>
</dependency>

2、spring-data-redis针对jedis提供了如下功能:

1.连接池自动管理,提供了一个高度封装的“RedisTemplate”类

2.针对jedis客户端中大量api进行了归类封装,将同一类型操作封装为operation接口


ValueOperations:简单K-V操作

ListOperations:针对list类型的数据操作

SetOperations:set类型数据操作

HashOperations:针对map类型的数据操作

ZSetOperations:zset类型数据操作


3.RedisTemplate中定义了对5种数据结构操作

redisTemplate.opsForValue();//操作字符串
redisTemplate.opsForHash();//操作hash
redisTemplate.opsForList();//操作list
redisTemplate.opsForSet();//操作set
redisTemplate.opsForZSet();//操作有序set

其实这里的ops相当于options, 是RedisTemplate对各种不同的Redis数据类型进行操作。其实还有另外的方法:

redistempalate.boundValueOps
redistempalate.boundSetOps
redistempalate.boundListOps
redistempalate.boundHashOps
redistempalate.boundZSetOps

opsForXXX和boundXXXOps的区别?


XXX为value的类型,前者获取一个operator,但是没有指定操作的对象(key),可以在一个连接(事务)内操作多个key以及对应的value;后者获取了一个指定操作对象(key)的operator,在一个连接(事务)内只能操作这个key对应的value。


关于计数的API(increment)有一个bug,需要各位使用中注意,通过increment计数以后,通过get方式获取计数值的时候可能会抛出EOF异常(和本地的jdk以及redis的编译版本有关),可以考虑使用boundValueOps(key).get(0,-1)获取计数值。


三.RedisTemplate操作Redis数据库的具体例子

1.值类型操作:

@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(locations="classpath:spring/applicationContext-redis.xml")
public class TestValue {
  @Autowired
  private RedisTemplate redisTemplate;  
  @Test
  public void setValue(){
  //存值,针对值类型,ops相当于options
  redisTemplate.boundValueOps("name").set("itcast");  
  } 
  @Test
  public void getValue(){
  String str = (String) redisTemplate.boundValueOps("name").get();
  System.out.println(str);
  } 
  @Test
  public void deleteValue(){
  redisTemplate.delete("name");
  } 
}

2.集合类型操作之Set类型,无序,即存取顺序不一定相同

@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(locations="classpath:spring/applicationContext-redis.xml")
public class TestSet {
  @Autowired
  private RedisTemplate redisTemplate;
  /**
  * 存入值
  */
  @Test
  public void setValue(){
  redisTemplate.boundSetOps("nameset").add("曹操");  
  redisTemplate.boundSetOps("nameset").add("刘备"); 
  redisTemplate.boundSetOps("nameset").add("孙权");
  }
  /**
  * 提取值
  */
  @Test
  public void getValue(){
  Set members = redisTemplate.boundSetOps("nameset").members();
  System.out.println(members);
  }
  /**
  * 删除集合中的某一个值
  */
  @Test
  public void deleteValue(){
  redisTemplate.boundSetOps("nameset").remove("孙权");
  }
  /**
  * 删除整个集合
  */
  @Test
  public void deleteAllValue(){
  redisTemplate.delete("nameset");
  }
}

输出结果:[孙权, 刘备, 曹操],此外,set类型的元素也不可重复。当set没有值的时候,会返回一个[]

3.List类型操作

list类型分为两种,一种是左压栈,一种是右压栈

1.右压栈:

/**
 * 右压栈:后添加的对象排在后边,相当于队列,相当于先进先出
 */
@Test
public void testSetValue1(){  
  redisTemplate.boundListOps("namelist1").rightPush("刘备");
  redisTemplate.boundListOps("namelist1").rightPush("关羽");
  redisTemplate.boundListOps("namelist1").rightPush("张飞");  
}
/**
 * 显示右压栈集合,range 表示查询的索引,从第几个查到第几个,如果想查询所有的数的话只能将第二个数写得大一点。
 */
@Test
public void testGetValue1(){
  List list = redisTemplate.boundListOps("namelist1").range(0, 10);
  System.out.println(list);
}

运行结果:[刘备, 关羽, 张飞],元素可以重复

2.左压栈:

/**
 * 左压栈:后添加的对象排在前边,相当于栈,先进后出
 */
@Test
public void testSetValue2(){  
  redisTemplate.boundListOps("namelist2").leftPush("刘备");
  redisTemplate.boundListOps("namelist2").leftPush("关羽");
  redisTemplate.boundListOps("namelist2").leftPush("张飞");  
}
/**
 * 显示左压栈集合
 */
@Test
public void testGetValue2(){
  List list = redisTemplate.boundListOps("namelist2").range(0, 10);
  System.out.println(list);
}

运行结果:[张飞, 关羽, 刘备]

3.根据索引查询元素

/**
 * 查询集合某个元素
 */
@Test
public void testSearchByIndex(){
  String s = (String) redisTemplate.boundListOps("namelist1").index(1);
  System.out.println(s);
}

运行结果:返回索引为1的元素

4.移除某个元素的值

/**
 * 移除集合某个元素,其中remove中第一个参数是移除的个数
 */
@Test
public void testRemoveByIndex(){
  redisTemplate.boundListOps("namelist1").remove(1, "关羽");
}

这里表示移除一个“关羽”。

4.Hash类型操作

@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(locations = "classpath:spring/applicationContext-redis.xml")
public class TestHash {
    @Autowired
    private RedisTemplate redisTemplate;
    //    存值
    @Test
    public void testSetValue() {
        redisTemplate.boundHashOps("namehash").put("a", "唐僧");
        redisTemplate.boundHashOps("namehash").put("b", "悟空");
        redisTemplate.boundHashOps("namehash").put("c", "八戒");
        redisTemplate.boundHashOps("namehash").put("d", "沙僧");
    }
    //获取所有的key
    @Test
    public void testGetKeys() {
        Set s = redisTemplate.boundHashOps("namehash").keys();
        System.out.println(s);
    }
    //    获取所有的value
    @Test
    public void testGetValues() {
        List values = redisTemplate.boundHashOps("namehash").values();
        System.out.println(values);
    }
    //    根据key获取值
    @Test
    public void testGetValueByKey() {
        Object object = redisTemplate.boundHashOps("namehash").get("b");
        System.out.println(object);
    }
    //根据key移除值
    @Test
    public void testRemoveValueByKey() {
        redisTemplate.boundHashOps("namehash").delete("c");
    }
}

四.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查看的时候,你会看到你的数据不是以可读的形式展现的,而是以字节数组显示,类似下面

当然从Redis获取数据的时候也会默认将数据当做字节数组转化,这样就会导致一个问题,当需要获取的数据不是以字节数组存在redis当中而是正常的可读的字符串的时候,比如说下面这种形式的数据



相关实践学习
基于Redis实现在线游戏积分排行榜
本场景将介绍如何基于Redis数据库实现在线游戏中的游戏玩家积分排行榜功能。
云数据库 Redis 版使用教程
云数据库Redis版是兼容Redis协议标准的、提供持久化的内存数据库服务,基于高可靠双机热备架构及可无缝扩展的集群架构,满足高读写性能场景及容量需弹性变配的业务需求。 产品详情:https://www.aliyun.com/product/kvstore &nbsp; &nbsp; ------------------------------------------------------------------------- 阿里云数据库体验:数据库上云实战 开发者云会免费提供一台带自建MySQL的源数据库&nbsp;ECS 实例和一台目标数据库&nbsp;RDS实例。跟着指引,您可以一步步实现将ECS自建数据库迁移到目标数据库RDS。 点击下方链接,领取免费ECS&amp;RDS资源,30分钟完成数据库上云实战!https://developer.aliyun.com/adc/scenario/51eefbd1894e42f6bb9acacadd3f9121?spm=a2c6h.13788135.J_3257954370.9.4ba85f24utseFl
目录
相关文章
|
1月前
|
存储 数据可视化
RedisTemplate中opsForValue()中的方法
RedisTemplate中opsForValue()中的方法
|
1月前
|
存储 NoSQL Redis
redisTemplate.opsForHash()
redisTemplate.opsForHash()
|
1月前
|
存储 NoSQL Java
redisTemplate.opsForValue() 懂这些就够了
redisTemplate.opsForValue() 懂这些就够了
171 0
|
1月前
|
存储 JSON NoSQL
[Redis]——RedisTemplate的两种序列化方式
[Redis]——RedisTemplate的两种序列化方式
145 0
|
9月前
|
缓存 Dart NoSQL
Jedis和RedisTemplate 1
Jedis和RedisTemplate
93 0
|
1月前
|
存储 NoSQL Redis
RedisTemplate常用方法总结
RedisTemplate常用方法总结
|
9月前
|
缓存 Dart Java
Jedis和RedisTemplate 2
Jedis和RedisTemplate
41 0
|
10月前
|
NoSQL Java Redis
RedisTemplate的RedisSerializer(序列化)
RedisTemplate的RedisSerializer(序列化)
76 0
|
10月前
|
存储 NoSQL Redis
redisTemplate.opsForValue().get(KEY)从Redis中取出的值为null 的解决方法
redisTemplate.opsForValue().get(KEY)从Redis中取出的值为null 的解决方法
365 0
|
NoSQL Redis
RedisTemplate和StringRedisTemplate
RedisTemplate和StringRedisTemplate