Redis+Springboot
Redis+Springboot
文心丶雕龙 发表于3个月前
Redis+Springboot
  • 发表于 3个月前
  • 阅读 21
  • 收藏 0
  • 点赞 0
  • 评论 0

腾讯云 新注册用户 域名抢购1元起>>>   

摘要: Redis是一个开源的高性能键值对数据库.它通过提供多种键值数据来适应不同场景下的存储需求,并借助许多高层级的接口使其可以胜任,如缓存,队列系统的不同角色

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 存在

 

标签: Redis 缓存
共有 人打赏支持
粉丝 7
博文 39
码字总数 23450
×
文心丶雕龙
如果觉得我的文章对您有用,请随意打赏。您的支持将鼓励我继续创作!
* 金额(元)
¥1 ¥5 ¥10 ¥20 其他金额
打赏人
留言
* 支付类型
微信扫码支付
打赏金额:
已支付成功
打赏金额: