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()方法:


 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM