文档章节

Redis+Springboot

文心丶雕龙
 文心丶雕龙
发布于 2017/09/09 18:35
字数 1153
阅读 30
收藏 0

Redis 的介绍

    Redis是当前比较热门的NOSQL系统之一,它是一个key-value存储系统。和Memcache类似,但很大程度补偿了Memcache的不足,它支持存储的value类型相对更多,包括string、list、set、zset和hash。这些数据类型都支持push/pop、add/remove及取交集并集和差集及更丰富的操作。在此基础上,Redis支持各种不同方式的排序。

集成

1 引入maven依赖

<dependency>

<groupId>org.springframework.boot</groupId>

<artifactId>spring-boot-starter-redis</artifactId>

</dependency>

2 编写config文件

@Configuration

public class RedisConfig {

@Bean

public RedisTemplate<String, Object> redisTemplate(RedisConnectionFactory factory){

Jackson2JsonRedisSerializer<Object> jackson2JsonRedisSerializer = new Jackson2JsonRedisSerializer<Object>(Object.class);

ObjectMapper om = new ObjectMapper();

om.setVisibility(PropertyAccessor.ALL, JsonAutoDetect.Visibility.ANY);

om.enableDefaultTyping(ObjectMapper.DefaultTyping.NON_FINAL);

jackson2JsonRedisSerializer.setObjectMapper(om);

RedisTemplate<String, Object> template = new RedisTemplate<String, Object>();

template.setConnectionFactory(factory);

template.setKeySerializer(jackson2JsonRedisSerializer);

template.setValueSerializer(jackson2JsonRedisSerializer);

template.setHashKeySerializer(jackson2JsonRedisSerializer);

template.setHashValueSerializer(jackson2JsonRedisSerializer);

template.afterPropertiesSet();

return template;

}

}

注: 若存入的key和value都要是字符串类型,则可以使用RedisTemplate的继承类StringRedisTemplate来操作redis

StringRedisTemplate template = new StringRedisTemplate(factory);

3 配置

.yml文件的配置

spring:

redis:

database: 0

host: 127.0.0.1

port: 6379

pool:

max-active: 8

.properties文件的配置

spring.redis.database: 0 // redis中第几个数据库

spring.redis.host: 127.0.0.1 // redis的ip

spring.redis.port: 6379 //redis的port

spring.redis.pool.max-active: 8//redis连接池最大可连接数

4使用

由于spring中的有可以依赖注入,我们在RedisConfig中也是使用@Bean进行注入的,使用的时候就可以直接注入使用:

@Autowired

private RedisTemplate<String, Object> redisTemplate;

 

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

redisTemplate.opsForValue();//操作字符串

redisTemplate.opsForHash();//操作hash

redisTemplate.opsForList();//操作list

redisTemplate.opsForSet();//操作set

redisTemplate.opsForZSet();//操作有序set

字符串的操作

增:

-- 单条记录的增加

@Test

public void opsForValue_set(){

String key = "1";

String value = "文心雕龙";

ValueOperations<String, Object> opsForValue = redisTemplate.opsForValue();

opsForValue.set(key, value);

}

也可以链式操作:redisTemplate.opsForValue().set(key, value);

-- 多条记录的增加

@Test

public void opsForValue_mutlSet(){

Map<String,String> map = new HashMap<>();

map.put("2", "白首不離");

map.put("3", "紫色的风");

redisTemplate.opsForValue().multiSet(map);

}

查:

-- 单条记录的查询

@Test

public void opsForValue_get(){

String key = "1";

Object value = redisTemplate.opsForValue().get(key);

System.out.println(key+"的value值是:"+value);

}

打印结果:1的value值是:文心雕龙

-- 多条记录的查询

@Test

public void opsForValue_multGet(){

List<String> keys = new ArrayList<>();

keys.add("1");

keys.add("2");

List<Object> list = redisTemplate.opsForValue().multiGet(keys);

for (int i = 0; i < list.size(); i++) {

System.out.println(keys.get(i)+"的value值是:"+list.get(i));

}

}

打印结果:

1的value值是:文心雕龙

2的value值是:白首不離

redis的修改本质上是用同一个key将原来的value用新的value值覆盖,所以应该拿到原来的value进行修改,然后set进去

@Test

public void opsForValue_update(){

String str_v = (String) redisTemplate.opsForValue().get("1");

str_v+="在码字中";

redisTemplate.opsForValue().set("1", str_v);

System.out.println("1修改后的的value值是:"+redisTemplate.opsForValue().get("1") );

}

打印结果:1修改后的的value值是:文心雕龙在码字中

删前的keys

@Test

public void opsForValue_del(){

redisTemplate.delete("1");

}

删后的keys

判断

-- 判断某个key是否存在

@Test

public void isExsist(){

System.out.println(redisTemplate.hasKey("2"));

}

打印结果: true 表示存在 false表示不存在

散列的操作

所谓散列其实和java中的map很像

@Test

