知识点:

  1.spring 封装了 RedisTemplate 对象来进行对redis的各种操作,它支持所有的 redis 原生的 api。模板中的Redis key的类型(通常为String)如:RedisTemplate<String, Object>。RedisTemplate、StringRedisTemplate只要你引入了Jedis依赖,并配置好了propertries,那么可以在项目随处进行引用。但如果想使用Jedis Pool连接池功能,需要自己先定义一个config,写好相关配置。

  2.RedisTemplate中定义了对5种数据结构操作:
   redisTemplate.opsForValue();//操作字符串
   redisTemplate.opsForHash();//操作hash
   redisTemplate.opsForList();//操作list
   redisTemplate.opsForSet();//操作set
   redisTemplate.opsForZSet();//操作有序set

  3.StringRedisTemplate与RedisTemplate:1)两者的关系是StringRedisTemplate继承RedisTemplate。2)两者的数据是不共通的;也就是说StringRedisTemplate只能管理StringRedisTemplate里面的数据,RedisTemplate只能管理RedisTemplate中的数据。 3)SDR默认采用的序列化策略有两种,一种是String的序列化策略,一种是JDK的序列化策略。StringRedisTemplate默认采用的是String的序列化策略,保存的key和value都是采用此策略序列化保存的。RedisTemplate默认采用的是JDK的序列化策略,保存的key和value都是采用此策略序列化保存的。反序列化后一个得到String、一个得到Object。

  区别:1)RedisTemplate是一个泛型类,而StringRedisTemplate则不是。 2)StringRedisTemplate只能对key=String,value=String的键值对进行操作,RedisTemplate可以对任何类型的key-value键值对操作。一般来说子类应该比父类有用更强大的功能,而此处却不是,因为RedisTemplate是泛型类,而在StringRedisTemplate继承RedisTemplate类时,则是指定了泛型的类型,两个String。这就直接导致了,StringRedisTemplate只能处理String-String的键值对数据,而RedisTemplate则可以处理任何类型的键值对。

  4.很明显,如果存的是字符串,我们直接上StringRedisTemplate就行了。但是如果存的是对象,那么就有两种办法:1.用RedisTemplate存,取值时可以直接强转。 2.用StringRedisTemplate,存值得时候使用json工具类将对象转化为json字符串,取值时再将json字符串转为对象。
FastJson对于json格式字符串的解析主要用到了下面三个类: 1.JSON:fastJson的解析器,用于JSON格式字符串与JSON对象及javaBean之间的转换 2.JSONObject:fastJson提供的json对象 3.JSONArray:fastJson提供json数组对象
  关键就两个关键字:parseObject和toJSONString

1.json格式的字符串
private static final String  JSON_OBJ_STR = "{\"studentName\":\"lily\",\"studentAge\":12}";

2.json字符串与JSONObject的转换
 JSONObject jsonObject = JSONObject.parseObject(JSON_OBJ_STR);

3.JSONObject到json字符串的转换
String jsonString = JSONObject.toJSONString(jsonObject);

4.JSONObject和JavaBean还有差距,可以把多个JSONObject的值取出,放到一个JavaBean里。
或者直接用TypeReference<T>类,再或者用Gson的思想
Student student = JSONObject.parseObject(JSON_OBJ_STR, new TypeReference<Student>() {});

 Student student = JSONObject.parseObject(JSON_OBJ_STR, Student.class);

5.JavaBean到json字符串
String jsonString = JSONObject.toJSONString(student);

  5.对于 String数据结构的常用方法。首先Serializer序列化,然后各种get、set方法上。
   String:

set void set(K key, V value)
使用:redisTemplate.opsForValue().set("name","tom");
结果:redisTemplate.opsForValue().get("name")  输出结果为tom

Set void set(K key, V value, long timeout, TimeUnit unit)
使用:redisTemplate.opsForValue().set("name","tom",10, TimeUnit.SECONDS);
结果:redisTemplate.opsForValue().get("name")由于设置的是10秒失效,十秒之内查询有结果,十秒之后返回为null

set void set(K key, V value, long offset)
使用:template.opsForValue().set("key","hello world");
        template.opsForValue().set("key","redis", 6);
        System.out.println("***************"+template.opsForValue().get("key"));
结果:***************hello redis

multiSet void multiSet(Map<? extends K, ? extends V> m)
使用: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));
结果:[multi1, multi2, multi3]

get V get(Object key)
使用:template.opsForValue().set("key","hello world");
        System.out.println("***************"+template.opsForValue().get("key"));
结果:***************hello world

getAndSet V getAndSet(K key, V value)设置键的字符串值并返回其旧值
使用:template.opsForValue().set("getSetTest","test");
        System.out.println(template.opsForValue().getAndSet("getSetTest","test2"));
结果:test

等等,等等

  6.用不用 Jedis Pool?jedis的默认读取时间是2s,当使用jedis对象连接时多个线程操作redis的时候,redis服务器采用的机制是FIFO(先入先出)机制,因此会使得线程等待时间增长,可能会造成redis读取超时报错。于是我们增加Jedis默认读取时间,但可能还是会有新的问题抛出。这时候就需要使用,JedisPool连接池来管理Jedis对象。
  优点:
  1.当很多任务采用线程执行时,有可能同时创建很多线程,这时候就需要线程池来控制创建的线程,让它不至于直接崩了。
  2.采用连接池可以提高效率,提前创建一定数目的线程放在池中,需要时从线程池中取比直接创建线程对象快的多。
  3.方便管理,线程池可以对线程进行统一设置、管理。
  注意:
  1.JedisPool得到的Jedis对象在使用完毕后需要手动close,即一定要用try-finally释放。因为JedisPool里面的连接数肯定是有上限的,虽然我们可以通过配置调整大小,但肯定还是个确定值,为了能继续运行下去这个连接池,用完的连接要返回连接池。

  这也是后来人们都选用RedisTemplate的原因。RedisTemplate作为Spring提供的管理redis工具,RedisTemplate封装了从JedisPool中取jedis以及返回池中。更加方便,所以需要配置的更少了、