SpringData Redis的使用

创建工程,引入坐标

        <!-- 缓存 -->
        <dependency>
            <groupId>redis.clients</groupId>
            <artifactId>jedis</artifactId>
            <version>2.8.1</version>
        </dependency>
        <dependency>
            <groupId>org.springframework.data</groupId>
            <artifactId>spring-data-redis</artifactId>
            <version>1.7.2.RELEASE</version>
        </dependency>

 

创建配置文件

<?xml version="1.0" encoding="UTF-8"?> 
<beans xmlns="http://www.springframework.org/schema/beans" 
  xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:p="http://www.springframework.org/schema/p" 
  xmlns:context="http://www.springframework.org/schema/context" 
  xmlns:mvc="http://www.springframework.org/schema/mvc" 
  xmlns:cache="http://www.springframework.org/schema/cache"
  xsi:schemaLocation="http://www.springframework.org/schema/beans   
            http://www.springframework.org/schema/beans/spring-beans.xsd   
            http://www.springframework.org/schema/context   
            http://www.springframework.org/schema/context/spring-context.xsd   
            http://www.springframework.org/schema/mvc   
            http://www.springframework.org/schema/mvc/spring-mvc.xsd 
            http://www.springframework.org/schema/cache  
            http://www.springframework.org/schema/cache/spring-cache.xsd">  
  
   <context:property-placeholder location="classpath*:properties/*.properties" />   
  
   <!-- redis 相关配置 --> 
   <bean id="poolConfig" class="redis.clients.jedis.JedisPoolConfig">  
     <property name="maxIdle" value="${redis.maxIdle}" />   
     <property name="maxWaitMillis" value="${redis.maxWait}" />  
     <property name="testOnBorrow" value="${redis.testOnBorrow}" />  
   </bean>  
  
   <bean id="JedisConnectionFactory" class="org.springframework.data.redis.connection.jedis.JedisConnectionFactory" 
       p:host-name="${redis.host}" p:port="${redis.port}" p:password="${redis.pass}" p:pool-config-ref="poolConfig"/>  
   
   <bean id="redisTemplate" class="org.springframework.data.redis.core.RedisTemplate">  
        <property name="connectionFactory" ref="JedisConnectionFactory" />  
   </bean>  
      
</beans>

 

创建测试类,完成一条简单数据的存取

@RunWith(SpringJunit4ClassRunner.class)
@ContextConfiguration("classpath:spring/applicationContext-redis.xml")
public class SpringDataRedis{
    @Autowired
    private RedisTemplate redisTemplate;


   //测试代码区
    @Test
    public void test0() {
        //存入数据
        redisTemplate.opsForValue().set("name", "heima");
        //查询数据
        String name = (String) redisTemplate.opsForValue().get("name");
        System.out.println(name);
    }

}

 

 

这时候会发现,存入的数据并不是简单的字符串,而是一些类似于二进制的数据,这是怎么回事呢?

原来,SpringData Redis在保存数据的时候,底层有一个序列化器在工作,它会将要保存的数据 (键和值)按照一定的规则进行序列化操作后再进行存储。

spring-data-redis提供如下几种序列化器:

  1. StringRedisSerializer: 简单的字符串序列化
  2. GenericToStringSerializer: 可以将任何对象泛化为字符串并序列化
  3. Jackson2JsonRedisSerializer: 序列化对象为json字符串
  4. GenericJackson2JsonRedisSerializer:功能同上,但是更容易反序列化
  5. OxmSerializer: 序列化对象为xml字符串
  6. JdkSerializationRedisSerializer: 序列化对象为二进制数据

RedisTemplate默认使用的是JdkSerializationRedisSerializer对数据进行序列化。 那么如何选择自己想要的序列化器呢?SpringData提供了两种方式:

1. 通过配置文件配置

<!--redisTemplate-->
<bean id="redisTemplate"
class="org.springframework.data.redis.core.RedisTemplate">
    <property name="connectionFactory" ref="jedisConnectionFactory"/>
    <!--指定非hash类型的数据序列化器-->
    <property name="keySerializer">
        <bean
        class="org.springframework.data.redis.serializer.StringRedisSerializer"/>
    </property>
    <property name="valueSerializer">
        <bean
        class="org.springframework.data.redis.serializer.StringRedisSerializer"/>
    </property>
</bean>

2. 通过RedisTemplate设定

public void test1() {
    redisTemplate.setKeySerializer(new StringRedisSerializer());
    redisTemplate.setValueSerializer(new StringRedisSerializer());
    //存入数据
    redisTemplate.opsForValue().set("name", "heima");
    //查询数据
    String name = (String) redisTemplate.opsForValue().get("name");
    System.out.println(name);
}

 

常见操作

1、String类型的数据存取

1.1 set进一个值

@Test
public void testSet(){
    redisTemplate.boundValueOps("str").set("我是被存储的字符串!");
}

1.2 get到一个值

@Test
public void testGet(){
    String result=redisTemplate.boundValueOps("str").get();
    System.out.println(result);
}

1.3 delete一个key及其它所指向的值,所有类型都可以用

@Test
public void testDelete(){
    //此操作执行之后再获取该key指向的值时Java中的代码得到的时null
    redisTemplate.delete("str");
}

