SpringBoot集成RedisTemplate使用

最近需要有做缓存的需求,选用Redis来做缓存,总结一下Redis的使用与SpringBoot集成RedisTemplate工具,如有不足之处还请多多指教。

引言

Redis概述
C语言开发的高性能的键值对(Kay, Value)数据库,通过提供多种键值数据类型来适应不同场景下的存储需求。
支持的数据类型:字符串(String), 字符串列表(List),有序字符串集合(sorted set), 哈希(hash), 字符串集合(set)。
应用场景: 缓存, 任务队列, 应用排行榜, 网站访问统计, 数据过期处理, 分布式集群架构中的session分离,消息代理 (Redis的发布订阅机制可以当作简单的消息代理,使用较少,一般采用消息队列,RabbitMQ)。

Redis与Memcache对比

  • Memcache是内存对象缓存系统,设计目的为通过缓解数据库的压力来加快web应用的响应速度,断电情况下数据消失

  • Redis应用场景更丰富,Memcache仅适合作为缓存使用

Redis优缺点

单进程,非阻塞式,无需处理并发请求,降低系统复杂度,不适合缓存大尺寸对象(超过100kb)。

RedisTemplate介绍

spring 封装了 RedisTemplate 对象来进行对redis的各种操作,它支持所有的 redis 原生的 api。

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

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

StringRedisTemplate与RedisTemplate

  • 两者的关系是StringRedisTemplate继承RedisTemplate。
  • 两者的数据是不共通的;也就是说StringRedisTemplate只能管理StringRedisTemplate里面的数据,RedisTemplate只能管理RedisTemplate中的数据。
  • SDR默认采用的序列化策略有两种,一种是String的序列化策略,一种是JDK的序列化策略。
  • StringRedisTemplate默认采用的是String的序列化策略,保存的key和value都是采用此策略序列化保存的。
  • RedisTemplate默认采用的是JDK的序列化策略,保存的key和value都是采用此策略序列化保存的。

个人使用的是StringRedisTemplate,需要注意的是StringRedisTemplate在进行批量删除时我们需要对Tempalte进行序列化。

添加Redis依赖:
Alt RedisTemplate

下面介绍一下RedisTempalte中常用的方法

@Autowired
private StringRedisTemplate template;

Redis的String数据结构

  • set void set(K key, V value, long timeout, TimeUnit unit);

使用: redisTemplate.opsForValue().set(“name”,”zz”,10, TimeUnit.SECONDS);

  • multiSet void multiSet(Map<? extends K, ? extends V> m);为多个键分别设置它们的值

使用:

1
2
3
4
5
6
7
8
9
10
Map<String,String> maps = new HashMap<String, String>();
maps.put("multi1","multi1");
maps.put("multi2","multi2");
maps.put("multi3","multi3");
template.opsForValue().multiSet(maps);
List<String> keys = new ArrayList<String>();
keys.add("multi1");
keys.add("multi2");
keys.add("multi3");
System.out.println(template.opsForValue().multiGet(keys));

Redis的List数据结构

  • Long leftPushAll(K key, V… values); 批量把一个数组或集合插入到列表中

使用:

1
String[] stringarrays = new String[]{"1","2","3"}; template.opsForList().leftPushAll("list",stringarrays);
  • Long remove(K key, long count, Object value);从存储在键中的列表中删除等于值的元素的第一个计数事件。

计数参数以下列方式影响操作:
count > 0:删除等于从头到尾移动的值的元素。
count < 0:删除等于从尾到头移动的值的元素。
count = 0:删除等于value的所有元素。

  • V index(K key, long index);根据下表获取列表中的值,下标是从0开始的
    使用:template.opsForList().index(“listRight”,2);

Redis的Hash数据结构

Hash数据结构应该也是最常用的,Redis的散列可以让用户将多个键值对存储到一个Redis键里面。
public interface HashOperations<H,HK,HV>
当用到map存储或获取数据的时:
Alt RedisTemplate

当用到获取数据value和批量删除缓存数据时:
Alt RedisTemplate

当要使用添加值到Redis中的时候:
Alt RedisTemplate

  • Cursor<Map.Entry<HK, HV>> scan(H key, ScanOptions options); 使用Cursor在key的hash中迭代,相当于迭代器。

