zoukankan      html  css  js  c++  java
  • redis

    基本语法

    public void putObject() {
            Jedis jedis = new Jedis("localhost", 6379);
            System.out.println(jedis.ping());
            System.out.println("=======================");
    
            /*string*/
            jedis.set("str","hello redis");
            String jString=jedis.get("str");
            System.out.println(jString);
    
            /*map*/
            Map map = new HashMap();
            map.put("a", "a");
            map.put("b", "b");
            jedis.hmset("map", map);
            Map map1=jedis.hgetAll("map");
            System.out.println(jedis.hmget("map", "a", "b"));
            System.out.println(map1.keySet());
    
            /*list*/
            String[] li = {"a", "b", "c"};
            jedis.lpush("li", li);
            List list = jedis.lrange("li", 0, -1);
            System.out.println(list);
        }
    View Code

    springboot  配置

    spring.cache.type=redis
    spring.cache.redis.time-to-live=60000
    # Redis数据库索引(默认为0)
    spring.redis.database=0
    spring.redis.host=127.0.0.1
    spring.redis.port=6379
    #spring.redis.password=123456
    #连接池最大连接数(使用负值表示没有限制)
    spring.redis.pool.max-active=8
    # 连接池最大阻塞等待时间(使用负值表示没有限制)
    spring.redis.pool.max-wait=-1ms
    # 连接池中的最大空闲连接
    spring.redis.pool.max-idle=8
    spring.redis.pool.min-idle=0
    spring.redis.timeout=300
    # 是否启用SSL连接.
    #spring.redis.ssl=false
    View Code

     service

    @Service
    @EnableCaching
    public class CategoryService {
        @Autowired
        private CategoryMapper categoryMapper;
        @Cacheable(cacheNames = "cate", key = "#p0")
        public Category getById(Integer id) {
            return categoryMapper.getById(id);
        }
    
        @CachePut(cacheNames = "cate", key = "#p0.id")
        public Category updateCategoryById(Category category) {
            categoryMapper.updateCategoryById(category);
            return category;
        }
    }
    View Code
    @Mapper
    public interface CategoryMapper {
        @Select("select * from category where id = #{id}")
        Category getById(Integer id);
    
        @Update("update category set cateName=#{cateName}, date=#{date} where id=#{id} ")
        int updateCategoryById(Category category);
    }
    View Code

     redis配置类

    @Configuration
    public class MyRedisCacheConfiguration extends CachingConfigurerSupport {
    
        @Bean
        public CacheManager getRedisCacheManager(RedisConnectionFactory factory) {
            RedisCacheWriter writer = RedisCacheWriter.nonLockingRedisCacheWriter(factory);
            RedisCacheConfiguration config = RedisCacheConfiguration.defaultCacheConfig(
                    Thread.currentThread().getContextClassLoader()
            );
            config.entryTtl(Duration.ofHours(1));
            //值的序列化
            // Jackson2JsonRedisSerializer jackson2JsonRedisSerializer = new Jackson2JsonRedisSerializer(Object.class);
            RedisSerializer<Object> jsonSerializer = new GenericJackson2JsonRedisSerializer();
            RedisSerializationContext.SerializationPair pair = RedisSerializationContext.SerializationPair
                    .fromSerializer(jsonSerializer);
            config.serializeValuesWith(pair);
            RedisCacheManager manager = new RedisCacheManager(writer, config);
            return manager;
        }
    }
    View Code

    项目中使用了热部署,在自动装配bean获取CacheManager时

    装载redisconfig,会使用到devtools容器,该容器具有缓存作用

    读取redis数据进行反序列化,会出现类型转换错误

    解决思路:

    1.直接删除热部署

    2.创建redisconfig时,指定装载器,不使用devtools

    RedisCacheConfiguration config = RedisCacheConfiguration.defaultCacheConfig(
    Thread.currentThread().getContextClassLoader()
    );

    mybatis整合redis缓存

    自定义cache类

     1 public class MybatisRedisCache implements Cache {
     2     private static Logger LOGGER = LoggerFactory.getLogger(MybatisRedisCache.class);
     3     private final ReadWriteLock readWriteLock = new ReentrantReadWriteLock();
     4     private String id;
     5     private Jedis redisClient = createReids();
     6 
     7     public MybatisRedisCache(final String id) {
     8         if (id == null) {
     9             try {
    10                 throw new IllegalAccessException("Cache instances require an ID");
    11             } catch (IllegalAccessException e) {
    12                 e.printStackTrace();
    13             }
    14         }
    15         LOGGER.debug(">>>>>>>>>>>>>>>>>>>>>>>>MybatisRedisCache:id=" + id);
    16         this.id = id;
    17     }
    18 
    19     private static Jedis createReids() {
    20         JedisPool jedisPool = new JedisPool("127.0.0.1", 6379);
    21         return jedisPool.getResource();
    22     }
    23 
    24     @Override
    25     public String getId() {
    26         return this.id;
    27     }
    28 
    29     @Override
    30     public void putObject(Object key, Object value) {
    31         LOGGER.debug(">>>>>>>>>>>>>>>>>>>>>>>>putObject:" + key + "=" + value);
    32         redisClient.set(SerializeUtil.serialize(key.toString()), SerializeUtil.serialize(value));
    33     }
    34 
    35     @Override
    36     public Object getObject(Object key) {
    37         Object value = SerializeUtil.unserialize(redisClient.get(SerializeUtil.serialize(key.toString())));
    38         LOGGER.debug(">>>>>>>>>>>>>>>>>>>>>>>>getObject:" + key + "=" + value);
    39         return value;
    40     }
    41 
    42     @Override
    43     public Object removeObject(Object key) {
    44         return redisClient.expire(SerializeUtil.serialize(key.toString()), 0);
    45     }
    46 
    47     @Override
    48     public void clear() {
    49         redisClient.flushDB();
    50     }
    51 
    52     @Override
    53     public int getSize() {
    54         return Integer.valueOf(redisClient.dbSize().toString());
    55     }
    56 
    57     @Override
    58     public ReadWriteLock getReadWriteLock() {
    59         return readWriteLock;
    60     }
    61 }
    View Code

    序列化和反序列化

     1 public class SerializeUtil {
     2 
     3     public static byte[] serialize(Object object) {
     4         ObjectOutputStream oos = null;
     5         ByteArrayOutputStream baos = null;
     6         try {
     7             // 序列化
     8             baos = new ByteArrayOutputStream();
     9             oos = new ObjectOutputStream(baos);
    10             oos.writeObject(object);
    11             byte[] bytes = baos.toByteArray();
    12             return bytes;
    13         } catch (Exception e) {
    14             e.printStackTrace();
    15         }
    16         return null;
    17     }
    18 
    19     public static Object unserialize(byte[] bytes) {
    20         ByteArrayInputStream bais = null;
    21         try {
    22             // 反序列化
    23             bais = new ByteArrayInputStream(bytes);
    24             ObjectInputStream ois = new ObjectInputStream(bais);
    25             return ois.readObject();
    26         } catch (Exception e) {
    27             // e.getCause().equals(NullPointerException.class);
    28             // e.printStackTrace();
    29         }
    30         return null;
    31     }
    32 }
    View Code

    mapper.xml文件中配置 

    <cache eviction="LRU" type="com.example.demo.util.MybatisRedisCache"/>

    常用的淘汰算法:

    FIFO:First In First Out,先进先出。判断被存储的时间,离目前最远的数据优先被淘汰。
    LRU:Least Recently Used,最近最少使用。判断最近被使用的时间,目前最远的数据优先被淘汰。
    LFU:Least Frequently Used,最不经常使用。在一段时间内,数据被使用次数最少的,优先被淘汰。

    Redis提供的淘汰策略:

    noeviction:达到内存限额后返回错误,客户尝试可以导致更多内存使用的命令(大部分写命令,但DEL和一些例外)
    allkeys-lru:为了给新增加的数据腾出空间,驱逐键先试图移除一部分最近使用较少的(LRC)。
    volatile-lru:为了给新增加的数据腾出空间,驱逐键先试图移除一部分最近使用较少的(LRC),但只限于过期设置键。
    allkeys-random: 为了给新增加的数据腾出空间,驱逐任意键
    volatile-random: 为了给新增加的数据腾出空间,驱逐任意键,但只限于有过期设置的驱逐键。
    volatile-ttl: 为了给新增加的数据腾出空间,驱逐键只有秘钥过期设置,并且首先尝试缩短存活时间的驱逐键

  • 相关阅读:
    怎样在caffe中添加layer以及caffe中triplet loss layer的实现
    【java】为数组全部元素赋同样的值 以及 数组之间的复制
    POJ 2386 Lake Counting 搜索题解
    android中实现内容搜索
    JNI之——在cmd命令行下编译执行C/C++源文件
    怎样编写高效android代码
    http headers
    matlab 工具函数、matlab toolbox(工具箱)
    数列收敛与数列极限
    数列收敛与数列极限
  • 原文地址:https://www.cnblogs.com/jhin-wxy/p/11815458.html
Copyright © 2011-2022 走看看