最近需要有做缓存的需求,选用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();//操作有序setStringRedisTemplate与RedisTemplate
- 两者的关系是StringRedisTemplate继承RedisTemplate。
- 两者的数据是不共通的;也就是说StringRedisTemplate只能管理StringRedisTemplate里面的数据,RedisTemplate只能管理RedisTemplate中的数据。
- SDR默认采用的序列化策略有两种,一种是String的序列化策略,一种是JDK的序列化策略。
- StringRedisTemplate默认采用的是String的序列化策略,保存的key和value都是采用此策略序列化保存的。
- RedisTemplate默认采用的是JDK的序列化策略,保存的key和value都是采用此策略序列化保存的。
个人使用的是StringRedisTemplate,需要注意的是StringRedisTemplate在进行批量删除时我们需要对Tempalte进行序列化。
添加Redis依赖:
下面介绍一下RedisTempalte中常用的方法
@Autowiredprivate 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 | Map<String,String> maps = new HashMap<String, String>(); |
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存储或获取数据的时:
当用到获取数据value和批量删除缓存数据时:
当要使用添加值到Redis中的时候:
Cursor<Map.Entry<HK, HV>> scan(H key, ScanOptions options);使用Cursor在key的hash中迭代,相当于迭代器。
使用:
1 | Cursor<Map.Entry<Object, Object>> curosr = template.opsForHash().scan("redisHash", ScanOptions.ScanOptions.NONE); |
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
- 如果是对象,可采用以下两种方式
- 使用RedisTemplate存,取值时可以直接强转为对象
- 使用StringRedisTemplate,存值得时候使用json工具类将对象转化为json字符串,取值时再将json字符串转为对象
附上json与实体Bean的转化
【使用jackson】private static ObjectMapper mapper = new ObjectMapper();
Java对象转为JSON字符串
JSON字符串转为Java对象
【使用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对象
- User user = JSON.parseObject(s, User.class);
- User user = JSON.parseObject(s, newTypeReference
() {});
- Json字符串 数组类型转Java对象
第一种方式:
1 | JSONObject jsonObject = JSON.parseObject(s); JSONArray error = jsonObject.getJSONArray("user"); |
第二种方式:
1 | //获取jsonobject对象 JSONObject jsonObject = JSON.parseObject(str); |
- Java对象转Json对象
JSONObject jsonObj = (JSONObject) JSON.toJSON(user);
JSON json = (JSON) JSON.toJSON(user);
总结:
- 对于JSON对象与JSON格式字符串的转换可以直接用toJSONString()这个方法
- javaBean与JSON格式字符串之间的转换要用到,JSON.toJSONString(string);
- javaBean与JSON对象间的转换使用:JSON.toJSON(obj),然后使用强制类型转换,JSONObject或者JSONArray
未完待续
关于RedisTemplate的使用就到这里结束了,有关RedisTemplate其他的知识下次再总结分享出来,欢迎有疑问和想法的朋友交流 ^_^