public void opsForHash_set(){

// 散列中单个元素的添加

User user = new User();

user.setUser_name("wxdl");

user.setPhone("13362041868");

user.setUser_id(1);

redisTemplate.opsForHash().put("map", user.getUser_id(), user);

// 散列中多个元素的添加

Map<Integer,User> map = new HashMap<>();

User user2 = new User();

user2.setUser_name("jawx");

user2.setPhone("15921993698");

user2.setUser_id(2);

User user3 = new User();

user3.setUser_name("zsdf");

user3.setPhone("15957374607");

user3.setUser_id(3);

map.put(user2.getUser_id(), user2);

map.put(user3.getUser_id(), user3);

redisTemplate.opsForHash().putAll("map", map);

// 散列中若没有元素则添加,否则不做新增/更新

user.setUser_name("1234");

redisTemplate.opsForHash().putIfAbsent("map", user.getUser_id(), user);

}

@Test

public void opsForHash_get(){

HashOperations<String, Object, Object> operations = redisTemplate.opsForHash();

//获取散列map中单个元素

Object single = operations.get("map", 1);

System.out.println(JSONObject.toJSONString(single));

//获取指定散列中所有的元素

List<Object> values = operations.values("map");

System.out.println(JSONObject.toJSONString(values));

//获取指定散列所有元素的keys

Collection<Object> keys = new ArrayList<>();

keys.add(1);

keys.add(2);

List<Object> list = operations.multiGet("map", keys);

System.out.println(JSONObject.toJSONString(list));

}

打印结果:

{"phone":"13362041868","user_id":1,"user_name":"wxdl"}

 

[{"phone":"15957374607","user_id":3,"user_name":"zsdf"},{"phone":"13362041868","user_id":1,"user_name":"wxdl"},{"phone":"15921993698","taobao_id":"xiaohongmao","user_id":2,"user_name":"jawx"}]

 

[{"phone":"13362041868","user_id":1,"user_name":"wxdl"},{"phone":"15921993698","taobao_id":"xiaohongmao","user_id":2,"user_name":"jawx"}]

@Test

public void opsForHash_update(){

HashOperations<String, Object, Object> operations = redisTemplate.opsForHash();

// 判断要修改的是否存在

if (operations.hasKey("map", 2)) {

// 存在则查询出来,然后进行修改

User user = (User) operations.get("map", 2);

user.setTaobao_id("xiaohongmao");

// 将修改后的对象重新写回redis

operations.put("map", user.getUser_id(), user);

System.out.println(JSONObject.toJSONString(operations.get("map", user.getUser_id())));

}

}

结果打印:

{"phone":"15921993698","taobao_id":"xiaohongmao","user_id":2,"user_name":"jawx"}

删除前:

@Test

public void opsForHash_del(){

HashOperations<String, Object, Object> operations = redisTemplate.opsForHash();

// 删除一个元素

operations.delete("map", 3);

}

删除后:

判断

-- 判断指定的hashkey是否存在

@Test

public void opsForHash_isExsit(){

Boolean hasKey = redisTemplate.opsForHash().hasKey("map", 3);

System.out.println(hasKey);

}

结果: false 不存在 true 存在

 

© 著作权归作者所有

共有 人打赏支持
文心丶雕龙
粉丝 8
博文 43
码字总数 30481
作品 0
杭州
程序员
崛起于Springboot2.X之集成单机Redis(14)

简介:单机redis+springboot,并不是jedis单机操作redis,jedis是需要另外的集成,下一篇博客会讲到。 1、添加pom依赖 <dependency><groupId>org.springframework.boot</groupId><artifactId......

木九天
07/15
0
0

没有更多内容

加载失败,请刷新页面

加载更多
spring 事件

ContextRefreshedEvent Event raised when an {@code ApplicationContext} gets initialized or refreshed. ContextClosedEvent Event raised when an {@code ApplicationContext} gets clos......

Canaan_
36分钟前
1
0
leetcode两数之和

leetcode中求两数之和解决方法 给定一个整数数组和一个目标值,找出数组中和为目标值的两个数。 你可以假设每个输入只对应一种答案,且同样的元素不能被重复利用。 给定 nums = [2, 7, 11, ...

lar555
52分钟前
1
0
js实现限制网页内容复制

转载 在我们做的网页发到网上后,如果访客看到比较喜欢的内容,只要复制就可以变为自己的,自己辛辛苦苦弄半天还不及人家的一下复制,有时为了只让访客看到,而不能让它们复制内容,就用Jav...

lc_comeon
56分钟前
1
0
jenkins将spring boot项目发布到阿里云镜像中

1、spring boot项目 1.1 pom.xml配置 <artifactId>xxx-docker</artifactId><properties><project.build.sourceEncoding>UTF-8</project.build.sourceEncoding><project.reporting.......

xixingzhe
今天
0
0
qsv格式可以在电视上播放吗

  大家都知道qsv格式是爱奇艺的独家缓存格式,是加密的,一般的播放器是无法播放的,只能在爱奇艺播放器上播放,如果想要在电视上播放,就必须要安装爱奇艺播放器,比较麻烦。其实还有一种...

萤火的萤火
今天
1
0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

返回顶部
顶部