关于用redis缓存对象

网友投稿 597 2022-11-26

关于用redis缓存对象

关于用redis缓存对象

本文基本上是<>的学习笔记

我们知道redis可以存储的数据结构比memcached多,它包含hash,list等等

但是如果,我有一个Person对象,里面两个变量,username,password,我想保存一个Person对象呢? 那很简单呀,要么使用pb把它序列化,要么把对象转成json字符串 从速度上讲pb要比json快 但是pb的结果是不可读的,相比较于json,对程序员不是那么友好 所以一般情况下,都是使用json的

package com.imooc.miaosha.redis;import org.springframework.beans.factory.annotation.Autowired;import org.springframework.stereotype.Service;import com.alibaba.fastjson.JSON;import redis.clients.jedis.Jedis;import redis.clients.jedis.JedisPool;@Servicepublic class RedisService { @Autowired JedisPool jedisPool; /** * 获取但个对象 * */ public T get(KeyPrefix prefix, String key, Class clazz) { Jedis jedis = null; try { jedis = jedisPool.getResource(); //生成真正的key String realKey = prefix.getPrefix() + key; String str = jedis.get(realKey); T t = stringToBean(str, clazz); return t; }finally { returnToPool(jedis); } } /** * 设置对象 * */ public boolean set(KeyPrefix prefix, String key, T value) { Jedis jedis = null; try { jedis = jedisPool.getResource(); String str = beanToString(value); if(str == null || str.length() <= 0) { return false; } //生成真正的key String realKey = prefix.getPrefix() + key; int seconds = prefix.expireSeconds(); if(seconds <= 0) { jedis.set(realKey, str); }else { jedis.setex(realKey, seconds, str); } return true; }finally { returnToPool(jedis); } } private String beanToString(T value) { if(value == null) { return null; } Class clazz = value.getClass(); if(clazz == int.class || clazz == Integer.class) { return ""+value; }else if(clazz == String.class) { return (String)value; }else if(clazz == long.class || clazz == Long.class) { return ""+value; }else { return JSON.toJSONString(value); } } @SuppressWarnings("unchecked") private T stringToBean(String str, Class clazz) { if(str == null || str.length() <= 0 || clazz == null) { return null; } if(clazz == int.class || clazz == Integer.class) { return (T)Integer.valueOf(str); }else if(clazz == String.class) { return (T)str; }else if(clazz == long.class || clazz == Long.class) { return (T)Long.valueOf(str); }else { return JSON.toJavaObject(JSON.parseObject(str), clazz); } } private void returnToPool(Jedis jedis) { if(jedis != null) { jedis.close(); } }}

看到上面的代码,朋友们可能要问那个KeyPrefix是个什么东西 假如有个用户,它的key是abc 假如有个订单,它的key也是abc 而且,即使同一个用户,我也希望他在缓存里有两个项,一个是按照用户名去查,一个是根据电话号码去查 明白了吧? 我们保证每个模块内的数据的前缀都是不一样的,而且同一个数据也可以保存两次 那具体怎么实现呢?

package com.imooc.miaosha.redis;public interface KeyPrefix { public String getPrefix();}package com.imooc.miaosha.redis;public abstract class BasePrefix implements KeyPrefix{ private String prefix; public BasePrefix( String prefix) { this.prefix = prefix; } public String getPrefix() { String className = getClass().getSimpleName(); return className+":" + prefix; }}package com.imooc.miaosha.redis;public class UserKey extends BasePrefix{ private UserKey(String prefix) { super(prefix); } public static UserKey getById = new UserKey("id"); public static UserKey getByName = new UserKey("name");}package com.imooc.miaosha.redis;public class OrderKey extends BasePrefix{ private OrderKey (String prefix) { super(prefix); } public static UserKey getById = new UserKey("id"); public static UserKey getByName = new UserKey("name");}

版权声明:本文内容由网络用户投稿,版权归原作者所有,本站不拥有其著作权,亦不承担相应法律责任。如果您发现本站中有涉嫌抄袭或描述失实的内容,请联系我们jiasou666@gmail.com 处理,核实后本网站将在24小时内删除侵权内容。

上一篇:ShardedJedis的一致性hash
下一篇:听小董谝存储 二
相关文章

 发表评论

暂时没有评论,来抢沙发吧~