redis缓存中间件基础

前序:

默认使用SimpleCacheConfiguration 组件
ConcurrentMapCacheManager==ConcurrentMapCache
将数据保存在ConcurrentMap<Object,Object> 中

开发中使用缓存中间件:
redis , memcache ,ehcache

安装redis流程:

1.安装redis ,使用docker
docker命令:

   docker pull redis


   docker images


   docker run -d -p 6379:6379 --name myredis docker.io/redis


 

2.引入redis的starter
<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-data-redis</artifactId>
</dependency>

3.配置redis
spring.redis.host=192.168.0.133

 

配置完成后Redis客户端console测试:

String测试:
append msg hello
插入key为msg,value为hello
append msg world
msg的值变为 helloworld
get msg
获得msg的值


list测试: lpush mylist
1 2 3 4 5 从左边往里面插入 那么值就是 5 4 3 2 1 lpop mylist 弹出左边的5 值为 4 3 2 1 rpop mylist 弹出右边的1 值为 4 3 2 set测试: sadd myset zhangsan lisi 增加一个set集合(无序)不可重复 sadd myset lisi 返回0 因为已经存在 smembers myset 查看myset 集合里面的值 sismember myset wangwu 判断myset集合里面是否存在wangwu 元素 如果有返回1 没有返回0

 

代码测试:

@Autowired
    RedisTemplate  redisTemplate;  //操作k-v都是对象的

    @Autowired
    StringRedisTemplate stringRedisTemplate;//操作字符串用


    @Autowired
    RedisTemplate<Object,Employee> empRedisTemplate;
    /*
    * String,List(列表),Set(集合),Hash(散列),ZSet(有序集合)
    * stringRedisTemplate.opsForValue()   【操作string字符串的】
    * stringRedisTemplate.opsForList()
    * stringRedisTemplate.opsForSet()
    * stringRedisTemplate.opsForHash()
    * stringRedisTemplate.opsForZSet()
    */
    @Test
    public void redisTest01(){
        //给redis中添加数据
       //stringRedisTemplate.opsForValue().append("msg","hello");
//        String ss= stringRedisTemplate.opsForValue().get("msg");
//        System.out.println(ss);

        stringRedisTemplate.opsForList().leftPush("mylist","1");
        stringRedisTemplate.opsForList().leftPush("mylist","2");
        stringRedisTemplate.opsForList().leftPush("mylist","3");
    }

    //保存对象测试
    @Test
    public void redisTest02(){
      Employee emp =  employeeMapper.getEmpById(1);
      //默认如果保存对象使用gdk,使用jdk序列化机制,序列化后的数据保存到redis中
        //redisTemplate.opsForValue().set("emp",emp);
      //解决方法:
        // 1.把对象转为json
        // 2.根据redisTemplate默认得序列话规则为gdk,重新配置新的RedisTemplate改变其序列化规则
        empRedisTemplate.opsForValue().set("emp-1",emp);

    }


    @Autowired
    EmployeeMapper employeeMapper;
    @Test
    public void contextLoads() {
        Employee emp = employeeMapper.getEmpById(1);
        System.out.println(emp.toString());
    }

 

插入redis值乱码,重新配置新的RedisTemplate改变其序列化规则方法:
思路:
1.redis starter 引入后 ,在RedisAutoConfiguration类中有两个加入容器的方法

2.类实现序列化
public class Employee implements Serializable

3.按照其格式,重写RedisTemplate方法,并且加入容器中。

@Configuration
public class MyRedisConfig {
    
    @Bean
    public RedisTemplate<Object, Employee> empRedisTemplate(RedisConnectionFactory redisConnectionFactory) throws UnknownHostException {
        RedisTemplate<Object, Employee> template = new RedisTemplate();
        template.setConnectionFactory(redisConnectionFactory);
        Jackson2JsonRedisSerializer<Employee> ser = new Jackson2JsonRedisSerializer<Employee>(Employee.class);
        template.setDefaultSerializer(ser);
        return template;
    }
}
setDefaultSerializer()方法:


 

posted @ 2019-04-28 17:44  MagicAsa  阅读(1459)  评论(0编辑  收藏  举报