范文健康探索娱乐情感热点
投稿投诉
热点动态
科技财经
情感日志
励志美文
娱乐时尚
游戏搞笑
探索旅游
历史星座
健康养生
美丽育儿
范文作文
教案论文
国学影视

从零开始教你舒服的使用RedisTemplate操作Redis数据

  SpringBoot快速操作Redis数据
  在SpringBoot框架中提供了spring-boot-starter-data-redis的依赖组件进行操作Redis服务,当引入了该组件之后,只需要配置Redis的配置即可进行链接Redis服务并且进行操作Redis服务数据。
  针对于不同的版本有了不同的底层客户端的支持的底层客户端框架是不同的:目前常见的客户端为Jedis和Lettuce。低版本SpringBoot支持的Jedis
  Jedis是很常用的Redis的Java 实现的客户端。支持基本的数据类型如:String、Hash、List、Set、Sorted Set。
  特点:使用阻塞的 I/O,方法调用同步,程序流需要等到 socket 处理完 I/O 才能执行,不支持异步操作。Jedis 客户端实例不是线程安全的,需要通过连接池来使用 Jedis。高版本版本SpringBoot支持的Lettuce
  Lettuce客户端主要用于线程安全同步,异步和响应使用,支持集群,Sentinel,管道和编码器。
  基于 Netty 框架的事件驱动的通信层,其方法调用是异步的。Lettuce 的 API 是线程安全的,所以可以操作单个 Lettuce 连接来完成各种操作。spring-data-redis针对jedis提供了如下功能:
  Spring Boot 的 spring-boot-starter-data-redis 为 Redis 的相关操作提供了一个高度封装的 RedisTemplate 类,而且对每种类型的数据结构都进行了归类,实现连接池自动管理,提供了一个高度封装的"RedisTemplate"类。 针对jedis/Lettuce客户端中大量api进行了归类封装,将同一类型操作封装为operation接口。通用的接口类型工厂方法
  提供了对key的"bound"(绑定)便捷化操作API,可以通过bound封装指定的key,然后进行一系列的操作而无须"显式"的再次指定Key,即BoundKeyOperations:
  ValueOperations - BoundValueOperations:String类型的简单K-V操作SetOperations - BoundSetOperations:set类型数据操作ZSetOperations - BoundListOperations:zset类型数据操作HashOperations - BoundSetOperations:针对map类型的数据操作ListOperations - BoundHashOperations:针对list类型的数据操作序列化/反序列化的扩展机制
  针对数据的"序列化/反序列化",提供了多种可选择策略(RedisSerializer)
  JdkSerializationRedisSerializer
  POJO对象的存取场景,使用JDK本身序列化机制,将pojo类通过ObjectInputStream/ObjectOutputStream进行序列化操作,最终redis-server中将存储字节序列。是目前最常用的序列化策略。StringRedisSerializer
  Key或者value为字符串的场景,根据指定的charset对数据的字节序列编码成string,是"new String(bytes, charset)"和"string.getBytes(charset)"的直接封装。是最轻量级和高效的策略。JacksonJsonRedisSerializer
  jackson-json工具提供了javabean与json之间的转换能力,可以将pojo实例序列化成json格式存储在redis中,也可以将json格式的数据转换成pojo实例。因为jackson工具在序列化和反序列化时,需要明确指定Class类型,因此此策略封装起来稍微复杂。【需要jackson-mapper-asl工具支持】Jackson2JsonRedisSerializer
  使用Jackson库将对象序列化为JSON字符串。优点是速度快,序列化后的字符串短小精悍,不需要实现Serializable接口。但缺点也非常致命,那就是此类的构造函数中有一个类型参数,必须提供要序列化对象的类型信息(.class对象)。 通过查看源代码,发现其只在反序列化过程中用到了类型信息。OxmSerializer
  提供了将javabean与xml之间的转换能力,目前可用的三方支持包括jaxb,apache-xmlbeans;redis存储的数据将是xml工具。不过使用此策略,编程将会有些难度,而且效率最低;不建议使用。【需要spring-oxm模块的支持】扩展第三方序列化工具
  当然了除了以上这几种基本的序列化器之外您还可以进行自定义一些更加优秀、速度更块的序列化方式,例如:FastJsonRedisSerializer和KryoRedisSerializer、FSTRedisSerializer等。RedisSerializer接口
  RedisSerializer 基础接口定义了将对象转换为字节数组(二进制数据)的序列化和反序列化方法。建议将实现设计为在序列化和反序列化端处理空对象/空字节数组。注意,Redis 不接受空键或空值,但可以返回 null(对于不存在的键)。RedisSerializer 接口方法定义
  序列化
  序列化方法定义如下:
  javabyte[] serialize(T t)
  该方法将给定对象 t 序列化为二进制数据,及字节数组。注意:对象 t 和返回值可以为 null。反序列化
  反序列化方法定义如下:
  javaT deserialize(byte[] bytes)
  该方法将从给定的二进制数据(字节数组)反序列化为一个对象。注意:bytes 字节数组和返回值 T 均可以为 null。
  注意:如果上面的 serialize() 和 deserialize() 方法在执行时报错,将抛出org.springframework.data.redis.serializer.SerializationException 异常。引入spring-boot-starter-data-redis组件
  springboot 与redis的整合,pom文件,依赖如下:
  xml        org.springframework.boot       spring-boot-starter-data-redis  配置对应的application.properties文件
  针对于配置我们按照jedis的配置为基础案例,如下所示。
  properties# Redis数据库索引(默认为0) spring.redis.database=0   # Redis服务器地址 spring.redis.host=127.0.0.1 # Redis服务器连接端口 spring.redis.port=6379   # Redis服务器连接密码(默认为空) spring.redis.password= # 连接池最大连接数(使用负值表示没有限制) spring.redis.pool.max-active=8   # 连接池最大阻塞等待时间(使用负值表示没有限制) spring.redis.pool.max-wait=-1   # 连接池中的最大空闲连接 spring.redis.pool.max-idle=8   # 连接池中的最小空闲连接 spring.redis.pool.min-idle=0   # 连接超时时间(毫秒) spring.redis.timeout=0  对应的SpringBoot-Redis的核心配置类
  此处需要定义RedisTemplate对象的配置类,其中需要配置对应的RedisConnectionFactory对象类以及对应类型的序列化和反序列化组件起。如下所示定义对应的redisTemplate对象类
  默认是JDK的序列化策略,这里配置redisTemplate采用的是Jackson2JsonRedisSerializer的序列化策略,参数为redisConnectionFactory。
  java    @Bean     public RedisTemplate redisTemplate(RedisConnectionFactory redisConnectionFactory){         //使用Jackson2JsonRedisSerializer来序列化和反序列化redis的value值(默认使用JDK的序列化方式)         Jackson2JsonRedisSerializer jackson2JsonRedisSerializer = new Jackson2JsonRedisSerializer<>(Object.class);         ObjectMapper om = new ObjectMapper();         // 指定要序列化的域,field,get和set,以及修饰符范围,ANY是都有包括private和public         om.setVisibility(PropertyAccessor.ALL,JsonAutoDetect.Visibility.ANY);         // 指定序列化输入的类型,类必须是非final修饰的,final修饰的类,比如String,Integer等会抛出异常         om.enableDefaultTyping(ObjectMapper.DefaultTyping.NON_FINAL);         jackson2JsonRedisSerializer.setObjectMapper(om);         RedisTemplate redisTemplate = new RedisTemplate<>();         // 配置连接工厂         redisTemplate.setConnectionFactory(redisConnectionFactory);         //使用StringRedisSerializer来序列化和反序列化redis的key值         //redisTemplate.setKeySerializer(new StringRedisSerializer());         redisTemplate.setKeySerializer(jackson2JsonRedisSerializer);         // 值采用json序列化         redisTemplate.setValueSerializer(jackson2JsonRedisSerializer);         redisTemplate.setHashKeySerializer(jackson2JsonRedisSerializer);         redisTemplate.setHashValueSerializer(jackson2JsonRedisSerializer);         redisTemplate.afterPropertiesSet();         return redisTemplate;     } 定义对应的StringRedisTemplate对象类
  但是对于 string 类型的数据,Spring Boot 还专门提供了 StringRedisTemplate 类,而且官方也建议使用该类来操作 String 类型的数据。stringRedisTemplate默认采用的是String的序列化策略。
  java    @Bean     public StringRedisTemplate stringRedisTemplate(RedisConnectionFactory redisConnectionFactory){         StringRedisTemplate stringRedisTemplate = new StringRedisTemplate();         stringRedisTemplate.setConnectionFactory(redisConnectionFactory);         return stringRedisTemplate;     } StringRedisTemplate和 RedisTemplate 又有啥区别呢?RedisTemplate 是一个泛型类,而 StringRedisTemplate 不是,后者只能对键和值都为 String 类型的数据进行操作,而前者则可以操作任何类型。两者的数据是不共通的,StringRedisTemplate 只能管理 StringRedisTemplate 里面的数据,RedisTemplate 只能管理 RedisTemplate 中 的数据。定义组合序列化方式
  key采用String序列化,value使用jackson序列化,如下代码所示。
  java    @Bean     public RedisTemplate redisTemplate(RedisConnectionFactory factory) {         RedisTemplate template = new RedisTemplate();         template.setConnectionFactory(factory);         Jackson2JsonRedisSerializer jackson2JsonRedisSerializer = new Jackson2JsonRedisSerializer(Object.class);         ObjectMapper om = new ObjectMapper();         om.setVisibility(PropertyAccessor.ALL, JsonAutoDetect.Visibility.ANY);         om.enableDefaultTyping(ObjectMapper.DefaultTyping.NON_FINAL);         jackson2JsonRedisSerializer.setObjectMapper(om);         StringRedisSerializer stringRedisSerializer = new StringRedisSerializer();         // key采用String的序列化方式         template.setKeySerializer(stringRedisSerializer);         // hash的key也采用String的序列化方式         template.setHashKeySerializer(stringRedisSerializer);         // value序列化方式采用jackson         template.setValueSerializer(jackson2JsonRedisSerializer);         // hash的value序列化方式采用jackson         template.setHashValueSerializer(jackson2JsonRedisSerializer);         template.afterPropertiesSet();         return template;     } 定义RedisTemplate的脚手架
  将形成一个快速操作数据的工具类,将各种类型的操作类进行封装处理控制。HashOperations:对hash类型的数据操作ValueOperations:对redis字符串类型数据操作ListOperations:对链表类型的数据操作SetOperations:对无序集合类型的数据操作ZSetOperations:对有序集合类型的数据操作
  将以上各种类型的类直接进行暴漏,减少调用链路的路径长度。
  java  /**      * 对hash类型的数据操作      * @param redisTemplate      * @return      */     @Bean     public HashOperations hashOperations(RedisTemplate redisTemplate) {         return redisTemplate.opsForHash();     }      /**      * 对redis字符串类型数据操作      * @param redisTemplate      * @return      */     @Bean     public ValueOperations valueOperations(RedisTemplate redisTemplate) {         return redisTemplate.opsForValue();     }      /**      * 对链表类型的数据操作      * @param redisTemplate      * @return      */     @Bean     public ListOperations listOperations(RedisTemplate redisTemplate) {         return redisTemplate.opsForList();     }      /**      * 对无序集合类型的数据操作      * @param redisTemplate      * @return      */     @Bean     public SetOperations setOperations(RedisTemplate redisTemplate) {         return redisTemplate.opsForSet();     }      /**      * 对有序集合类型的数据操作      * @param redisTemplate      * @return      */     @Bean     public ZSetOperations zSetOperations(RedisTemplate redisTemplate) {         return redisTemplate.opsForZSet();     } 定义基础层的操作处理定义RedisSupport
  除了以上这几种类型的操作之外,还有一些基础相关的核心操作类,包含重命名,转移以及情况整个库的操作、设置TTL生命周期等。
  java@Component public class RedisSupport {  	@Autowired     private RedisTemplate redisTemplate;      /**      * 默认过期时长,单位:秒      */     public static final long DEFAULT_EXPIRE = 60 * 60 * 24;      /**      * 不设置过期时长      */     public static final long NOT_EXPIRE = -1;      public boolean existsKey(String key) {         return redisTemplate.hasKey(key);     }      /**      * 重名名key,如果newKey已经存在,则newKey的原值被覆盖      *      * @param oldKey      * @param newKey      */     public void renameKey(String oldKey, String newKey) {         redisTemplate.rename(oldKey, newKey);     }      /**      * newKey不存在时才重命名      *      * @param oldKey      * @param newKey      * @return 修改成功返回true      */     public boolean renameKeyNotExist(String oldKey, String newKey) {         return redisTemplate.renameIfAbsent(oldKey, newKey);     }      /**      * 删除key      *      * @param key      */     public void deleteKey(String key) {         redisTemplate.delete(key);     }      /**      * 删除多个key      *      * @param keys      */     public void deleteKey(String... keys) {         Set kSet = Stream.of(keys).map(k -> k).collect(Collectors.toSet());         redisTemplate.delete(kSet);     }      /**      * 删除Key的集合      *      * @param keys      */     public void deleteKey(Collection keys) {         Set kSet = keys.stream().map(k -> k).collect(Collectors.toSet());         redisTemplate.delete(kSet);     }      /**      * 设置key的生命周期      *      * @param key      * @param time      * @param timeUnit      */     public void expireKey(String key, long time, TimeUnit timeUnit) {         redisTemplate.expire(key, time, timeUnit);     }      /**      * 指定key在指定的日期过期      *      * @param key      * @param date      */     public void expireKeyAt(String key, Date date) {         redisTemplate.expireAt(key, date);     }      /**      * 查询key的生命周期      *      * @param key      * @param timeUnit      * @return      */     public long getKeyExpire(String key, TimeUnit timeUnit) {         return redisTemplate.getExpire(key, timeUnit);     }      /**      * 将key设置为永久有效      *      * @param key      */     public void persistKey(String key) {         redisTemplate.persist(key);     } }
  至此整体对应的RedisTemplate对象的封装和扩展就到这里,可以把代码介入到你的项目里面,非常方便的进行操作Redis了,是不是很OK呢?
  原文链接:https://www.cnblogs.com/liboware/p/17035032.html
特工王妃楚乔传,赵丽颖饰演的楚乔是洛河之女是嘛?楚乔应该就是洛河之女。时间脉络是这样的小时候的楚乔一直在跟随一个女人练武,这个女人就是楚乔的妈妈,两个人有同样的彼岸花纹身,所以说明有可能属于同一个组织。后来这个楚乔的妈妈出于某种有哪些好看的间谍剧可以推荐?今天我们就来聊一聊那些真正好看的谍战剧吧。小编经过筛选,最终选定下面8部谍战剧。需要指出的是,下面8部真正好看的谍战剧在豆瓣上的评分都高于8分。一黎明之前豆瓣评分9。2黎明之前由吴名爵领航的油耗高吗?这个和驾驶习惯,路况有关系,每个人都不一样的,一般综合油耗都在78个左右吧,名爵领航的油耗还是可以的。名爵领航这个车子的油耗不高,我开这个车在市区跑也只是7个油左右,可以说是很经济价格在五六百两瓶的酱香型白酒有什么推荐?感谢邀请。酱香型五六百的选择性还是很多的,比如茅台系列的。1茅台王子酱香经典市场价325元茅台酱香经典酒是53度的高度酒,价格定位在300元左右。采用了茅台独特的酿酒工艺,搭配传统有声绘本世界为谁存在让孩子对世界满怀感恩和敬意乐爸导读今天分享的绘本故事叫世界为谁存在,故事讲述了世界为谁存在?狮子宝宝问爸爸。呃,看看你的四周,爸爸回答,这个世界有那么多绿油油的草原,让你跑跳奔放,每一只斑马羚羊与大象,帮助宝宝打嗝不停,你可以这样做姐妹们有没有遇到过这种情况,就是小宝宝喝完奶后常常打嗝不止。新生儿打嗝要特别注意,必须要细心呵护才行。新生儿打嗝的原因主要有很多,针对不同原因处理的方法也是不同的,一般新生儿打嗝不出生半年数次遭遇病危通知,这个漂洋过海求医的异域宝宝,在这里转危为安出生17天,就遭遇抽搐呼吸心跳骤停出生2个月时,医生已数次下达病危通知小亚当来到这个世界的前200多天,几乎都是在医院度过。不愿就此放弃的亚当父母带着孩子辗转多地,终于在中国遇到优英超死敌红军与红魔英格兰足球历史上,利物浦和曼联是两支不可忽视的劲旅。这两支球队不仅在球场上的竞争引人瞩目,而且在历史地缘政治和文化方面也有着诸多联系。本文将从多个角度来探究这两支球队之间的关系。历湖人3换1报价方案,有意得到杰伦布朗,提升球队整体实力据NBA名记Shams报道,凯尔特人的布朗先后拒绝了球队提供的3年1。19亿和4年1。82亿的续约合同,他想要5年2。82亿的超级顶薪合同。这让双方的谈判陷入僵局,如果绿军不能提供你觉得用什么办法才能拯救国足?该拯救的是中国的男孩!用死刑犯,踢进世界一百名,改成20年有期徒刑。踢进三十名,改成十年有期徒刑。踢进世界杯,改成三年有期徒刑。世界杯夺冠,当场释放。这个问题提得很搞笑,国家都不在中国几亿男人为什么都凑不到11个人踢好足球?不是凑不到11个人,很简单,会踢球,有技术,有体力,有拼博,有拼劲的球员因为沒有关糸,进不了国家队,有关糸有靠山的上场又没技术更没体力。问题在于体制探索尚未完成,机制塑造不够完备。
Google怒怼苹果,不用iPhone就会被排挤?今年初,为了短信气泡的蓝与绿,美国青少年陷入社交裂缝。绿色气泡和蓝色气泡,被划分为不同的阵营,以颜色隐喻iPhone和Android手机之间短信沟通的不畅。裂缝两边,一个是文字通讯中层管理者晋升到高层的壁垒或者挑战通常有哪些?很多中层,奋斗一生都做不到高层,高层机会少或个人运气差只是一方面,根本原因还在于个人始终无法突破一些重大瓶颈或壁垒,导致个人综合实力始终无法达到高层应当具备的水准,自然不会,也不应想长肉先健脾养胃,这里推荐一个古方很多人都有这么一个困扰,怎么吃都吃不胖,怎么吃都不长肉,看着自己一身的排骨恨不得灌两桶花生油。中医认为脾主肌肉胃强脾弱,人身体的结构是,营养优先提供给大脑心肝脾肺肾让人的身体能够正请让踢假球者终身逐出足球圈,接受法律严惩就是踢假球,通过观看比赛视频,U15广州队53战胜清远队的比赛成为专家球迷的广泛共识。踢假球,特别是在孩子当中踢假球,其危害性不言而喻,不再陈述。查,严查,还一个风清气正的真相成为我国各省份具有代表的饮料是啥?网友好像是这回事(漫画)21世纪的今天,家家户户直奔小康,儿时喝过的饮料也逐渐被替代,什么低脂低糖低碳,深受年轻人欢迎。虽然早年前的饮料有色素有糖分,但绝对是大家内心不可磨灭的记忆。那个年代选择性不高,喝暴涨103!这只ST股发生了什么?中国基金报记者林雪实习生余洋披星戴帽不到四个月,股价却暴涨。听起来很魔幻,但却发生在ST中潜身上。该股从7月18日至8月8日涨幅将近103,因此收到了交易所的关注函。截至8月9日收以色列发起突袭,巴方百余火箭弹反击,联合国紧急发声全球动荡不平!俄乌冲突还没有缓和之际,中东地区又传出了炮火声,巴勒斯坦与以色列这一对老冤家,又闹出了新的矛盾,联合国为此紧急发声!近日,据外媒报道,以色列国防军对巴勒斯坦加沙地带进江苏与上海的辖区调整,江苏省的10个县,为何划归了上海市?在之前的文章中,作者和大家聊了一系列关于我国江苏省与周边各省区划变迁的故事,例如江苏省与山东省江苏省与安徽省之间的区划变迁。今天,我们聊聊江苏省与上海市之间的区划调整。在上世纪50亲家送的五粮液,浙江男子舍不得喝!16年后打开一看心都凉了邻居家的老张,居住在浙江,他女儿结婚的时候,亲家送了一瓶五粮液,因为是名酒,所以一直舍不得喝,就这样一放就放了16年。直到外孙要上高中了,老张才想要拿出来庆祝一下。没想到,一打开包惊艳!浙江网红图书馆走红设计独特,还屡获省级重磅荣誉宁波是一个爱藏书的城市,天一阁五桂楼伏跗室烟屿楼一座座历史悠久的藏书楼彰显着宁波人对文化价值的坚持。作为与宁波这座城市共荣共生的高校,爱书的文化基因也早已深嵌在浙大宁波理工学院的脉武汉卖2元糖水的爷爷惨遭网暴,年度最悲哀的热搜出现了01hr前段时间,武汉街头有位卖糖水的爷爷走红了。67岁的他,每晚都会用平板车拖着几桶糖水出来摆摊,已经卖了17年了。绿豆汤酸梅汤银耳汤冰糖雪梨桂花糊各种夏季冰凉饮品应有尽有。而且