美文网首页
Spring Boot学习笔记5(Redis)

Spring Boot学习笔记5(Redis)

作者: 页川叶川 | 来源:发表于2019-03-25 22:15 被阅读0次

    五、Redis

    • 开发中常用的缓存中间件: resdismemcachedchcache
    • Spring Boot默认的缓存配置类为 SimpleCacheConfiguration
    • Redis是一个开源的(BSD许可)的,内存中的数据结构存储系统,它可以用作数据库、缓存和消息中间件,这里我们使用的是它的缓存中间件的功能

    5.1.Redis常用指令

    5.1.1.基本操作

    Redis或者Spring Boot中的Key,通常都包含逻辑上的命名空间,用符号 ”:” 分开,比如spring:session:xxxxxx

    > *set: 可以添加/覆盖一个字符串或数字类型
            例: set platform:info “simple infomation”
    > *get: 获取对应key的值
            例: get platform:info
    > *mget: 获取多个key的值
             例: mget platform:version platform:info
    > *DECR/INCR: 数字类型数据自减和自增
    > *DECRBY/INCRBY: 数字类型数据减去/增加某个指定的整数
    > *INCRBYFLOAT: 数字增加一个浮点数,负数表示减去
    

    注:以上操作都具有原子性

    > *keys: 查询Redis中的key
            例: platform:* :表示所有patform:开的key
                 *: 表示查询所有的key
    > *exists: 判断Key是否存在
            例: exists platform:info                 //返回1表示存在,返回0表示不存在
    > *del: 删除Key-value
             例: del platform:info                  //返回1表示删除成功,返回0表示失败
    > *expire: 指定多少秒后Key-value自动删除
             例: expire platform 10
    > *ttl: 查看Key的剩余存活时间
             例: ttl platform
    

    5.1.2.Redis List

    *rpush: 可以将多个值放入list尾部,也可以理解为放入右侧
              rpush platform:history “2012-1-1”  “2012-3-5”
    *lpush: 与rpush相反
              lpush platform:history “2011-10-22”
    *lrange: 从左到右显示指定范围的序列
              lrarge platform:history 0 2
    *rpop: 从列表尾部取出一个元素
    *lpop: 取出列表的头一个元素
    *llen: 返回List的长度
    *blpop或者brpop: 在List为空的时候处于等待状态,知道列表有元素,或者指定的时间到期为止
    

    5.1.3.Redis Hash

    *hset key field value: 给指定的Key设置一个字段值,如果值已经存在,则覆盖,返回0表示失败,返回1表示成功
             例: hset session:1xac name xiandafu
    *hget key field: 获取指定Key的field字段的值,如果不存在返回nil
    *hexists key field: 判断指定的Key的field字段是否存在,返回1存在,0不存在
    *hkeys key: 返回指定Key所指定的hash所有的字段名
    *hgetall key: 返回所有的字段名和字段值
    *hdel key field [field]: 删除多个字段
    *hincby key field value: 对Key指定的Hash数据中的field的值增加整型value
              例: hset website access 0
                   hincrby website access 1         //此时数据变为1
    *hincbyfloat key field value: 对Key指定Hash数据中的field的值进行增加浮点value
    

    5.1.4.Set

    *sad key member [member ..]: 添加元素
    *srem key member [member ..]: 删除元素
    *smember key: 返回一个集合中的所有元素
    *sinter key1 key2: 返回两个集合共同的元素,key1和key2分别代表两个集合
    *sinterstore key1 key2 key3: 取key1和key2的交集,并存放到key3集合中
    *sunion key1 key2: 返回一个合并后的集合
    *sunionstore key1 key2 key3: 合并key1和key2集合,并存放到key3集合中 
    

    5.1.5.Pub/Sub

    *subscribe news: news表示一个频道
           返回第一行固定为 subscribe,第二行固定为频道的名称,第三行表示总共有多少个订阅者
    *publish: 向终端发送一条信息
           例: punlish news “hello”
           注: redis-cli一旦使用subscribe,将一直等待频道的消息并输出,如果想使用redis-cli中的其他命令,就必须重新打开一个终端
    *psubscribe:  另一种订阅模式
           例: news.*: 订阅所有news.开头的频道
               new-?: 可以订阅news-1、news-2等频道
               news[123]: 订阅news-1、news-2、news-3频道
    

    5.2.Spring Boot集成Redis

    引入依赖

    <dependency>
         <groupId>org.springframework.boot</groupId>
         <artifactId>spring-boot-starter-data-redis</artifactId>
    </dependency>
    
    # 配置application.properties
    spring.redis.host = 127.0.1.1
    spring.redis.password = 123456
    spring.redis.port = 6379
    #最大连接数
    spring.redis.pool.max-active = 8
    

    实例:

    @Autowired
    private StringRedisTemplate redisClient;
    …
    redisClient.opsForValue().set(“testenv”,para);  //para=”123”相当于set  testenv  “123”
    …
    

    5.3.使用StringRedisTemplate

    StringRedisTemplate继承于RedisTemplate

    5.3.1.opsFor

    *opsForValue: 用来设置普通的Key-Value
    redisClient.opsForValue().set(“testenv”,”para”)   == set  testenv  para
    redisClient.opsForValue().get(“testenv”)   == get  testenv
    *opsForList: 用来操作List结构
    redisClient. opsForList ().leftPush(“platform:message”,”hello”)
            == lpush platform:message hello
    opsForList提供了lefPush、leftPushAll、leftPop、rightPush、rightPushAll、rightPop等操作,也提供了range于size操作,用于查看List的长度
    *posForHash: 用来操作Hash数据结构
              redisClient.opsForHash().put(“cache”,key,value)  == hset cache key value
    

    5.3.2.绑定Key的操作

    BoundListOperations operations = redisClient.boundListOps(“somekey”);
    //此后的操作就不需要在提供key参数
    *boundValueOps  -->  BoundValueOperations      //value相关操作
    *boundListOps  -->  BoundListOperations            //List相关操作
    *boundHashOps  -->  BoundHashOperations        //Hash相关操作
    *boundSetOps  -->  BoundSetOperations            //Set相关操作
    *boundZSetOps  --> ZSetOperations                  //Sorted Set相关操作
    *boundGeoOps  -->  BoundGeoOperations         //Geo,地理信息相关操作
    

    5.3.2.RedisConnection

    用于低级别API操作Redis,具体实现有JRedis或者Lettuce

    5.3.3.Pub/Sub

    *convertAndSend(): 发送一条消息
    *redisClient. convertAndSend(“news”,”hello,world”)
    *MessageListener的onMessage方法:订阅消息
    public class MyRedisChannelListener implements MessageListener{
         public void onMessage(Message message,byte[] pattern){
               byte[] channel = message.getChannel();
               byte[] bs = message.getBody();
               try{
                    String content = new String(bs,”UTF-8”);
                    String p = new String(channel,”UTF-8”);
                    System.out.println(“get ”+content+” from”+p);
               } catch (UnsupportedEncodingException e){
                    e.printStachTrace();
               }
         }
    }
    

    注:编写好MessageListener后,还需要添加一些固定的Java代码来设置监听器

    @Bean
    MesssageListenerAdapter listenerAdapter(){
         return new MessageListenerAdapter(new MyRedisChannelListener());
    }
    @Bean
    RedisMessageListenerContainer container(RedisConnectionFactory connectionFactory,MessageListenerAdapter listenerAdapter){
         redisMessageListenerContainer container = new RedisMessageListenerContainer();
         container.setConnectionFactory(connectionFactory);
         container.addMessageListener(listenerAdapter,new PatternTopic(“news.*”));
         return container;
    }
    

    5.3.4 自定义RedisConfig示例:

    //用来自定义序列化器的类
    
    @Configuration
    public class MyRedisConfig {
    
        // 自定义序列化为json格式
        @Bean
        public RedisTemplate<Object,Employee> empRedisTemplate(
                RedisConnectionFactory redisConnectionFactory)
                throws UnknownHostException {
            RedisTemplate<Object, Employee> template = new RedisTemplate<Object, Employee>();
            template.setConnectionFactory(redisConnectionFactory);
            Jackson2JsonRedisSerializer<Employee> ser = new Jackson2JsonRedisSerializer<Employee>(Employee.class);
            template.setDefaultSerializer(ser);
            return template;
        }
    
        //自定义CacheManager
        //CacheManagerCustomizers可以定制缓存的一些规则
        @Bean
        public RedisCacheManager employeeCacheManager(RedisTemplate<Object,Employee> empRedisTemplate){
            RedisCacheManager cacheManager = new RedisCacheManager(empRedisTemplate);
            cacheManager.setUsePrefix(true);
            return cacheManager;
        }
    
    }
    

    5.4.序列化策略

    使用默认序列化策略
    -(1).引入

    @Autowired
    @Qualifier(“redisTemplate”)
    private RedisTemplate redisClient;
    

    -(2).新建可序列的对象

    public static class User implements java.io.Serializable{
         ...
    }
    

    5.5.自定义序列化策略

    // 自定义序列化为json格式
    @Bean
    public RedisTemplate<Object,Employee> empRedisTemplate(
         RedisConnectionFactory redisConnectionFactory)throws UnknownHostException {
            
         RedisTemplate<Object, Employee> template = new RedisTemplate<Object, Employee>();
         template.setConnectionFactory(redisConnectionFactory);
         Jackson2JsonRedisSerializer<Employee> ser = new Jackson2JsonRedisSerializer<Employee>(Employee.class);
         template.setDefaultSerializer(ser);
         return template;
    
    }
    

    文集推荐:

    Java基础方法集1
    Python基础知识完整版
    Spring Boot学习笔记
    Linux指令进阶
    Java高并发编程
    SpringMVC基础知识进阶
    Mysql基础知识完整版
    健康管理系统学习花絮(学习记录)
    Node.js基础知识(随手笔记)
    MongoDB基础知识
    Dubbo学习笔记
    Vue学习笔记(随手笔记)

    声明:发表此文是出于传递更多信息之目的。若有来源标注错误或侵犯了您的合法权益,请作者持权属证明与本我们(QQ:981086665;邮箱:981086665@qq.com)联系联系,我们将及时更正、删除,谢谢。

    相关文章

      网友评论

          本文标题:Spring Boot学习笔记5(Redis)

          本文链接:https://www.haomeiwen.com/subject/cruivqtx.html