使用:

1
2
Cursor<Map.Entry<Object, Object>> curosr = template.opsForHash().scan("redisHash", ScanOptions.ScanOptions.NONE);
while(curosr.hasNext()){ Map.Entry<Object, Object> entry = curosr.next(); System.out.println(entry.getKey()+":"+entry.getValue()); }

StringRedisTemplate的使用

stringRedisTemplate.opsForValue().set("zz","24",60 * 10, TimeUnit.SENCONDS); //向redis里存入数据和设置缓存时间

stringRedisTemplate.opsForValue().get("zz")//根据key获取缓存中的value

stringRedisTemplate.getExpire("zz");//根据key获取过期时间

stringRedisTemplate.delete("zz");//根据key删除缓存

stringRedisTemplate.hasKey("sry");//检查key是否存在,返回boolean值

stringRedisTemplate.opsForSet().add("zz_123", "1","2","3");//向指定key中存放set集合

stringRedisTemplate.expire("zz_123",1000 , TimeUnit.MILLISECONDS);//设置过期时间

stringRedisTemplate.opsForSet().isMember("red_123", "1")//查看集合中是否存在指定数据

stringRedisTemplate.opsForSet().members("red_123");//根据key获取set集合

使用注意点

【RedisTemplate】
RedisTemplate是最基本的操作类,它默认的序列化方式是 JdkSerializationRedisSerializer,在存值时,键值会被序列化为字节数组,可读性差,取值时也是一样,如果redis中存的值是正常的字符串形式,取值时将返回null

【StringRedisTemplate】
StringRedisTemplate继承于RedisTemplate<String,String>,默认的序列化方式是StringRedisSerializer,存值取值都是按照字符串的形式

  • 如果存的是字符串,可以直接使用StringRedisTemplate
  • 如果是对象,可采用以下两种方式
  1. 使用RedisTemplate存,取值时可以直接强转为对象
  2. 使用StringRedisTemplate,存值得时候使用json工具类将对象转化为json字符串,取值时再将json字符串转为对象

附上json与实体Bean的转化

【使用jackson】
private static ObjectMapper mapper = new ObjectMapper();

Java对象转为JSON字符串
Alt RedisTemplate

JSON字符串转为Java对象
Alt RedisTemplate

【使用FastJson】
FastJson是用于java后台处理json格式数据的工具包,包括序列化和反序列化,主要针对Json格式字符串,JsonObject的json对象,JsonArray的Json数组对象。
使用方法:

  • Java对象转Json字符串
    String s = JSON.toJSONString(user); // User实体类
  • Json字符串转Json对象
    JSONObject jsonObject = JSON.parseObject(s); //s为Json字符串
  • Json字符串转Java对象
    1. User user = JSON.parseObject(s, User.class);
    2. User user = JSON.parseObject(s, newTypeReference() {});
  • Json字符串 数组类型转Java对象

第一种方式:

1
2
JSONObject jsonObject = JSON.parseObject(s); JSONArray error = jsonObject.getJSONArray("user"); 
List<User> errors = JSON.parseObject(user.toJSONString(), new TypeReference<List<User>>() {});

第二种方式:

1
2
3
4
5
6
//获取jsonobject对象 JSONObject jsonObject = JSON.parseObject(str);  
//把对象转换成jsonArray数组
JSONArray error = jsonObject.getJSONArray("errors");
//将数组转换成字符串 String jsonString = JSONObject.toJSONString(error);
//将字符串转成list集合
List<Error> errors = JSONObject.parseArray(jsonString, Error.class);
  • Java对象转Json对象
    JSONObject jsonObj = (JSONObject) JSON.toJSON(user);
    JSON json = (JSON) JSON.toJSON(user);
    总结:
  1. 对于JSON对象与JSON格式字符串的转换可以直接用toJSONString()这个方法
  2. javaBean与JSON格式字符串之间的转换要用到,JSON.toJSONString(string);
  3. javaBean与JSON对象间的转换使用:JSON.toJSON(obj),然后使用强制类型转换,JSONObject或者JSONArray

未完待续

关于RedisTemplate的使用就到这里结束了,有关RedisTemplate其他的知识下次再总结分享出来,欢迎有疑问和想法的朋友交流 ^_^