创建工程,引入坐标
<!-- 缓存 -->
<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提供如下几种序列化器:
- StringRedisSerializer: 简单的字符串序列化
- GenericToStringSerializer: 可以将任何对象泛化为字符串并序列化
- Jackson2JsonRedisSerializer: 序列化对象为json字符串
- GenericJackson2JsonRedisSerializer:功能同上,但是更容易反序列化
- OxmSerializer: 序列化对象为xml字符串
- 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