拓展:redis中设置键值的存活时间

2、Hash类型的存取

2.1 put一个值到HashMap中

@Test
public void testPush(){
    //Hash类型其实就是HashMap
  redisTemplate.boundHashOps("group").put("member1","HUAWEI");
  redisTemplate.boundHashOps("group").put("member2","Alibaba");
}

2.2 get到一个指定key的值

@Test
public void testGet(){
    //所有存到redis中的对象全部需要序列化,并且取值时需要强转成自己需要的类型
    String member1=(String)redisTemplate.boundHashOps("group").get("member1");
    String member2=(String)redisTemplate.boundHashOps("group").get("member2");
    System.out.println(member1);
    System.out.println(member2);
}

2.3 获取被绑定key的所有键/大小/全部值

@Test
public void testApi(){
    redisTemplate.boundHashOps("group").keys();//返回一个Set,因为不允许重复
    redisTemplate.boundHashOps("group").values();//返回一个List,因为可以重复
    redisTemplate.boundHashOps("group").size();//返回一个Long数值
}

2.4 从Hash中删除键值

@Test
public void testDelete(){
    redisTemplate.boundHashOps("group").delete("member1");//删除指定成员的键值
    redisTemplate.boundHashOps("group").delete();//删除Hash中指定key下的所有值
}

3、List类型的存取

3.1 push一个值到List中

@Test
public void testPush(){
    redisTemplate.boundListOps("hero").leftPush("乔峰");
    redisTemplate.boundListOps("hero").leftPush("扫地僧");
    redisTemplate.boundListOps("hero").leftPush("孙悟空");
}

3.2 pop出一个值

@Test
public void testPop(){
    redisTemplate.boundListOps("hero").rightPop();//此操作执行之后会从list中删除一个
    redisTemplate.boundListOps("hero").rightPop(1,TimeUnit枚举变量);//每一个间隔弹一个
    redisTemplate.boundListOps("hero").range(0,-1);//返回所有的值,但是不清除
}

3.3 remove删除操作

@Test
public void testRemove(){
   
    //redisTemplate.delete("hero");//这是删除全部的值
    redisTemplate.boundListOps("hero").remove(删除个数,要被删除的值);//有API可以设置删除的方向
}

4、Set类型的存取

4.1 add实现添加值

@Test
public void testAdd(){
    //set不准有重复的key
    redisTemplate.boundSetOps("character").add("孙行者");
    redisTemplate.boundSetOps("character").add("孙行者");
    redisTemplate.boundSetOps("character").add("猪悟能");
    redisTemplate.boundSetOps("character").add("沙悟净");
    redisTemplate.boundSetOps("character").add("孙悟空");
    redisTemplate.boundSetOps("character").add("唐玄奘");
}

4.2 获取Set里面的值

 

@Test
public void testMember(){
    Set<String> characters=redisTemplate.boundSetOps("character").members();//会返回一个Set
    for(String character : characters){
        System.out.println(s);
    }
    
    Boolean member=redisTemplate.boundSetOps("character").isMember("如来");
    //还有api如,取出一个随机的值randomMember(),取出两个diff差集。另外set也可以pop()一个值出来。
}

4.3 remove指定删除

@Test
public void testRemove(){
    redisTemplate.boundSetOps("character").remove("唐玄奘");//删除指定的值
    redisTemplate.boundSetOps("character").delete();//清空所有
}

5、ZSet类型的存取

ZSet的有序是依据分值实现的,相当于权值。

5.1 add值到ZSet中

@Test
public void testAdd(){
    //key相同时为修改更新
    redisTemplate.boundZSetOps("role").add("人民",10);
    redisTemplate.boundZSetOps("role").add("公民",20);
    redisTemplate.boundZSetOps("role").add("官员",30);
    redisTemplate.boundZSetOps("role").add("洋人",40);
} 

 

5.2 range取出所有的值

返回值仍为Set

@Test
public void testRange(){
    //不带分值的获取
    Set<String> roles= redisTemplate.boundZSetOps("role").range(0,,-1);
    for(String role:roles){
        System.out.println(role);
    }
    //不带分的获取全部
    Set<TypedTupl> rolesTypeTupl=redisTemplate.boundZSetOps("role").rangeWithScore(0,-1)//指定获取的所有
    for(TypedTupl role : rolesTypeTupl){
        System.out.println(role.getValue+"@@@@@@"+role.getScore());
    }
    //带分的获取
    Set<TypedTupl> rolesTypeTuplWithScore=redisTemplate.boundZSetOps("role").rangeByScoreWithScore(10,40)//指定score范围
    for(TypedTupl role : rolesTypeTuplWithScore){
        System.out.println(role.getValue+"@@@@@@"+role.getScore());
    }
    
}

 

拓展:

1、redis的增、删、改、查中对于修改操作,在redis中key值相同时增加既是修改。

2、设置key的存活【expire(Long unit,TimeUnit timeUnit)//是枚举变量】

---【完】---

拓展:在redis客户端(黑窗口)操作redis的基本命令

参考:https://juejin.im/post/5ad6e4066fb9a028d82c4b66

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值