今天看了一些redis的客户端实现、主要分为spring-redis-data 、jredis
今天先记录下spring-redis-data的学习心得;
spring-redis-data 中我目前主要用了它的存、取、清除。
先看配置吧redis-manager-config.properties :
redis.host=192.168.1.20//redis的服务器地址 redis.port=6400//redis的服务端口 redis.pass=1234xxxxx//密码 redis.default.db=0//链接数据库 redis.timeout=100000//客户端超时时间单位是毫秒 redis.maxActive=300// 最大连接数 redis.maxIdle=100//最大空闲数
redis.maxWait=1000//最大建立连接等待时间 redis.testOnBorrow=true//指明是否在从池中取出连接前进行检验,如果检验失败,则从池中去除连接并尝试取出另一个
spring 中配置
<bean id="propertyConfigurerRedis" > <property name="order" value="1" /> <property name="ignoreUnresolvablePlaceholders" value="true" /> <property name="locations"> <list> <value>classpath:config/redis-manager-config.properties</value> </list> </property> </bean> <!-- jedis pool配置 --> <bean id="jedisPoolConfig" > <property name="maxActive" value="${redis.maxActive}" /> <property name="maxIdle" value="${redis.maxIdle}" /> <property name="maxWait" value="${redis.maxWait}" /> <property name="testOnBorrow" value="${redis.testOnBorrow}" /> </bean> <!-- spring data redis --> <bean id="jedisConnectionFactory" > <property name="usePool" value="true"></property> <property name="hostName" value="${redis.host}" /> <property name="port" value="${redis.port}" /> <property name="password" value="${redis.pass}" /> <property name="timeout" value="${redis.timeout}" /> <property name="database" value="${redis.default.db}"></property> <constructor-arg index="0" ref="jedisPoolConfig" /> </bean> <bean id="redisTemplate" > <property name="connectionFactory" ref="jedisConnectionFactory" /> </bean>
<!--配置一个基础类(之后的业务类继承于该类)、将redisTemplate注入 -->
<bean id="redisBase" abstract="true"> <property name="template" ref="redisTemplate"></property> </bean>
java代码:
public class RedisBase { private StringRedisTemplate template; /** * @return the template */ public StringRedisTemplate getTemplate() { return template; } /** * @param template the template to set */ public void setTemplate(StringRedisTemplate template) { this.template = template; } }
继续:
下面就是具体redis的值的写入、读出、清除缓存喽!
第一:写入
public class StudentCountDO { private Long id; private String studentId; private Long commentHeadCount; private Long docAttitudeScores; private Long guideServiceScores; private Long treatEffectCount; private Long treatEffectScores; private String gmtModified; private String gmtCreated; private Long waitingTimeScores; }
StringRedisTemplate template = getTemplate();//获得上面注入的template // save as hash 一般key都要加一个前缀,方便清除所有的这类key BoundHashOperations<String, String, String> ops = template.boundHashOps("student:"+studentCount.getStudentId()); Map<String, String> data = new HashMap<String, String>(); data.put("studentId", CommentUtils.convertNull(studentCount.getStudentId())); data.put("commentHeadCount", CommentUtils.convertLongToString(studentCount.getCommentHeadCount())); data.put("docAttitudeScores", CommentUtils.convertLongToString(studentCount.getDocAttitudeScores())); data.put("guideServicesScores", CommentUtils.convertLongToString(studentCount.getGuideServiceScores())); data.put("treatEffectCount", CommentUtils.convertLongToString(studentCount.getTreatEffectCount())); data.put("treatEffectScores", CommentUtils.convertLongToString(studentCount.getTreatEffectScores())); data.put("waitingTimeScores", CommentUtils.convertLongToString(studentCount.getWaitingTimeScores())); try { ops.putAll(data); } catch (Exception e) { logger.error(CommentConstants.WRITE_EXPERT_COMMENT_COUNT_REDIS_ERROR + studentCount.studentCount(), e); }
第二、 取出
public StudentCountDO getStudentCommentCountInfo(String studentId) { final String strkey = "student:"+ studentId; return getTemplate().execute(new RedisCallback<StudentCountDO>() { @Override public StudentCountDO doInRedis(RedisConnection connection) throws DataAccessException { byte[] bkey = getTemplate().getStringSerializer().serialize(strkey); if (connection.exists(bkey)) { List<byte[]> value = connection.hMGet(bkey, getTemplate().getStringSerializer().serialize("studentId"), getTemplate() .getStringSerializer().serialize("commentHeadCount"), getTemplate() .getStringSerializer().serialize("docAttitudeScores"), getTemplate() .getStringSerializer().serialize("guideServicesScores"), getTemplate() .getStringSerializer().serialize("treatEffectCount"), getTemplate() .getStringSerializer().serialize("treatEffectScores"), getTemplate() .getStringSerializer().serialize("waitingTimeScores")); StudentCountDO studentCommentCountDO = new StudentCountDO(); studentCommentCountDO.setExpertId(getTemplate().getStringSerializer().deserialize(value.get(0))); studentCommentCountDO.setCommentHeadCount(Long.parseLong(getTemplate().getStringSerializer() .deserialize(value.get(1)))); studentCommentCountDO.setDocAttitudeScores(Long.parseLong(getTemplate().getStringSerializer() .deserialize(value.get(2)))); studentCommentCountDO.setGuideServiceScores(Long.parseLong(getTemplate().getStringSerializer() .deserialize(value.get(3)))); studentCommentCountDO.setTreatEffectCount(Long.parseLong(getTemplate().getStringSerializer() .deserialize(value.get(4)))); studentCommentCountDO.setTreatEffectScores(Long.parseLong(getTemplate().getStringSerializer() .deserialize(value.get(5)))); studentCommentCountDO.setWaitingTimeScores(Long.parseLong(getTemplate().getStringSerializer() .deserialize(value.get(6)))); return studentCommentCountDO; } return null; } }); }
这个存和取的过程其实是把对象中的各个字段序列化之后存入到hashmap 、取出来的时候在进行按照存入进去的顺序进行取出。
第三 清除
这个就根据前面的前缀很简单了,一句代码就搞定啦!
private void clear(String pattern) { StringRedisTemplate template = getTemplate(); Set<String> keys = template.keys(pattern); if (!keys.isEmpty()) { template.delete(keys); } }
pattern传入为student: 就可以将该类型的所有缓存清除掉喽!
北京商报讯(记者 丁开艳)火车票上携带的个人信息是否会很容易被软件读取进而导致信息泄露?对此问题,铁道部运输局有关负责人日前回应表示,火车票二维码已经采用强加密技术对旅客身份信息进行统一加密处理,只有铁路专用软件才能读取。
自去年6月动车组火车票实行实名制以来,实名制火车票上就包含购票者姓名以及身份证号等信息,不少购票者担心,如果用普通软件能够读取火车票信息,则会导致个人信息泄露。
对此,上述铁道部运输局负责人表示,实行车票实名制初期,因新旧软件兼容需要,存入二维码的旅客身份信息是按照业界标准技术进行存储,可通过通用二维码识读软件读取。不过,目前的火车票二维码进行统一加密处理,具备较强的保密性,防伪能力得到提升。
据了解,从今年开始,全国统一对火车票个人信息部分进行了加密,因此,现在扫描车票不会出现个人信息。昨日,记者咨询12306客户服务热线也了解到,目前火车票上的身份证号有四位为*号,普通的软件不能轻易读取到相关信息。
还记得2010年底的时候,想要去趟深圳华强北,连穿马路都需要从人群的缝隙一路穿行,低下头来也只能看到黑压压的一片脚步,还惊叹于那四面八方同时出现的密集人流。没想到短短不到两年的时间,如今的华强北同样的路口,同样的时间,不同的却是路口中央终于显现出的斑马线。这几乎标志了一个时代的落幕,一个“大山寨机时代”。
随着潮水退去,我们终于能够看到,曾经轰轰烈烈的国产手机厂商们,已经有了明确的等级分化,原本第二阵营中的手机厂商们,与第一阵营中的魅族、小米、OPPO等厂商的差距越来越大,几乎无可挽回。也因此,在本篇文章中,笔者武断的将所有第一阵营之外的国产手机,全部称为“山寨机”。
究竟是什么造成了这种局面?
市场动作迟缓笔者从来不认识国产手机厂商们缺乏创意,只要你打开任何一个搜索引擎,在图片那里搜索“山寨机”,就可以从那些五花八门的照片中明白这一点。但是,正如发明了PC的IBM最终放弃了PC,发明了手机的摩托罗拉也差点一蹶不振一样,无论在任何市场中,“创意”从来不等于“市场”。市场最核心的工作,在于如何让你的创意,快速的让更多的人知道。
国产手机并不是没有这样的机会。
举个栗子来说,就像当年曾经红极一时的英雄钢笔。随着时代的进步,人们渐渐开始不用钢笔写字了,转而使用电脑,于是英雄钢笔遍逐渐随之没、消失。相对于英雄钢笔的悲惨结局,国外的派克、凌美等同样生产钢笔的品牌,却依然火热。归其原因,非常简单,多年的品牌沉淀加上成熟的市场运作。
任何的市场,随着技术的更新换代,都必然会伴随著新一轮的洗牌,一定会有一些无法跟上时代脚步从而被淘汰的人,这是无法避免的。
好在,仍然有许多厂商意识到了这个问题,开始了他们的自救。有资金优势的就走资本运作,有规模优势的就强化品牌,有渠道优势的就专心搞销售铺货,还有一点点技术优势的就转向代工厂。而那些其他的,行动迟缓的厂商,只能在这新一轮的市场洗牌中消失。
可是这些转型的行动,只能让这些厂商勉强自保,却无法阻止市场份额的萎缩。究其原因,根源在于对于市场的反应行动迟缓。
当用户对于大屏幕、双核、甚至品牌等等,越来越在意的市场,我们的“山寨机”们却依然我行我素的,延续着原本的节奏,去不断的做着那些早已被用户所抛弃的低端产品。这一点,懒风君的《国产手机为何总是“长不大”》中已经总结的很好,推荐一读。
但是,真的仅仅只是这些厂商没有意识到市场的变化吗,还是他们不想,或者根本就无法跟上?
核心优势缺失曾经,中国山寨机能够如此的有名,至少有一个非常关键的原因,就是技术门槛非常低,市场相对混乱,但却因为移动通信的普及,手机大量流行,市场需求日渐增长。这就给那些原本一无所有的小公司,创造了机会。
三星之所以能够成为当今世界上,能够在手机领域与苹果相抗衡的仅有的几家公司之一,无疑是与其成熟的市场运作分不开的,但是除此之外,还有一个重要的因素,就是核心的技术优势。从CPU、闪存、到屏幕,这些手机中最关键的部分,三星都能够自己制造,并且都是业界最好的,因此连苹果都只能选择三星作为自己的芯片供应商。
反过头来看看我们的国产手机厂商,优势如何?
随着技术不断的更新换代,手机的技术含量早已今非昔比。曾经随便买芯片回来拼在一起就能用的手机,几乎随着智能机时代的到来而一夜之间彻底消失。芯片要买,主板要设计,要焊接,哪一项都是技术含量极高的工种,即使解决了这些问题,你还需要一个成本巨大的屏幕。随着技术的革新,行业总是会被分的越来越细。
并不是所有的厂商都没有技术优势。比如那些依靠以前的积累,成功转型为代工厂的公司。可是他们的日子也不好过。
其实许多品牌的山寨机,是没有自己的工厂的,他们只运作品牌,提供一个设计,然后去找成熟的代工厂去生产制造。于是,现在就面对了这样的一个局面,不同的代工厂报价不同:国际知名大厂的价格,比不知名的小工厂,报价高出20元。尽管在故障率方面还有差距,可是之间的差价完全能够弥补这所有的损失。于是许多的山寨机厂商就会去选择小工厂,虽然质量可能有一定的差距,但是利润更高。
可是随着技术的进步,情况发生了一些变化。同样还是之前的两个工厂,他们的报价差距仅仅只有5元,而这5元甚至还不足以弥补故障率所带来的售后成本。此时,山寨机厂商已经别无选择,因为订单量太低,所带来的有限的议价能力根本不足以让大型代工厂重视自己的产品,只能去选择那些小工厂进行生产。
而这最终所带来的结局就是,生产出的手机不仅质量差,而且利润薄。这样的山寨机公司,也就只能面临倒闭。
商业模式模糊至此,你可能已经开始觉得,还能活到现在的国产手机厂商们,至少是都解决了以上这些问题的厂商们,应该是活的还不错了吧。其实并非如此,他们面临的,还有一个更大的问题,就是没有商业模式。
什么是商业模式,简单来说就是,一个不仅让用户愿意买,而且公司也有动力持续去运作的理由。智能手机与传统的功能机,其最大的区别,就是拉近了手机用户与手机厂商的距离。智能手机的出现,极大的增加了用户使用手机的频率,对于这样一个每天都面对的东西,用户的品牌忠诚度上升到了一个难以置信的高度,也是不足为奇的。
魅族与小米的成功,不仅仅只是市场运作的成功,他们还建立了各自不同的商业模式,让用户能够持续的使用、关注自己的产品,从中获取持续的利益,进而不断的升级原本的手机系统,从而形成一个正向循环。
但是,做商业模式,显然不是我们国家的手机厂商所擅长的。他们更喜欢一次性的买卖:我制造手机,你买的手机,一手交钱一手交货。殊不知,当用户买到手机之后,真正的商业模式才刚刚开始。
智能手机绝非一个一次性的商品,如果无法意识到这一点,国产手机公司就永远无法跟上时代的步伐。
缺少互联网基因总结了以上这么多原因,让我们重新回到原点,去思考另外一个问题。用户所购买的是手机,但是他使用的却是APP,是应用,是移动互联网。智能手机的本质,是移动互联网的终端。
笔者个人很喜欢基因论,因为他可以解释很多事情。比如,那些曾经依靠炒货一夜暴富的厂商们,很难意识到什么是互联网,也想不明白为什么一款手机再卖出去之后还要不管的去运营,即使想明白了这些,对于互联网的商业模式也仍然一知半解。
这就是互联网的基因。这种基因并非是天生的,但却需要后天不断的积累和完善。凡是能够存活下的成功厂商,均不同程度的有着这样的基因。他们真正的明白,这个时代的智能手机用户所需要的东西,究竟是什么。